기하급수적인 이동평균 및 MACD 지표에 기초한 전략

저자:차오장, 날짜: 2023-12-08 16:58:01
태그:

img

전반적인 설명

이 전략은 기하급수적인 이동 평균 및 MACD 지표의 브레이크아웃 신호와 긴 기간과 짧은 기간을 결합하여 트렌드를 따라와 평균 회전 거래를 통해 이익을 창출합니다.

전략 원칙

이 전략은 주로 다음을 기반으로 합니다.

  1. 주요 트렌드 방향을 결정하기 위해 200일 EMA를 계산합니다. 200-EMA 이상의 폐쇄 가격은 상승 추세를 나타냅니다. 아래는 하락 추세를 나타냅니다.

  2. 가장 높은 가격, 가장 낮은 가격 및 폐쇄 가격의 중간값을 기반으로 EMA를 계산하고, MACD 히스토그램을 구성하기 위해 EMA와 가장 높은 가격/최저 가격의 차이를 얻습니다.

  3. MACD 신호선을 만들기 위해 MACD 히스토그램의 9일 MA를 계산합니다.

  4. 매커드가 신호선을 넘을 때 구매 신호가 생성되며, 매커드가 신호선을 넘을 때 판매 신호가 생성됩니다.

  5. 주요 트렌드의 분석을 결합하여 시장이 새로운 트렌드의 시작인지 또는 단기적 역전인지 결정합니다.

장점

이 전략은 트렌드 따라와 평균 리버션 트레이딩을 결합하여 장기적인 트렌드를 추적하고 다양한 시장 조건에 대처하기 위해 단기적인 리버션 기회를 포착할 수 있습니다.

주요 장점은 다음과 같습니다.

  1. 200일 EMA는 주요 트렌드 방향을 결정합니다. 트렌드에 반하는 거래를 피합니다.

  2. MACD 지표는 단기 가격 변화에 민감하며 수익성 있는 반전 신호를 포착할 수 있습니다.

  3. MACD 구성 요소에 대한 다른 매개 변수는 시간 프레임에 걸쳐 거래 신호를 생성 할 수 있습니다.

  4. 단일 거래 손실을 효과적으로 제어하기 위해 스톱 손실 전략을 통합합니다.

위험성

주요 위험은 다음과 같습니다.

  1. 장기 및 단기 지표의 거래 신호 사이에 시간 차이는 존재할 수 있습니다. 주요 트렌드에 대한 판단은 중요합니다.

  2. MACD는 중등 반전 지표로서 강한 추세에서 저조한 성과를 낼 수 있습니다.

  3. 부적절한 스톱 로스 배치로 인해 조기 스톱 로스 트리거 또는 과대 손실이 발생할 수 있습니다.

  4. 너무 빈번한 신호는 더 많은 잘못된 신호를 가져올 수 있습니다.

해결책:

  1. MACD 매개 변수를 최적화하여 지표 감도를 조정합니다.

  2. 다른 지표를 결합하여 시장 상황을 결정하고 MACD 신호를 맹목적으로 따르지 마십시오.

  3. 스톱 로스 전략 매개 변수를 테스트하고 최적화합니다.

  4. 가짜 신호를 줄이기 위해 필터를 추가합니다.

최적화 방향

전략은 다음과 같이 최적화 될 수 있습니다.

  1. 더 효과적인 거래 신호를 얻기 위해 이동 평균과 MACD의 매개 변수를 최적화하십시오.

  2. 전략의 효율성을 높이기 위해 부피, RSI와 같은 다른 지표를 추가합니다.

  3. 각 거래에 대한 고정된 양보다는 포지션 사이즈 규칙을 설정하십시오.

  4. 스톱 로스 외에도 더 고급한 출구 규칙을 추가합니다. 예를 들어, 수익 목표, 트레일 스톱.

  5. 더 현실적인 수수료 설정으로 실제 거래를 시뮬레이션합니다.

  6. 앞으로 걸어서 분석하고 신뢰성을 높이기 위해 견고성 테스트를 수행합니다.

결론

이 전략은 트렌드 추종 및 평균 반전 거래를 균형있게합니다. 본질은 적절한 매개 변수 조정과 주요 트렌드의 올바른 이해에 있습니다. 매개 변수를 최적화하고 필터를 추가함으로써 전략은 더 나은 거래 신호 판단을 수행하고 더 안정적인 이익을 얻을 수 있습니다. 전반적으로,이 전략은 높은 통합 수준과 유망한 응용 가능성을 가지고 있습니다.


/*backtest
start: 2022-12-01 00:00:00
end: 2023-12-07 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("Strategia EMA + Impulse MACD", shorttitle="EMA+IMACD", overlay=true)

// Impostazioni
ema_length = input(200, title="Periodo EMA a 200", type=input.integer)
lengthMA = input(34, title="Periodo EMA", type=input.integer)
lengthSignal = input(9, title="Periodo Signal", type=input.integer)
lengthImpulseMACD = input(12, title="Periodo Impulse MACD", type=input.integer)
lengthImpulseMACDSignal = input(9, title="Periodo Impulse MACD Signal", type=input.integer)
stopLossPeriod = input(20, title="Periodo Stop Loss", type=input.integer)

var float ema200 = na
if bar_index >= ema_length
    ema200 := ema(close, ema_length)

// Impulse MACD
var float hi = na
var float lo = na
var float mi = na
var float impulseMACD = na
var float impulseMACDSignal = na

calc_smma(src, len) =>
    var float smma = na
    if na(smma)
        smma := sma(src, len)
    else
        smma := (smma[1] * (len - 1) + src) / len
    smma

calc_zlema(src, length) =>
    ema1 = ema(src, length)
    ema2 = ema(ema1, length)
    d = ema1 - ema2
    ema1 + d

if bar_index >= lengthMA
    src = hlc3
    hi := calc_smma(high, lengthMA)
    lo := calc_smma(low, lengthMA)
    mi := calc_zlema(src, lengthMA)

    impulseMACD := (mi > hi) ? (mi - hi) : (mi < lo) ? (mi - lo) : 0
    impulseMACDSignal := sma(impulseMACD, lengthSignal)

// Calcolo dello stop loss
var float stopLossLong = na
var float stopLossShort = na

stopLossLong := lowest(low, stopLossPeriod)
stopLossShort := highest(high, stopLossPeriod)

// Calcolo del take profit
var float takeProfitLong = na
var float takeProfitShort = na

if not na(stopLossLong)
    takeProfitLong := close + (close - stopLossLong) * 1.5
if not na(stopLossShort)
    takeProfitShort := close - (stopLossShort - close) * 1.5

// Condizioni per aprire una posizione long
longCondition = not na(ema200) and not na(impulseMACD) and not na(impulseMACDSignal) and close > ema200 and impulseMACD < 0 and impulseMACDSignal < 0 and crossover(impulseMACD, impulseMACDSignal)

// Condizioni per aprire una posizione short
shortCondition = not na(ema200) and not na(impulseMACD) and not na(impulseMACDSignal) and close < ema200 and impulseMACD > 0 and impulseMACDSignal > 0 and crossunder(impulseMACD, impulseMACDSignal)

// Disegna l'EMA 200 sul grafico
plot(ema200, color=color.blue, title="EMA 200")

// Imposta lo stop loss e il take profit
strategy.entry("Long", strategy.long, when=longCondition)
strategy.entry("Short", strategy.short, when=shortCondition)
strategy.exit("Take Profit/Stop Loss Long", from_entry="Long", stop=stopLossLong, limit=takeProfitLong)
strategy.exit("Take Profit/Stop Loss Short", from_entry="Short", stop=stopLossShort, limit=takeProfitShort)

// Impulse MACD
plot(0, color=color.gray, linewidth=1, title="MidLine")
plot(impulseMACD, color=color.red, linewidth=2, title="ImpulseMACD", style=plot.style_histogram)
plot(impulseMACDSignal, color=color.blue, linewidth=2, title="ImpulseMACDSignal", style=plot.style_histogram)

// Disegna le operazioni long e short sul grafico
plotshape(series=longCondition, location=location.belowbar, color=color.green, style=shape.triangleup, title="Long Entry")
plotshape(series=shortCondition, location=location.abovebar, color=color.red, style=shape.triangledown, title="Short Entry")


더 많은