Эта стратегия основана на индикаторе динамической скользящей средней Макгинли. Индикатор Макгинли 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 отслеживать изменения цен в режиме реального времени.
McGinley MA улучшает отстающую эмиссию традиционных MA и может быстро улавливать изменения тенденций.
Использование двойных МА для генерации сигналов может эффективно фильтровать ложные прорывы.
Добавление цены выше/ниже MCMA позволяет избежать чрезмерной торговли на рынках с ограниченным диапазоном.
Использование EMA делает MA более чувствительным к недавним изменениям цен.
В случае, когда рынок находится в боковом направлении, Whipsaws могут генерировать ложные сигналы, вызывая убытки. Параметры могут быть настроены на фильтр сигналов.
Пробелы могут не запустить вход вовремя, правила входа могут быть смягчены.
Недостаточная настройка параметров может повлиять на эффективность стратегии. Параметры должны быть оптимизированы.
Долгие периоды хранения несут системный риск.
Испытывать различные длины MA для поиска оптимальных комбинаций.
Добавьте другие индикаторы, такие как KD, MACD, чтобы улучшить сроки входа/выхода.
Корректировать значение k на основе различных продуктов и рынков для оптимизации расчета McGinley MA.
Включить меры волатильности для динамического размещения позиций и контроля рисков.
Установите стоп-лосс для контроля потерь.
Эта стратегия использует способность быстрого отслеживания МакГинли 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()