ダイナミック・トレイル・ストップ・ロスのモメント・クロスオーバー戦略

作者: リン・ハーンチャオチャン,日付: 2024-02-29 13:55:16
タグ:

img

概要

この戦略は,移動平均指標と指向動向指標 (DMI) を組み合わせて,二重指標クロスオーバーに基づく買い売り信号を生成する.また,リスク管理のために動的なトライリングストップロスを組み込む.

戦略の論理

  1. 短い9日間のEMAと長い21日間のEMAを使用して移動平均指標を構築する.短いEMAが長いEMAを横切ったときに購入信号が生成される.短いEMAが長いEMAを下回ったときに販売信号が生成される.
  2. ADX,+DI,−DI を使って DMI インジケーターを構築する. +DI が −DI を越えると買い信号が起動する. −DI が +DI を越えると売り信号が起動する.
  3. EMA と DMI の信号を組み合わせ,実際の買い買い・売り信号を発行する前に,両方の指標が条件を満たすことを要求する.
  4. ストップ・ロスの最も高い価格/最も低い価格を追跡するために動的なストップ・ロスを使用します.

利点分析

  1. 二重指標コンボは偽信号をフィルタリングし,信号の精度を向上させる.短期指標はトレンドの変化を捉え,長期指標は全体的な方向性を決定する.
  2. モメントインジケーターは トレンドシフトを早期に捉えることができます
  3. ダイナミック・トライル・ストップ・ロスは リスクをコントロールしながら できるだけ利益を確保します

リスク分析

  1. 信号の周波数が減少し 機会が失われる可能性があります
  2. 指標のパラメータ調節が不十分である場合,過剰な取引または低品質の信号を引き起こす可能性があります.
  3. ストップロスの設定が幅が大きすぎると損失リスクが増加し,幅が狭すぎるとトレンド断絶リスクが増加します.

オプティマイゼーションの方向性

  1. EMA コンボを短期間と長期間の異なる長さでテストし,最適な値を見つけます.
  2. ADX パラメータを最適化して DMI 信号品質を向上させる.
  3. リスクを管理しながら 利益を確保するために ストップ損失パラメータを調整します
  4. 信号の質をさらに向上させるために,より多くのフィルターを追加することを検討してください.

結論

この戦略は,シグナルの二重確認のために移動平均値とモメント指標の強みを組み合わせ,収益性を高めるために互いを補完する.一方,ダイナミックトレーリングストップロスはリスクを効果的に制御する.さらなるパラメータ最適化と戦略の精製は収益性と安定性の両方を向上させることができる.


/*backtest
start: 2023-02-22 00:00:00
end: 2024-02-28 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Combined EMA and DMI Strategy with Enhanced Table", overlay=true)

// Input parameters for EMA
shortTermEMA = input.int(9, title="Short-Term EMA Period")
longTermEMA = input.int(21, title="Long-Term EMA Period")
riskPercentageEMA = input.float(1, title="Risk Percentage EMA", minval=0.1, maxval=5, step=0.1)

// Calculate EMAs
emaShort = ta.ema(close, shortTermEMA)
emaLong = ta.ema(close, longTermEMA)

// EMA Crossover Strategy
longConditionEMA = emaShort > emaLong and emaShort[1] <= emaLong[1]
shortConditionEMA = emaShort < emaLong and emaShort[1] >= emaLong[1]

// Input parameters for DMI
adxlen = input(17, title="ADX Smoothing")
dilen = input(17, title="DI Length")

// DMI Logic
dirmov(len) =>
    up = ta.change(high)
    down = -ta.change(low)
    truerange = ta.tr
    plus = fixnan(100 * ta.rma(up > down and up > 0 ? up : 0, len) / truerange)
    minus = fixnan(100 * ta.rma(down > up and down > 0 ? down : 0, len) / truerange)
    [plus, minus]

adx(dilen, adxlen) => 
    [plus, minus] = dirmov(dilen)
    sum = plus + minus
    adxValue = 100 * ta.rma(math.abs(plus - minus) / (sum == 0 ? 1 : sum), adxlen)
    [adxValue, plus, minus]

[adxValue, up, down] = adx(dilen, adxlen)

// DMI Conditions
buyConditionDMI = up > down or (up and adxValue > down)
sellConditionDMI = down > up or (down and adxValue > up)

// Combined Conditions for Entry
longEntryCondition = longConditionEMA and buyConditionDMI
shortEntryCondition = shortConditionEMA and sellConditionDMI

// Combined Conditions for Exit
longExitCondition = shortConditionEMA
shortExitCondition = longConditionEMA

// Enter long trade based on combined conditions
if (longEntryCondition)
    strategy.entry("Long", strategy.long)

// Enter short trade based on combined conditions
if (shortEntryCondition)
    strategy.entry("Short", strategy.short)

// Exit trades
if (longExitCondition)
    strategy.close("Long")

if (shortExitCondition)
    strategy.close("Short")

// Plot EMAs
plot(emaShort, color=color.blue, title="Short-Term EMA")
plot(emaLong, color=color.red, title="Long-Term EMA")

// Create and fill the enhanced table
var tbl = table.new(position.top_right, 4, 1)
if (barstate.islast)
    table.cell(tbl, 0, 0, "ADX: " + str.tostring(adxValue), bgcolor=color.new(color.red, 90), width=15, height=4)
    table.cell(tbl, 1, 0, "+DI: " + str.tostring(up), bgcolor=color.new(color.blue, 90), width=15, height=4)
    table.cell(tbl, 2, 0, "-DI: " + str.tostring(down), bgcolor=color.new(color.orange, 90), width=15, height=4)

   

もっと