Стратегия отслеживания свободных колебаний полосы


Дата создания: 2024-02-04 10:28:24 Последнее изменение: 2024-02-04 10:28:24
Копировать: 0 Количество просмотров: 614
1
Подписаться
1617
Подписчики

Стратегия отслеживания свободных колебаний полосы

Обзор

Основная идея этой стратегии заключается в том, чтобы рассчитать стоп-позиции для длинных и коротких линий на основе показателей ATR и генерировать торговые сигналы, когда цена прорывает эти стоп-линии. Она одновременно имеет функции отслеживания тенденций и захвата потрясений.

Стратегический принцип

Эта стратегия использует коэффициент ATR, умноженный на коэффициент ATR N-периодов, для вычисления стоп-линий с обеих сторон. Конкретная формула вычисления такова:

长线止损 = 最高价 - ATR * 系数
短线止损 = 最低价 + ATR * 系数

Когда цена поднимается, она пробивает длинную линию остановки, а когда цена падает, она пробивает короткую линию остановки. После дополнительной позиционирования она отслеживает колебания цены в реальном времени, чтобы переместить линию остановки.

Такой метод, использующий ATR-диапазон в качестве места остановки, позволяет в полной мере улавливать ценовые тенденции при условии обеспечения риска остановки. Когда происходит значительный прорыв цены, создается сигнал, который может эффективно устранить ложные прорывы.

Анализ преимуществ

Основным преимуществом этой стратегии является возможность автоматически регулировать свои стоп-поизы, чтобы уловить ценовые тенденции и одновременно контролировать риски. Конкретные преимущества:

  1. На основе ATR-индикатора устанавливается плавающий стоп, который может быть скорректирован в зависимости от волатильности рынка, чтобы эффективно контролировать одиночные потери.

  2. Сигналы генерируются с использованием прорывного способа, который позволяет устранить часть шума и избежать подъема и подъема.

  3. Регулирование стоп-линий в режиме реального времени отслеживает колебания цен, предотвращает слишком мягкие стоп-линии и блокирует больше прибыли.

Анализ рисков

Существуют также некоторые риски, связанные с установкой стоп-позиций и способом создания сигналов. Конкретные риски:

  1. Неправильные ATR-циклы и коэффициенты могут привести к слишком широкому или слишком узкому остановке.

  2. Например, если вы используете метод прорыва, вы можете упустить первые шансы на прорыв.

  3. В конце тренда стоп-лошади могут задерживаться и не выйти идеально.

Контраст в основном состоит в том, чтобы скорректировать параметры, чтобы сделать стоп-лосс более обоснованным, или помочь другим показателям оценить тенденции и сигналы.

Направление оптимизации

Эта стратегия может быть улучшена в следующих аспектах:

  1. Установка второго уровня потери для дальнейшего контроля риска.

  2. Повышение качества сигнала в сочетании с другими показателями.

  3. Добавление мобильных стоп-стратегий для повышения прибыли при дальнейшем продолжении тренда.

  4. Оптимизация циклов и коэффициентов 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")