
Эта стратегия является автоматической торговой стратегией ETF, основанной на средней реальной волне (ATR) и ценовом прорыве. Она использует ATR для расчета стоп-лосса и стоп-поста, и открывает позиции вверх или вниз, когда цена пересекает определенную циклическую максимуму или минимуму.
Эта стратегия основана на следующих принципах:
Используйте максимальные и минимальные цены определенного цикла (например, 20 K-линий) для определения движения и направления цены. Когда цена прорывает циклическую максимальную цену, делайте больше; когда цена прорывает циклическую минимальную цену, делайте пробел.
Используйте ATR для динамического вычисления стоп-лосса. Стоп-лосса находится на расстоянии от начальной цены, а значение ATR для одного ATR-цикла умножено на коэффициент ((например, 2)).
Используйте ATR, чтобы рассчитать стоп-паузы. Стоп-паузы от входных цен на один цикл ATR, умноженный на коэффициент ATR (как 1) [2].
Используйте ATRtrailer многофакторный для отслеживания стоп-поста. Стоп-поста, когда цена прорывает стоп-пост трейлера в неблагоприятном направлении.
Эта стратегия проста и надежна, учитывает направление ценовых тенденций, что способствует своевременному улавливанию ценовых тенденций, а также устанавливает стоп-лосс и стоп-позиции, которые способствуют захвату возможностей для получения прибыли и контролю риска.
Эта стратегия имеет следующие преимущества:
Стратегическая концепция проста, понятна, легко понятна и реализуема.
Используя ATR для расчета стоп-стоп-лосса, можно динамически регулировать размер позиции, гибко контролировать риск.
Поскольку в целом, по мнению экспертов, в целом, это не так, как предполагается, то в целом, это не так.
Приведите пример, как можно вовремя остановить повреждение трейлера, чтобы избежать риска.
Для более заметных видов, таких как ETF, акции и т. д.
Также существуют следующие риски:
При колебаниях цен может быть больше ложных сигналов и обратных открытий позиций.
Неправильная настройка циклических параметров может привести к упущению ценовых тенденций или слишком большому количеству фиктивных сделок.
Неправильная настройка параметров коэффициента может привести к тому, что остановка или остановка станет слишком радикальной или консервативной, что повлияет на прибыль.
Риски, связанные с ETF, такие как политический риск, риск премии и т. д., также влияют на стратегию.
Решение проблемы:
Эта стратегия может быть улучшена в следующих аспектах:
Для фильтрации ложных сигналов используются такие индикаторы, как движущаяся средняя.
Добавление модуля оптимизации параметров адаптации, автоматическая оптимизация параметров в зависимости от различных циклов и сортов.
Добавление моделей машинного обучения, которые прогнозируют высокие и низкие точки следующей линии K для определения прорыва.
Внимание к таким показателям, как избыток объема сделки, предотвращение ложных прорывов.
Оптимизация размеров и пропорций открытых позиций, адаптация открытых позиций к различным видам и рыночным условиям.
Общая концепция стратегии ясна и проста, прорыв в основной механизме и динамический стоп-стоп 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, "#"))