この戦略は,異なる種類の移動平均値 (Simple Moving Average SMA,Exponential Moving Average EMA,Hull Moving Average HMA,Weighted Moving Average VWMA) を計算し,それらの間のクロスオーバーポイントを検知して,市場のトレンドを決定し,それをフォローすることで取引信号を生成する.短期MMAが下から長期MMAを横切るときに購入信号を生成し,逆のクロスオーバーが起こるときに販売信号を生成する.
この戦略の主な考え方は,二つの移動平均を比較することによって市場傾向を判断することである.具体的には,入力パラメータを通じて異なる種類と長さの2つのMAを構成することを可能にする.最初のMAは主要な傾向を表すより長い期間を持ち,第2MAは現在の短期トレンドのための短い期間を有する.
短期MAが長期MAを下から横切ると,短期トレンドが強化され,市場は上昇傾向に入っていることを示します.したがって,このクロスオーバーポイントで購入信号が生成されます.逆に,短期MAが長期MAを下に横切ると,短期トレンドが弱まり,市場は下向きに逆転していることを示します.したがって,販売信号が生成されます.
この戦略は,そのようなMAクロスオーバーを検出することで,市場のトレンドに従って取引する.
解決策:
この戦略は,主要なトレンド検出のためにMAクロスオーバーを使用するというクラシックなアイデアに基づいています.柔軟なMA組み合わせにより,実装が簡単で,アルゴリズム取引自動化に適しています.全体的には,かなり実用的です.しかし,パラメータチューニング,追加のフィルターなど,パフォーマンスをさらに改善するための強化に余地があります.
/*backtest start: 2023-12-31 00:00:00 end: 2024-01-30 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=3 //study(title="MA Crossover Strategy", overlay = true) strategy("MA Crossover Strategy", overlay=true) src = input(close, title="Source") price = request.security(syminfo.tickerid, timeframe.period, src) ma1 = input(25, title="1st MA Length") type1 = input("HMA", "1st MA Type", options=["SMA", "EMA", "HMA", "VWMA"]) ma2 = input(7, title="2nd MA Length") type2 = input("HMA", "2nd MA Type", options=["SMA", "EMA", "HMA", "VWMA"]) f_hma(_src, _length)=> _return = wma((2*wma(_src, _length/2))-wma(_src, _length), round(sqrt(_length))) price1 = if (type1 == "SMA") sma(price, ma1) else if (type1 == "EMA") ema(price, ma1) else if (type1 == "VWMA") vwma(price, ma1) else f_hma(price, ma1) price2 = if (type2 == "SMA") sma(price, ma2) else if (type2 == "EMA") ema(price, ma2) else if (type2 == "VWMA") vwma(price, ma2) else f_hma(price, ma2) //plot(series=price, style=line, title="Price", color=black, linewidth=1, transp=0) plot(series=price1, style=line, title="1st MA", color=blue, linewidth=2, transp=0) plot(series=price2, style=line, title="2nd MA", color=green, linewidth=2, transp=0) longCondition = crossover(price1, price2) if (longCondition) strategy.entry("Long", strategy.long) shortCondition = crossunder(price1, price2) if (shortCondition) strategy.entry("Short", strategy.short)