Стратегия Best ATR Stop Multiple - это стратегия, которая использует множители среднего истинного диапазона (ATR) для установки точек остановки потерь и динамической корректировки риска.
Стратегия сначала рассчитывает простые скользящие средние периодов быстрой и медленной SMA. Она длинная, когда быстрая SMA пересекает медленную SMA, и короткая, когда быстрая SMA пересекает медленную SMA.
После ввода, он отслеживает значение ATR в режиме реального времени. ATR представляет собой среднюю волатильность за определенный период обратного просмотра. Стратегия позволяет установить период ATR (по умолчанию 14) и мультипликатор (по умолчанию 2). Система вычисляет значение ATR при входе, а затем умножает его на установленный мультипликатор как расстояние остановки.
Например, если ATR после входа составляет 50 пунктов, а мультипликатор установлен на 2, то стоп-расстояние будет 100 пунктов. Если цена затем движется более чем на 100 пунктов, будет задействован ордер стоп-лосса. Это позволяет своевременно остановить потери, чтобы избежать чрезмерных потерь.
Стратегия также учитывает определение тренда. Длинный стоп-лосс разрешается только тогда, когда сигнал покупки соответствует восходящей тенденции. Короткий стоп-лосс соответствует нисходящей тенденции.
Линии стоп-лосса отображены на графике, чтобы мы могли проверить их в режиме реального времени.
Наибольшее преимущество этой стратегии заключается в том, что она динамически регулирует расстояние стоп-лосса и автоматически изменяет риск на основе изменений волатильности рынка.
По сравнению с фиксированными дистанциями стоп-лосса, этот подход эффективно контролирует потери на основе торговли, отслеживая тенденции.
Кроме того, в сочетании с определением тренда, такие методы стоп-лосса могут уменьшить вероятность того, что они будут остановлены в зонах консолидации.
Основным риском этой стратегии является вероятность того, что цены будут снижаться в краткосрочной перспективе во время позиции, что вызовет стоп-лосс. Особенно если период ATR слишком короткий, стоп-расстояния не могут полностью отфильтровать влияние краткосрочных колебаний.
Еще один риск заключается в том, что цены могут разрываться через уровень стоп-лосса при насильственных движениях. Это потребует больших настроек мультипликатора ATR, но это также означает снижение потенциала прибыли.
Наконец, в стратегии не учитывается влияние послеобеденной и предмаркетной торговли на значения ATR, что может привести к неточному расчету данных ATR при открытии или закрытии.
Стратегия может быть оптимизирована в нескольких аспектах:
Оптимизировать параметры периода ATR и тестировать лучшие комбинации для различных рынков
Сравните фиксированные и динамические кратные ATR с точки зрения доходности
Включить данные после работы в расчет ATR, чтобы уменьшить пробелы на открытых
Установка условий ATR: допускать остановки только при достижении ATR определенных уровней, избегая ненужных остановок в условиях низкой волатильности
Включите больше фильтров: основные тенденции, показатели объема/импульса и т.д.
Стратегия Best ATR Stop Multiple эффективно уравновешивает следование тренду и контроль рисков путем динамической корректировки расстояний остановок. По сравнению с фиксированными остановками она обеспечивает потенциал прибыли, эффективно ограничивая убытки.
Конечно, некоторые риски остаются, такие как ценовые разрывы и чрезмерно чувствительные остановки.
/*backtest start: 2024-01-01 00:00:00 end: 2024-01-31 23:59:59 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 //@author=Daveatt //This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ SystemName = "BEST ATR Stop Multiple Strategy" TradeId = "BEST" InitCapital = 100000 InitPosition = 100 InitCommission = 0.075 InitPyramidMax = 1 CalcOnorderFills = true CalcOnTick = true DefaultQtyType = strategy.fixed DefaultQtyValue = strategy.fixed Precision = 2 Overlay=true strategy(title=SystemName, shorttitle=SystemName, overlay=Overlay ) fastSMAperiod = input(defval=15, title='Fast SMA', type=input.integer, minval=2, step=1) slowSMAperiod = input(defval=45, title='Slow SMA', type=input.integer, minval=2, step=1) src = close // Calculate moving averages fastSMA = sma(src, fastSMAperiod) slowSMA = sma(src, slowSMAperiod) // Calculate trading conditions enterLong = crossover(fastSMA, slowSMA) enterShort = crossunder(fastSMA, slowSMA) // trend states since_buy = barssince(enterLong) since_sell = barssince(enterShort) buy_trend = since_sell > since_buy sell_trend = since_sell < since_buy is_signal = enterLong or enterShort // get the entry price entry_price = valuewhen(enterLong or enterShort, src, 0) // Plot moving averages plot(series=fastSMA, color=color.teal) plot(series=slowSMA, color=color.orange) // Plot the entries plotshape(enterLong, style=shape.circle, location=location.belowbar, color=color.green, size=size.small) plotshape(enterShort, style=shape.circle, location=location.abovebar, color=color.red, size=size.small) /////////////////////////////// //======[ Trailing STOP ]======// /////////////////////////////// // use SL? useSL = input(true, "Use stop Loss") // ATR multiple Stop stop_atr_length = input(14,title="ATR Length", minval=1, type=input.integer) stop_atr_mult = input(2,title="ATR Multiple", minval=0.05, step=0.1, type=input.float) // Global STOP stop_price = 0.0, stop_price := nz(stop_price[1]) // STOP ATR var stop_atr = 0.0 var entry_stop_atr = 0.0 stop_atr := nz(atr(stop_atr_length)) if enterLong or enterShort entry_stop_atr := stop_atr * stop_atr_mult // display the ATR value multiple plotshape(enterLong, title='ATR Long Stop value', style=shape.labelup, location=location.bottom, color=color.green, transp=0, text='', textcolor=color.navy, editable=true, size=size.small, show_last=1, size=size.small) // var label atr_long_label = na // var label atr_short_label = na lapos_y_entry_up = lowest(30) lapos_y_entry_dn = highest(30) // text_label = "ATR value: " + tostring(stop_atr, '#.#') + "\n\nATR Multiple value: " + tostring(entry_stop_atr, '#.#') // if enterLong // label.delete(atr_long_label) // atr_long_label := label.new(bar_index, lapos_y_entry_up, text=text_label, // xloc=xloc.bar_index, yloc=yloc.price, color=color.green, style=label.style_labelup, textcolor=color.white, // size=size.normal) // if enterShort // label.delete(atr_short_label) // atr_short_label := label.new(bar_index, lapos_y_entry_dn, text=text_label, // xloc=xloc.bar_index, yloc=yloc.price, color=color.red, style=label.style_labeldown, textcolor=color.black, // size=size.normal) // Determine trail stop loss prices longStopPrice = 0.0, shortStopPrice = 0.0 longStopPrice := if useSL and buy_trend stopValue = entry_price - entry_stop_atr else 0 shortStopPrice := if useSL and sell_trend stopValue = entry_price + entry_stop_atr else 999999 ////////////////////////////////////////////////////////////////////////////////////////// //*** STOP LOSS HIT CONDITIONS TO BE USED IN ALERTS ***// ////////////////////////////////////////////////////////////////////////////////////////// cond_long_stop_loss_hit = useSL and buy_trend and crossunder(low, longStopPrice[1]) cond_short_stop_loss_hit = useSL and sell_trend and crossover(high, shortStopPrice[1]) // Plot stop loss values for confirmation plot(series=useSL and buy_trend and low >= longStopPrice ? longStopPrice : na, color=color.fuchsia, style=plot.style_cross, linewidth=2, title="Long Trail Stop") plot(series=useSL and sell_trend and high <= shortStopPrice ? shortStopPrice : na, color=color.fuchsia, style=plot.style_cross, linewidth=2, title="Short Trail Stop") close_long = cond_long_stop_loss_hit close_short = cond_short_stop_loss_hit // Submit entry orders strategy.entry(TradeId + " L", long=true, when=enterLong) strategy.close(TradeId + " L", when=close_long) //if (enterShort) strategy.entry(TradeId + " S", long=false, when=enterShort) strategy.close(TradeId + " S", when=close_short)