
5 EMA 다이내믹 브레이커스 전략과 시간 필터링 최적화 시스템은 지수 이동 평균을 기반으로 한 정량 거래 전략으로, 5 주기 EMA 지표를 사용하여 잠재적인 시장 브레이커스를 식별하고, 엄격한 신호 검증과 시간 창 필터링을 통해 거래 실행을 최적화합니다. 이 전략의 핵심은 가격 브레이커스 신호 최고 / 낮은 시점에 대한 동력의 변화를 포착하는 것과 동시에 각 거래에 독립적으로 적용되는 위험 관리 매개 변수를 적용하는 것입니다.
이 전략은 다음과 같은 핵심 원칙에 기반을 두고 있습니다.
신호 생성 메커니즘: 전략은 5주기 EMA를 주요 지표로 사용하고, 가격과 EMA의 관계를 통해 신호를 식별한다. 종전 가격과 최고 가격이 모두 EMA보다 낮으면 구매 신호를 생성한다. 종전 가격과 최저 가격이 모두 EMA보다 높으면 판매 신호를 생성한다.
브레이크 검증: 전략은 신호가 생성된 후 3개의 안에서만 유효한 브레이크를 찾는다. 구매 거래는 가격이 신호 의 가장 높은 지점을 통과했을 때, 판매 거래는 가격이 신호 의 가장 낮은 지점을 통과했을 때 촉발된다.
리스크 관리 프레임워크: 각 거래에는 독립적인 중지 및 목표값이 설정되어 있습니다. 구매 거래의 중지 손실은 신호 의 가장 낮은 지점에서, 판매 거래의 중지 손실은 신호 의 가장 높은 지점에서 설정되어 있습니다. 목표값은 사용자 정의의 리스크 수익률을 기반으로 계산되며, 1:3을 기본으로합니다.
시간 필터링 시스템: 전략은 두 가지의 시간 관리 메커니즘을 구현합니다: (a) 특정 시간 창 내에서 새로운 거래를 차단하는 것 (예: 시장의 변동이 큰 시간); (b) 지정된 시간에 자동으로 모든 지분을 청산하는 것 (예: 거래일 종료 전에).
다중 거래 처리: 전략은 이전 포지션을 닫지 않고 동일한 방향으로 여러 거래를 허용하며, 각 거래에는 자체의 독립된 ID, 스톱로스 및 목표 가격이 있습니다.
이 전략은 심층적인 분석을 통해 다음과 같은 명백한 장점을 보여준다.
정확한 신호 필터링: 가격과 EMA의 특정 관계를 요구하여 신호를 생성하여 잘못된 신호의 발생을 줄이고 거래 품질을 향상시킵니다.
유연한 실행 옵션: 거래자가 가짜 브레이크를 피하고 전략의 안정성을 강화할 수 있도록 “상장 종료 때만 입문” 옵션을 제공합니다.
독립적 인 위험 관리: 각 거래에는 독립적 인 중지 및 목표 지점이 있으며, 거래자가 각 거래의 위험 노출을 정확하게 제어 할 수있게하여 전체 포지션 위험을 피할 수 있습니다.
시간 지능화: 사용자 정의 시간 창 필터링 및 자동 평점 기능을 통해 전략이 시장의 시간 특성에 적응할 수 있도록 하여, 효율적이지 않거나 위험성이 높은 거래 시기를 피할 수 있다.
확장성: 전략 설계는 모듈화, 매개 변수는 조정할 수 있으며, 다른 시장과 시간 주기, 다른 거래 스타일과 요구에 적응할 수 있습니다.
이 전략은 훌륭하게 설계되었지만, 다음과 같은 잠재적인 위험들이 있습니다.
EMA 지연성: 지연된 지표로서, 5주기 EMA는 빠르게 변화하는 시장에서 지연 신호를 발생시킬 수 있으며, 이는 진입점이 바람직하지 않습니다. 해결 방법은 고폭동성 시장에서 신중하게 사용하거나, 다른 지표와 결합하여 확인하는 것입니다.
고정 스톱 리스크: 신호창의 높음/저음점을 스톱 지점으로 사용하면 스톱 리스가 너무 넓어져서 거래 당 위험 금액이 증가할 수 있습니다. 스톱 위치를 최적화하기 위해 ATR 또는 퍼센티지 스톱을 사용하는 것이 고려 될 수 있습니다.
3개 창 제한: 단 3개 창 안의 돌파구를 찾는 것은 유효하지만 지연된 돌파구를 놓칠 수 있다. 이 파라미터를 다른 시장과 시간대에 따라 조정하는 것을 고려한다.
시간대 의존성: 전략은 IST (인도 표준 시간) 를 사용하여 시간을 필터링합니다. 다른 시간대를 사용하는 거래자는 조정해야합니다. 동적 시간대 설정을 지원하기 위해 코드를 수정하는 것이 좋습니다.
다중 거래 축적: 같은 방향으로 여러 입력을 허용하는 것은 과도한 레버리지와 위험 집중을 초래할 수 있습니다. 총 위험 제어 장치를 적용하여 최대 수의 동방 거래 또는 총 위험 을 제한하는 것이 좋습니다.
전략적 분석을 바탕으로 몇 가지 최적화 방안이 있습니다.
동적 EMA 주기: 시장의 변동성에 따라 EMA 주기를 자동으로 조정하는 기능을 구현합니다 (ATR과 같은), 이는 전략이 다른 시장 상태에 적응할 수 있도록합니다. 이것은 다양한 변동 환경에서 전략의 적응력을 향상시킵니다.
고급 필터 통합: 거래량 확인, 시장 변동률 필터 또는 트렌드 강도 지표 (ADX와 같은) 를 도입하여 신호 품질을 향상시키고 가짜 돌파구를 줄일 수 있습니다.
적응형 위험 관리: 시장의 변동성에 따라 리스크 수익률과 스톱 로즈 폭을 조정하는 기능을 구현하여 위험 관리를 더 지능적이고 시장에 적합한 것으로 만듭니다.
부분 이익 잠금: 부분 이익 목표가 달성되면 손실을 이동하거나 이익을 분할하는 기능을 추가하여 이미 수익성있는 막을 보호하고 남은 포지션을 더 큰 추세를 추적 할 수 있습니다.
기계 학습 최적화: 기계 학습 알고리즘을 사용하여 역사 데이터를 분석하여 최적의 입시 시점과 변수 조합을 식별하고 전략 변수의 적응 최적화를 구현합니다.
5 EMA 다이내믹 브레이크 전략과 시간 필터링 최적화 시스템은 EMA 지표, 브레이크 검증, 엄격한 위험 관리 및 시간 필터링 기능을 결합하여 거래자에게 포괄적이고 유연한 거래 프레임 워크를 제공합니다. 이 전략은 특히 일간 및 단기 거래자에게 적합하며 가격 브레이크 이후의 동적 변화를 효과적으로 포착 할 수 있습니다.
/*backtest
start: 2025-01-01 00:00:00
end: 2025-07-04 08:00:00
period: 2h
basePeriod: 2h
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/
//@version=5
strategy("5 EMA STRATEGY by Power of Stocks(StockYogi)", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100)
// === INPUTS ===
emaLen = input.int(5, title="EMA Length")
filterBuy = input.bool(true, title="Enable Buy Trades")
filterSell = input.bool(true, title="Enable Sell Trades")
targetRR = input.float(3.0, title="Target R:R (e.g. 3 = 1:3)")
entryOnCloseOnly = input.bool(false, title="Only Enter on Candle Close?")
// === TOGGLES ===
enableCustomExitTime = input.bool(true, title="Enable Custom Exit Time")
enableBlockTradeTime = input.bool(true, title="Enable Block Trade Time Window")
// === CUSTOM TIME SETTINGS ===
exitHour = input.int(15, title="Exit Hour (IST)", minval=0, maxval=23)
exitMinute = input.int(30, title="Exit Minute (IST)", minval=0, maxval=59)
blockStartHr = input.int(15, title="Block Start Hour (IST)", minval=0, maxval=23)
blockStartMn = input.int(0, title="Block Start Minute (IST)", minval=0, maxval=59)
blockEndHr = input.int(15, title="Block End Hour (IST)", minval=0, maxval=23)
blockEndMn = input.int(30, title="Block End Minute (IST)", minval=0, maxval=59)
// === TIME MANAGEMENT (IST) ===
ist = timestamp("Asia/Kolkata", year, month, dayofmonth, hour, minute)
istHour = hour(ist)
istMinute = minute(ist)
exitNow = enableCustomExitTime and (istHour == exitHour and istMinute == exitMinute)
// === ENTRY BLOCK ZONE LOGIC ===
afterBlockStart = istHour > blockStartHr or (istHour == blockStartHr and istMinute >= blockStartMn)
beforeBlockEnd = istHour < blockEndHr or (istHour == blockEndHr and istMinute < blockEndMn)
inBlockZone = enableBlockTradeTime and (afterBlockStart and beforeBlockEnd)
// === CALCULATE EMA ===
ema = ta.ema(close, emaLen)
plot(ema, color=color.orange, title="5 EMA")
// === SIGNAL CANDLE STORAGE ===
var float signalHigh = na
var float signalLow = na
var int signalIndex = na
var bool isBuySignal = false
var bool isSellSignal = false
// === SIGNAL CONDITIONS ===
newBuySignal = close < ema and high < ema
newSellSignal = close > ema and low > ema
if newBuySignal
signalHigh := high
signalLow := low
signalIndex := bar_index
isBuySignal := true
isSellSignal := false
if newSellSignal
signalHigh := high
signalLow := low
signalIndex := bar_index
isBuySignal := false
isSellSignal := true
// === HIGHLIGHT SIGNAL BAR ===
isSignalBar = bar_index == signalIndex
barcolor(isSignalBar ? color.blue : na)
// === TRIGGER CONDITIONS ===
withinWindow = bar_index > signalIndex and bar_index <= signalIndex + 3
buyTrigger = isBuySignal and withinWindow and high > signalHigh and not inBlockZone
sellTrigger = isSellSignal and withinWindow and low < signalLow and not inBlockZone
// === UNIQUE TRADE ID GENERATOR ===
getId(prefix) =>
var int counter = 0
counter += 1
prefix + "_" + str.tostring(counter)
// === BUY ENTRY ===
if buyTrigger and filterBuy
entry = signalHigh
sl = signalLow
risk = entry - sl
target = entry + risk * targetRR
tradeId = getId("Buy")
if entryOnCloseOnly
if close > signalHigh
strategy.entry(tradeId, strategy.long)
strategy.exit("TP_" + tradeId, from_entry=tradeId, limit=target, stop=sl)
else
strategy.entry(tradeId, strategy.long, stop=entry)
strategy.exit("TP_" + tradeId, from_entry=tradeId, limit=target, stop=sl)
// === SELL ENTRY ===
if sellTrigger and filterSell
entry = signalLow
sl = signalHigh
risk = sl - entry
target = entry - risk * targetRR
tradeId = getId("Sell")
if entryOnCloseOnly
if close < signalLow
strategy.entry(tradeId, strategy.short)
strategy.exit("TP_" + tradeId, from_entry=tradeId, limit=target, stop=sl)
else
strategy.entry(tradeId, strategy.short, stop=entry)
strategy.exit("TP_" + tradeId, from_entry=tradeId, limit=target, stop=sl)
// === TIME-BASED EXIT FOR ALL TRADES ===
if exitNow
strategy.close_all(comment="Exited at Custom Time")