
Это многообещающая стратегическая стратегия, основанная на динамических трендовых линиях и подтверждении объема сделки. Стратегия идентифицирует ключевые высокие точки колебания, отслеживая движение цены в режиме реального времени, и использует динамику этих точек для построения трендовых линий.
Центральная логика стратегии основана на трех основных столпах: построение динамической трендовой линии, подтверждение объема сделки и система управления рисками. Во-первых, стратегия использует функцию ta.pivothigh для динамического идентификации высоких колебаний цены и построения верхней трендовой линии на основе расчета наклона и сечения на основе двух последних высоких колебаний. Во-вторых, стратегия требует, чтобы входный сигнал должен сопровождаться более чем 1,5 раза большим объемом сделки, чем средняя величина 20 циклов, чтобы обеспечить эффективность прорыва.
Эта стратегия имеет хорошую адаптивность и надежность. Хотя существует определенная зависимость от рынка, но с помощью рекомендуемого направления оптимизации стратегия имеет большое пространство для улучшения. Рекомендуется, чтобы трейдеры проводили полноценную оптимизацию параметров и обратную проверку перед использованием на рынке.
/*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")