Стратегия бэктестинга индикатора импульса MACD


Дата создания: 2023-09-24 13:21:54 Последнее изменение: 2023-09-24 13:21:54
Копировать: 1 Количество просмотров: 796
1
Подписаться
1617
Подписчики

Обзор

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

Стратегический принцип

  1. Расчет MACD-полюсов DIFF, DEA и MACD. При прохождении DEA по DIFF образуется золотой форк, при прохождении MACD - мертвый форк.

  2. Рассчитайте RSI, чтобы определить, отскочил ли дно или вернулся ли вершина. Настройте окно обратной связи, чтобы определить, было ли дно или вершина на последнем этапе.

  3. При MACD Gold Fork, если RSI завершит обратный отклик в окне обратного просмотра, то появляется сигнал просмотра. При MACD Dead Fork, если RSI завершит обратный отклик, то появляется сигнал просмотра.

  4. После входа в систему устанавливается точка стоп-лосса для контроля риска.

Стратегические преимущества

  1. MACD чувствителен к времени поворота тренда. RSI эффективен для определения перепродажи.

  2. В то же время проверяются токены MACD и RSI, чтобы отфильтровать ложные сигналы.

  3. Взгляните на окно и судите о надежности увеличенного сигнала.

  4. Установка стоп-лосса помогает управлять рисками.

Стратегический риск

  1. MACD и RSI отстают от своих оптимальных точек.

  2. Ожидание одновременного появления обоих сигналов имеет меньшую вероятность и меньше сигналов.

  3. На самом деле, это не так просто, как думать о том, что может произойти в будущем.

  4. Неправильные настройки сдерживания убытков могут быть слишком мягкими или жесткими.

Решение проблемы:

  1. Корректировка параметров MACD и RSI для снижения вероятности задержки.

  2. Увеличение эффективного диапазона показателей, чтобы предоставить больше сигналов.

  3. Добавьте фильтр тренда, чтобы избежать обратного входа.

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

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

  1. Проверьте эффективность других сбалансированных линий, таких как SMA.

  2. Увеличение мобильного стоп-интервью, чтобы сделать стоп-интервью более гибким.

  3. Добавить индикаторы тренда, чтобы оценить преимущества и недостатки вступления.

  4. Внедрение машинного обучения для прогнозирования движения индикаторов.

  5. Вместе с другими факторами оптимизируйте выбор времени поступления.

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

Стратегия использует комбинацию двух индикаторов MACD и RSI, и вступает в игру после отбора надежного обратного сигнала. Стратегия имеет четкую концепцию, гибкость в регулировании параметров, может быть расширена с точки зрения выбора индикаторов, определения тенденций, методов остановки убытков и т. Д., чтобы получить больше возможностей для торговли при сохранении стабильной основы. Однако необходимо следить за тем, чтобы не потерять стабильность из-за чрезмерной оптимизации.

Исходный код стратегии
/*backtest
start: 2023-08-24 00:00:00
end: 2023-09-23 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
//based on Range Strat - MACD/RSI 
// strategy("MACD/RSI - edited", 
//      overlay=true,
//      default_qty_type=strategy.percent_of_equity,
//      default_qty_value=10, precision=2, initial_capital=100000,
//      pyramiding=2,
//      commission_value=0.05)

//Backtest date range
StartDate = input(timestamp("13 Jun 2022"), title="Start Date")
EndDate = input(timestamp("13 Jun 2024"), title="Start Date")
inDateRange = true

// RSI Input Settings
rsisrc = input(title="RSI Source", defval=close, group="RSI Settings")
length = input(title="Length", defval=14, group="RSI Settings" )
overSold = input(title="Over Sold Threshold", defval=30, group="RSI Settings" )
overBought = input(title="Over Bought Threshold", defval=70, group="RSI Settings" )
rsi_lookback = input(title="RSI cross lookback period", defval=7, group="RSI Settings")

// Calculating RSI
vrsi = ta.rsi(rsisrc, length)
co = ta.crossover(vrsi, overSold)
cu = ta.crossunder(vrsi, overBought)

// Function looking for a happened condition during lookback period
f_somethingHappened(_cond, _lookback) =>
    bool _crossed = false
    for i = 1 to _lookback
        if _cond[i]
            _crossed := true
    _crossed


coCheck = f_somethingHappened(co, rsi_lookback)
cuCheck = f_somethingHappened(cu, rsi_lookback)

// MACD Input Settings
macdsrc = input(title="MACD Source", defval=close, group="MACD Settings")
fast_length = input(title="Fast Length", defval=12, group="MACD Settings")
slow_length = input(title="Slow Length", defval=26, group="MACD Settings")
signal_length = input.int(title="Signal Smoothing",  minval = 1, maxval = 50, defval = 9, group="MACD Settings")
sma_source = input.string(title="Oscillator MA Type",  defval="EMA", options=["SMA", "EMA"], group="MACD Settings")
sma_signal = input.string(title="Signal Line MA Type", defval="EMA", options=["SMA", "EMA"], group="MACD Settings")


// Calculating MACD
fast_ma = sma_source == "SMA" ? ta.sma(macdsrc, fast_length) : ta.ema(macdsrc, fast_length)
slow_ma = sma_source == "SMA" ? ta.sma(macdsrc, slow_length) : ta.ema(macdsrc, slow_length)
macd = fast_ma - slow_ma
signal = sma_signal == "SMA" ? ta.sma(macd, signal_length) : ta.ema(macd, signal_length)
delta = macd - signal

MACDcrossover = ta.crossover(delta, 0)
MACDcrossunder = ta.crossunder(delta, 0)

// Stop Loss Input Settings
longLossPerc = input(title="Long Stop Loss (%)", defval=15, group="Stop Loss Settings") * 0.01
shortLossPerc = input(title="Short Stop Loss (%)", defval=15, group="Stop Loss Settings") * 0.01

// Calculating Stop Loss
longStopPrice  = strategy.position_avg_price * (1 - longLossPerc)
shortStopPrice = strategy.position_avg_price * (1 + shortLossPerc)



// Strategy Entry
if (not na(vrsi))
	if (inDateRange and MACDcrossover and coCheck)
		strategy.entry("LONG", strategy.long, comment="LONG")
	if (inDateRange and MACDcrossunder and cuCheck)
		strategy.entry("SHORT", strategy.short, comment="SHORT")

// Submit exit orders based on calculated stop loss price
if (strategy.position_size > 0)
    strategy.exit(id="LONG STOP", stop=longStopPrice)
if (strategy.position_size < 0)
    strategy.exit(id="SHORT STOP", stop=shortStopPrice)