モメント・ムービング・平均クロスオーバー・トレード戦略

作者: リン・ハーンチャオチャン,日付: 2024-01-24 11:09:58
タグ:

img

概要

この戦略は,市場動向とエントリーポイントを決定するために,高速および遅い移動平均線間のクロスオーバーに基づいて取引信号を生成する.高速EMAが遅いEMAを超えると,市場は上昇傾向にあると判断され,購入信号が生成される.高速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)

もっと