この戦略は"複数移動平均取引戦略"と呼ばれる.MACD指標と複数の移動平均値のクロスオーバーを取引シグナルとして利用し,ZLSMA指標の助けによりトレンドを決定し,自動取引を実現するための利益とストップ損失の退出ロジックを設定する.
MACD指標の高速線,スローライン,MACDヒストグラムを計算します.黄金十字を見ると長,死十字を見ると短を設定します.
5日,25日,45日,100日間の移動平均を計算します.移動平均が長くなるほど,それが代表するトレンド持続可能性が強くなります.
移動平均の2つのグループ間の距離を計算します.距離が一定の
価格の中長期トレンド方向を表すZLSMA指標を計算する.ZLSMAがターニングポイントを形成するときにトレンド逆転が決定できます.
MACDクロスオーバーと移動平均差のシグナルとZLSMAのトレンド判断を組み合わせて,長期と短期取引戦略を設定します.
自動的な退出論理を実現するために,利益とストップ損失のポイントを設定します.
マルチフィルター信号は戦略の効率性を向上させる.MACDと移動平均差の信号は,偽のブレイクを避けるために互いに検証することができる.
ZLSMAは,中長期のトレンド方向性を決定し,トレンドに反する取引を避けるのに協力します.
利益とストップ・ロスのポイントを設定することで 自動的な退出が 人間の介入の頻度を減らすのです
パラメータの設定が正しくない場合,オーバートレードまたはオーダーが欠落する可能性があります.最適な結果のために,パラメータを最適化する必要があります.
固定利益とストップ・ロスのポイントは,利益の可能性を制限したり損失を増加させたりします.ATRに基づくダイナミックストップは検討できます.
移動平均戦略は範囲限定市場ではうまく機能しない.他の指標や手動的な介入が必要かもしれない.
移動平均のパラメータの組み合わせを最適化するために,異なる長さの移動平均をテストする.
入口と出口点を決定するために,KDJとBOLLなどの他の指標を追加してテストする.
動的ストップロスの戦略を試す
自動で最適なパラメータを見つけるために 機械学習モデルを追加します
この戦略は,自動取引を達成するためにMACD,複数の移動平均値およびZLSMAのトレンド決定を統合する.複数のシグナルでフィルタリングすることにより,戦略の安定性が向上し,退出ロジックを設定することでリスクが軽減される.実際の取引には一定の実用的な価値があります.その後のパラメータ最適化,インジケーター拡張,ダイナミックストップなどにより戦略のパフォーマンスを改善することができます.
/*backtest start: 2023-02-22 00:00:00 end: 2024-02-28 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy("MACD ZLSMA_izumi⑤(4つの条件、MCDがクロスしてたら)", overlay=true) fast_length = input(title = "Fast Length", defval = 12) slow_length = input(title = "Slow Length", defval = 26) src = input(title = "Source", defval = close) signal_length = input.int(title = "Signal Smoothing", minval = 1, maxval = 50, defval = 9) sma_source = input.string(title = "Oscillator MA Type", defval = "EMA", options = ["SMA", "EMA"]) sma_signal = input.string(title = "Signal Line MA Type", defval = "EMA", options = ["SMA", "EMA"]) // Calculating fast_ma = sma_source == "SMA" ? ta.sma(src, fast_length) : ta.ema(src, fast_length) slow_ma = sma_source == "SMA" ? ta.sma(src, slow_length) : ta.ema(src, slow_length) macd = fast_ma - slow_ma signal = sma_signal == "SMA" ? ta.sma(macd, signal_length) : ta.ema(macd, signal_length) hist = macd - signal alertcondition(hist[1] >= 0 and hist < 0, title = 'Rising to falling', message = 'The MACD histogram switched from a rising to falling state') alertcondition(hist[1] <= 0 and hist > 0, title = 'Falling to rising', message = 'The MACD histogram switched from a falling to rising state') hline(0, "Zero Line", color = color.new(#787B86, 50)) plot(hist, title = "Histogram", style = plot.style_columns, color = (hist >= 0 ? (hist[1] < hist ? #26A69A : #B2DFDB) : (hist[1] < hist ? #FFCDD2 : #FF5252))) plot(macd, title = "MACD", color = #2962FF) plot(signal, title = "Signal", color = #FF6D00) //MACDクロス設定 enterLong = ta.crossover(macd, signal) enterShort = ta.crossunder(macd, signal) //移動平均線の期間を設定 ema5 = input(5, title="ma期間5") ema25 = input(25, title="ma期間25") ema45 = input(45, title="ma期間45") ema100 = input(100, title="ma期間100") //移動平均線を計算 //sma関数で「ema25」バー分のcloseを移動平均線として「Kema」に設定 Kema5 = ta.sma(close,ema5) Kema25 = ta.sma(close,ema25) Kema45 = ta.sma(close,ema45) Kema100 = ta.sma(close,ema100) //移動平均線をプロット plot(Kema5, color=color.rgb(82, 249, 255),title="ema5") plot(Kema25, color=color.red,title="ema25") plot(Kema45, color=color.blue,title="ema45") plot(Kema100, color=color.green,title="ema100") //ema同士の距離が30以上の時に「distancOK」にTureを返す //distance1 = math.abs(Kema5-Kema25) distance2 = math.abs(Kema25-Kema45) distanceValue1 = input(0.030, title ="ema同士の乖離値") //distanceOk1 = distance1 > distanceValue1 distanceOk2 = distance2 > distanceValue1 //2区間のema同士の距離が30以上の時に「distanceOKK」にTrueを返す //distanceOkK1 = distanceOk1 and distanceOk2 distanceOkK1 = distanceOk2 //5EMAとロウソクの乖離判定 //DistanceValue5ema = input(0.03, title ="5emaとロウソクの乖離率") //emaDistance = math.abs(Kema5 - close) //emaDistance5ema = emaDistance < DistanceValue5ema //ZLSMA追加のコード length = input.int(32, title="Length") offset = input.int(0, title="offset") src2 = input(close, title="Source") lsma = ta.linreg(src2, length, offset) lsma2 = ta.linreg(lsma, length, offset) eq= lsma-lsma2 zlsma = lsma+eq //ZLSMAのプロット plot(zlsma, color=color.yellow, linewidth=3) //ZLSMAの前回高値を検索 //var float zlsmaHigh = na //var float zlsmaHighValue = na //if ta.highest(zlsma,35) == zlsma[3] // zlsmaHighValue := zlsmaHigh // zlsmaHigh := zlsma[3] //if (na(zlsmaHighValue)) // zlsmaHighValue := zlsmaHigh //ZLSMAの前回安値を検索 //var float zlsmaLow = na //var float zlsmaLowValue = na //if ta.lowest(zlsma,35) == zlsma[3] // zlsmaLowValue := zlsmaLow // zlsmaLow := zlsma[3] ///if (na(zlsmaLowValue)) // zlsmaLowValue := zlsmaLow //利確・損切りポイントの初期化(変数の初期化) var longProfit = 0.0 var longStop = 0.0 var shortProfit = 0.0 var shortStop = 0.0 //inputで設定画面の選択項目を設定 longProfitValue = input(0.06, title ="ロング利確pips") shortProfitValue = input(-0.06, title ="ショート利確pips") longStopValue = input(-0.06, title ="ロング損切pips") shortStopValue = input(0.06, title ="ショート損切pips") // クロスの強さを推定 //angleThreshold = input(0.001, title = "クロスの強さ調節" ) // クロスの強さの閾値、この値を調整してクロスの強さの基準を変える //macdDiff = macdLine - signalLine //strongCross = math.abs(macdDiff) > angleThreshold // エントリー条件 (MACDラインとシグナルラインがクロス) //ta.crossover(macdLine, signalLine) and strongCross //ロングエントリー条件 if distanceOkK1 and enterLong strategy.entry("long", strategy.long, comment="long") longProfit := close + longProfitValue longStop := close + longStopValue // if na(strategy.position_avg_price) and close>strategy.position_avg_price + 0.05 * syminfo.mintick // longStop := strategy.position_avg_price + 10 * syminfo.mintick // strategy.exit("exit", "long",stop = longStop) strategy.exit("exit", "long", limit = longProfit,stop = longStop) if distanceOkK1 and enterShort strategy.entry("short", strategy.short, comment="short") shortProfit := close + shortProfitValue shortStop := close + shortStopValue // if na(strategy.position_avg_price) and close>strategy.position_avg_price - 0.05 * syminfo.mintick // shortStop := strategy.position_avg_price - 0.1 * syminfo.mintick // strategy.exit("exit", "long",stop = longStop) strategy.exit("exit", "short", limit = shortProfit,stop = shortStop) //plot(strategy.equity, title="equity", color=color.red, linewidth=2, style=plot.style_areabr)