モメンタム移動平均取引戦略


作成日: 2024-01-24 11:09:58 最終変更日: 2024-01-24 11:09:58
コピー: 0 クリック数: 614
1
フォロー
1617
フォロワー

モメンタム移動平均取引戦略

概要

この戦略は,速いと遅い移動平均の交差を基に市場のトレンドと買出点を判断する.速いEMAを横断すると市場が上昇傾向にあると判断し,買入シグナルを生む.速いEMAを横断すると市場が下降傾向にあると判断し,販売シグナルを生む.この戦略は,リスク管理のためにストップ・ロズとストップ・価格も設定する.

戦略原則

この戦略は,急速なEMA ((8日線) と遅いEMA ((21日線) の交差を用い,市場動向を判断する.具体的論理は:

  1. 8日EMAと21日EMAを計算する
  2. 8日のEMAが21日のEMAを突破すると,市場が変化し,上昇傾向が始まる.
  3. 8日のEMAが21日のEMAを横切ったとき,市場転換と判断され,下降傾向が始まる.
  4. 上昇傾向では,買取シグナルを生成し,下降傾向では,売出シグナルを生成します.
  5. オーダーごとにリスクを管理するために,ストップ・ロズとストップ・ストップ・価格を設定します.

この戦略は,動量指標とトレンド分析を組み合わせて,市場の方向と逆転点を効果的に捉えます. 速いEMAの交差と,平らな移動平均を組み合わせて,一部のノイズ取引信号をフィルターすることができます.

優位分析

この戦略の主な利点は以下の通りです.

  1. 速いEMAと遅いEMAの交差は,市場動向と買い買い点を判断するのに有効です
  2. 戦略パラメータの最適化余地があり,EMA周期はさらに調整できます.
  3. 動量指数と組み合わせて,ノイズ信号を効率的にフィルタリング
  4. ストップダストストップロジックを設定し,リスクを積極的に制御できます.

全体として,この戦略は,トレンドと動態指標を組み合わせ,パラメータを調整することで異なる市場環境に適応し,比較的柔軟なショートライン取引戦略である.

リスク分析

この戦略にはいくつかのリスクがあります.

  1. EMAの交差信号は頻繁に発生し,誤った取引が多く発生します.
  2. 飛び込み穴の発生を 効果的に処理できない状況
  3. 長期的傾向を考慮しない

このリスクに対して,以下のような方法で最適化することができます.

  1. ブリンバンド,KDJなどの他の指標フィルターを追加して,誤信号の確率を減らす
  2. 長期的傾向を判断するより大きなレベルの周期指標と組み合わせる
  3. パラメータを最適化し,異なる市場状況に合わせてEMAの長さを調整する
  4. 人工干渉取引,空白の隙間を避けるため,最大損失を防ぐ

最適化の方向

この戦略の最適化には,以下の方向から多くの余地があります.

  1. EMAサイクルパラメータを最適化し,異なるパラメータのリターン率を歴史的データでテストする
  2. KDJ,MACDなどの他の技術指標のフィルタリングを追加して,戦略の正確性を向上させる
  3. ストップダストの設定を最適化して,状況特性に合わせた
  4. 機械学習によるパラメータの自動最適化

これらの最適化策は,戦略の安定性,適応性,収益性を大幅に向上させることができます.

要約する

この戦略は,全体として,トレンドフォローと動向指標の交差に基づく典型的なショートライン取引戦略である.この戦略は,EMAの高速・スローライン交差とストップ・ストップの論理を組み合わせて,市場の方向性の機会を迅速に捕捉することができる.この戦略の最適化スペースは広大である.他の補助指標,自動パラメータ最適化などの手段をさらに導入すれば,戦略のパフォーマンスをより安定して優れたものにすることができる.この戦略は,市場について確実な知識があり,頻繁な操作を望む投資家に適している.

ストラテジーソースコード
/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © TradersPostInc

//@version=5
strategy('TradersPost Example MOMO Strategy', overlay=true)

startTime = input(defval = timestamp('01 Jan 2021 00:00 +0000'), title = 'Start Time', group = 'Date Range')
endTime = input(defval = timestamp('31 Dec 2023 23:59 +0000'), title = 'End Time', group = 'Date Range')
timeCondition = true
timeConditionEnd = timeCondition[1] and not timeCondition

fastEmaLength = input.int(defval = 8, title = 'Fast EMA Length')
slowEmaLength = input.int(defval = 21, title = 'Slow EMA Length')
sides = input.string(defval = 'Both', title = 'Sides', options = ['Long', 'Short', 'Both', 'None'])

fastEma = ta.ema(close, fastEmaLength)
slowEma = ta.ema(close, slowEmaLength)

isUptrend = fastEma >= slowEma
isDowntrend = fastEma <= slowEma
trendChanging = ta.cross(fastEma, slowEma)

ema105 = request.security(syminfo.tickerid, '30', ta.ema(close, 105)[1], barmerge.gaps_off, barmerge.lookahead_on)
ema205 = request.security(syminfo.tickerid, '30', ta.ema(close, 20)[1], barmerge.gaps_off, barmerge.lookahead_on)
plot(ema105, linewidth=4, color=color.new(color.purple, 0), editable=true)
plot(ema205, linewidth=2, color=color.new(color.purple, 0), editable=true)

aa = plot(fastEma, linewidth=3, color=color.new(color.green, 0), editable=true)
bb = plot(slowEma, linewidth=3, color=color.new(color.red, 0), editable=true)
fill(aa, bb, color=isUptrend ? color.green : color.red, transp=90)

tradersPostBuy = trendChanging and isUptrend and timeCondition
tradersPostSell = trendChanging and isDowntrend and timeCondition

pips = syminfo.pointvalue / syminfo.mintick

percentOrPipsInput = input.string('Percent', title='Percent or Pips', options=['Percent', 'Pips'])

stopLossLongInput = input.float(defval=0, step=0.01, title='Stop Loss Long', minval=0)
stopLossShortInput = input.float(defval=0, step=0.01, title='Stop Loss Short', minval=0)

takeProfitLongInput = input.float(defval=0, step=0.01, title='Target Profit Long', minval=0)
takeProfitShortInput = input.float(defval=0, step=0.01, title='Target Profit Short', minval=0)

stopLossPriceLong = ta.valuewhen(tradersPostBuy, close, 0) * (stopLossLongInput / 100) * pips
stopLossPriceShort = ta.valuewhen(tradersPostSell, close, 0) * (stopLossShortInput / 100) * pips

takeProfitPriceLong = ta.valuewhen(tradersPostBuy, close, 0) * (takeProfitLongInput / 100) * pips
takeProfitPriceShort = ta.valuewhen(tradersPostSell, close, 0) * (takeProfitShortInput / 100) * pips

takeProfitALong = takeProfitLongInput > 0 ? takeProfitLongInput : na
takeProfitBLong = takeProfitPriceLong > 0 ? takeProfitPriceLong : na

takeProfitAShort = takeProfitShortInput > 0 ? takeProfitShortInput : na
takeProfitBShort = takeProfitPriceShort > 0 ? takeProfitPriceShort : na

stopLossALong = stopLossLongInput > 0 ? stopLossLongInput : na
stopLossBLong = stopLossPriceLong > 0 ? stopLossPriceLong : na

stopLossAShort = stopLossShortInput > 0 ? stopLossShortInput : na
stopLossBShort = stopLossPriceShort > 0 ? stopLossPriceShort : na

takeProfitLong = percentOrPipsInput == 'Pips' ? takeProfitALong : takeProfitBLong
stopLossLong = percentOrPipsInput == 'Pips' ? stopLossALong : stopLossBLong
takeProfitShort = percentOrPipsInput == 'Pips' ? takeProfitAShort : takeProfitBShort
stopLossShort = percentOrPipsInput == 'Pips' ? stopLossAShort : stopLossBShort

buyAlertMessage = '{"ticker": "' + syminfo.ticker + '", "action": "buy", "price": ' + str.tostring(close) + '}'
sellAlertMessage = '{"ticker": "' + syminfo.ticker + '", "action": "sell", "price": ' + str.tostring(close) + '}'

exitLongAlertMessage = '{"ticker": "' + syminfo.ticker + '", "action": "exit", "price": ' + str.tostring(close) + '}'
exitShortAlertMessage = '{"ticker": "' + syminfo.ticker + '", "action": "exit", "price": ' + str.tostring(close) + '}'

if (sides != "None")
    if tradersPostBuy
        strategy.entry('Long', strategy.long, when = sides != 'Short', alert_message = buyAlertMessage)
        strategy.close('Short', when = sides == "Short" and timeCondition, alert_message = exitShortAlertMessage)

    if tradersPostSell
        strategy.entry('Short', strategy.short, when = sides != 'Long', alert_message = sellAlertMessage)
        strategy.close('Long', when = sides == 'Long', alert_message = exitLongAlertMessage)

exitAlertMessage = '{"ticker": "' + syminfo.ticker + '", "action": "exit"}'

strategy.exit('Exit Long', from_entry = "Long", profit = takeProfitLong, loss = stopLossLong, alert_message = exitAlertMessage)
strategy.exit('Exit Short', from_entry = "Short", profit = takeProfitShort, loss = stopLossShort, alert_message = exitAlertMessage)

strategy.close_all(when = timeConditionEnd)