Стратегия скользящего стоп-лосса MACD с пересечением тренда и скользящей средней


Дата создания: 2023-11-06 11:56:14 Последнее изменение: 2023-11-06 11:56:14
Копировать: 0 Количество просмотров: 623
1
Подписаться
1617
Подписчики

Стратегия скользящего стоп-лосса MACD с пересечением тренда и скользящей средней

Обзор

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

Принципы

Сигнал входа

Когда быстрая линия EMA пересекает медленную линию EMA, это означает, что краткосрочная тенденция изменения цены лучше, чем долгосрочная тенденция, и считается сигналом к покупке. В то же время, медленная SMA пересекает быструю SMA, что также означает, что краткосрочная тенденция к росту цены лучше, чем долгосрочная. Таким образом, в сочетании с прохождением сигнальной линии MACD прямой линии и EMA & SMA перекрестным сигналом, направленным на тенденцию, можно определить более сильное время входа.

Стойкость

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

Выход

Выход в серию, сначала, после небольшого роста, выровняется часть дохода от позиции. Затем при значительном росте цены выровняется часть дохода от позиции.

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

  • Использование MACD для определения направления тренда, дополненное скрещенными сигналами EMA и SMA, позволяет более точно определить время входа в рынок
  • Стоп-пост, рассчитанный ATR, позволяет как остановить, так и отследить тренд
  • Вы можете выйти на рынок в группах, вернуть деньги, зафиксировать прибыль и держать их в течение некоторого времени.

Риски и противодействие

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

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

  • оптимизация MACD-параметров для более точного определения тенденций

  • Оптимизация параметров цикла ATR, чтобы сделать стоп-лост более подходящим

  • Оптимизация соотношения выхода и контроля позиций, снижение риска поглощения

  • Увеличение мобильных стоп-ап или оптимизация стоп-лосса с учетом показателей волатильности

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

Эта стратегия использует различные показатели, такие как MACD, EMA / SMA, чтобы определить направление тренда и получить точный момент входа. При этом используется плавающий ATR для блокирования прибыли и лучшего отслеживания тренда.

Исходный код стратегии
/*backtest
start: 2022-10-30 00:00:00
end: 2023-11-05 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/
// © Deobald

//@version=4
strategy("MACD Strategy", overlay=true)

// FUNCTIONS

Ema(src,p) =>
    ema = 0.
    sf = 2/(p+1)
    ema := nz(ema[1] + sf*(src - ema[1]),src)

Sma(src,p) => a = cum(src), (a - a[max(p,0)])/max(p,0)

Atr(p) =>
    atr = 0.
    Tr = max(high - low, max(abs(high - close[1]), abs(low - close[1])))
    atr := nz(atr[1] + (Tr - atr[1])/p,Tr)

/// TREND
ribbon_period = input(34, "Period", step=1)

leadLine1 = ema(close, ribbon_period)
leadLine2 = sma(close, ribbon_period)

p3 = plot(leadLine1, color= #53b987, title="EMA", transp = 50, linewidth = 1)
p4 = plot(leadLine2, color= #eb4d5c, title="SMA", transp = 50, linewidth = 1)
fill(p3, p4, transp = 60, color = leadLine1 > leadLine2 ? #53b987 : #eb4d5c)


// MACD
fast_length = input(title="Fast Length", type=input.integer, defval=3)
slow_length = input(title="Slow Length", type=input.integer, defval=5)
src = input(title="Source", type=input.source, defval=close)
signal_length = input(title="Signal Smoothing", type=input.integer, minval = 1, maxval = 50, defval = 2)
sma_source = input(title="Simple MA(Oscillator)", type=input.bool, defval=false)
sma_signal = input(title="Simple MA(Signal Line)", type=input.bool, defval=true)

// Plot colors
col_grow_above = #26A69A
col_grow_below = #FFCDD2
col_fall_above = #B2DFDB
col_fall_below = #EF5350
col_macd = #0094ff
col_signal = #ff6a00

// Calculating
fast_ma = sma_source ? Sma(src, fast_length) : Ema(src, fast_length)
slow_ma = sma_source ? Sma(src, slow_length) : Ema(src, slow_length)
macd = fast_ma - slow_ma
signal = sma_signal ? Sma(macd, signal_length) : Ema(macd, signal_length)
hist = macd - signal

//plot(hist, title="Histogram", style=plot.style_columns, color=(hist>=0 ? (hist[1] < hist ? col_grow_above : col_fall_above) : (hist[1] < hist ? col_grow_below : col_fall_below) ), transp=0 )
// plot(macd, title="MACD", color=col_macd, transp=0)
// plot(signal, title="Signal", color=col_signal, transp=0)



// TAKE PROFIT AND STOP LOSS
long_tp1_inp = input(1, title='Long Take Profit 1 %', step=0.1)/100
long_tp1_qty = input(10, title="Long Take Profit 1 Qty", step=1)

long_tp2_inp = input(5, title='Long Take Profit 2%', step=0.1)/100
long_tp2_qty = input(50, title="Long Take Profit 2 Qty", step=1)

long_take_level_1 = strategy.position_avg_price * (1 + long_tp1_inp)
long_take_level_2 = strategy.position_avg_price * (1 + long_tp2_inp)




// Stop Loss
multiplier = input(2.2, "SL Mutiplier", minval=1, step=0.1)
ATR_period=input(17,"ATR period", minval=1, step=1)

// Strategy
entry_long=crossover(macd,signal) and leadLine2 < leadLine1
entry_price_long=valuewhen(entry_long,close,0)
SL_floating_long = entry_price_long - multiplier*Atr(ATR_period)
exit_long= close < SL_floating_long 

///// BACKTEST PERIOD ///////
testStartYear = input(2018, "Backtest Start Year")
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear, testStartMonth, testStartDay, 0, 0)

testStopYear = input(2020, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear, testStopMonth, testStopDay, 0, 0)

testPeriod() => true

if testPeriod()
    strategy.entry("long", strategy.long, comment="Long", when=entry_long)
    strategy.exit("TP1","long", qty_percent=long_tp1_qty, limit=long_take_level_1)//, trail_points=entry_price_long * long_trailing / syminfo.mintick, trail_offset=entry_price_long * long_trailing / syminfo.mintick)
    strategy.exit("TP2", qty_percent=long_tp2_qty, limit=long_take_level_2) //, trail_points=entry_price_long * long_trailing / syminfo.mintick, trail_offset=entry_price_long * long_trailing / syminfo.mintick)
    strategy.close_all("long", when=exit_long, comment="exit long" )


// LONG POSITION
plot(strategy.position_size > 0 ? long_take_level_1 : na, style=plot.style_linebr, color=color.green, linewidth=1, title="1st Long Take Profit")
plot(strategy.position_size > 0 ? long_take_level_2 : na, style=plot.style_linebr, color=color.green, linewidth=1, title="2nd Long Take Profit")
plot(strategy.position_size > 0 ? SL_floating_long : na, style=plot.style_linebr, color=color.red, linewidth=1, title="Long Stop Loss")