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

Автор:Чао Чжан, Дата: 2024-02-22 15:32:42
Тэги:

img

Обзор

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

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

Основная логика состоит в том, чтобы использовать индикатор MACD, генерируемый из разницы быстрого и медленного MA, для определения направления тренда рынка, и линию сигнала для оценки уровня перекупленности / перепродажи. Когда MACD и линия сигнала образуют золотой крест, это длинный сигнал для длинного хода. Когда образуется мертвый крест, это короткий сигнал для короткого хода. Между тем, он использует отношение цены с 200-дневным MA для фильтрации сигналов, принимая только длинные сигналы, когда цена выше 200-дневного MA, и короткие сигналы, когда цена ниже 200-дневного MA, чтобы избежать сбоев во время сильных тенденций.

Конкретный метод расчета:

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

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

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

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

Риски

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

Может снизить риски путем сокращения периодов MA, добавления других индикаторов и добавления стоп-лосса.

Руководство по оптимизации

1.Испытано в разных временных рамках от 15 до 1D, оптимальные результаты в 4H в рискованно скорректированных доходах

2.Оптимизируйте быстрый и медленный MA так, чтобы MACD фиксировал циклы, 7-21 хорошо для 15m

3.Халл МА по MACD дал хорошие результаты

4.Ограничение потерь улучшает управление рисками

Заключение

В целом это очень простая и практичная стратегия, генерирующая высоковероятные торговые сигналы с помощью двойной системы индикаторов и фильтрации цен. Она имеет относительно высокую маржу прибыли, использует классическую комбинацию параметров 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)

Больше