
Основная идея этой стратегии заключается в том, чтобы использовать показатель средней реальной длины волны (ATR) для установления адаптивной следящей стоп-линии, чтобы максимально защитить прибыльные позиции и избежать преждевременного прекращения. Показатель ATR способен динамически улавливать волатильность рынка, корректируя стоп-дистанцию в соответствии с рыночными колебаниями и минимизируя вероятность того, что стоп-убытки будут вызваны, гарантируя стоп-убытки.
Эта стратегия использует среднее значение N циклов показателя ATR, умноженное на одно кратное число, как базовый стоп-дистанцию. Чем больше значение ATR, тем больше рыночная волатильность, тем шире устанавливается стоп-дистанция; чем меньше значение ATR, тем меньше устанавливается стоп-дистанция.
В частности, стратегия использует следующую ключевую логику:
Вычислить значение ATR для периода ATR ((nATRPeriod)).
На основе ATR-значений умножьте на кратное число ((nATRMultip) и получите базовое расстояние стоп-лосса nLoss.
Обновление стоп-линии xATRTrailingStop на основе текущих высоких, низких и предыдущих циклов.
Если текущая низкая точка вызвала предыдущую линию стоп-порога, то стоп-порог перемещается на расстояние nLoss ниже низкой точки.
Если текущий пик вызывает предыдущий цикл стоп-линии, то стоп-линия перемещается ниже, на расстояние nLoss выше пика.
Если стоп-линия не была активирована, то она должна быть скорректирована в зависимости от расстояния от стоп-линии.
Добавление опционального расстояния защиты от теневой линии для дальнейшей оптимизации стоп-линии.
Нарисуйте орбиту Брин для визуализации верхней и нижней границ стоп-линий.
Определение направления позиции в зависимости от цвета стоп-линии
Эта стратегия использует гибкий показатель ATR, позволяя стоп-линии адаптироваться к рыночным колебаниям, чтобы обеспечить разумное расстояние от стоп-линий и избежать ненужных потерь позиций из-за слишком радикальных стоп-линий.
Эта стратегия имеет следующие преимущества:
Используя индикатор ATR для динамической корректировки стоп-дистанции, можно адаптироваться к различным условиям рынка.
Параметры множителя могут быть настроены, чтобы обеспечить гибкую настройку стоп-расстояния.
Присоединяется к орбите Брин-пояса, образуя верхнюю и нижнюю границы визуализации стоп-линии.
Выберите защиту от теней, чтобы избежать випсава при колебаниях.
Это может быть использовано для отслеживания стоп-лосса и максимального вывода выигрышных позиций.
Стратегическая мысль ясна и понятна, параметры не так легко оптимизировать.
Используется в различных сортах и циклах, имеет широкое применение.
Однако есть и другие риски, о которых следует помнить:
ATR задерживается в реакции на неожиданные события на рынке, что может привести к чрезмерному стоп-дальности.
Слишком большое множительное также может привести к слишком широкому стоп-диапазону, увеличивая риск потери.
Защита от теневой линии при усилении толчков может привести к чрезмерному ослаблению стоп-линий.
Не учитывая правила входа, нельзя использовать их в качестве стратегии Entries/Exits.
Необходимо многократно тестировать параметры оптимизации для различных сортов и циклов.
Прорыв стоп-лосса может привести к увеличению убытков и требует эффективного управления средствами.
Эта стратегия может быть оптимизирована в следующих аспектах:
Тестирование различных параметров цикла ATR для оптимизации стоп-дистанции.
Настройка параметров множителей, чтобы найти баланс между расстоянием остановки и вероятностью остановки.
Оптимизация параметров цикла защиты от теней, предотвращая whipsaw.
Попытка включить входные условия на основе стоп-лосса, чтобы сделать это стратегией Entries/Exits.
Добавить индикатор определения тренда и скорректировать стоп-ранч в соответствии с трендом.
В сочетании с теорией волны, в зависимости от положения волны корректируется расстояние остановки.
Добавление контроля позиций, ограничение одиночных потерь.
Эта стратегия использует адаптивные свойства ATR-индикатора и разработала механизм, позволяющий динамично регулировать убытки. При этом, гарантируя убытки, она также уменьшает по возможности ненужные убытки.
/*backtest
start: 2022-10-12 00:00:00
end: 2023-10-18 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=2
////////////////////////////////////////////////////////////
// Copyright by HPotter v2.0 13/10/2014
// Average True Range Trailing Stops Strategy, by Sylvain Vervoort
// The related article is copyrighted material from Stocks & Commodities Jun 2009
// Modified by River to add Bands, and change color of Trailing Stop and add Wick Protection. Now turned into a Strategy for Backtesting Purposes.
// After backtesting, it seems clear that it functions well as a Trailing Stop, but not as an Entry/Exit strategy.
////////////////////////////////////////////////////////////
strategy(title="ATR Trailing Stop Bands Strategy[R] ", overlay = true)
nATRPeriod = input(5)
nATRMultip = input(4)
length = input(30, "#Periods of Wick Protection", minval=2)
bType = input(0, "Max [1] or Avg Wick Protection [0]", minval=0, maxval=1)
avgupperwick = sma(close[1] <= open[1] ? high[1] - open[1] : high[1] - close[1], length)
maxupperwick = highest(close[1] <= open[1] ? high[1] - open[1] : high[1] - close[1], length)
avglowerwick = sma(close[1] > open[1] ? open[1] - low[1] : close[1] - low[1], length)
maxlowerwick = highest(close[1] > open[1] ? open[1] - low[1] : close[1] - low[1], length)
upperwick = bType == 0 ? avgupperwick : maxupperwick
lowerwick = bType == 0 ? avglowerwick : maxlowerwick
xATR = atr(nATRPeriod)
nLoss = nATRMultip * xATR
upperband = iff(high < nz(upperband[1], 0) and high[1] < nz(upperband[1], 0), min(nz(upperband[1]), high + nLoss + upperwick), high + nLoss + upperwick)
lowerband = iff(low > nz(lowerband[1], 0) and low[1] > nz(lowerband[1], 0), max(nz(lowerband[1]), low - nLoss - lowerwick), low - nLoss - lowerwick)
xATRTrailingStop = iff(low > nz(xATRTrailingStop[1], 0) and low[1] > nz(xATRTrailingStop[1], 0), max(nz(xATRTrailingStop[1]), low - nLoss - lowerwick),
iff(high < nz(xATRTrailingStop[1], 0) and high[1] < nz(xATRTrailingStop[1], 0), min(nz(xATRTrailingStop[1]), high + nLoss + upperwick),
// iff(low <= nz(xATRTrailingStop[1], 0) and close[1] > nz(xATRTrailingStop[1], 0), high + nLoss + upperwick, iff(high >= nz(xATRTrailingStop[1], 0) and close[1] < nz(xATRTrailingStop[1], 0), low - nLoss - lowerwick,0))))
iff(low <= nz(xATRTrailingStop[1], 0) and close[1] > nz(xATRTrailingStop[1], 0), upperband[1], iff(high >= nz(xATRTrailingStop[1], 0) and close[1] < nz(xATRTrailingStop[1], 0), lowerband[1],0))))
pos = iff(close[1] > nz(xATRTrailingStop[1], 0) and low <= nz(xATRTrailingStop[1], 0), 1,
iff(close[1] < nz(xATRTrailingStop[1], 0) and high >= nz(xATRTrailingStop[1], 0), -1, nz(pos[1], 0)))
color = pos == 1 ? red: pos == -1 ? green : blue
plot(upperband, color=red, title="ATR Upper")
plot(xATRTrailingStop, color=color, title="ATR Trailing Stop", linewidth=2)
plot(lowerband, color=green, title="ATR Lower")
longCondition = (color == green and color[1] == red)
if (longCondition)
strategy.entry("Long", strategy.long)
longExitCondition = (color == red and color[1] == green)
if (longExitCondition)
strategy.close("Long")
shortCondition = (color == red and color[1] == green)
if (shortCondition)
strategy.entry("Short", strategy.short)
shortexitCondition = (color == green and color[1] == red)
if (shortexitCondition)
strategy.close("Short")