ダブル移動平均クロスオーバー取引戦略


作成日: 2023-10-13 15:40:49 最終変更日: 2023-10-13 15:40:49
コピー: 0 クリック数: 743
1
フォロー
1617
フォロワー

概要

双均線交差取引戦略は,2つの異なるパラメータセットの均線を計算し,均線の交差によって買付と売却を行う.この戦略はシンプルで直接的で,中期短期取引に適している.

戦略原則

この戦略は,主に,高速平均線周期,遅い平均線周期,平均線タイプなどのパラメータを入力することによって,高速平均線と遅い平均線を計算する.高速平均線上を通過すると,買取操作を行う.高速平均線下を通過すると,販売操作を行う.

この戦略の核心的な論理は:

  1. 入力パラメータ:速平均周期maLen1,遅平均周期maLen2,平均周期型maTypeChoice

  2. 入力パラメータに基づいて計算された高速平均線maValue1と遅い平均線maValue2

  3. 2つの均線大小関係を比較し,購入と販売の条件を定義する:

    • 購入条件:maValue1にmaValue2を装着する

    • 販売条件:maValue1でmaValue2を履く

  4. 購入と販売の条件が成立したときに,対応する取引を行う

  5. 均線を視覚的に表示し,均線の大きさの関係を異なる色で区分する

  6. 購入と売却のシグナルを提示する

戦略的優位性

  • 双均線交差原理を用いて,単一の均線振動に誤導されない

  • 平均線パラメータは調整可能で,異なる周期操作に対応できる

  • 取引ロジックはシンプルで直接的で,理解しやすい.

  • 取引のタイミングをリアルタイムで把握するカスタマイズ可能な買入/売却のシグナル提示

  • 平均線走勢を視覚化して,直観的な取引指標を形成する

  • パラメータ最適化により最適なパラメータの組み合わせを見つけることができます.

  • 最適なパラメータを検索する回測にも使用できます.また,リールディスク取引にも使用できます.

戦略リスク

  • 均線交差は誤信号を発生しやすいので,傾向と形状を組み合わせて判断する

  • 双平線が揺れると,頻繁にポジションを開くことで取引費用が損なわれます.

  • パラメータが正しくない場合,取引が頻繁すぎたり,不頻繁になる

  • 突発的な出来事が起こり,事態は激しくなり,事態は止まらない.

  • 大周期が突破すると,短周期指標は失効する可能性があります.

  • 監視は頻繁で,完全に自動化することはできません.

リスク対策:

  • トレンド指数と組み合わせて,急激な取引を避ける

  • 形状指標と組み合わせて,信号の有効性を確認

  • パラメータを最適化して,取引頻度を合理的なレベルに

  • ストップポイントを設定し,単一損失を制御します.

  • パラメータの安定性を複数の時間帯で検証

  • タイムフィルターや信号フィルターを使用して,偽突破を避ける

戦略最適化の方向性

  • 異なる平均線パラメータをテストし,最適なパラメータを探します.

  • 異なる均線タイプをテストし,信号を生成する最も正確な均線を選択する

  • トレンド指数と組み合わせて,トレンドに合わない取引を避ける

  • 波動の指標と組み合わせて,適切なタイミングを判断する.

  • タイムまたは信号のフィルターを追加し,誤信号を減らす

  • スライドポイント制御を設定し,実盤取引の効果を最適化

  • 多種多周期安定性検証

  • 自動ストップ・ストップの戦略に参加する

  • 機械学習などの技術で 追跡効果を向上させる

要約する

双均線交差策略は,非常に典型的な技術指標策略である。それは,快慢均線交差原理を利用して取引シグナルを生成し,パラメータ最適化によって良い反測結果を得ることができる。しかし,この策略にも一定のリスクがあり,トレンド,形状などの他の技術指標と連携して検証し,誤信号率を下げる必要がある。さらに,実盘取引では,滑点制御などの取引細部も考慮する必要がある。全体的に,双均線交差策略は,中期期間の操作に適しており,理解し,簡易に実現する為の好ましい取引策の一つである。継続的な最適化と検証により,この策略を実盘に運用して,安定した収益を得ることができる。

ストラテジーソースコード
/*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 )