Количественная стратегия MACD – стратегия прорыва двойного пересечения скользящей средней


Дата создания: 2024-02-22 15:32:42 Последнее изменение: 2024-02-22 15:32:42
Копировать: 0 Количество просмотров: 679
1
Подписаться
1617
Подписчики

Количественная стратегия MACD – стратегия прорыва двойного пересечения скользящей средней

Обзор

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

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

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

Подробный подсчет:

  1. Быстродвижущаяся средняя ((12-дневная EMA) минус медленнодвижущаяся средняя ((26-дневная EMA) получает MACD
  2. 9-дневная ЭМА MACD получила сигнал
  3. MACD минус сигналная линия получается прямоугольник MACD

Когда MACD проходит по сигнальной линии, а MACD и сигнальная линия одновременно ниже 0, для золотого форка делается многосигнал, когда MACD проходит по сигнальной линии, а MACD и сигнальная линия одновременно выше 0, для мертвого форка делается пустой сигнал. При этом цена выше 200-дневной средней линии только для золотого форка делается много, а цена ниже 200-дневной средней линии только для мертвого форка делается пустой.

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

  1. Использование двойных показателей позволяет избежать ограничений одного показателя и повысить точность сигналов
  2. Двойная фильтрация в сочетании с ценовой и равнолинейной связью, чтобы избежать искажения сигнала в сильных тенденциях
  3. Большое пространство для оптимизации параметров, можно адаптироваться к различным рыночным условиям путем корректировки параметров средней линии
  4. Консервативная параметровая настройка дает меньше сигналов, но более высокую точность
  5. Стратегии, которые легко понять и реализовать

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

  1. При резких колебаниях рынка, суждение индикаторов может быть затронуто и создать ошибочный сигнал.
  2. Отсталость системы равнолинейной оценки влияет на своевременность стратегии.
  3. Сигналов меньше, возможности пропускать тренд
  4. Оптимизация PARAMETERS рискует быть переоптимизированной
  5. Механизмы контроля за выводом и устранения убытков должны быть усовершенствованы

Риск может быть снижен путем соответствующего сокращения среднелинейного цикла, добавления других показателей суждений и добавления мер по сдерживанию убытков.

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

1.tested on different timeframes from 15m upto 1D, where optimal results where on 4H timeframe in terms of risk adjusted returns

2.optimize fast ma and slow ma so that macd represents cycle, I found 7-21 performs good for 15m chart

3.also tested hull moving average for MACD which gave good results

4.stoploss can also be trailed for better risk management

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

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

Исходный код стратегии
/*backtest
start: 2024-02-14 00:00:00
end: 2024-02-21 00:00:00
period: 1h
basePeriod: 15m
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/
// © Hurmun

//@version=4
strategy("Simple MACD strategy ", overlay=true, margin_long=100, margin_short=100)


fast_length = input(title="Fast Length", type=input.integer, defval=12)
slow_length = input(title="Slow Length", type=input.integer, defval=26)
src = input(title="Source", type=input.source, defval=close)
signal_length = input(title="Signal Smoothing", type=input.integer, minval = 1, maxval = 50, defval = 9)
sma_source = input(title="Simple MA (Oscillator)", type=input.bool, defval=false)
sma_signal = input(title="Simple MA (Signal Line)", type=input.bool, defval=false)
// 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


movinga2 = input(title="movinga 2", type=input.integer, defval=200)

movinga200 = sma(close, movinga2)

plot(movinga200, "MA", color.orange)
longCondition = crossover(macd, signal) and macd < 0 and signal < 0 and close > movinga200
if (longCondition)
    strategy.entry("My Long Entry Id", strategy.long)

shortCondition = crossunder(macd, signal) and macd > 0 and signal > 0 and close < movinga200
if (shortCondition)
    strategy.entry("My Short Entry Id", strategy.short)
    
shortProfitPerc = input(title="Short Take Profit (%)", minval=0.0, step=0.1, defval=2) / 100
longProfitPerc = input(title="Long Take Profit (%)", minval=0.0, step=0.1, defval=2) / 100
    
stoploss = input(title="stoploss in %", minval = 0.0, step=1, defval=2) /100

longStoploss = strategy.position_avg_price * (1 - stoploss)
longExitPrice  = strategy.position_avg_price * (1 + longProfitPerc)

shortExitPrice = strategy.position_avg_price * (1 - shortProfitPerc)
shortStoploss = strategy.position_avg_price * (1 + stoploss)
    
if (strategy.position_size > 0 )
    strategy.exit(id="XL TP", limit=longExitPrice, stop=longStoploss)






if (strategy.position_size < 0 )
    strategy.exit(id="XS TP", limit=shortExitPrice, stop=shortStoploss)