この戦略は典型的な移動平均クロスオーバー戦略で,移動平均の2組,一つは速い,一つは遅い. 速い移動平均がゆっくり移動平均を横切ると,購入信号が生成される. 速い平均がゆっくり移動平均を下回ると,販売信号が生成される. この戦略は,移動平均のためにEMAとSMAの両方を使用し,EMAは速い線とSMAは遅い線である.複数の移動平均を使用することで,偽信号をフィルタリングし,信頼性を向上させるのに役立ちます.
基本論理は,入口と出口を決定するために,高速と遅い移動平均線間の交差点に依存しています.
具体的には,2つのセットの高速移動平均値と遅い移動平均値が計算されます.
低速SMAと低速EMAの間のクロスオーバーをチェックします.
偽信号をフィルタリングするには,確認のために2度目のEMA/SMAクロスオーバーが必要です.
2つの高速/遅いMAクロスオーバーを必要とすることで,多くの誤った信号をフィルタリングし,信頼性を向上させることができます.
シグナルトリガーを購入するときは,ロング,シグナルトリガーを販売するときはショート.
戦略では,入場価格から入場価格の割合に基づいて,利益とストップロスを設定します.
この戦略の利点は以下の通りです.
戦略のリスク:
リスクを制御するために
戦略は以下によってさらに最適化できます.
概要すると,ダブルMAクロスオーバー戦略は,高速/遅いMAクロス,セットの利益とストップ損失をコントロールするリスクのシグナルを生成し,シンプルで直感的で簡単に実装できます.パラメータは調節し,より良いパフォーマンスのために他の指標と組み合わせることができます.定量取引で大きな有用性があります.
/*backtest start: 2023-02-20 00:00:00 end: 2024-02-26 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © JMLSlop //@version=4 src = close strategy("Crossover moving averages", shorttitle="Cross MA-EMA", overlay=true, calc_on_order_fills=false) // first fast EMA len = input(8, "Length", type=input.integer, minval=1) doma1 = input(true, title="EMA") out1 = ema(src, len) //Second fast EMA len2 = input(21, minval=1, title="Length") doma2 = input(true, title="EMA") out2 = ema(src, len2) //First slow MA len3 = input(50, minval=1, title="Length") doma3 = input(true, title="SMA") out3 = sma(src, len3) //Second slow MA len4 = input(200, minval=1, title="Length") doma4 = input(true, title="SMA") out4 = sma(src, len4) // Profit profit = input(8, "Profit/lost %", type=input.float, minval=1) * 0.01 plot(doma1 and out1 ? out1: na, color=color.blue, linewidth=1, title="1st EMA") plot(doma2 and out2 ? out2: na, color=color.red, linewidth=1, title="2nd EMA") plot(doma3 and out3 ? out3: na, color=color.green, linewidth=2, title="1st MA") plot(doma4 and out4 ? out4: na, color=color.orange, linewidth=3, title="2nd MA") // Orders config takeProfitPrice = (strategy.position_size > 0) ? strategy.position_avg_price + open*profit : (strategy.position_size < 0) ? strategy.position_avg_price - (open*profit) : na longStopPrice = strategy.position_avg_price * (1 - profit) shortStopPrice = strategy.position_avg_price * (1 + profit) longCondition2 = (out2>out3 and (crossover(out1, out4) or crossover(out1[1], out4[1]) or crossover(out1[2], out4[2]) or (crossover(out1[3], out4[3]))) or (out2>out3 and (crossover(out1, out3) or crossover(out1[1], out3[1]) or crossover(out1[2], out3[2]) or crossover(out1[3], out3[3])))) if (longCondition2) strategy.entry("Enter L", strategy.long) shortCondition2 = (out2<out3 and (crossunder(out1, out4) or crossunder(out1[1], out4[1]) or crossunder(out1[2], out4[2]) or crossunder(out1[3], out4[3]))) or (out2<out3 and (crossunder(out1, out3) or crossunder(out1[1], out3[1]) or crossunder(out1[2], out3[2]) or crossunder(out1[3], out3[3]))) if (shortCondition2) strategy.entry("Enter S", strategy.short) if (strategy.position_size > 0) strategy.exit("Exit L", limit=takeProfitPrice, stop=longStopPrice) if (strategy.position_size < 0) strategy.exit("Exit S", limit=takeProfitPrice, stop=shortStopPrice)