Стратегия торговли MACD с адаптивным ATR стоп-лосс

Автор:Чао Чжан, Дата: 2023-09-20 15:23:00
Тэги:

Обзор

Эта стратегия использует индикатор MACD для генерации торговых сигналов и адаптивных стоп-лосс на основе ATR для контроля рисков.

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

  1. Скрещивание дельта-линии MACD 0 производит сигналы покупки и продажи.

  2. Динамическая стоп-лосс, рассчитанная на основе последних N периодов ATR, что отражает волатильность.

  3. Стоп-лосс адаптируется к изменениям волатильности, увеличиваясь при росте волатильности.

  4. Обновление стоп-лосса в режиме реального времени, когда вы находитесь на позиции, чтобы зафиксировать прибыль и контролировать риски.

  5. Выходные позиции, когда для управления рисками запускается стоп-лосс.

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

  1. MACD чувствителен к тенденциям.

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

  3. Визуальные линии остановки интуитивно отражают статус риска.

  4. Простые и понятные правила стратегии, легко понятные и реализуемые.

  5. Контролируемые вычеты и эффективное управление рисками.

Риски

  1. MACD может генерировать ложные сигналы, вызывающие ненужные потери.

  2. Неправильные параметры ATR приводят к слишком тесным или свободным остановкам.

  3. Риск слишком частого запуска остановок.

  4. Трудно остановиться вовремя, когда тенденция меняется.

  5. Риск чрезмерного приспособления при оптимизации параметров.

Улучшение

  1. Проверить параметры MACD для оптимальной комбинации.

  2. Попробуйте другие методы остановки, например, остановки на заднем пути.

  3. Оптимизируйте остановки, чтобы сбалансировать частоту и контроль рисков.

  4. Добавьте фильтр тренда, чтобы предотвратить остановку.

  5. Учитывайте влияние затрат на торговлю, чтобы избежать переоценки.

  6. Используйте скольжение или усиленные остановки, чтобы гарантировать, что остановки запускаются.

Заключение

Эта стратегия торгует сигналами MACD с адаптивными динамическими остановками ATR. Она имеет контролируемые риски и простоту. Но сигналы MACD могут быть ложными, и остановки нуждаются в постоянной оптимизации. В целом, с настройкой параметров, оптимизацией остановки и т. Д., Она может стать надежной системой, следующей за трендом.


/*backtest
start: 2023-01-01 00:00:00
end: 2023-02-14 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("MACD BF 🚀", overlay=true, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.0)

/////////////// Time Frame ///////////////
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

///////////////  MACD  /////////////// 
fastLength = input(13) 
slowlength = input(30) 
MACDLength = input(12) 

MACD = ema(close, fastLength) - ema(close, slowlength)
aMACD = ema(MACD, MACDLength)
delta = MACD - aMACD

///////////////  Strategy  /////////////// 
long = crossover(delta, 0)
short = crossunder(delta, 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]) 

/////////////// Dynamic ATR Stop Losses ///////////////
atrLkb = input(2, minval=1, title='ATR Stop Period')
atrMult = input(1.25, step=0.25, title='ATR Stop Multiplier') 
atr1 = atr(atrLkb)

longStop = 0.0
longStop :=  short_signal ? na : long_signal ? close - (atr1 * atrMult) : longStop[1]
shortStop = 0.0
shortStop := long_signal ? na : short_signal ? close + (atr1 * atrMult) : shortStop[1]

/////////////// Execution /////////////// 
if testPeriod()
    strategy.entry("Long", strategy.long, when=long)
    strategy.entry("Short", strategy.short, when=short)
    strategy.exit("Long SL", "Long", stop=longStop, when=since_longEntry > 0)
    strategy.exit("Short SL", "Short", stop=shortStop, when=since_shortEntry > 0)

/////////////// Plotting /////////////// 
barcolor(long ? color.lime : short ? color.red : na)
plot(strategy.position_size <= 0 ? na : longStop, title="Long Stop Loss", color=color.yellow, style=plot.style_circles, linewidth=2)
plot(strategy.position_size >= 0 ? na : shortStop, title="Short Stop Loss", color=color.orange, style=plot.style_circles, linewidth=2)
bgcolor(strategy.position_size > 0 ? color.lime : strategy.position_size < 0 ? color.red : color.white, transp=90)
bgcolor(long_signal ? color.lime : short_signal ? color.red : na, transp=60)

Больше