Стратегия ATR по отслеживанию полос остановки

Автор:Чао Чжан, Дата: 2023-10-19 12:42:26
Тэги:

img

Обзор

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

Логика стратегии

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

В частности, в стратегии используется следующая основная логика:

  1. Вычислить значение ATR периода ATR (nATRPeriod).

  2. Получить базовое расстояние остановки потери nLoss путем умножения значения ATR на фактор (nATRMultip).

  3. Обновление линии стоп-лосса xATRTrailingStop на основе текущей высокой, низкой и линии стоп-лосса предыдущего периода.

  4. Если текущий минимум запускает предыдущую линию стоп-лосса периода, то линия стоп-лосса движется вверх до минимума на расстояние nLoss.

  5. Если текущий максимум запускает предыдущую линию стоп-лосса периода, линия стоп-лосса движется вниз до выше максимума на расстояние nLoss.

  6. Если стоп-лосс не запускается, корректируйте линию стоп-лосса в зависимости от расстояния от нее до ценового закрытия.

  7. Добавить дополнительное расстояние защиты фитиля для дальнейшей оптимизации линии остановки потерь.

  8. Нарисуйте полосы Боллинджера, чтобы визуализировать верхний и нижний предел линии стоп-лосса.

  9. Определить направление позиции на основе цвета линии стоп-лосса.

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

Преимущества

Преимущества этой стратегии:

  1. Использование индикатора ATR для регулирования расстояния стоп-лосса с динамической адаптацией к различным рыночным условиям.

  2. Настраиваемый множитель позволяет гибко регулировать расстояние остановки потери.

  3. Добавление полос Боллинджера обеспечивает визуализацию верхних и нижних пределов линии стоп-лосса.

  4. Факультативная защита от фитиля позволяет избежать использования випса на различных рынках.

  5. Может использоваться в качестве последующего стоп-лосса для максимального снижения прибыльных позиций.

  6. Логика стратегии ясна и легко понятна с несколькими оптимизируемыми параметрами.

  7. Применяется для нескольких продуктов и временных рамок.

Риски

Некоторые риски этой стратегии:

  1. Показатель ATR медленно реагирует на шоки рынка, что приводит к большому расстоянию стоп-лосса.

  2. Чрезмерное установление мультипликатора также увеличивает расстояние остановки потери, увеличивая риск потери.

  3. Защита от вика может сделать линию стоп-лосса слишком свободной при увеличении винта.

  4. Правила входа не рассматриваются, не могут быть использованы в качестве стратегии входа/выхода.

  5. Обширные испытания и оптимизация параметров, необходимых для различных продуктов и сроков.

  6. Стоп-лосс может увеличить убытки, что требует эффективного управления капиталом.

Руководство по оптимизации

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

  1. Испытывать различные периоды ATR для оптимизации расстояния остановки потери.

  2. Настройка мультипликатора на баланс между расстоянием остановки и вероятностью.

  3. Оптимизируйте период защиты фитиля, чтобы предотвратить випса.

  4. Попробуйте добавить условия входа в верхнюю часть стоп-лосса, чтобы сделать его стратегией входа/выхода.

  5. Добавить индикатор тренда для корректировки дистанции остановки по тренду.

  6. Настройка стоп-лосса на основе теории волн Эллиота.

  7. Добавление размеров позиций для ограничения суммы единого убытка.

Резюме

Эта стратегия использует адаптивную характеристику индикатора 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")


Больше