モメンタムトレーディング: ダブル移動平均クロスオーバー戦略


作成日: 2024-04-01 11:53:14 最終変更日: 2024-04-01 11:53:14
コピー: 4 クリック数: 597
1
フォロー
1617
フォロワー

モメンタムトレーディング: ダブル移動平均クロスオーバー戦略

概要

この戦略は,8周期と21周期の指数移動平均 (((EMA) を用いて市場傾向の変化を識別する.より短い周期のEMAがより長い周期のEMAを下から横切るとき,買いの信号を生じ;逆に,より短い周期のEMAがより長い周期のEMAを上から横切るとき,売りの信号を生じする.この戦略は,さらにトレンドの逆転をさらに確認する信号として,3つの連続したより高い低値 (((HLL) と3つの連続したより低い高値 (((LLH) を組み合わせる.さらに,この戦略は,リスクを制御し,利潤をロックするために,ストップ・ロズとストップ・ストップのレベルを設定する.

戦略原則

  1. 主なトレンドの方向を識別するために,8周期と21周期のEMAを計算する.
  2. トレンドの逆転の早期信号として,3つの連続したより高い低点 ((HLL) と3つの連続したより低い高点 ((LLH) を識別する.
  3. 8周期EMAが下から21周期EMAを突破し,HLLの突破が発生すると,買入シグナルが生じます. 8周期EMAが上から21周期EMAを突破し,LLHの突破が発生すると,売出シグナルが生じます.
  4. リスク管理と利益のロックをするために,入場価格の5%のストップ・ローズレベルと入場価格の16%のストップ・ローズレベルを設定します.
  5. 逆転の信号が出ると,平仓を入れ,逆転してポジションを開きます.

戦略的優位性

  1. EMAと価格行動パターン ((HLLとLLH) を組み合わせてトレンドを確認し,信号の信頼性を高めます.
  2. リスクの管理と利益の確保に役立つ明確なストップ・ロズとストップ・ストップのレベルを設定します.
  3. 複数の時間枠と異なる市場に適用され,ある程度の普遍性があります.
  4. 論理が明確で,理解し,実行しやすい.

戦略リスク

  1. 波動的な市場では,頻繁に交差すると,誤信号が繰り返し発生し,損失を招く可能性があります.
  2. 固定のストップ・ロズとストップ・ストップレベルは,異なる市場環境に適応できない可能性があり,潜在的な機会コストやより大きな損失を引き起こす.
  3. 戦略は過去のデータに依存し,突発的な出来事や根本的な変化に対して適応性が低い可能性があります.

戦略最適化の方向性

  1. 変動率 (ATRなど) をベースにした自律的な止損と停止の仕組みを導入し,異なる市場状況に適した止損と停止のレベルを調整する.
  2. 取引量,相対強さ指数 (RSI) などの他の指標または要因と組み合わせて,信号をさらにフィルタリングし,信頼性を向上させる.
  3. パラメータ (EMA周期,ストップ・ストップ比率など) を最適化して,特定の市場または指標上で最適のパフォーマンスを示すパラメータの組み合わせを見つけます.
  4. ポジションサイジングなどのリスク管理策の導入を考慮し,単一取引のリスクのを制御する.

要約する

この戦略は,8サイクルと21サイクルEMAの交差を活用し,HLLとLLHの価格モデルを組み合わせて,トレンドの逆転を認識し,取引シグナルを生成する.明確なストップ・ストップル規則は,リスクを制御し,利益をロックするのに役立ちます.しかし,この戦略は,不安定な市場で偽のシグナルを生成し,固定ストップ・ストップのレベルも,異なる市場環境に適応できない可能性があります.さらなる改善のために,適応ストップ・ストップを導入し,他の指標を組み合わせ,パラメータを最適化し,リスク管理措置を導入することを検討することができます.

ストラテジーソースコード
/*backtest
start: 2023-03-26 00:00:00
end: 2024-03-31 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy('Trend Following 8&21EMA with strategy tester [ukiuro7]', overlay=true, process_orders_on_close=true, calc_on_every_tick=true, initial_capital = 10000)

//INPUTS
lh3On = true
hl3On = true
emaOn = input(title='105ema / 30min', defval=true) 
assistantOn = input(title='Assistant', defval=true)
textOn = input(title='Text', defval=true)

showRiskReward = input.bool(true, title='Show Risk/Reward Area', group="TP/SL")
stopPerc = input.float(5.0, step=0.1, minval=0.1, title='Stop-Loss %:',group="TP/SL") / 100
tpPerc = input.float(16.0, step=0.1, minval=0.1, title='Take-Profit %:',group="TP/SL") / 100

backtestFilter = input(false, title='Backtest Entries to Date Range',group="Backtest Date Range")
i_startTime = input(defval=timestamp('01 Jan 2022 00:00'), inline="b_1", title='Start',group="Backtest Date Range")
i_endTime = input(defval=timestamp('01 Jan 2029 00:00'), inline="b_1", title='End',group="Backtest Date Range")
inDateRange = true

message_long_entry = input.string(title='Alert Msg: LONG Entry', defval ='', group='Alert Message')
message_short_entry = input.string(title='Alert Msg: SHORT Entry', defval='', group='Alert Message')
message_long_exit = input.string(title='Alert Msg: LONG SL/TP', defval='', group='Alert Message')
message_short_exit = input.string(title='Alert Msg: SHORT SL/TP', defval='', group='Alert Message')  

//CALCS
threeHigherLows() =>
    low[0] >= low[1] and low[1] >= low[2]

threeLowerHighs() =>
    high[2] >= high[1] and high[1] >= high[0]

breakHigher() =>
    padding = timeframe.isintraday ? .02 : .1
    high >= high[1] + padding

breakLower() =>
    padding = timeframe.isintraday ? .02 : .1
    low <= low[1] - padding

lh3 = threeLowerHighs() and lh3On
lh3bh = lh3[1] and breakHigher() and lh3On

hl3 = threeHigherLows() and hl3On
hl3bl = hl3[1] and breakLower() and hl3On

ema8 = ta.ema(close, 8)
ema21 = ta.ema(close, 21)

//VARS
var float longStop = na, var float longTp = na
var float shortStop = na, var float shortTp = na

//CONDS
isUptrend = ema8 >= ema21
isDowntrend = ema8 <= ema21
trendChanging = ta.cross(ema8, ema21)

buySignal = lh3bh and lh3[2] and lh3[3] and isUptrend and timeframe.isintraday
sellSignal = hl3bl and hl3[2] and hl3[3] and isDowntrend and timeframe.isintraday

goingDown = hl3 and isDowntrend and timeframe.isintraday
goingUp = lh3 and isUptrend and timeframe.isintraday

projectXBuy = trendChanging and isUptrend
projectXSell = trendChanging and isDowntrend

longCond = trendChanging and isUptrend and assistantOn
shortCond = trendChanging and isDowntrend and assistantOn

//STRATEGY
if shortCond and strategy.position_size > 0 and barstate.isconfirmed
    strategy.close('Long', comment='CLOSE LONG', alert_message=message_long_exit)

if longCond and strategy.position_size < 0 and barstate.isconfirmed
    strategy.close('Short', comment='CLOSE SHORT', alert_message=message_short_exit) 

if longCond and strategy.position_size <= 0 and barstate.isconfirmed and inDateRange
    longStop := close * (1 - stopPerc)
    longTp := close * (1 + tpPerc)
    strategy.entry('Long', strategy.long, comment='LONG', alert_message=message_long_entry)
    strategy.exit('Long Exit', 'Long', comment_loss="SL LONG", comment_profit = "TP LONG", stop=longStop, limit=longTp, alert_message=message_long_exit)

if shortCond and strategy.position_size >= 0 and barstate.isconfirmed and inDateRange
    shortStop := close * (1 + stopPerc)
    shortTp := close * (1 - tpPerc)
    strategy.entry('Short', strategy.short, comment='SHORT', alert_message=message_short_entry)
    strategy.exit('Short Exit', 'Short', comment_loss="SL SHORT", comment_profit="TP SHORT", stop=shortStop, limit=shortTp, alert_message=message_short_exit)

//PLOTS
plotshape(longCond, style=shape.triangleup, location=location.belowbar, color=color.new(color.green, 0), size=size.small, text='Buy')
plotshape(shortCond, style=shape.triangledown, location=location.abovebar, color=color.new(color.red, 0), size=size.small, text='Sell')
plotchar(trendChanging and isUptrend and close < open and assistantOn, char='!', location=location.abovebar, color=color.new(color.green, 0), size=size.small)

aa = plot(ema8, linewidth=3, color=color.new(color.green, 0), editable=true)
bb = plot(ema21, linewidth=3, color=color.new(color.red, 0), editable=true)
fill(aa, bb, color=isUptrend ? color.new(color.green,90) : color.new(color.red,90))
buyZone = isUptrend and lh3 and high < ema21 and timeframe.isintraday
sellZone = isDowntrend and hl3 and low > ema21 and timeframe.isintraday

L1 = plot(showRiskReward and strategy.position_size > 0 ? strategy.position_avg_price : na, color=color.new(color.green, 0), linewidth=1, style=plot.style_linebr, title='Long Entry Price')
L2 = plot(showRiskReward and strategy.position_size > 0 ? longTp : na, color=color.new(color.green, 0), linewidth=1, style=plot.style_linebr, title='Long TP Price')
L3 = plot(showRiskReward and strategy.position_size > 0 ? longStop : na, color=color.new(color.red, 0), linewidth=1, style=plot.style_linebr, title='Long Stop Price')

S1 = plot(showRiskReward and strategy.position_size < 0 ? strategy.position_avg_price : na, color=color.new(color.teal, 0), linewidth=1, style=plot.style_linebr, title='Short Entry Price')
S2 = plot(showRiskReward and strategy.position_size < 0 ? shortTp : na, color=color.new(color.teal, 0), linewidth=1, style=plot.style_linebr, title='Short TP Price')
S3 = plot(showRiskReward and strategy.position_size < 0 ? shortStop : na, color=color.new(color.maroon, 0), linewidth=1, style=plot.style_linebr, title='Short Stop Price')

fill(L1, L2, color=color.new(color.green, 90))
fill(L1, L3, color=color.new(color.red, 90))
fill(S1, S2, color=color.new(color.teal, 90))
fill(S1, S3, color=color.new(color.maroon, 90))

bgcolor(inDateRange == false ? color.new(color.red,90) : na, title="Backtest Off-Range")