
이중 지수 이동 평균 다목적 거래 전략은 단기 및 장기 지수 이동 평균 ((EMA) 의 교차 신호를 기반으로 한 정량 거래 시스템이다. 이 전략은 9주기 및 21주기 EMA의 교차를 입시 신호로 사용하고 있으며, 최대 10개의 수익 목표와 수익을 극대화하기 위해 스톱로스를 설정한다. 이 전략은 다목적 쌍방향 거래를 동시에 지원하며, EMA가 단기 상에서 장기 EMA를 통과할 때 더 많이 열리고, 단기 EMA가 장기 EMA를 통과할 때 공백하고, 역 교차할 때 퇴출한다.
이 전략의 핵심 원칙은 지수 이동 평균 교차 시스템을 기반으로 다음과 같이 구체적으로 구현된다:
이 전략은 체계적인 위험 관리 방법을 채택하고 있으며, 거래마다 기본으로 계좌 자금의 10%를 사용하며, 초기 자금은 100,000로 설정되어 있으며, 위자리 운영은 금지되어 있다.
이러한 위험을 줄이기 위해, 트렌드 강도 지표와 같은 추가적인 필터링 조건을 도입하고, 시장의 변동적 동력에 따라 스톱로스 및 타겟 위치 설정을 조정하는 것을 고려하는 것이 좋습니다.
이러한 최적화를 통해 전략의 안정성과 수익성을 크게 향상시킬 수 있으며, 철회 및 손실 거래의 빈도를 줄일 수 있습니다.
이중 지수 이동 평균 다목적 거래 전략은 명확하고 논리적으로 간단한 양적 거래 시스템으로, 클래식 EMA 교차 신호를 기반으로 하며, 다목적 이익 관리 및 중지 손실 설정을 보조한다. 이 전략은 중장기 트렌드 거래에 적합하며, 명확한 트렌드 시장에서 더 잘 작동한다.
전략 설계는 비교적 간단하지만, 거래 전략의 핵심 요소를 포함합니다: 입문 신호, 출구 조건, 손실 관리 및 수익 목표. 전략의 주요 장점은 동작이 명확하고 이해하기 쉽고 실행되는 것과 동시에 좋은 시각적 지원을 제공하는 것입니다.
그러나, 전략은 단일 지표에 의존하는, 시장 환경의 인식 부족과 자금 관리의 유연성 부족과 같은 한계도 있습니다. 트렌드 필터를 추가하고, 손실을 막는 장치를 최적화하고, 진정한 분기 수익을 달성하고, 자금 관리 방법을 개선함으로써 전략에는 큰 최적화 공간이 있습니다.
트레이더에게, 이 전략은 기본 프레임워크로서, 개인의 위험 선호와 거래 품종 특성에 따라 개인화 조정 및 최적화를 통해 더 나은 거래 효과를 얻을 수 있다.
/*backtest
start: 2024-08-21 00:00:00
end: 2025-08-20 00:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_OKX","currency":"BNB_USDT","balance":5000}]
*/
//@version=5
strategy("9/21 EMA with 10 Targets + Stoploss",
overlay = true,
initial_capital = 100000,
default_qty_type = strategy.percent_of_equity,
default_qty_value = 10,
pyramiding = 0)
// === Inputs ===
emaFastLen = input.int(9, "Fast EMA Length")
emaSlowLen = input.int(21, "Slow EMA Length")
slPercent = input.float(0.5, "Stoploss %", step=0.1)
// 10 Targets
tp1Percent = input.float(0.5, "Target 1 %", step=0.1)
tp2Percent = input.float(1.0, "Target 2 %", step=0.1)
tp3Percent = input.float(1.5, "Target 3 %", step=0.1)
tp4Percent = input.float(2.0, "Target 4 %", step=0.1)
tp5Percent = input.float(2.5, "Target 5 %", step=0.1)
tp6Percent = input.float(3.0, "Target 6 %", step=0.1)
tp7Percent = input.float(3.5, "Target 7 %", step=0.1)
tp8Percent = input.float(4.0, "Target 8 %", step=0.1)
tp9Percent = input.float(4.5, "Target 9 %", step=0.1)
tp10Percent = input.float(5.0, "Target 10 %", step=0.1)
// === EMA Calculation ===
emaFast = ta.ema(close, emaFastLen)
emaSlow = ta.ema(close, emaSlowLen)
// === Entry Conditions ===
longCond = ta.crossover(emaFast, emaSlow)
shortCond = ta.crossunder(emaFast, emaSlow)
// === Entry ===
if (longCond and strategy.position_size <= 0)
strategy.entry("BUY", strategy.long)
if (shortCond and strategy.position_size >= 0)
strategy.entry("SELL", strategy.short)
// === Series Variables for Targets ===
var float tp1 = na
var float tp2 = na
var float tp3 = na
var float tp4 = na
var float tp5 = na
var float tp6 = na
var float tp7 = na
var float tp8 = na
var float tp9 = na
var float tp10 = na
var float stopLevel = na
// === Long Positions ===
if strategy.position_size > 0
stopLevel := strategy.position_avg_price * (1 - slPercent/100)
tp1 := strategy.position_avg_price * (1 + tp1Percent/100)
tp2 := strategy.position_avg_price * (1 + tp2Percent/100)
tp3 := strategy.position_avg_price * (1 + tp3Percent/100)
tp4 := strategy.position_avg_price * (1 + tp4Percent/100)
tp5 := strategy.position_avg_price * (1 + tp5Percent/100)
tp6 := strategy.position_avg_price * (1 + tp6Percent/100)
tp7 := strategy.position_avg_price * (1 + tp7Percent/100)
tp8 := strategy.position_avg_price * (1 + tp8Percent/100)
tp9 := strategy.position_avg_price * (1 + tp9Percent/100)
tp10 := strategy.position_avg_price * (1 + tp10Percent/100)
strategy.exit("Exit Long", "BUY", stop=stopLevel, limit=tp1)
// === Short Positions ===
if strategy.position_size < 0
stopLevel := strategy.position_avg_price * (1 + slPercent/100)
tp1 := strategy.position_avg_price * (1 - tp1Percent/100)
tp2 := strategy.position_avg_price * (1 - tp2Percent/100)
tp3 := strategy.position_avg_price * (1 - tp3Percent/100)
tp4 := strategy.position_avg_price * (1 - tp4Percent/100)
tp5 := strategy.position_avg_price * (1 - tp5Percent/100)
tp6 := strategy.position_avg_price * (1 - tp6Percent/100)
tp7 := strategy.position_avg_price * (1 - tp7Percent/100)
tp8 := strategy.position_avg_price * (1 - tp8Percent/100)
tp9 := strategy.position_avg_price * (1 - tp9Percent/100)
tp10 := strategy.position_avg_price * (1 - tp10Percent/100)
strategy.exit("Exit Short", "SELL", stop=stopLevel, limit=tp1)
// === Plotting ===
plot(emaFast, "EMA 9", color=color.yellow, linewidth=2)
plot(emaSlow, "EMA 21", color=color.orange, linewidth=2)
// Global plots (avoid local scope error)
plot(tp1, "TP1", color=color.new(color.green, 0))
plot(tp2, "TP2", color=color.new(color.green, 10))
plot(tp3, "TP3", color=color.new(color.green, 20))
plot(tp4, "TP4", color=color.new(color.green, 30))
plot(tp5, "TP5", color=color.new(color.green, 40))
plot(tp6, "TP6", color=color.new(color.green, 50))
plot(tp7, "TP7", color=color.new(color.green, 60))
plot(tp8, "TP8", color=color.new(color.green, 70))
plot(tp9, "TP9", color=color.new(color.green, 80))
plot(tp10, "TP10", color=color.new(color.green, 90))
plot(stopLevel, "Stoploss", color=color.red, linewidth=2)
// Entry Signals
plotshape(longCond, title="BUY Signal", style=shape.labelup, color=color.green, text="BUY")
plotshape(shortCond, title="SELL Signal", style=shape.labeldown, color=color.red, text="SELL")