
이것은 ATR 동적 조정에 기반한 트렌드 추적 전략으로, 이동 평균과 ATR 지표가 결합되어 입점과 출구를 결정한다. 이 전략의 핵심 특징은 ATR 동적 조정으로 이동 평균의 상하 궤도를, 가격이 궤도를 돌파할 때 입지를 더 많이 하고, ATR 배수에 기반한 중지 및 중지 지점을 설정하는 것이다. 한편, 이 전략은 혁신적인 재입장 메커니즘을 포함하고 있으며, 가격이 입점으로 다시 이동할 때 다시 입지를 구축할 수 있다.
이 전략은 다음과 같은 몇 가지 핵심 요소를 기반으로 작동합니다.
이것은 합리적이고, 논리적으로 명확하게 설계된 트렌드 추적 전략이며, ATR의 동적 조정을 통해 좋은 시장 적응력을 제공합니다. 전략의 재입장 메커니즘은 좋은 시장 조건에서 추가적인 수익 기회를 제공할 수 있는 혁신적인 점입니다. 주의해야 할 몇 가지 위험점이 있지만, 제안된 최적화 방향은 전략의 안정성과 수익성을 더욱 향상시킬 수 있습니다. 체계화된 거래 방법을 찾는 투자자에게는 고려할 가치가 있는 기본 전략 프레임워크입니다.
/*backtest
start: 2024-02-19 00:00:00
end: 2025-02-16 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=6
strategy("KON SET By Sai", overlay=true, max_lines_count=40)
// INPUTS
length = input.int(10, "Trend Length")
target_multiplier = input.int(0, "Set Targets") // Target adjustment
max_bars = 30 // Number of bars to display the lines after signal
// VARIABLES
var bool inTrade = false
var float entryPrice = na
var float stopLoss = na
var float targetPrice = na
var int barCount = na // Counter to track how many bars have passed since signal
// ATR for stop-loss and target calculation
atr_value = ta.sma(ta.atr(200), 200) * 0.8
// Moving averages for trend detection
sma_high = ta.sma(high, length) + atr_value
sma_low = ta.sma(low, length) - atr_value
// Signal conditions for trend changes
signal_up = ta.crossover(close, sma_high)
signal_down = ta.crossunder(close, sma_low)
// Entry conditions
if not inTrade and signal_up
entryPrice := close
stopLoss := close - atr_value * 2
targetPrice := close + atr_value * (5 + target_multiplier)
strategy.entry("Long", strategy.long)
strategy.exit("Exit Long", "Long", stop=stopLoss, limit=targetPrice)
inTrade := true
barCount := 0 // Reset bar count when signal occurs
// Exit conditions
if inTrade and (close <= stopLoss or close >= targetPrice)
inTrade := false
entryPrice := na
stopLoss := na
targetPrice := na
barCount := na // Reset bar count on exit
// Re-entry logic
if not inTrade and close == entryPrice
entryPrice := close
stopLoss := close - atr_value * 2
targetPrice := close + atr_value * (5 + target_multiplier)
strategy.entry("Re-Long", strategy.long)
strategy.exit("Re-Exit Long", "Re-Long", stop=stopLoss, limit=targetPrice)
inTrade := true
barCount := 0 // Reset bar count when re-entry happens
// Count bars since the signal appeared (max 30 bars)
if inTrade and barCount < max_bars
barCount := barCount + 1
// Plotting lines for entry, stop-loss, and targets (Only during active trade and within max_bars)
entry_line = plot(inTrade and barCount <= max_bars ? entryPrice : na, title="Entry Price", color=color.new(color.green, 0), linewidth=1, style=plot.style_cross)
sl_line = plot(inTrade and barCount <= max_bars ? stopLoss : na, title="Stop Loss", color=color.new(color.red, 0), linewidth=1, style=plot.style_cross)
target_line = plot(inTrade and barCount <= max_bars ? targetPrice : na, title="Target Price", color=color.new(color.blue, 0), linewidth=1, style=plot.style_cross)
// Background color between entry and target/stop-loss (Only when inTrade and within max_bars)
fill(entry_line, target_line, color=color.new(color.green, 90), title="Target Zone")
fill(entry_line, sl_line, color=color.new(color.red, 90), title="Stop-Loss Zone")
// Label updates (reduce overlap and clutter)
if bar_index % 50 == 0 and inTrade and barCount <= max_bars // Adjust label frequency for performance
label.new(bar_index + 1, entryPrice, text="Entry: " + str.tostring(entryPrice, "#.##"), style=label.style_label_left, color=color.green, textcolor=color.white, size=size.small)
label.new(bar_index + 1, stopLoss, text="Stop Loss: " + str.tostring(stopLoss, "#.##"), style=label.style_label_left, color=color.red, textcolor=color.white, size=size.small)
label.new(bar_index + 1, targetPrice, text="Target: " + str.tostring(targetPrice, "#.##"), style=label.style_label_left, color=color.blue, textcolor=color.white, size=size.small)