동적 트레일링 스톱 손실과 함께 모멘텀 크로스오버 전략

저자:차오장, 날짜: 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. DMI 신호 품질을 향상시키기 위해 ADX 매개 변수를 최적화합니다.
  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)

   

더 많은