ダブル移動平均クロスオーバー・トレーディング戦略は,異なるパラメータ設定を持つ移動平均を2つ計算し,移動平均がクロスオーバーしたときの取引によって取引信号を生成します.このシンプルで直接的な戦略は中期取引に適しています.
この戦略の基本的な論理は
入力パラメータ:より速いMA周期maLen1,より遅いMA周期maLen2,MAタイプmaTypeChoice
入力パラメータに基づいて,より速い MA maValue1とより遅い MA maValue2を計算する
2つのMAを比較して購入・販売条件を定義する.
maValue1 が maValue2 を越えると購入する
maValue1が maValue2を下回ると売る
買い/売るシグナルで取引を実行する
関連性に基づいて異なる色でMAを視覚化します
購入・販売の警告信号を送信する
単一のMAから誤った信号を避ける.
調整可能なMA期間が異なる取引領域に適している
シンプルで直線的な論理,理解し実行しやすい
タイミングで実行するための可変信号アラート
視覚化されたMA傾向は直感的な取引指標を形成する
最適な組み合わせを見つけるために最適化可能なパラメータ
バックテストとライブ取引に適用される
MAの交差は誤った信号を生む可能性があり,さらなる傾向とパターン確認が必要です.
MAのクロスオーバーの周りの問題には,不必要な取引コストが生じます
不適切なパラメータは,過剰な取引または稀有な取引につながります
極端 な 出来事 に よっ て 莫大な 価格 変動 が 起き,損失 を 制限 する こと が でき ない
長期的トレンドブレーキは短期的指標を無効にする
頻繁な監視が必要で,完全に自動化できない
リスク管理
トレンドに反する取引を避けるためにトレンドフィルターを追加する
信号の有効性を確認するためにパターンフィルターを追加する
適正な取引頻度のためのパラメータを最適化
損失を制限するためにストップ・ロース/得益設定
耐久性試験 長期間の試験
偽のブレイクを避けるための価格と時間フィルター
最適値を見つけるために異なるMAパラメータをテストする
最も正確な信号のために異なるMAタイプをテストする
逆トレンド取引を避けるためにトレンドフィルターを追加する
適正な出口点を識別するために波動性フィルターを追加します.
偽信号を減らすために価格/時間フィルターを追加します
リアル取引のスライド制御を実施する
耐久性試験 計測器と時間枠
オートストップ損失/利益を取ることを統合する
戦略を改善するために機械学習を探求する
ダブル移動平均クロスオーバーは,クラシックな技術指標戦略である.MAクロスからシグナルを生成し,最適化によって良いバックテスト結果を生成することができる.しかし,誤ったシグナルのようなリスクは残っており,追加のフィルターが必要である.実際の取引には,スリップ制御などの実行詳細も必要である.全体として,この戦略は,シンプルで直感的な選択として中期取引に適している.継続的な改善と強度検証により,この戦略はライブ取引で安定したリターンを達成することができる.
/*backtest start: 2023-10-05 00:00:00 end: 2023-10-05 22:00:00 period: 15m basePeriod: 5m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 // © sehweijun //study( title="Arch1tect's New Toy", shorttitle="Arch1tect's New Toy", overlay=true, resolution="") // strategy( title="Arch1tect's New Toy (Strategy Tester Version)", shorttitle="Arch1tect's New Toy (Strategy Tester Version)", overlay=true, initial_capital = 100000, commission_value=0.07, commission_type=strategy.commission.cash_per_contract) maTypeChoice = input( "EMA", title="MA Type", options=["EMA", "WMA", "SMA"] ) maSrc = input( close, title="MA Source" ) maLen1 = input( 15, minval=1, title="MA Length" ) maLen2 = input( 95, minval=1, title="MA Length" ) maValue1 = if ( maTypeChoice == "EMA" ) ema( maSrc, maLen1 ) else if ( maTypeChoice == "WMA" ) wma( maSrc, maLen1 ) else if ( maTypeChoice == "SMA" ) sma( maSrc, maLen1 ) else 0 maValue2 = if ( maTypeChoice == "EMA" ) ema( maSrc, maLen2 ) else if ( maTypeChoice == "WMA" ) wma( maSrc, maLen2 ) else if ( maTypeChoice == "SMA" ) sma( maSrc, maLen2 ) else 0 buySignal = crossover( maValue1, maValue2 ) sellSignal = crossunder( maValue1, maValue2 ) mainMAColour = ( maValue1 > maValue2 ) ? color.green : color.red plot( maValue1, title="Arch1tect's New Toy", color=mainMAColour, offset=0, linewidth=4 ) //plot( maValue2, title="Arch1tect's Filter", color=color.black, offset=0, linewidth=2 ) var color buyCandleColour = #00ff0a var color sellCandleColour = #ff1100 barcolor( buySignal ? buyCandleColour : sellSignal ? sellCandleColour : na, title="Signal Bar Colour" ) bgcolor( color=buySignal ? buyCandleColour : sellSignal ? sellCandleColour : na, transp=85, title="Signal Background Colour") alertcondition( buySignal or sellSignal, title="Signal change!", message="Signal change!") alertcondition( buySignal, title="Buy signal!", message="Buy signal!") alertcondition( sellSignal, title="Sell signal!", message="Sell signal!") // Strategy Tester stratTesterOn = input( title="Strategy Tester [ON/OFF]", group="Strategy Tester", type=input.bool, defval=true) entryTime = input( "2200-1200", title = "Daily trading time session (in Exchange GMT)", group="Strategy Tester", type = input.session ) startTime = input( "2200-2201", title = "Start Time", group="Strategy Tester", type = input.session ) maxDailyLoss = input( 2500, title = "Max daily loss", group="Strategy Tester", type = input.integer ) maxTotalDrawdown = input( 12000, title = "Max daily loss", group="Strategy Tester", type = input.integer ) contractSize = input( 1, title = "Contract size", group="Strategy Tester", type = input.integer ) tradeOnStartSess = input( title="First trade on session start [ON/OFF]", group="Strategy Tester", type=input.bool, defval=true) fixedTPSL = input( title="Fixed TP/SL PIPS [ON/OFF]", group="Strategy Tester", type=input.bool, defval=false) fixedTPValue = input ( 10.00, minval=0.01, type=input.float, title="TP", group="Strategy Tester" ) fixedSLValue = input ( 10.00, minval=0.01, type=input.float, title="SL", group="Strategy Tester" ) fromDay = input(defval = 1, title = "From Day", group="Date Range", type = input.integer, minval = 1, maxval = 31) fromMonth = input(defval = 1, title = "From Month", group="Date Range", type = input.integer, minval = 1, maxval = 12) fromYear = input(defval = 2020, title = "From Year", group="Date Range", type = input.integer, minval = 1970) thruDay = input(defval = 1, title = "Thru Day", group="Date Range", type = input.integer, minval = 1, maxval = 31) thruMonth = input(defval = 1, title = "Thru Month", group="Date Range", type = input.integer, minval = 1, maxval = 12) thruYear = input(defval = 2112, title = "Thru Year", group="Date Range", type = input.integer, minval = 1970) start = timestamp(fromYear, fromMonth, fromDay, 00, 00) // backtest start window finish = timestamp(thruYear, thruMonth, thruDay, 23, 59) // backtest finish window window() => time >= start and time <= finish ? true : false // create function "within window of time" // strategy.risk.max_intraday_loss( maxDailyLoss, strategy.cash ) // strategy.risk.max_drawdown( maxTotalDrawdown, strategy.cash ) isTime(_position) => range = time( timeframe.period, _position + ':1234567' ) bgcolor( color=isTime( entryTime ) and stratTesterOn and window() ? color.yellow : na, title="Daily trading time session (in Exchange GMT)", transp=75 ) if ( stratTesterOn and window() ) if ( buySignal and isTime( entryTime ) ) if ( not fixedTPSL ) strategy.close_all() strategy.entry( "Buy", strategy.long, contractSize ) if ( fixedTPSL and strategy.position_size == 0 ) strategy.entry( "Buy", strategy.long, contractSize ) strategy.exit( "TP/SL", "Buy", stop=close[0]-fixedSLValue, limit=close[0]+fixedTPValue ) if ( sellSignal and isTime( entryTime )) if ( not fixedTPSL ) strategy.close_all() strategy.entry( "Sell", strategy.short, contractSize ) if ( fixedTPSL and strategy.position_size == 0 ) strategy.entry( "Sell", strategy.short, contractSize ) strategy.exit( "TP/SL", "Sell", stop=close[0]+fixedSLValue, limit=close[0]-fixedTPValue ) if ( isTime( startTime ) and tradeOnStartSess and strategy.position_size == 0 ) if ( maValue1 > maValue2 ) strategy.entry( "Buy", strategy.long, contractSize ) if ( fixedTPSL ) strategy.exit( "TP/SL", "Buy", stop=close[0]-fixedSLValue, limit=close[0]+fixedTPValue ) else strategy.entry( "Sell", strategy.short, contractSize ) if ( fixedTPSL ) strategy.exit( "TP/SL", "Sell", stop=close[0]+fixedSLValue, limit=close[0]-fixedTPValue ) strategy.close_all( when=not isTime( entryTime ) ) plot( strategy.equity )