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

Автор:Чао Чжан, Дата: 2023-12-26 16:05:55
Тэги:

img

Обзор

Это алгоритмическая стратегия торговли ETF, основанная на среднем истинном диапазоне (ATR) и ценовом прорыве.

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

Стратегия основывается главным образом на следующих принципах:

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

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

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

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

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

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

Преимущества этой стратегии включают:

  1. Логика стратегии проста и понятна, легко понять и реализовать.

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

  3. Стратегии прорыва хорошо улавливают ценовые тенденции, что приводит к хорошим доходам.

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

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

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

Риски этой стратегии включают:

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

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

  3. Экстремальные значения параметров могут привести к чрезмерно агрессивным или чрезмерно консервативным стоп-лосс и прибыли, влияя на рентабельность стратегии.

  4. Основные риски ETF, такие как риски политики и премии, также могут повлиять на эффективность стратегии.

Соответствующие решения:

  1. Оптимизируйте параметры, чтобы уменьшить ненужные сделки.
  2. Добавьте больше факторов и фильтров для подтверждения торговых сигналов.
  3. Настройка параметров в соответствии с различными рынками.
  4. Диверсификация размеров инвестиционных и контрольных позиций в одном ИФО.

Руководство по оптимизации

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

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

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

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

  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, "#"))



Больше