
Основная идея этой стратегии заключается в том, чтобы рассчитать стоп-позиции для длинных и коротких линий на основе показателей ATR и генерировать торговые сигналы, когда цена прорывает эти стоп-линии. Она одновременно имеет функции отслеживания тенденций и захвата потрясений.
Эта стратегия использует коэффициент ATR, умноженный на коэффициент ATR N-периодов, для вычисления стоп-линий с обеих сторон. Конкретная формула вычисления такова:
长线止损 = 最高价 - ATR * 系数
短线止损 = 最低价 + ATR * 系数
Когда цена поднимается, она пробивает длинную линию остановки, а когда цена падает, она пробивает короткую линию остановки. После дополнительной позиционирования она отслеживает колебания цены в реальном времени, чтобы переместить линию остановки.
Такой метод, использующий ATR-диапазон в качестве места остановки, позволяет в полной мере улавливать ценовые тенденции при условии обеспечения риска остановки. Когда происходит значительный прорыв цены, создается сигнал, который может эффективно устранить ложные прорывы.
Основным преимуществом этой стратегии является возможность автоматически регулировать свои стоп-поизы, чтобы уловить ценовые тенденции и одновременно контролировать риски. Конкретные преимущества:
На основе ATR-индикатора устанавливается плавающий стоп, который может быть скорректирован в зависимости от волатильности рынка, чтобы эффективно контролировать одиночные потери.
Сигналы генерируются с использованием прорывного способа, который позволяет устранить часть шума и избежать подъема и подъема.
Регулирование стоп-линий в режиме реального времени отслеживает колебания цен, предотвращает слишком мягкие стоп-линии и блокирует больше прибыли.
Существуют также некоторые риски, связанные с установкой стоп-позиций и способом создания сигналов. Конкретные риски:
Неправильные ATR-циклы и коэффициенты могут привести к слишком широкому или слишком узкому остановке.
Например, если вы используете метод прорыва, вы можете упустить первые шансы на прорыв.
В конце тренда стоп-лошади могут задерживаться и не выйти идеально.
Контраст в основном состоит в том, чтобы скорректировать параметры, чтобы сделать стоп-лосс более обоснованным, или помочь другим показателям оценить тенденции и сигналы.
Эта стратегия может быть улучшена в следующих аспектах:
Установка второго уровня потери для дальнейшего контроля риска.
Повышение качества сигнала в сочетании с другими показателями.
Добавление мобильных стоп-стратегий для повышения прибыли при дальнейшем продолжении тренда.
Оптимизация циклов и коэффициентов ATR, чтобы остановить убытки ближе к реальным колебаниям цен.
Эта стратегия в целом очень практична, поскольку позволяет автоматически корректировать стоп-пост, эффективно контролировать риски, а также получать хорошую прибыль с помощью отслеживания тенденций. Мы можем оптимизировать и улучшать стратегию, чтобы сделать ее более стабильной и интеллектуальной.
/*backtest
start: 2024-01-04 00:00:00
end: 2024-02-03 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © melihtuna
//@version=4
strategy("Chandelier Exit - Strategy",shorttitle="CE-STG" , overlay=true, default_qty_type=strategy.cash, default_qty_value=10000, initial_capital=10000, currency=currency.USD, commission_value=0.03, commission_type=strategy.commission.percent)
length = input(title="ATR Period", type=input.integer, defval=22)
mult = input(title="ATR Multiplier", type=input.float, step=0.1, defval=3.0)
showLabels = input(title="Show Buy/Sell Labels ?", type=input.bool, defval=false)
useClose = input(title="Use Close Price for Extremums ?", type=input.bool, defval=true)
highlightState = input(title="Highlight State ?", type=input.bool, defval=true)
atr = mult * atr(length)
longStop = (useClose ? highest(close, length) : highest(length)) - atr
longStopPrev = nz(longStop[1], longStop)
longStop := close[1] > longStopPrev ? max(longStop, longStopPrev) : longStop
shortStop = (useClose ? lowest(close, length) : lowest(length)) + atr
shortStopPrev = nz(shortStop[1], shortStop)
shortStop := close[1] < shortStopPrev ? min(shortStop, shortStopPrev) : shortStop
var int dir = 1
dir := close > shortStopPrev ? 1 : close < longStopPrev ? -1 : dir
var color longColor = color.green
var color shortColor = color.red
longStopPlot = plot(dir == 1 ? longStop : na, title="Long Stop", style=plot.style_linebr, linewidth=2, color=longColor)
buySignal = dir == 1 and dir[1] == -1
plotshape(buySignal ? longStop : na, title="Long Stop Start", location=location.absolute, style=shape.circle, size=size.tiny, color=longColor, transp=0)
plotshape(buySignal and showLabels ? longStop : na, title="Buy Label", text="Buy", location=location.absolute, style=shape.labelup, size=size.tiny, color=longColor, textcolor=color.white, transp=0)
shortStopPlot = plot(dir == 1 ? na : shortStop, title="Short Stop", style=plot.style_linebr, linewidth=2, color=shortColor)
sellSignal = dir == -1 and dir[1] == 1
plotshape(sellSignal ? shortStop : na, title="Short Stop Start", location=location.absolute, style=shape.circle, size=size.tiny, color=shortColor, transp=0)
plotshape(sellSignal and showLabels ? shortStop : na, title="Sell Label", text="Sell", location=location.absolute, style=shape.labeldown, size=size.tiny, color=shortColor, textcolor=color.white, transp=0)
midPricePlot = plot(ohlc4, title="", style=plot.style_circles, linewidth=0, display=display.none, editable=false)
longFillColor = highlightState ? (dir == 1 ? longColor : na) : na
shortFillColor = highlightState ? (dir == -1 ? shortColor : na) : na
fill(midPricePlot, longStopPlot, title="Long State Filling", color=longFillColor)
fill(midPricePlot, shortStopPlot, title="Short State Filling", color=shortFillColor)
long_short = input(true, "Long-Short",type=input.bool, group="Strategy Settings")
start = input(timestamp("2019-01-01"), "Date", type=input.time, group="Strategy Settings")
finish = input(timestamp("2025-01-01"), "Date", type=input.time, group="Strategy Settings")
window() => true
slRatio=input(5, "Manuel Stop Loss Ratio", type=input.float, minval=0, group="Strategy Settings")
tpRatio=input(20, "Take Profit Ratio", type=input.float, minval=0, group="Strategy Settings")
tsStartRatio=input(10, "Trailing Stop Start Ratio", type=input.float, minval=0, group="Strategy Settings")
tsRatio=input(5, "Trailing Stop Ratio", type=input.float, minval=1, group="Strategy Settings")
lastBuyPrice = strategy.position_avg_price
diffHiPriceRatio = (high-lastBuyPrice)/lastBuyPrice*100
diffLoPriceRatio = (close-lastBuyPrice)/lastBuyPrice*100
posHiRatio=0.0
posHiRatio:= strategy.position_size > 0 ? diffHiPriceRatio > posHiRatio[1] ? diffHiPriceRatio : posHiRatio[1] : 0
s_diffHiPriceRatio = (low-lastBuyPrice)/lastBuyPrice*100
s_diffLoPriceRatio = (close-lastBuyPrice)/lastBuyPrice*100
s_posHiRatio=0.0
s_posHiRatio:= strategy.position_size < 0 ? s_diffLoPriceRatio < s_posHiRatio[1] ? s_diffLoPriceRatio : s_posHiRatio[1] : 0
strategy.entry("LONG", strategy.long, when = window() and buySignal)
strategy.close("LONG", when = window() and sellSignal)
strategy.close("LONG", when = diffLoPriceRatio<(slRatio*(-1)), comment="STOP-LONG")
strategy.close("LONG", when = diffHiPriceRatio>tpRatio, comment="TAKE-PROFIT-LONG")
strategy.close("LONG", when = ((posHiRatio[1]>tsStartRatio) and (posHiRatio[1]-diffHiPriceRatio)>tsRatio), comment="TRAILING-STOP-LONG")
if long_short
strategy.entry("SHORT", strategy.short, when = window() and sellSignal)
strategy.close("SHORT", when = window() and buySignal)
strategy.close("SHORT", when = s_diffLoPriceRatio>(slRatio), comment="STOP-SHORT")
strategy.close("SHORT", when = s_diffHiPriceRatio<(tpRatio*(-1)), comment="TAKE-PROFIT-SHORT")
strategy.close("SHORT", when = ((s_posHiRatio[1]*(-1)>tsStartRatio) and ((s_posHiRatio[1]-s_diffLoPriceRatio))*(-1)>tsRatio), comment="TRAILING-STOP-SHORT")