Стратегия торговли ETF на основе ATR и прорывов


Дата создания: 2023-12-26 16:05:55 Последнее изменение: 2023-12-26 16:05:55
Копировать: 2 Количество просмотров: 822
1
Подписаться
1623
Подписчики

Стратегия торговли ETF на основе ATR и прорывов

Обзор

Эта стратегия является автоматической торговой стратегией ETF, основанной на средней реальной волне (ATR) и ценовом прорыве. Она использует ATR для расчета стоп-лосса и стоп-поста, и открывает позиции вверх или вниз, когда цена пересекает определенную циклическую максимуму или минимуму.

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

Эта стратегия основана на следующих принципах:

  1. Используйте максимальные и минимальные цены определенного цикла (например, 20 K-линий) для определения движения и направления цены. Когда цена прорывает циклическую максимальную цену, делайте больше; когда цена прорывает циклическую минимальную цену, делайте пробел.

  2. Используйте ATR для динамического вычисления стоп-лосса. Стоп-лосса находится на расстоянии от начальной цены, а значение ATR для одного ATR-цикла умножено на коэффициент ((например, 2)).

  3. Используйте ATR, чтобы рассчитать стоп-паузы. Стоп-паузы от входных цен на один цикл ATR, умноженный на коэффициент ATR (как 1) [2].

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

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

Анализ преимуществ

Эта стратегия имеет следующие преимущества:

  1. Стратегическая концепция проста, понятна, легко понятна и реализуема.

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

  3. Поскольку в целом, по мнению экспертов, в целом, это не так, как предполагается, то в целом, это не так.

  4. Приведите пример, как можно вовремя остановить повреждение трейлера, чтобы избежать риска.

  5. Для более заметных видов, таких как ETF, акции и т. д.

Анализ рисков

Также существуют следующие риски:

  1. При колебаниях цен может быть больше ложных сигналов и обратных открытий позиций.

  2. Неправильная настройка циклических параметров может привести к упущению ценовых тенденций или слишком большому количеству фиктивных сделок.

  3. Неправильная настройка параметров коэффициента может привести к тому, что остановка или остановка станет слишком радикальной или консервативной, что повлияет на прибыль.

  4. Риски, связанные с ETF, такие как политический риск, риск премии и т. д., также влияют на стратегию.

Решение проблемы:

  1. Оптимизация параметров, снижение виртуальных транзакций.
  2. Для определения торгового сигнала используются различные факторы и фильтры.
  3. Параметры для различных рынков.
  4. Распределенные инвестиции, контролирующие позиции в отдельных ETF.

Направление оптимизации

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

  1. Для фильтрации ложных сигналов используются такие индикаторы, как движущаяся средняя.

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

  3. Добавление моделей машинного обучения, которые прогнозируют высокие и низкие точки следующей линии K для определения прорыва.

  4. Внимание к таким показателям, как избыток объема сделки, предотвращение ложных прорывов.

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

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

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

Исходный код стратегии
/*backtest
start: 2023-12-18 00:00:00
end: 2023-12-21 03:00:00
period: 1m
basePeriod: 1m
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/
// © FX_minds

//@version=4
strategy("ETF tradedr", overlay=true, pyramiding=100, default_qty_type=strategy.percent_of_equity, default_qty_value=100)

//------------------------------ get user input
lookback                   = input(title="HH LL lookback", type=input.integer, defval=20)
ATR_periode                = input(title="ATR period", type=input.integer, defval=14)
ATR_SL_multiplier          = input(title="ATR SL multiplier", type=input.float, defval=2)
ATR_TP_multiplier          = input(title="ATR TP multiplier", type=input.float, defval=1)
trailing_SL_ATR_multiplier = input(title="ATR trailing SL multiplier", type=input.float, defval=3.5)
lookback_trailing_SL       = input(title="trailing SL lookback", type=input.integer, defval=4)
max_sequel_trades          = input(title="max sequel trades", type=input.float, defval=1)
trade_long                 = input(title= "trade long ?", type=input.bool, defval=true)
trade_short                = input(title= "trade short ?", type=input.bool, defval=false)

//------------------------------ determine entry conditions
long_condition   = barstate.isconfirmed and crossover(high, highest(high, lookback)[1])
short_condition  = barstate.isconfirmed and crossunder(low, lowest(low, lookback)[1])


//------------------------------ count open long trades
count_open_longs = 0
count_open_longs := nz(count_open_longs[1])

if (long_condition) 
    count_open_longs := count_open_longs +1
    //label.new(bar_index, low, tostring(count_open_longs, "#"), xloc.bar_index, yloc.belowbar, color.green, label.style_none, color.green, size.large)

if (short_condition)
    count_open_longs := 0


//------------------------------ count open short trades
count_open_shorts = 0
count_open_shorts := nz(count_open_shorts[1])

if (short_condition)
    count_open_shorts := count_open_shorts +1
    //label.new(bar_index, low, tostring(count_open_shorts, "#"), xloc.bar_index, yloc.belowbar, color.red, label.style_none, color.red, size.large)

if (long_condition)
    count_open_shorts := 0


//------------------------------ calculate entryprice
entryprice_long = long_condition ? close : na
entryprice_short = short_condition ? close : na


//------------------------------ calculate SL & TP
SL_distance = atr(ATR_periode) * ATR_SL_multiplier
TP_distance  = atr(ATR_periode) * ATR_TP_multiplier
trailing_SL_distance = atr(ATR_periode) * trailing_SL_ATR_multiplier

SL_long = entryprice_long - SL_distance
SL_short = entryprice_short + SL_distance

trailing_SL_short = lowest(close, lookback_trailing_SL) + trailing_SL_distance
trailing_SL_long  = highest(close, lookback_trailing_SL) - trailing_SL_distance

trailing_SL_short_signal = crossover(high, trailing_SL_short[1])
trailing_SL_long_signal = crossunder(low, trailing_SL_long[1])


//------------------------------ plot entry price & SL  
plot(entryprice_long, style=plot.style_linebr, color=color.white)
plot(SL_long, style=plot.style_linebr, color=color.red)
plot(SL_short, style=plot.style_linebr, color=color.green)
plot(trailing_SL_short, style=plot.style_linebr, color=color.red)
plot(trailing_SL_long, style=plot.style_linebr, color=color.green)


//------------------------------ submit entry orders
if (long_condition) and (count_open_longs <= max_sequel_trades) and (trade_long == true)
    strategy.entry("Long" + tostring(count_open_longs, "#"), strategy.long)
    strategy.exit("SL Long"+ tostring(count_open_longs, "#"), 
     from_entry="Long" + tostring(count_open_longs, "#"), stop=SL_long)

if (short_condition) and (count_open_shorts <= max_sequel_trades) and (trade_short == true)
    strategy.entry("Short" + tostring(count_open_shorts, "#"), strategy.short)
    strategy.exit("SL Short" + tostring(count_open_shorts, "#"), 
     from_entry="Short" + tostring(count_open_shorts, "#"), stop=SL_short)
    

//------------------------------ submit exit conditions
if (trailing_SL_long_signal)
    strategy.close("Long" + tostring(count_open_longs, "#"))
    strategy.close("Long" + tostring(count_open_longs-1, "#"))
    strategy.close("Long" + tostring(count_open_longs-2, "#"))
    strategy.close("Long" + tostring(count_open_longs-4, "#"))
    strategy.close("Long" + tostring(count_open_longs-5, "#"))
    strategy.close("Long" + tostring(count_open_longs-6, "#"))
    strategy.close("Long" + tostring(count_open_longs-7, "#"))
    strategy.close("Long" + tostring(count_open_longs-8, "#"))
    strategy.close("Long" + tostring(count_open_longs-9, "#"))
    
if (trailing_SL_short_signal)
    strategy.close("Short" + tostring(count_open_shorts, "#"))
    strategy.close("Short" + tostring(count_open_shorts-1, "#"))
    strategy.close("Short" + tostring(count_open_shorts-2, "#"))
    strategy.close("Short" + tostring(count_open_shorts-3, "#"))
    strategy.close("Short" + tostring(count_open_shorts-4, "#"))
    strategy.close("Short" + tostring(count_open_shorts-5, "#"))
    strategy.close("Short" + tostring(count_open_shorts-6, "#"))
    strategy.close("Short" + tostring(count_open_shorts-7, "#"))
    strategy.close("Short" + tostring(count_open_shorts-8, "#"))
    strategy.close("Short" + tostring(count_open_shorts-9, "#"))