
Стратегия прорыва в динамике - это количественная торговая стратегия, которая следует за рыночными тенденциями. Она используется для определения тенденции и интенсивности движения рыночных цен путем вычисления динамических показателей исторических цен, чтобы уловить средне-длинную тенденцию рынка.
Эта стратегия основана на динамике. Динамика - это цена закрытия текущего цикла минус цена закрытия до N цикла. Когда цена закрытия последней K-линии выше, чем она была до N цикла, динамика положительна, что означает повышенную динамику; когда цена закрытия последней K-линии ниже, чем она была до N цикла, динамика отрицательна, что означает пониженную динамику.
Стратегия сначала рассчитывает динамику длиной 18 циклов, то есть текущая цена закрытия минус цена закрытия до 18 циклов, получая mom0 ≠. Затем рассчитывает динамику одного цикла mom0 и получает mom1 ≠.
Сигналы “сделай больше” появляются, когда mom0>0 и mom1>0, что указывает на сильный рост цены. Сигналы “сделай меньше” появляются, когда mom0 и mom1, что указывает на сильный спад цены.
Стратегия записывает время последнего сигнала о повышении и понижении, и занимает позицию о повышении, когда время повышения больше, чем время понижения.
Эта стратегия имеет следующие преимущества:
Стратегическая концепция ясна, проста, легко понятна и подходит для начинающих трейдеров, занимающихся количественными операциями.
Движущийся индикатор способен запечатлеть тенденции и силу рынка, а средний и длинный тренды имеют более высокий коэффициент выигрыша.
Используя двойную массовую фильтрацию, можно отфильтровать части повреждений, вызванных ложными прорывами.
После появления торгового сигнала будет создано трендовое положение, которое позволит получить дополнительную прибыль от трендового движения.
Своевременное прекращение убытков позволяет контролировать одиночные убытки и избежать чрезмерных убытков в результате обращения вспять.
В этой стратегии также есть некоторые риски, о которых следует помнить:
Краткосрочная корректировка в многоглавном движении приводит к выходу из остановки, что не позволяет захватить весь цикл движения. Можно соответствующим образом расширить пределы остановки.
При наличии частого открытия и закрытия позиций в условиях шока, это может привести к увеличению торговых сборов и потерям в скользящих точках.
После того, как тренд изменился, удерживание позиции в первоначальном направлении приводит к увеличению убытков. Можно объединить показатели тренда для определения обратного тренда.
Неправильная настройка параметров может привести к потере торгового сигнала или созданию ошибочного сигнала. Параметры необходимо скорректировать для разных рынков.
Эта стратегия может быть оптимизирована в следующих аспектах:
Оптимизация параметров динамики, расчет длины динамики для различных циклов и рыночной коррекции, улучшение качества сигнала.
Добавление фильтров для других показателей, таких как MACD, KD и т. Д., чтобы избежать убытков от обратного тренда.
Оптимизация стратегии остановки убытков, адекватная расслабление остановки убытков в торговых тенденциях; адекватная ужесточение остановки убытков в не трендовых рынках.
Увеличение стратегии управления позициями, уменьшение позиций в не-трендовых ситуациях; увеличение позиций в трендовых ситуациях для получения большей прибыли.
Повышение адаптивности параметров для оптимизации параметров для разных сортов.
Добавление алгоритмов машинного обучения, позволяющих динамически оптимизировать параметры стратегии.
Движущаяся стратегия прорыва в целом является простой интуитивно понятной стратегией отслеживания тенденций. Она может эффективно улавливать долгосрочные тенденции на рынке и получать лучшую прибыль в условиях тренда. В то же время необходимо обратить внимание на контроль риска, оптимизировать стратегию остановки убытков и помочь оценить тенденции с помощью других показателей.
/*backtest
start: 2023-10-15 00:00:00
end: 2023-11-14 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
strategy("Momentum BF 🚀", overlay=true, precision=2, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.075)
/////////////// Time Frame ///////////////
_0 = input(false, "════════ Test Period ═══════")
testStartYear = input(2017, "Backtest Start Year")
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay, 0, 0)
testStopYear = input(2019, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay, 0, 0)
testPeriod() => true
///////////// Momentum /////////////
_1 = input(false, "═══════ Momentum ══════")
length = input(18)
price = close
momentum(seria, length) =>
mom = seria - seria[length]
mom
mom0 = momentum(price, length)
mom1 = momentum(mom0, 1)
/////////////// Strategy ///////////////
long = mom0 > 0 and mom1 > 0
short = mom0 < 0 and mom1 < 0
last_long = 0.0
last_short = 0.0
last_long := long ? time : nz(last_long[1])
last_short := short ? time : nz(last_short[1])
long_signal = crossover(last_long, last_short)
short_signal = crossover(last_short, last_long)
last_open_long_signal = 0.0
last_open_short_signal = 0.0
last_open_long_signal := long_signal ? open : nz(last_open_long_signal[1])
last_open_short_signal := short_signal ? open : nz(last_open_short_signal[1])
last_long_signal = 0.0
last_short_signal = 0.0
last_long_signal := long_signal ? time : nz(last_long_signal[1])
last_short_signal := short_signal ? time : nz(last_short_signal[1])
in_long_signal = last_long_signal > last_short_signal
in_short_signal = last_short_signal > last_long_signal
last_high = 0.0
last_low = 0.0
last_high := not in_long_signal ? na : in_long_signal and (na(last_high[1]) or high > nz(last_high[1])) ? high : nz(last_high[1])
last_low := not in_short_signal ? na : in_short_signal and (na(last_low[1]) or low < nz(last_low[1])) ? low : nz(last_low[1])
since_longEntry = barssince(last_open_long_signal != last_open_long_signal[1])
since_shortEntry = barssince(last_open_short_signal != last_open_short_signal[1])
/////////////// Stop Losses Long ///////////////
_5 = input(false, "═══════ Stop Loss L ══════")
SL_typel = input("Fixed", options=["Fixed", "ATR Derived"], title="Stop Loss Type")
sl_inpl = input(8.0, title='Fixed Stop Loss %') / 100
atrLkbl = input(20, minval=1, title='ATR Stop Period')
atrMultl = input(1.5, step=0.25, title='ATR Stop Multiplier')
atr1l = atr(atrLkbl)
longStop1l = 0.0
longStop1l := short_signal ? na : long_signal ? close - (atr1l * atrMultl) : longStop1l[1]
slLongl = in_long_signal ? strategy.position_avg_price * (1 - sl_inpl) : na
long_sll = in_long_signal ? slLongl : na
/////////////// Stop Losses Short ///////////////
_6 = input(false, "═══════ Stop Loss S ══════")
SL_types = input("Fixed", options=["Fixed", "ATR Derived"], title="Stop Loss Type")
sl_inps = input(7.0, title='Fixed Stop Loss %') / 100
atrLkbs = input(20, minval=1, title='ATR Stop Period')
atrMults = input(1.5, step=0.25, title='ATR Stop Multiplier')
atr1s = atr(atrLkbs)
shortStop1s = 0.0
shortStop1s := long_signal ? na : short_signal ? close + (atr1s * atrMults) : shortStop1s[1]
slShorts = strategy.position_avg_price * (1 + sl_inps)
short_sls = in_short_signal ? slShorts : na
_7 = input(false, "══════ Longs or Shorts ═════")
useLongs = input(true, title="Use Longs")
useShorts = input(true, title="Use Shorts")
/////////////// Execution ///////////////
if testPeriod()
if useLongs
strategy.entry("L", strategy.long, when=long)
strategy.exit("L SL", "L", stop = SL_typel == "Fixed" ? long_sll : longStop1l, when=since_longEntry > 0)
if useShorts
strategy.exit("S SL", "S", stop = SL_types == "Fixed" ? short_sls : shortStop1s, when=since_shortEntry > 0)
strategy.entry("S", strategy.short, when=short)
if not useShorts
strategy.close("L", when=short)
if not useLongs
strategy.close("S", when=long)
/////////////// Plotting ///////////////
bgcolor(long_signal ? color.lime : short_signal ? color.red : na, transp=40)
p0 = plot(close)
p1 = plot(strategy.position_size <= 0 ? na : SL_typel == "Fixed" ? long_sll : longStop1l, title="Long Stop Loss", color=color.yellow, style=plot.style_linebr, linewidth=2)
p2 = plot(strategy.position_size >= 0 ? na : SL_types == "Fixed" ? short_sls : shortStop1s, title="Short Stop Loss", color=color.orange, style=plot.style_linebr, linewidth=2)
p3 = plot(strategy.position_size <= 0 ? na : strategy.position_avg_price, style=plot.style_linebr, title="Long Entry", color=color.green, linewidth=2)
p4 = plot(strategy.position_size >= 0 ? na : strategy.position_avg_price, style=plot.style_linebr, title="Short Entry", color=color.red, linewidth=2)
fill(p0, p3, color = color.lime, transp=60)
fill(p0, p4, color = color.red, transp=60)