Стратегия торговли движущейся средней Макгинли

Автор:Чао Чжан, Дата: 2023-11-14 15:48:46
Тэги:

img

Обзор

Эта стратегия основана на индикаторе динамической скользящей средней Макгинли. Индикатор Макгинли MA - это улучшенная версия скользящих средних, которая может лучше отслеживать ценовые тенденции. Стратегия использует сигналы, генерируемые индикатором Макгинли MA, в сочетании с ценовыми прорывами MA, для установления правил торговли для получения прибыли.

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

Стратегия в основном использует две скользящие средние, 21-периодную EMA и 42-периодную EMA. Когда более короткий MA пересекает более длинный MA, он считается сигналом покупки. Когда более короткий MA пересекает ниже более длинного MA, он считается сигналом продажи.

Кроме того, стратегия также требует, чтобы цена находилась выше Макгинли Динамический MA и прерывалась выше более короткого MA, чтобы генерировать сигнал покупки.

В частности, сигнал покупки запускается, когда: более короткий MA пересекает более длинный MA, цена закрытия превышает Макгинли MA, цена закрытия превышает более короткий MA. Сигнал продажи запускается, когда: более короткий MA пересекает более длинный MA, цена закрытия превышает Макгинли MA, цена закрытия превышает более короткий MA.

МакГинли MA рассчитывается как: MDIt = MDIt-1 + (Close - MDIt-1) / Max(k * Period * (Close / MDIt-1) ^ 4, 1). Где MDIt - текущее значение, MDIt-1 - предыдущее значение, Close - цена закрытия, k - постоянная сглаживания, а Period - период расчета. Эта формула позволяет MA отслеживать изменения цен в режиме реального времени.

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

  1. McGinley MA улучшает отстающую эмиссию традиционных MA и может быстро улавливать изменения тенденций.

  2. Использование двойных МА для генерации сигналов может эффективно фильтровать ложные прорывы.

  3. Добавление цены выше/ниже MCMA позволяет избежать чрезмерной торговли на рынках с ограниченным диапазоном.

  4. Использование EMA делает MA более чувствительным к недавним изменениям цен.

Риски

  1. В случае, когда рынок находится в боковом направлении, Whipsaws могут генерировать ложные сигналы, вызывая убытки. Параметры могут быть настроены на фильтр сигналов.

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

  3. Недостаточная настройка параметров может повлиять на эффективность стратегии. Параметры должны быть оптимизированы.

  4. Долгие периоды хранения несут системный риск.

Усовершенствования

  1. Испытывать различные длины MA для поиска оптимальных комбинаций.

  2. Добавьте другие индикаторы, такие как KD, MACD, чтобы улучшить сроки входа/выхода.

  3. Корректировать значение k на основе различных продуктов и рынков для оптимизации расчета McGinley MA.

  4. Включить меры волатильности для динамического размещения позиций и контроля рисков.

  5. Установите стоп-лосс для контроля потерь.

Заключение

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


/*backtest
start: 2022-11-07 00:00:00
end: 2023-11-13 00:00:00
period: 1d
basePeriod: 1h
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/
// © LucasZancheta

//@version=4
strategy(shorttitle="Maguila", title="McGinley Dynamic Indicator", overlay=true)

//Médias móveis
MA1Period=input(21, title="MA1")
MA2Period=input(42, title="MA2")

MA1 = ema(close, MA1Period)
MA2 = ema(close, MA2Period)

aboveAverage = MA1 >= MA2
hunderAverage = MA2 >= MA1

//Período do backtest
startDate = input(title="Start Date", type=input.integer, defval=28, minval=1, maxval=31)
startMonth = input(title="Start Month", type=input.integer, defval=5, minval=1, maxval=12)
startYear = input(title="Start Year", type=input.integer, defval=2019, minval=1800, maxval=2100)

endDate = input(title="End Date", type=input.integer, defval=28, minval=1, maxval=31)
endMonth = input(title="End Month", type=input.integer, defval=5, minval=1, maxval=12)
endYear = input(title="End Year", type=input.integer, defval=2030, minval=1800, maxval=2100)

//Verifica se o candle está dentro do período do backtest
inDateRange = (time >= timestamp(syminfo.timezone, startYear, startMonth, startDate, 0, 0)) and (time < timestamp(syminfo.timezone, endYear, endMonth, endDate, 0, 0))

//Número de periodos da média móvel
period  = input(title="Períodos", type=input.integer, defval=20)
//Constante K (0.6)
k = input(title="Constante K", type=input.float, defval=0.6)
//Preço de fechamento 
closePrice = input(title="Preço", type=input.source, defval=close)

mdi = 0.0

//Fórmula de McGinley
mdi := na(mdi[1]) ? closePrice : mdi[1] + (closePrice - mdi[1]) / max((k * period * pow(closePrice / mdi[1], 4)), 1)

//Regra de coloração 
mdiColor = closePrice > mdi ? color.green : closePrice < mdi ? color.red : color.black

//Inserindo as informações no gráfico    
plot(MA1, color=color.blue, linewidth=2)
plot(MA2, color=color.purple, linewidth=2)

barcolor(mdiColor)

//Estratégia
buySignal = aboveAverage and closePrice > mdi and crossunder(low, MA1) and close > MA1  
buyLoss = closePrice < mdi and close < MA1 and close < MA2

if (inDateRange)
    strategy.entry("Compra", strategy.long, qty=1, when= buySignal)
    strategy.exit("Gain da compra", "Compra", qty=1, profit=20)
    strategy.close("Compra", qty=1, when= buyLoss, comment="Loss na operação")

sellSignal = hunderAverage and closePrice < mdi and crossover(high, MA1) and close < MA1
sellLoss = closePrice > mdi and close > MA1 and close > MA2

if (inDateRange)
    strategy.entry("Venda", strategy.short, qty=1, when= sellSignal)
    strategy.exit("Gain da venda", "Venda", qty=1, profit=20)
    strategy.close("Venda", qty=1, when= sellLoss, comment="Loss na operação")

if (not inDateRange)
    strategy.close_all()




Больше