Эта стратегия использует индикатор MACD для генерации торговых сигналов и адаптивных стоп-лосс на основе ATR для контроля рисков.
Скрещивание дельта-линии MACD 0 производит сигналы покупки и продажи.
Динамическая стоп-лосс, рассчитанная на основе последних N периодов ATR, что отражает волатильность.
Стоп-лосс адаптируется к изменениям волатильности, увеличиваясь при росте волатильности.
Обновление стоп-лосса в режиме реального времени, когда вы находитесь на позиции, чтобы зафиксировать прибыль и контролировать риски.
Выходные позиции, когда для управления рисками запускается стоп-лосс.
MACD чувствителен к тенденциям.
Адаптивные остановки подходят для различных рыночных условий, избегая слишком тесных или свободных остановок.
Визуальные линии остановки интуитивно отражают статус риска.
Простые и понятные правила стратегии, легко понятные и реализуемые.
Контролируемые вычеты и эффективное управление рисками.
MACD может генерировать ложные сигналы, вызывающие ненужные потери.
Неправильные параметры ATR приводят к слишком тесным или свободным остановкам.
Риск слишком частого запуска остановок.
Трудно остановиться вовремя, когда тенденция меняется.
Риск чрезмерного приспособления при оптимизации параметров.
Проверить параметры MACD для оптимальной комбинации.
Попробуйте другие методы остановки, например, остановки на заднем пути.
Оптимизируйте остановки, чтобы сбалансировать частоту и контроль рисков.
Добавьте фильтр тренда, чтобы предотвратить остановку.
Учитывайте влияние затрат на торговлю, чтобы избежать переоценки.
Используйте скольжение или усиленные остановки, чтобы гарантировать, что остановки запускаются.
Эта стратегия торгует сигналами 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)