
다중 지표 돌파 트렌드 추적 전략은 고전적 해안 거래 시스템을 기반으로 한 양적 거래 전략으로, 여러 주기 돌파 신호를 통해 시장의 강력한 트렌드를 포착한다. 전략의 핵심은 다른 시간 주기의 가격 돌파를 입수 및 출구 신호로 사용하여 ATR (진짜 파동의 평균) 와 결합하여 위험 제어 및 위치 관리를 수행하는 것이다. 이 전략은 시장 돌파 신호를 식별하는 지표로 사용될 수 있으며, 완전한 자동화 된 거래 시스템으로 거래를 수행 할 수 있다. 전략의 장점은 트렌드 기회를 체계적으로 포착하고 엄격한 위험 통제를 통해 재원 관리 효율성을 높이는 것이다.
이 전략의 핵심 원칙은 가격의 역사적인 고위점이나 낮은 곳을 식별하여 잠재적인 트렌드 움직임을 포착하는 것입니다. 구체적인 구현 논리는 다음과 같습니다.
입학 메커니즘전략: N1 주기 (기본 20주기) 의 역사 최고 가격과 최저 가격을 뚫는 참고로 사용한다. 가격이 상향으로 이전 N1 주기 최고 가격을 뚫었을 때, 다중 입구 신호를 생성한다. 가격이 하향으로 이전 N1 주기 최저 가격을 뚫었을 때, 공허 입구 신호를 생성한다.
출전 메커니즘“이번 경기에서 두 번 출전하는 것이 전략입니다.
포지션 관리: 전략은 변동률 (ATR) 과 위험 비율에 기반하여 거래 단위 크기를 계산하고, 각 거래의 위험은 계정 자금의 고정 비율 (설정 1%) 내에서 제어되도록합니다. 계산 공식은 다음과 같습니다.
交易单位 = 风险金额 / (ATR * 每点价值)
위험 금액은 초기 자본의 위험 비율을 곱합니다.
트렌드 추적 능력전략 설계는 큰 트렌드를 포착하는 데 초점을 맞추고 있으며, 잠재적인 트렌드 시작 지점을 식별하여 시장의 추세적 움직임을 효과적으로 활용합니다.
동적 위험 제어: ATR을 통해 중지 위치를 계산하고, 시장의 실제 변동 상황에 따라 중지 거리를 동적으로 조정하여 고정 중단이 너무 가깝게 발생하는 빈번한 중지 손실을 피하고, 중지 거리가 너무 멀리있는 과도한 손실을 방지합니다.
위치 적응: 시장의 변동율과 계정 위험 비율에 따라 포지션 크기를 동적으로 조정하고, 높은 변동율의 시장에서 포지션을 자동으로 줄이고, 낮은 변동율의 시장에서 포지션을 적절하게 증가시켜 위험 구멍을 균형있게 제어한다.
매개 변수 조정정책: 여러 핵심 매개 변수 (N1, N2, ATR 주기, 위험 비율 등) 에 대한 조정 인터페이스를 제공하여 사용자가 다른 시장 환경과 개인 위험 선호도에 따라 최적화 할 수 있습니다.
체계화된 거래완전히 체계화된 거래 규칙은 감정적 방해를 없애고, 사전 설정된 입출금 및 자금 관리 규칙을 엄격히 따르고, 거래 규율을 높인다.
시장의 부진: 트렌드 추적 전략으로, 수평 변동 시장에서 빈번한 가짜 브레이크 신호가 발생하여 연속적인 손실이 발생합니다. 해결책은 변동률 필터링 조건을 증가시킬 수 있으며, 변동률이 특정 하락점을 초과했을 때만 입장을 고려 할 수 있습니다.
슬라이드 포인트와 수수료 영향높은 주파수 거래 또는 유동성이 부족한 시장에서 슬라이드 포인트 및 수수료가 전략 성능에 크게 영향을 미칠 수 있습니다. 거래 주파수를 줄이거나 신호 확인 메커니즘을 추가함으로써이 문제를 완화 할 수 있습니다.
매개변수 민감도: 전략 성능은 N1, N2 변수 설정에 민감하며, 다른 시장과 시간 프레임에 따라 최적의 변수가 크게 달라질 수 있다. 역사적 회귀를 통해 견고한 변수 조합을 찾는 것이 권장되며, 과도한 최적화로 인한 곡선 적합성을 피한다.
큰 빈자 위험: 갑작스러운 중대한 사건으로 인한 가격 폭락에서, 정지 명령은 예상된 가격에 따라 실행되지 않을 수 있으며, 예상 이상의 손실을 초래한다. 최대 손실 제한을 높이는 것이 고려될 수 있으며, 변동률 조정 인자를 도입할 수 있다.
자금 관리 위험: 전략에는 위험 제어 장치가 포함되어 있음에도 불구하고, 극한 시장 조건에서, 연속적인 상쇄 손실은 여전히 자본 곡선의 큰 회전을 초래할 수 있습니다. 최대 연속적인 손실 횟수 제한을 설정하거나 전체적인 위험 컨트롤을 도입하는 것이 좋습니다.
다중 시간 프레임 확인: 더 긴 주기의 트렌드 확인 메커니즘을 도입할 수 있으며, 여러 시간 프레임의 트렌드가 일치할 때만 입장을 고려하여 신호 품질을 향상시킬 수 있습니다. 예를 들어, 일계 트렌드 방향이 현재 거래 주기의 트렌드 방향과 일치하는지 여부를 검사하는 조건을 추가할 수 있습니다.
변동율 필터: 변동률 필터 조건을 도입하고, 시장 변동률이 합리적인 범위 내에서만 거래 신호를 실행하고, 지나치게 평온하거나 지나치게 변동하는 시장에 진입하는 것을 피하십시오. ATR의 상대치를 (예: ATR/가격 비율) 필터 지표로 사용할 수 있습니다.
신호 확인 메커니즘: 파격 확인 메커니즘을 추가하여, 파격 이후의 가격이 일정 시간 또는 양을 유지하도록 요구하면 신호가 유효하다는 것을 확인하고, 가짜 파격으로 인한 손실을 줄일 수 있다.
동적 변수 조정: 시장 상태의 동적에 따라 N1, N2 변수를 조정하고, 다양한 변동률 환경에서 다른 변수 조합을 사용하여, 시장 환경에 대한 전략의 적응성을 향상시킵니다.
트렌드 강도 평가: 트렌드 강도 지표 (ADX, 선형 회귀 기울기 등과 같은) 와 결합하여 현재 트렌드 강도를 평가하고, 트렌드 강도가 특정 경계에 도달했을 때만 입장을 고려하여 트렌드 캡처의 정확성을 향상시킵니다.
손해 방지 제도를 최적화: 이동 상쇄를 도입하거나 지지/저항 지점에 기반한 상쇄 방법을 도입하는 것이 고려될 수 있으며, 위험 제어 기능을 유지하면서 트렌드에 더 많은 발전 공간을 제공합니다.
다중 지표 돌파 트렌드 추적 전략은 고전적 인 해수 무역 철학과 현대적 인 위험 관리 기술을 결합 한 체계화된 거래 전략입니다. 다중 주기 가격 돌파를 통해 트렌드 방향을 판단하고 ATR과 함께 동적 스톱 로즈 및 포지션 제어를 수행하는 전략은 시장에서 눈에 띄는 트렌드 기회를 효과적으로 포착 할 수 있습니다.
전략의 핵심 장점은 체계화된 거래 규칙과 엄격한 위험 통제, 감정적 간섭을 피하는 동시에 파라미터를 조정하여 높은 유연성을 제공하는 데 있습니다. 그러나, 트렌드 추적 전략으로서, 그것은 흔들리는 시장에서 좋지 않을 수 있으며, 사용자가 적용 시나리오를 이해하고 적절한 파라미터를 최적화해야합니다.
다중 시간 프레임 확인, 변동률 필터링, 신호 확인 메커니즘과 같은 최적화 방향을 도입함으로써, 이 전략은 신호 품질과 안정성을 더욱 향상시키고, 더 다양한 시장 환경에 적응할 것으로 예상된다. 궁극적으로, 다중 지표 돌파 트렌드 추적 전략은 거래자에게 시장 추세를 포착하는 신뢰할 수 있고 체계화된 방법을 제공하며, 위험을 제어하고, 장기적으로 안정적인 거래 성과를 달성한다.
/*backtest
start: 2024-07-03 00:00:00
end: 2025-07-01 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"DOGE_USDT"}]
*/
//@version=5
strategy("Turtle Trading Strategy (Simplified)", overlay=true, initial_capital=10000, default_qty_type=strategy.cash, default_qty_value=1000, commission_type=strategy.commission.cash_per_order, commission_value=1)
// --- Strategy Inputs ---
n1_entry_period = input.int(20, title="Entry Lookback Period (N1)", minval=1)
n2_exit_period = input.int(10, title="Exit Lookback Period (N2)", minval=1)
atr_period = input.int(20, title="ATR Period", minval=1)
atr_multiplier = input.float(2.0, title="ATR Stop Multiplier", minval=0.1)
risk_per_trade_percent = input.float(1.0, title="Risk Per Trade (%)", minval=0.1, maxval=10.0)
// --- Calculate Channels ---
highest_high_n1 = ta.highest(high, n1_entry_period)
lowest_low_n1 = ta.lowest(low, n1_entry_period)
highest_high_n2 = ta.highest(high, n2_exit_period)
lowest_low_n2 = ta.lowest(low, n2_exit_period)
// --- Calculate ATR (Average True Range) ---
atr_value = ta.atr(atr_period)
// --- Position Sizing (Simplified) ---
// This aims to calculate units based on a fixed percentage risk per trade.
// 1 Unit = 1 ATR worth of movement. Risk 1% of equity per trade.
risk_amount = strategy.initial_capital * (risk_per_trade_percent / 100)
dollar_per_point = syminfo.mintick // Or your instrument's specific dollar per point value
unit_size = atr_value * dollar_per_point > 0 ? math.round(risk_amount / (atr_value * dollar_per_point)) : 0
// Ensure unit_size is at least 1 if risk allows, and cap it for realism
if unit_size == 0 and risk_amount > 0
unit_size := 1 // Minimum 1 unit if risk allows any trade
if unit_size > 10000 // Cap unit size to prevent excessively large positions in backtesting
unit_size := 10000
// --- Entry Logic ---
long_condition = ta.crossover(close, highest_high_n1[1]) // Break above previous N1 high
short_condition = ta.crossunder(close, lowest_low_n1[1]) // Break below previous N1 low
// Variables to store entry information only for the *current* bar
var float current_entry_price = na
var int current_entry_type = 0 // 1 for long, -1 for short, 0 for no entry
if long_condition and strategy.opentrades == 0 // Only enter if no open positions
strategy.entry("Long", strategy.long, qty=unit_size, comment="Turtle Long Entry")
// Store entry details for the current bar
current_entry_price := close // Or strategy.opentrades[0].entry_price if you prefer but close on entry bar is often same
current_entry_type := 1
if short_condition and strategy.opentrades == 0 // Only enter if no open positions
strategy.entry("Short", strategy.short, qty=unit_size, comment="Turtle Short Entry")
// Store entry details for the current bar
current_entry_price := close // Or strategy.opentrades[0].entry_price
current_entry_type := -1
// --- Exit Logic ---
// Declare persistent variables to store stop prices
var float long_stop_price = na
var float short_stop_price = na
// Calculate and store stop price on the bar *after* an entry
if current_entry_type[1] == 1 // If a long entry occurred on the previous bar
long_stop_price := current_entry_price[1] - (atr_value[1] * atr_multiplier) // Use values from previous bar
short_stop_price := na // Reset short stop
if current_entry_type[1] == -1 // If a short entry occurred on the previous bar
short_stop_price := current_entry_price[1] + (atr_value[1] * atr_multiplier) // Use values from previous bar
long_stop_price := na // Reset long stop
// Stop Loss for Long Positions
if strategy.position_size > 0 // We have a long position
strategy.exit("Long Exit SL", from_entry="Long", stop=long_stop_price, comment="Long Stop Loss")
// Stop Loss for Short Positions
if strategy.position_size < 0 // We have a short position
strategy.exit("Short Exit SL", from_entry="Short", stop=short_stop_price, comment="Short Stop Loss")
// N2 Exit for Long Positions
if strategy.position_size > 0 and ta.crossunder(close, lowest_low_n2[1])
strategy.close("Long", comment="Turtle Long N2 Exit")
// N2 Exit for Short Positions
if strategy.position_size < 0 and ta.crossover(close, highest_high_n2[1])
strategy.close("Short", comment="Turtle Short N2 Exit")
// --- Plotting for Visualization ---
plot(highest_high_n1, "N1 High", color=color.green, linewidth=2, style=plot.style_linebr)
plot(lowest_low_n1, "N1 Low", color=color.red, linewidth=2, style=plot.style_linebr)
plot(highest_high_n2, "N2 High (Exit)", color=color.blue, linewidth=1, style=plot.style_linebr)
plot(lowest_low_n2, "N2 Low (Exit)", color=color.orange, linewidth=1, style=plot.style_linebr)