
이것은 동적인 트렌드 라인과 거래량 확인을 기반으로 한 다단계 돌파 거래 전략이다. 전략은 가격 움직임을 실시간으로 추적하여 중요한 변동 고점을 식별하고 이러한 지점을 동적으로 사용하여 트렌드 라인을 구성한다. 전략은 가격과 함께 유의미한 대량으로 상향 트렌드 라인을 돌파 할 때 다단계 입장에 들어가며, 백분율 스톱 손실과 추적 스톱 손실을 사용하여 위험을 관리한다.
전략의 핵심 논리는 세 가지 주요 기둥에 기반합니다: 동적 트렌드 라인 구축, 거래량 확인 및 위험 관리 시스템. 첫째, 전략은 ta.pivothigh 함수를 사용하여 가격의 변동 고점을 동적으로 식별하고, 최근 두 개의 변동 고점을 기반으로 기울기와 교차점을 계산하여 상향 트렌드 라인을 구성합니다. 둘째, 전략은 20주기 평균의 1.5배 이상의 거래량을 동반해야하는 입시 신호를 요구합니다.
이것은 합리적이고 논리적으로 설계된 트렌드 추적 전략이다. 동적 트렌드 라인과 거래량 확인의 조합과 완벽한 위험 관리 시스템으로 전략은 더 나은 적응성과 신뢰성을 갖는다. 일정 시장 의존성이 있음에도 불구하고, 제안된 최적화 방향을 통해 전략은 여전히 향상될 여지가 있다.
/*backtest
start: 2019-12-23 08:00:00
end: 2024-12-09 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy("Long Only Strategy with Dynamic Trend Lines, Fixed TP/SL, and Trailing SL+", overlay=true,
default_qty_type=strategy.percent_of_equity, default_qty_value=10,
pyramiding=0, // Prevent multiple entries
calc_on_order_fills=true,
calc_on_every_tick=true)
// === Parameters ===
swingThreshold = input.int(5, title="Swing Detection Threshold")
tpPercent = input.float(2.0, title="Take Profit (%)")
slPercent = input.float(1.0, title="Stop Loss (%)")
trailPercent = input.float(1.0, title="Trailing Stop (%)")
volumeThresholdMultiplier = input.float(1.5, title="Volume Spike Threshold (x MA)")
// === Volume Indicator ===
avgVolume = ta.sma(volume, 20)
volumeSpike = volume > (avgVolume * volumeThresholdMultiplier)
// === Detect Swing High ===
isSwingHigh = ta.pivothigh(high, swingThreshold, swingThreshold)
// Variables to store swing highs
var float swingHigh1 = na
var float swingHigh2 = na
var int swingHighBar1 = na
var int swingHighBar2 = na
// Update swing highs
if (isSwingHigh)
swingHigh2 := swingHigh1
swingHighBar2 := swingHighBar1
swingHigh1 := high[swingThreshold]
swingHighBar1 := bar_index - swingThreshold
// === Calculate Upper Trend Line ===
var float upperSlope = na
var float upperIntercept = na
// Calculate slope and intercept for upper trend line if there are two swing highs
if (not na(swingHigh1) and not na(swingHigh2))
deltaX = swingHighBar1 - swingHighBar2
if (deltaX != 0)
upperSlope := (swingHigh1 - swingHigh2) / deltaX
upperIntercept := swingHigh1 - (upperSlope * swingHighBar1)
else
upperSlope := 0
upperIntercept := swingHigh1
// Calculate trend line price for the current bar
var float upperTrendPrice = na
if (not na(upperSlope) and not na(upperIntercept))
upperTrendPrice := upperSlope * bar_index + upperIntercept
// Calculate trend line price for the previous bar
var float upperTrendPrice_prev = na
if (not na(upperSlope) and not na(upperIntercept))
upperTrendPrice_prev := upperSlope * (bar_index - 1) + upperIntercept
// === Buy Condition Based on Trend Line Breakout ===
// Buy Signal: Price breaks above Upper Trend Line with volume spike
breakoutBuyCondition = (not na(upperTrendPrice)) and
(close > upperTrendPrice) and
(not na(upperTrendPrice_prev)) and
(close[1] <= upperTrendPrice_prev) and
volumeSpike
// === Manage Single Position ===
// Calculate Take Profit and Stop Loss levels based on percentage
longTakeProfit = close * (1 + tpPercent / 100)
longStopLoss = close * (1 - slPercent / 100)
// Calculate Trailing Stop as trail_offset (in price)
trail_offset = close * (trailPercent / 100)
// Execute Trade with Single Position Management
if (breakoutBuyCondition)
// Close existing short position if any
if (strategy.position_size < 0)
strategy.close("Sell")
// Open long position
strategy.entry("Buy", strategy.long)
// Set Take Profit, Stop Loss, and Trailing Stop Loss for long position
strategy.exit("Take Profit Buy", from_entry="Buy", limit=longTakeProfit, stop=longStopLoss, trail_offset=trail_offset)
// Plot Buy Signal
plotshape(breakoutBuyCondition, title="Buy Signal", location=location.belowbar, color=color.green, style=shape.labelup, text="BUY")