
다시간대 다중 지표 고주파 역동적 돌파량 거래 전략은 고주파 단선 거래 (Scalping) 를 위해 설계된 고성능 거래 시스템이다. 이 전략은 Pine Script 5에 기반하여 개발되었으며, 여러 기술 지표와 시간 필터 기능을 결합하여 시장 돌파 신호를 식별하고 고속 거래를 수행한다. 핵심 원칙은 EMA, SMA, RSI 등의 다중 지표 인증을 통해 가격 돌파 탐지 및 ATR 역동적 위험 관리를 결합하여 특정 거래 시점에 단선 기회를 포착하는 것이다. 이 전략은 각 가격 변화에 대한 실시간 계산을 한다.
이 전략의 핵심 논리는 다중 조건 인증을 기반으로 하는 가격 돌파 시스템이며, 구체적으로 구현 메커니즘은 다음과 같다:
기술 지표 포트폴리오:
해킹 로직:
다중 조건 확인:
시간 필터링 시스템:
동적 위험 관리:
성능 최적화 설계:
이 전략은 다음과 같은 중요한 장점을 가지고 있습니다.
빠른 실행 능력: calc_on_every_tick=true 설정을 통해, 각 가격 변화에 즉각적으로 반응할 수 있으며, 특히 고주파 거래 환경에 적합하다. 코드에는 상수 사전 계산 및 지표 캐시 기술이 사용되어 실행 속도가 더욱 향상되었다.
다중 인증 메커니즘: EMA, SMA, RSI 등과 같은 여러 지표 검증 거래 신호와 결합하여 가짜 돌파의 위험을 크게 줄입니다. 이 확인 시스템은 여러 조건이 동시에 충족 될 때만 포지션을 열도록 보장하여 거래 품질을 향상시킵니다.
유연한 시간 필터4개의 사용자 정의 가능한 거래 시기를 통해 거래자는 높은 유동성과 높은 변동성의 시장 시기를 집중하고, 낮은 활동성과 불안정한 시장 시기를 회피할 수 있습니다.
동적 위험 관리ATR 기반의 동적 중지 및 수익 목표, 전략이 시장의 변동성에 따라 위험 매개 변수를 자동으로 조정하여 다른 시장 조건에 맞게 조정할 수 있도록합니다.
완전 자동화 지원: PineConnector와 MT5 통합을 통해 완전히 자동화된 거래를 구현하고, 인간의 개입과 감정적 인 영향을 줄인다. 코드에는 완전한 경보 시스템이 포함되어 있으며, 빠른 실행 모드를 지원한다.
자원 사용 최적화: 상수와 캐시 지표 결과를 미리 계산하여 컴퓨팅 자원의 소모를 효과적으로 줄이고, 실시간 거래 환경에서 효율적인 운영을 보장한다.
시각화된 의사결정전략: 전략에는 직관적인 거래 상태 및 신호 시각화를 제공하는 성능 지표 표시 패널과 위치 표시가 내장되어 있으며, 인공 모니터링 및 의사 결정을 지원합니다.
이 전략의 장점에도 불구하고 다음과 같은 위험과 도전이 있습니다.
고주파 거래의 위험성: 고주파 거래 환경에서는 슬라이드 포인트, 지연 및 거래 비용이 실제 거래 결과에 크게 영향을 미칠 수 있습니다. 코드에 빠른 실행 모드가 구현되어 있지만 실제 거래 환경에서는 거래 플랫폼과 중개인의 실행 속도에 제한 될 수 있습니다.
가짜 함정을 뚫고: 복수의 확인 메커니즘을 사용함에도 불구하고, 높은 변동성 시장에서 가짜 브레이크 신호가 발생하여 불필요한 거래 손실이 발생할 수 있습니다.
과대 최적화 위험전략은 여러 변수 (EMA, SMA, RSI 등 주기적 설정) 을 포함하고 있으며, 과도한 최적화 (curve-fitting) 의 위험이 있으며, 전략은 실전에서 좋지 않은 성능을 발휘할 수 있습니다.
시간 필터 제한시간 필터링은 불효율적인 거래 시간을 피할 수 있지만, 특히 중요한 시장 사건이나 뉴스 발표 때 특정 시간 이외의 유리한 거래 기회를 놓칠 수 있습니다.
ATR 기본 위험 제어의 한계극단적인 시장 조건에서 ATR 기반의 중지 및 수익 목표가 급격한 큰 변동에 대응하기에는 충분하지 않을 수 있으며, 이로 인해 중지 효과가 떨어지거나 수익이 조기 종료됩니다.
위험 완화 조치:
코드 분석을 바탕으로 이 전략이 더 개선될 수 있는 방향은 다음과 같습니다.
동적 변수는 스스로 적응합니다.:
시장 상태 분류:
강화된 필터링 시스템:
손해 방지 전략의 최적화:
신호 품질 평가:
통제를 철회한다:
계산 효율을 최적화:
이러한 최적화 방향은 전략의 성능과 안정성을 향상시킬 뿐만 아니라, 다양한 시장 조건에 적응할 수 있는 능력을 강화하여 더 지속 가능한 장기적인 수익을 창출할 수 있습니다.
다중 시간대 다중 지표 고 주파수 동적 돌파량 거래 전략은 단선 거래자를 대상으로 설계된 종합적인 고 주파수 거래 시스템이다. 이 전략은 다중 기술 지표, 가격 돌파구 식별, 시간 필터링 및 동적 위험 관리를 결합하여 완전한 거래 프레임워크를 구축한다. 그것의 핵심 장점은 빠른 실행 능력, 다중 확인 메커니즘 및 유연한 자동화 지원으로, 특히 변동성 자산의 짧은 시간 프레임에 적용하기에 적합하다.
전략의 주요 기술적인 특징은 EMA 교차 판단 경향, 가격 필터로서의 SMA, RSI가 과매매 지역 거래를 피하고 ATR의 동적 위험 관리이다. 시간 필터 시스템과 PineConnector의 통합은 전략의 실용성과 유연성을 더욱 강화한다.
이 전략은 고주파 거래 특유의 위험과 가짜 돌파 함정과 같은 도전에 직면하지만, 합리적인 위험 관리와 파라미터 최적화를 통해 이러한 위험을 효과적으로 제어 할 수 있습니다. 향후 최적화 방향은 파라미터 자조, 시장 상태 분류, 필터링 시스템 및 지능형 중지 전략의 강화입니다. 이러한 개선은 전략의 안정성과 수익성을 더욱 향상시킬 것입니다.
이 전략은 단선 거래에서 이점을 추구하는 거래자들에게 기술적으로 진보된, 논리적으로 엄격한 양적 거래 솔루션을 제공하며, 특히 고속 거래에 관심이 있고 자동화 기술을 통해 거래 효율성을 높이고자 하는 사용자들에게 적합합니다.
/*backtest
start: 2024-08-04 00:00:00
end: 2025-08-02 08:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"DOGE_USDT"}]
*/
//@version=5
strategy("Scalper TURBO", overlay=true, initial_capital=1000,
default_qty_type=strategy.percent_of_equity, default_qty_value=50,
calc_on_every_tick=true, process_orders_on_close=false)
// ==================== PERFORMANCE OPTIMIZATIONS ====================
// Pre-calculate constants to avoid repeated calculations
const int MINUTES_PER_HOUR = 60
// ==================== INPUT PARAMETERS ====================
// Technical Parameters
emaFastLen = input.int(34, "EMA Rápida", minval=1)
emaSlowLen = input.int(63, "EMA Lenta", minval=1)
smaLen = input.int(34, "SMA Filtro", minval=1)
rsiLen = input.int(14, "Periodo RSI", minval=1)
rsiOverbought = input.int(70, "RSI Sobrecompra", minval=1, maxval=100)
rsiOversold = input.int(30, "RSI Sobreventa", minval=1, maxval=100)
breakoutPeriod = input.int(1, "Periodos para Breakout", minval=1)
atrLen = input.int(14, "Periodo ATR", minval=1)
atrMultSL = input.float(3, "Multiplicador ATR Stop-Loss", step=0.1)
atrMultTrail = input.float(3, "Multiplicador ATR Trailing Stop", step=0.1)
// ==================== TIME FILTER SETTINGS ====================
var g_timefilters = "Time Filters"
// Time Filter Arrays for faster processing
useTimeFilter = array.new_bool(4)
startHour = array.new_int(4)
startMin = array.new_int(4)
endHour = array.new_int(4)
endMin = array.new_int(4)
// Time Filter 1
array.set(useTimeFilter, 0, input.bool(false, "Enable Time Filter 1", group=g_timefilters))
array.set(startHour, 0, input.int(9, "Start Hour", minval=0, maxval=23, group=g_timefilters, inline="tf1start"))
array.set(startMin, 0, input.int(0, "Start Minute", minval=0, maxval=59, group=g_timefilters, inline="tf1start"))
array.set(endHour, 0, input.int(11, "End Hour", minval=0, maxval=23, group=g_timefilters, inline="tf1end"))
array.set(endMin, 0, input.int(30, "End Minute", minval=0, maxval=59, group=g_timefilters, inline="tf1end"))
// Time Filter 2
array.set(useTimeFilter, 1, input.bool(false, "Enable Time Filter 2", group=g_timefilters))
array.set(startHour, 1, input.int(13, "Start Hour", minval=0, maxval=23, group=g_timefilters, inline="tf2start"))
array.set(startMin, 1, input.int(30, "Start Minute", minval=0, maxval=59, group=g_timefilters, inline="tf2start"))
array.set(endHour, 1, input.int(15, "End Hour", minval=0, maxval=23, group=g_timefilters, inline="tf2end"))
array.set(endMin, 1, input.int(0, "End Minute", minval=0, maxval=59, group=g_timefilters, inline="tf2end"))
// Time Filter 3
array.set(useTimeFilter, 2, input.bool(false, "Enable Time Filter 3", group=g_timefilters))
array.set(startHour, 2, input.int(16, "Start Hour", minval=0, maxval=23, group=g_timefilters, inline="tf3start"))
array.set(startMin, 2, input.int(0, "Start Minute", minval=0, maxval=59, group=g_timefilters, inline="tf3start"))
array.set(endHour, 2, input.int(18, "End Hour", minval=0, maxval=23, group=g_timefilters, inline="tf3end"))
array.set(endMin, 2, input.int(30, "End Minute", minval=0, maxval=59, group=g_timefilters, inline="tf3end"))
// Time Filter 4
array.set(useTimeFilter, 3, input.bool(false, "Enable Time Filter 4", group=g_timefilters))
array.set(startHour, 3, input.int(20, "Start Hour", minval=0, maxval=23, group=g_timefilters, inline="tf4start"))
array.set(startMin, 3, input.int(0, "Start Minute", minval=0, maxval=59, group=g_timefilters, inline="tf4start"))
array.set(endHour, 3, input.int(22, "End Hour", minval=0, maxval=23, group=g_timefilters, inline="tf4end"))
array.set(endMin, 3, input.int(30, "End Minute", minval=0, maxval=59, group=g_timefilters, inline="tf4end"))
// ==================== PINECONNECTOR SETTINGS ====================
var g_connector = "PineConnector Settings"
pcID = input.string(" ", "Pine Connector ID", group=g_connector)
symbolName = input.string("XAUUSD", "Symbol Name", tooltip="Symbol exactly as it appears in your MT5", group=g_connector)
lotSize = input.float(0.01, "Lot Size", step=0.01, group=g_connector)
enableRealTrading = input.bool(true, "Enable Real Trading", group=g_connector)
useFastExecution = input.bool(true, "Use Fast Execution Mode", group=g_connector)
showLabels = input.bool(true, "Show Info Labels", group=g_connector)
// Risk Management
useStopLoss = input.bool(true, "Use Stop Loss", group=g_connector)
useTakeProfit = input.bool(true, "Use Take Profit", group=g_connector)
useTrailingStop = input.bool(false, "Use Trailing Stop", group=g_connector)
stopLossATRMult = input.float(3, "Stop Loss ATR Multiple", step=0.1, group=g_connector)
takeProfitATRMult = input.float(3, "Take Profit ATR Multiple", step=0.1, group=g_connector)
trailingStopATRMult = input.float(3, "Trailing Stop ATR Multiple", step=0.1, group=g_connector)
// ==================== OPTIMIZED TIME FILTER FUNCTION ====================
// Cache current time components
currentHour = hour(time)
currentMin = minute(time)
currentTimeMinutes = currentHour * MINUTES_PER_HOUR + currentMin
// Optimized time check function
isTimeAllowed() =>
anyEnabled = false
timeOK = false
for i = 0 to 3
if array.get(useTimeFilter, i)
anyEnabled := true
startTimeMin = array.get(startHour, i) * MINUTES_PER_HOUR + array.get(startMin, i)
endTimeMin = array.get(endHour, i) * MINUTES_PER_HOUR + array.get(endMin, i)
inRange = startTimeMin <= endTimeMin ?
(currentTimeMinutes >= startTimeMin and currentTimeMinutes <= endTimeMin) :
(currentTimeMinutes >= startTimeMin or currentTimeMinutes <= endTimeMin)
if inRange
timeOK := true
break
not anyEnabled or timeOK
// ==================== CACHED INDICATOR CALCULATIONS ====================
// Calculate indicators only once per bar
emaFast = ta.ema(close, emaFastLen)
emaSlow = ta.ema(close, emaSlowLen)
sma34 = ta.sma(close, smaLen)
rsi = ta.rsi(close, rsiLen)
atr = ta.atr(atrLen)
// Support/Resistance with caching
var float resistenciaReciente = na
var float soporteReciente = na
if barstate.isconfirmed
resistenciaReciente := ta.highest(high, breakoutPeriod)[1]
soporteReciente := ta.lowest(low, breakoutPeriod)[1]
// ==================== SIGNAL CONDITIONS ====================
// Pre-calculate all conditions
tendenciaAlcista = emaFast > emaSlow
tendenciaBajista = emaFast < emaSlow
rsiNotOverbought = rsi < rsiOverbought
rsiNotOversold = rsi > rsiOversold
priceAboveSMA = close > sma34
priceBelowSMA = close < sma34
timeAllowed = isTimeAllowed()
// Breakout conditions
breakoutUp = close > resistenciaReciente
breakoutDown = close < soporteReciente
// Final entry conditions - simplified logic
longSignal = breakoutUp and tendenciaAlcista and rsiNotOverbought and priceAboveSMA and timeAllowed
shortSignal = breakoutDown and tendenciaBajista and rsiNotOversold and priceBelowSMA and timeAllowed
// ==================== POSITION MANAGEMENT ====================
// Efficient position tracking
var int currentPosition = 0 // 1 = long, -1 = short, 0 = flat
var bool positionChanged = false
var string pendingAlert = ""
// Detect position changes
newLong = longSignal and currentPosition <= 0
newShort = shortSignal and currentPosition >= 0
// ==================== OPTIMIZED ALERT SYSTEM ====================
// Pre-build alert components for faster execution
stopPips = useStopLoss ? str.tostring(math.round(atr * stopLossATRMult * 100)) : ""
tpPips = useTakeProfit ? str.tostring(math.round(atr * takeProfitATRMult * 100)) : ""
trailPips = useTrailingStop ? str.tostring(math.round(atr * trailingStopATRMult * 100)) : ""
// Build risk management string once
riskParams = useStopLoss ? ",sl=" + stopPips : ""
riskParams += useTakeProfit ? ",tp=" + tpPips : ""
riskParams += useTrailingStop ? ",trailingstop=" + trailPips : ""
// ==================== FAST EXECUTION MODE ====================
if enableRealTrading
// LONG ENTRY
if newLong
// Close short first if needed
if currentPosition < 0
alert(pcID + ",closeshort," + symbolName, alert.freq_once_per_bar)
// Enter long
strategy.entry("Long", strategy.long)
longAlert = pcID + ",buy," + symbolName + ",risk=" + str.tostring(lotSize) + riskParams
alert(longAlert, useFastExecution ? alert.freq_once_per_bar : alert.freq_once_per_bar_close)
currentPosition := 1
// SHORT ENTRY
else if newShort
// Close long first if needed
if currentPosition > 0
alert(pcID + ",closelong," + symbolName, alert.freq_once_per_bar)
// Enter short
strategy.entry("Short", strategy.short)
shortAlert = pcID + ",sell," + symbolName + ",risk=" + str.tostring(lotSize) + riskParams
alert(shortAlert, useFastExecution ? alert.freq_once_per_bar : alert.freq_once_per_bar_close)
currentPosition := -1
else
// Backtest mode
if newLong
strategy.entry("Long", strategy.long)
currentPosition := 1
else if newShort
strategy.entry("Short", strategy.short)
currentPosition := -1
// ==================== STOP LOSS MANAGEMENT ====================
// Calculate stops only when in position
if currentPosition != 0
if currentPosition > 0
stopLong = strategy.position_avg_price - atr * atrMultSL
strategy.exit("Exit Long", "Long", stop=stopLong, trail_points=atr * atrMultTrail, trail_offset=atr * atrMultTrail)
else
stopShort = strategy.position_avg_price + atr * atrMultSL
strategy.exit("Exit Short", "Short", stop=stopShort, trail_points=atr * atrMultTrail, trail_offset=atr * atrMultTrail)
// Detect exits
if strategy.position_size == 0 and currentPosition != 0
if enableRealTrading
exitAlert = currentPosition > 0 ? pcID + ",closelong," + symbolName : pcID + ",closeshort," + symbolName
alert(exitAlert, alert.freq_once_per_bar)
currentPosition := 0