Основная идея этой стратегии состоит в том, чтобы использовать индикатор среднего истинного диапазона (ATR) для установки адаптивной линии остановки потери, чтобы максимизировать защиту прибыльных позиций, избегая преждевременного остановки потери.
Эта стратегия использует средний показатель ATR за N периодов, умноженный на фактор в качестве базового расстояния стоп-лосса. Чем больше значение ATR, тем больше волатильность рынка, поэтому чем шире устанавливается расстояние стоп-лосса. Чем меньше значение ATR, тем узче устанавливается расстояние стоп-лосса. Это позволяет динамически регулировать расстояние стоп-лосса на основе волатильности рынка.
В частности, в стратегии используется следующая основная логика:
Вычислить значение ATR периода ATR (nATRPeriod).
Получить базовое расстояние остановки потери nLoss путем умножения значения ATR на фактор (nATRMultip).
Обновление линии стоп-лосса xATRTrailingStop на основе текущей высокой, низкой и линии стоп-лосса предыдущего периода.
Если текущий минимум запускает предыдущую линию стоп-лосса периода, то линия стоп-лосса движется вверх до минимума на расстояние nLoss.
Если текущий максимум запускает предыдущую линию стоп-лосса периода, линия стоп-лосса движется вниз до выше максимума на расстояние nLoss.
Если стоп-лосс не запускается, корректируйте линию стоп-лосса в зависимости от расстояния от нее до ценового закрытия.
Добавить дополнительное расстояние защиты фитиля для дальнейшей оптимизации линии остановки потерь.
Нарисуйте полосы Боллинджера, чтобы визуализировать верхний и нижний предел линии стоп-лосса.
Определить направление позиции на основе цвета линии стоп-лосса.
Стратегия гибко использует индикатор ATR, чтобы позволить линии стоп-лосса адаптироваться на основе волатильности рынка, обеспечивая разумное расстояние стоп-лосса, избегая чрезмерного стоп-лосса, который вызывает ненужную потерю позиций.
Преимущества этой стратегии:
Использование индикатора ATR для регулирования расстояния стоп-лосса с динамической адаптацией к различным рыночным условиям.
Настраиваемый множитель позволяет гибко регулировать расстояние остановки потери.
Добавление полос Боллинджера обеспечивает визуализацию верхних и нижних пределов линии стоп-лосса.
Факультативная защита от фитиля позволяет избежать использования випса на различных рынках.
Может использоваться в качестве последующего стоп-лосса для максимального снижения прибыльных позиций.
Логика стратегии ясна и легко понятна с несколькими оптимизируемыми параметрами.
Применяется для нескольких продуктов и временных рамок.
Некоторые риски этой стратегии:
Показатель ATR медленно реагирует на шоки рынка, что приводит к большому расстоянию стоп-лосса.
Чрезмерное установление мультипликатора также увеличивает расстояние остановки потери, увеличивая риск потери.
Защита от вика может сделать линию стоп-лосса слишком свободной при увеличении винта.
Правила входа не рассматриваются, не могут быть использованы в качестве стратегии входа/выхода.
Обширные испытания и оптимизация параметров, необходимых для различных продуктов и сроков.
Стоп-лосс может увеличить убытки, что требует эффективного управления капиталом.
Стратегия может быть оптимизирована в следующих аспектах:
Испытывать различные периоды ATR для оптимизации расстояния остановки потери.
Настройка мультипликатора на баланс между расстоянием остановки и вероятностью.
Оптимизируйте период защиты фитиля, чтобы предотвратить випса.
Попробуйте добавить условия входа в верхнюю часть стоп-лосса, чтобы сделать его стратегией входа/выхода.
Добавить индикатор тренда для корректировки дистанции остановки по тренду.
Настройка стоп-лосса на основе теории волн Эллиота.
Добавление размеров позиций для ограничения суммы единого убытка.
Эта стратегия использует адаптивную характеристику индикатора 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")