マルチ期間SMA指標に基づくトレンドフォロー戦略


作成日: 2024-02-04 14:50:24 最終変更日: 2024-02-04 14:50:24
コピー: 0 クリック数: 680
1
フォロー
1617
フォロワー

マルチ期間SMA指標に基づくトレンドフォロー戦略

概要

この戦略は,複数の異なる周期のSMA平均線を組み合わせて使用することで,トレンドの判断と追跡を実現する. 核心的な考え方は,異なる周期のSMAの上昇と下降の方向を比較して,トレンドを判断すること. 短い周期のSMAで長い周期のSMAを穿ったとき,多めにすること. 短い周期のSMAの下で長い周期のSMAを穿ったとき,空きすること. 同時に,ZeroLagEMA指標と組み合わせて,入場と出場の確認を行う.

戦略原則

  1. 5つの異なる周期のSMA平均線を使用し,それぞれ10周期,20周期50周期100周期,200周期である.
  2. この5つの平均線の上昇と下降の方向を比較して,トレンドの方向を判断する.例えば,10周期,20周期,100周期,200周期SMA平均線が同時に上昇すると,上昇傾向と判断する.平均線が同時に下降すると,下降傾向と判断する.
  3. 異なる周期SMAの数値を比較して取引シグナルを形成する.例えば,10周期SMA上を20周期SMA穿越すると多し,入場シグナルを形成する.10周期SMA下を20周期SMA穿越すると空し,入場シグナルを形成する.
  4. ゼロラゲマを入場確認と出場信号として使用する.高速サイクルゼロラゲマ上をゆっくりとした周期で穿越するときに多行する.下を穿越するときに平行多行する.空き信号の判断方法はその逆である.

戦略的優位性

  1. 複数の異なる周期のSMA平均線組合せを使用して,市場のトレンド方向を効果的に判断できます.
  2. 周期的なSMA値の比較は取引シグナルを生成し,入場と出場の定量化ルールを形成する.
  3. Zero LagEMAの波は,不必要な取引を回避し,戦略の安定性を高めます.
  4. トレンド判断と取引シグナルを組み合わせて,トレンド追跡取引を実現する.

戦略的リスクと解決策

  1. 市場が振動整理段階に入ると,SMA平均線信号は頻繁に交差し,無効取引と損失のリスクを高めます.
    • 解決方法:ZeroLagEMAの波パラメータを増加させ,無効信号の入力を回避する.
  2. 周期的なSMAを参考にしたため,信号は遅滞しており,短期間の急激な価格変動に及ばない.
    • 解決方法:MACDなどのより敏感な指標を組み合わせて,補助判断を行う.

戦略最適化の方向性

  1. SMA周期パラメータを最適化して,最適なパラメータ組み合わせを見つけます.
  2. 単一損失をさらに制御するために,ストップを追跡するなど,ストップ・ストラトジーを追加する.
  3. ポジション数管理のメカニズムを追加し,トレンドが強くなるとポジションを大きくし,揺れるとポジションを小さくする.
  4. MACD,KDJなどの補助指標の判断により,戦略の全体的な安定性が向上する.

要約する

この戦略は,複数の周期SMA平均線を組み合わせることで,市場トレンドの方向を効果的に判断し,定量取引シグナルを生成する.同時に,ZeroLagEMAの適用は,戦略の順利率を向上させる.全体的に,戦略は,トレンド追跡に基づく定量取引理念を実現し,効果は顕著である.SMA周期パラメータ,ストップ損失戦略,ポジション管理などをさらに最適化することにより,戦略の効果価値をさらに強化し,実盘で検証および適用することができる.

ストラテジーソースコード
/*backtest
start: 2024-01-04 00:00:00
end: 2024-02-03 00:00:00
period: 2h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=2
strategy("Forex MA Racer - SMA Performance /w ZeroLag EMA Trigger", shorttitle = "FX MA Racer (5x SMA, 2x zlEMA)", overlay=false )

// === INPUTS ===
hr0             = input(defval = true, title = "=== SERIES INPUTS ===")
smaSource       = input(defval = close, title = "SMA Source")
sma1Length      = input(defval = 10, title = "SMA 1 Length")
sma2Length      = input(defval = 20, title = "SMA 2 Length")
sma3Length      = input(defval = 50, title = "SMA 3 Length")
sma4Length      = input(defval = 100, title = "SMA 4 Length")
sma5Length      = input(defval = 200, title = "SMA 5 Length")
smaDirSpan      = input(defval = 4, title = "SMA Direction Span")
zlmaSource      = input(defval = close, title = "ZeroLag EMA Source")
zlmaFastLength  = input(defval = 9, title = "ZeroLag EMA Fast Length")
zlmaSlowLength  = input(defval = 21, title = "ZeroLag EMA Slow Length")
hr1             = input(defval = true, title = "=== PLOT TIME LIMITER ===")
useTimeLimit    = input(defval = true, title = "Use Start Time Limiter?")
// set up where we want to run from
startYear       = input(defval = 2018, title = "Start From Year", minval = 0, step = 1)
startMonth      = input(defval = 02, title = "Start From Month", minval = 0,step = 1)
startDay        = input(defval = 01, title = "Start From Day", minval = 0,step = 1)
startHour       = input(defval = 00, title = "Start From Hour", minval = 0,step = 1)
startMinute     = input(defval = 00, title = "Start From Minute", minval = 0,step = 1)
hr2             = input(defval = true, title = "=== TRAILING STOP ===")
useStop     = input(defval = false, title = "Use Trailing Stop?")
slPoints    = input(defval = 200, title = "Stop Loss Trail Points", minval = 1)
slOffset    = input(defval = 400, title = "Stop Loss Trail Offset", minval = 1)
// === /INPUTS ===

// === SERIES SETUP ===
// Fast ZeroLag EMA
zema1=ema(zlmaSource, zlmaFastLength)
zema2=ema(zema1, zlmaFastLength)
d1=zema1-zema2
zlemaFast=zema1+d1

// Slow ZeroLag EMA
zema3=ema(zlmaSource, zlmaSlowLength)
zema4=ema(zema3, zlmaSlowLength)
d2=zema3-zema4
zlemaSlow=zema3+d2

// Simple Moving Averages
period10 = sma(close, sma1Length)
period20 = sma(close, sma2Length)
period50 = sma(close, sma3Length)
period100 = sma(close, sma4Length)
period200 = sma(close, sma5Length)
// === /SERIES SETUP ===

// === PLOT ===
// colors of plotted MAs
p1 = (close < period10) ? #FF0000 : #00FF00
p2 = (close < period20) ? #FF0000 : #00FF00
p3 = (close < period50) ? #FF0000 : #00FF00
p4 = (close < period100) ? #FF0000 : #00FF00
p5 = (close < period200) ? #FF0000 : #00FF00

plot(period10, title='10 Period', color = p1, linewidth=1)
plot(period20, title='20 Period', color = p2, linewidth=2)
plot(period50, title='50 Period', color = p3, linewidth=4)
plot(period100, title='100 Period', color = p4, linewidth=6)
plot(period200, title='200 Period', color = p5, linewidth=10)
// === /PLOT ===

//BFR = BRFIB ? (maFast+maSlow)/2 : abs(maFast - maSlow)

// === STRATEGY ===
// calculate SMA directions
direction10 = rising(period10, smaDirSpan) ? +1 : falling(period10, smaDirSpan) ? -1 : 0
direction20 = rising(period20, smaDirSpan) ? +1 : falling(period20, smaDirSpan) ? -1 : 0
direction50 = rising(period50, smaDirSpan) ? +1 : falling(period50, smaDirSpan) ? -1 : 0
direction100 = rising(period100, smaDirSpan) ? +1 : falling(period100, smaDirSpan) ? -1 : 0
direction200 = rising(period200, smaDirSpan) ? +1 : falling(period200, smaDirSpan) ? -1 : 0

// conditions
// SMA Direction Trigger
dirUp = direction10 > 0 and direction20 > 0 and direction100 > 0 and direction200 > 0
dirDn = direction10 < 0 and direction20 < 0 and direction100 < 0 and direction200 < 0

longCond = (period10>period20) and (period20>period50) and (period50>period100) and  dirUp//and (close > period10) and (period50>period100) //and (period100>period200)
shortCond = (period10<period20) and (period20<period50) and dirDn//and (period50<period100) and (period100>period200)

longExit = crossunder(zlemaFast, zlemaSlow) or crossunder(period10, period20)
shortExit = crossover(zlemaFast, zlemaSlow) or crossover(period10, period20)


// entries and exits
startTimeOk() =>
    // get our input time together
    inputTime   = timestamp(syminfo.timezone, startYear, startMonth, startDay, startHour, startMinute)
    // check the current time is greater than the input time and assign true or false
    timeOk      = time > inputTime ? true : false
    // last line is the return value, we want the strategy to execute if..
    // ..we are using the limiter, and the time is ok -OR- we are not using the limiter
    r = (useTimeLimit and timeOk) or not useTimeLimit


if( true )
    // entries
    strategy.entry("long", strategy.long, when = longCond)
    strategy.entry("short", strategy.short, when = shortCond)

        
    // trailing stop
    if (useStop)
        strategy.exit("XL", from_entry = "long", trail_points = slPoints, trail_offset = slOffset)
        strategy.exit("XS", from_entry = "short", trail_points = slPoints, trail_offset = slOffset)

    // exits
    strategy.close("long", when = longExit)
    strategy.close("short", when = shortExit)
// === /STRATEGY ===