Стратегия динамического стоп-лосса на основе ATR


Дата создания: 2023-10-10 10:50:21 Последнее изменение: 2023-10-10 10:50:21
Копировать: 4 Количество просмотров: 936
1
Подписаться
1617
Подписчики

Обзор

Эта стратегия использует ATR, чтобы установить динамическую остановку, чтобы регулировать остановку в зависимости от колебаний цены, чтобы обеспечить контроль риска. Стратегия в основном заключается в том, чтобы сделать несколько входов с помощью 5-дневной ЭМА и 20-дневной ЭМА, чтобы сформировать золотой форк, а затем использовать ATR, чтобы установить остановку и остановку.

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

Стратегия сначала рассчитывает, что в случае пересечения 5-дневной ЭМА через 20-дневную ЭМА будет сделан лишний вход. После входа, используя показатель ATR, рассчитывается кратность ATR от расстояния от текущей цены, и устанавливается стоп-стоп на 1,5 ATR ниже цены входа. Затем, по мере роста цены, постепенно повышается стоп-стоп, и частично останавливается, если рост цены превышает цену входа 3 ATR.

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

  • entry_price: цена входа
  • stop_price: цена остановки
  • take_profit_price: цена, на которую можно получить прибыль
  • atr_down: ниже линии ATR
  • atr_up: верхняя линия ATR
  • atr_current: текущая линия ATR
  • atr_ref: Значение ATR

После входа рассчитываетсяatr_ref как значение текущего ATR,atr_div как кратность ATR от текущей цены входа. Затем в зависимости отatr_div устанавливаетсяatr_down,atr_current иatr_up. Стоп_price - это 1,5 ATR ниже цены входа.

По мере роста цены, путем сравнения текущей цены AVG и ATR_UP, если AVG носит ATR_UP, то пересчитывается соответствующее положение ATR_DIV и ATR, таким образом, постепенно повышается стоп-линия, увеличивая прибыль от держания позиции.

Если цена превышает входную цену 3ATR, то будет частично ликвидировано, чтобы зафиксировать прибыль, в этот момент знак tookProfit будет установлен как true. Если цена продолжит расти, то будет продолжено повышение стоп-позиции. Если будет вызвана стоп-убыток, то будет принято решение о tookProfit, если ранее уже была частичная стоп-позиция, то будет ликвидирована только оставшаяся позиция, иначе вся позиция будет ликвидирована.

Стратегические преимущества

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

  2. В случае ограниченных убытков следует следовать тренду, чтобы сократить прибыль. Стоп-линия будет постепенно повышаться, чтобы прибыль продолжала накапливаться.

  3. Частичный стоп-механизм может блокировать часть прибыли, уменьшая риск. Затем стоп-позиция продолжает расти, чтобы прибыль продолжала работать.

Стратегический риск

  1. ATR не чувствителен к аномальным прорывам и не может справиться с рисками, связанными с пробелами.

  2. EMA не может определить обратный тренд и может ввести новую позицию, если тренд изменится.

  3. После частичной остановки вероятность возврата убытков выше.

  4. Недостаточно оптимизированы параметры, 1.5 ATR Stop Loss и 3 ATR Stop Loss требуют корректировки в зависимости от разновидности.

Оптимизация стратегии

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

  2. Можно тестировать различные среднелинейные показатели или включать MACD, чтобы определить обратный тренд.

  3. Можно оптимизировать пропорции и частоту частичного задержки, различные сорта могут иметь разные настройки.

  4. Добавление параметров оптимизации, тестирование эффекта остановки потери различных ATR множителей. Добавление функции остановки потери по шагу.

  5. Тестирование эффективности при слабом тренде, можно рассматривать только при более сильном тренде.

Подвести итог

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

Исходный код стратегии
/*backtest
start: 2022-10-03 00:00:00
end: 2023-10-09 00:00:00
period: 1d
basePeriod: 1h
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/
// © ekinbasarkomur

//@version=5
strategy("[EKIN] ATR Exit Strategy", overlay=true, initial_capital = 1000, default_qty_value = 100, default_qty_type = strategy.percent_of_equity, calc_on_every_tick = true)

// Simple EMA tracking
fastEMA = ta.ema(close, 5)
slowEMA = ta.ema (close, 20)
atr = ta.atr(14)

// We define entry price for future reference
var float entry_price = na
// We define stop and take profit for future calculations
var float stop_price = na
var float take_profit_price = na

// We define atr limtim its here
var float atr_down = na
var float atr_up = na
var float atr_current = na
var float atr_ref = na

avg = (low + high) / 2

// Conditions
enterCondition = ta.crossover(fastEMA, slowEMA)
var bool tookProfit = false
timePeriod = time >= timestamp(syminfo.timezone, 2021, 12, 15, 0, 0)
InTrade = strategy.position_size > 0

// Go long if conditions are met
if (enterCondition and timePeriod and not InTrade)
    // Calculate and update variables
    entry_price := avg
    atr_ref := atr
    atr_div = int((avg - entry_price) / atr_ref)
    atr_down := entry_price + (atr_ref * (atr_div - 1.5))
    atr_up := entry_price + (atr_ref * (atr_div + 1))
    atr_current := entry_price + (atr_ref * atr_div) 
    stop_price := (entry_price - (atr_ref * 1.5))
    take_profit_price := (entry_price + (atr_ref * 3))
    strategy.order("buy", strategy.long, qty = 2)

// Enter here if in position
if InTrade or tookProfit
    stopCondition = avg < stop_price
    takeProfitCondition = avg > take_profit_price

    if avg < atr_down
        stopCondition := true

    // Move stop price and exit price if price for each atr price increase
    if avg > atr_up
        if tookProfit
            atr_ref := atr
        atr_div = int((avg - entry_price) / atr_ref)
        atr_down := entry_price + (atr_ref * (atr_div - 1))
        atr_up := entry_price + (atr_ref * (atr_div + 1))
        atr_current := entry_price + (atr_ref * atr_div) 

    // Take half of the investment if current price is 3 atr higher than entry price
    if (takeProfitCondition and timePeriod and InTrade and not tookProfit)
        strategy.order("take_half_profit", strategy.short, qty = 1)
        tookProfit := true

    // Exit position if conditions are met and reset the variables
    if (stopCondition and timePeriod and InTrade)
        if tookProfit
            strategy.order("exit", strategy.short, qty = 1)
        else
            strategy.order("stop_loss", strategy.short, qty = 2)

        tookProfit := false

// Plot EMA's
plot(fastEMA, color = color.blue)
plot(slowEMA, color = color.yellow)

// Plot ATR Limit/Stop positions
profit_plot = plot(series = InTrade?atr_up:na, title = "profit", color = color.green, style=plot.style_linebr)
close_plot = plot(series = InTrade?atr_current:na, title = "close", color = color.white, style=plot.style_linebr)
stop_plot = plot(series = InTrade?atr_down:na, title = "stop_loss", color = color.red, style=plot.style_linebr)
fill(profit_plot, close_plot, color = color.new(color.green, 80))
fill(close_plot, stop_plot, color =color.new(color.red,80))