EMA 이중 이동 평균 교차 동적 손절매 및 손절매 양적 거래 전략

EMA
생성 날짜: 2024-11-18 15:53:49 마지막으로 수정됨: 2024-11-18 15:53:49
복사: 5 클릭수: 611
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

개요

이 전략은 동적 스톱 스로드 메커니즘과 결합된 평행선 교차를 기반으로 한 양적 거래 시스템입니다. 전략의 핵심은 10주기 및 26주기 지수 이동 평균 ((EMA) 의 교차를 통해 시장 추세를 식별하고 회귀 시 거래하는 것입니다. 시스템은 고정된 스톱 스로드 지점 설정을 사용하여 엄격한 위험 제어로 자금을 보호합니다. 이 전략은 특히 변동성이 높은 거래 품종에 적합합니다.

전략 원칙

이 전략은 두 개의 다른 주기적 EMA 평균선을 핵심 지표로 사용한다: 단기 10 주기 EMA와 장기 26 주기 EMA. 단기 평균선이 상향으로 장기 평균선을 통과하면, 시스템은 상승 추세로 인식하여 구매 신호를 생성한다. 단기 평균선이 하향으로 장기 평균선을 통과하면, 시스템은 하향 추세로 인식하여 판매 신호를 생성한다.

전략적 이점

  1. 신호 명확성: 거래 신호로 평행선 교차를 사용, 규칙은 간단하고 명확하며 실행 및 모니터링이 용이하다
  2. 위험 조절 가능: 고정된 스톱 스톱 손실 지점을 사용하여 거래 당 위험을 효과적으로 제어할 수 있습니다.
  3. 트렌드 추적: 평평선 교차와 가격 회정을 결합하여, 트렌드적인 행태를 더 잘 파악할 수 있다
  4. 자동화 수준: 전략 논리가 명확하고 거래 자동화를 프로그래밍하기 쉽습니다.
  5. 적응력: 다양한 거래 품종, 특히 변동률이 높은 품종에 적합하다

전략적 위험

  1. 변동 시장의 위험: 변동 시장에서 종종 잘못된 신호가 발생할 수 있습니다.
  2. 슬라이드 리스크: 시장의 격렬한 변동으로 인해 큰 슬라이드 위험이 발생할 수 있습니다.
  3. 스톱 로즈 위험: 고정 스톱 로즈는 특정 시장 조건에서 유연하지 않을 수 있습니다.
  4. 신호 지연: 평행선 교차 신호는 약간의 지연성을 가지고 있으며, 최적의 입구 지점을 놓칠 수 있다.
  5. 자금 관리 위험: 거래당 자금 비율을 합리적으로 통제해야 합니다.

전략 최적화 방향

  1. 동적 스톱: 시장의 변동에 따라 동적으로 스톱 위치를 조정하는 것을 고려할 수 있습니다.
  2. 신호 필터링: 거래량, 변동률 등의 보조 지표를 증가시켜 가짜 신호를 필터링한다.
  3. 시간 필터링: 거래 시간 필터를 추가하여 격렬한 변동이 발생하는 시간을 피하십시오.
  4. 포지션 관리: 부분적인 차단 장치를 추가하여 일부 포지션을 유지하여 트렌드를 계속 추적할 수 있습니다.
  5. 자금 관리: 계정 순액에 따라 거래 규모를 자동으로 조정하는 동적 자금 관리 시스템을 추가합니다.

요약하다

이 전략은 EMA 평평선 교차와 가격 회귀를 결합하여 완전한 거래 시스템을 구축한다. 전략 설계는 간단하고 직관적이며, 위험 통제는 명확하며, 변동성이 높은 거래 품종에 적합하다. 합리적인 최적화와 파라미터 조정으로 이 전략은 실물 거래에서 안정적인 수익을 얻을 수 있다.

전략 소스 코드
/*backtest
start: 2023-11-18 00:00:00
end: 2024-11-17 00:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("30 Pips Target & 15 Pips Stop-Loss with One Signal at a Time", overlay=true)

// Define settings for target and stop-loss in pips
target_in_pips = 30
stoploss_in_pips = 10

// Convert pips to price value based on market (for forex, 1 pip = 0.0001 for major pairs like GBP/JPY)
pip_value = syminfo.mintick * 10  // For forex, 1 pip = 0.0001 or 0.01 for JPY pairs
target_value = target_in_pips * pip_value
stoploss_value = stoploss_in_pips * pip_value

// Define EMAs (10-EMA and 26-EMA) for the crossover strategy
ema10 = ta.ema(close, 10)
ema26 = ta.ema(close, 26)

// Buy signal: when 10 EMA crosses above 26 EMA
longCondition = ta.crossover(ema10, ema26)
// Sell signal: when 10 EMA crosses below 26 EMA
shortCondition = ta.crossunder(ema10, ema26)

// Define price levels with explicit type float
var float long_entry_price = na
var float long_take_profit = na
var float long_stop_loss = na
var float short_entry_price = na
var float short_take_profit = na
var float short_stop_loss = na

// Variable to track if a trade is active
var bool inTrade = false

// Check if the trade hit stop loss or take profit
if (inTrade)
    if (not na(long_take_profit) and close >= long_take_profit)
        inTrade := false  // Exit the trade after hitting target
        long_entry_price := na
        long_take_profit := na
        long_stop_loss := na
        strategy.close("Long")

    if (not na(long_stop_loss) and close <= long_stop_loss)
        inTrade := false  // Exit the trade after hitting stoploss
        long_entry_price := na
        long_take_profit := na
        long_stop_loss := na
        strategy.close("Long")

    if (not na(short_take_profit) and close <= short_take_profit)
        inTrade := false  // Exit the trade after hitting target
        short_entry_price := na
        short_take_profit := na
        short_stop_loss := na
        strategy.close("Short")

    if (not na(short_stop_loss) and close >= short_stop_loss)
        inTrade := false  // Exit the trade after hitting stoploss
        short_entry_price := na
        short_take_profit := na
        short_stop_loss := na
        strategy.close("Short")

// Only generate new signals if not already in a trade
if (not inTrade)
    if (longCondition)
        long_entry_price := close
        long_take_profit := close + target_value
        long_stop_loss := close - stoploss_value
        strategy.entry("Long", strategy.long)  // Enter a long trade
        strategy.exit("Take Profit/Stop Loss", "Long", limit=long_take_profit, stop=long_stop_loss)
        inTrade := true  // Mark trade as active

    if (shortCondition)
        short_entry_price := close
        short_take_profit := close - target_value
        short_stop_loss := close + stoploss_value
        strategy.entry("Short", strategy.short)  // Enter a short trade
        strategy.exit("Take Profit/Stop Loss", "Short", limit=short_take_profit, stop=short_stop_loss)
        inTrade := true  // Mark trade as active

// Plot the levels on the chart only when in a trade
plot(inTrade and not na(long_take_profit) ? long_take_profit : na, color=color.green, linewidth=2, style=plot.style_linebr, title="Take Profit (Long)")
plot(inTrade and not na(long_stop_loss) ? long_stop_loss : na, color=color.red, linewidth=2, style=plot.style_linebr, title="Stop Loss (Long)")

plot(inTrade and not na(short_take_profit) ? short_take_profit : na, color=color.green, linewidth=2, style=plot.style_linebr, title="Take Profit (Short)")
plot(inTrade and not na(short_stop_loss) ? short_stop_loss : na, color=color.red, linewidth=2, style=plot.style_linebr, title="Stop Loss (Short)")

plotshape(series=longCondition and not inTrade, title="Buy Signal", location=location.belowbar, color=color.green, style=shape.labelup, text="Buy")
plotshape(series=shortCondition and not inTrade, title="Sell Signal", location=location.abovebar, color=color.red, style=shape.labeldown, text="Sell")