Динамическая стратегия остановки потерь на основе ATR

Автор:Чао Чжан, Дата: 2023-10-10 10:50:21
Тэги:

Обзор

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

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

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

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

  • 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_down, atr_current и atr_up на основе atr_div. Стоп-лосс цена стоп_цены устанавливается на 1,5ATR ниже входной цены.

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

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

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

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

  2. Следуйте тенденциям, ограничивая убытки.

  3. Механизм частичного получения прибыли блокирует некоторую прибыль и снижает риск.

Риски

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

  2. EMA не могут определить изменение тренда, они могут вводить новые позиции при изменении тренда.

  3. Высокая вероятность потерь после частичной прибыли.

  4. Параметры требуют дальнейшей оптимизации, для различных продуктов следует корректировать остановку 1.5ATR и получение прибыли 3ATR.

Улучшения

  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))

Больше