Движущаяся средняя кроссоверная тенденция MACD в соответствии со стратегией с последующим стоп-лосом

Автор:Чао Чжан, Дата: 2023-11-06 11:56:14
Тэги:

img

Обзор

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

Логика

Сигнал входа

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

Остановить потерю

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

Выходные сигналы

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

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

  • Тенденция оценки MACD в сочетании с перекрёстком EMA/SMA подтверждает сроки входа
  • ATR trailing stop позволяет эффективно остановить потерю при следовании тренду
  • Частичные выходы помогают получать прибыль, блокировать прибыль и удерживать ее на длительное время

Риски и решения

  • Риск ошибочного сигнала от MACD и индикаторов тренда.

  • Риск попадания ATR-стоп-лосса может увеличить период ATR или множитель стоп-лосса.

  • Уменьшить размер позиции и сократить потери во времени.

Возможности для расширения

  • Оптимизировать параметры MACD для лучшего определения тренда

  • Оптимизировать период ATR для улучшения уровня остановки потерь

  • Оптимизировать коэффициенты выхода и размер позиций для снижения риска задержания

  • Подумайте о добавлении движущегося индекса прибыли или волатильности для улучшения стоп-лосса

Резюме

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


/*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")


Больше