Эта стратегия позволяет вычислить индикатор MACD и его столбцевую линию и обнаружить отклонение между MACD и движением цены, что приводит к выпуску торговых сигналов. При обнаружении нового высокого ценового уровня, но без создания нового высокого ценового уровня, сигнал отклонения прибыли приводится в действие. При обнаружении нового низкого ценового уровня, но без создания нового низкого ценового уровня, сигнал отклонения прибыли приводится в действие.
Основной принцип этой стратегии - использовать индикатор MACD и его характеристики, отражающие изменение ценового тренда, для обнаружения сигналов отклонения между MACD и ценой, которые являются условиями для запуска торговых сигналов.
В частности, стратегия сначала рассчитывает MACD-линию, Signal-линию и MACD-колониальную линию. Затем, определяя фрактальную функцию, выявляется пик и долина MACD-колониальной линии, чтобы извлечь локальные максимумы и минимумы. Затем, объединяя максимальные и минимальные цены цены, определяется наличие отклонения между MACD-колониальной линией и ценой.
Когда цена создает новые высокие, но MACD не создает новые высокие, то получается сигнал regulark_bearish_div; когда цена создает новые низкие, но MACD не создает новые низкие, то получается сигнал regulark_bullish_div.
Наконец, стратегия выпускает "делай больше" и "сделай меньше" инструкции, когда появляются сигнал "остановить потерю" и "остановить выход" с помощью ATR.
По словам одного из них, "это очень важно".
Используя MACD-линию столбца и расхождение между ценой, можно заранее зафиксировать изменение ценового тренда.
ATR имеет разумные параметры, которые позволяют эффективно контролировать максимальные потери от одной сделки.
Применение методов отслеживания трендов позволяет максимально зафиксировать прибыль.
Параметры настроены разумно, что позволяет фильтровать часть шума сигналов торговли.
По словам одного из авторов статьи, "это не так уж и сложно".
В то же время в этой стратегии есть некоторые риски:
Отклонение от MACD не обязательно приводит к перевороту цены, существует определенный риск ложных сигналов.
Нерациональная установка препятствий может привести к слишком большим потерям или слишком малым прибылям.
Слишком короткий цикл отклонения от сигнала, который может быть вызван шумом, должен быть соответствующим образом отфильтрован.
Несоответствие в разновидностях сделок и параметрах также может повлиять на эффективность стратегии.
Относительное решение:
Соответствующее увеличение длины и ширины отклонения требуется для фильтрации ложных сигналов.
Использование ATR в качестве индикатора остановки потери и корректировка коэффициента ATR для контроля риска одной сделки.
Выбирать различные параметры для различных видов сделок; оптимизировать параметры, чтобы найти оптимальную комбинацию параметров;
Также эта стратегия может быть оптимизирована в следующих направлениях:
Более сложные подтверждения отклонения, такие как подтверждение отклонения объема.
Оптимизировать параметры MACD, чтобы найти оптимальную комбинацию параметров.
Оптимизировать ATR и уменьшить убытки.
Добавление алгоритмов машинного обучения, которые помогают определить надежность сигналов.
Повышение прогнозов моделей, определение вероятности переворота цен.
В зависимости от изменения рыночной среды, параметры стратегии динамически корректируются.
В целом, индикатор MACD отклоняется от стратегии отслеживания тренда, используя характеристики отклонения между MACD столбиковой линией и ценой для улавливания тренда. ATR имеет разумную настройку и контролирует риск одной сделки.
/*backtest start: 2024-01-04 00:00:00 end: 2024-02-03 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © bigwin_sun // copyright: Tradingvue Limited //@version = 5 strategy(title = "Demigod : CDMA histogram Divergence strategy", shorttitle = "Demigod strategy", overlay = false, pyramiding = 100) //macd input fastMA = input.int(13, title = "fast Length", minval = 1, group = "CDMA") slowMA = input.int(34, title = "slow Length", minval = 1, group = "CDMA") src = input.source(title = "source", defval = close, group = "CDMA") signalSmooth = input.int(9, title="ma Length", minval = 1, group = "CDMA") //Divergenc divLength = input.int(title = "Divergenc Length", defval = 5, minval = 1, maxval = 50, inline = "ATRLength", group = "Divergence") divStren = input.float(title="Divergenc Strength", defval = 2, minval = 1.0, maxval = 5.0, inline = "ATRLength", group = "Divergence") //atr input atrLength = input.int(13, title = "ATR Length", minval = 1, inline = "ATRLength", group = "ATR") m = input.float(1.0, "ATR multyple", minval = 0.5, inline = "ATRLength", group = "ATR", step = 0.5) collong = input.color(color.teal, title = "upper color", inline = "ATR显示", group = "ATR") colshort = input.color(color.red, title = "under color", inline = "ATR显示", group = "ATR") // MACD--------------------------------------------------------------------------------------------------------------------------------- DivOffset = -2 macdLine = ta.ema(src, fastMA) - ta.ema(src, slowMA) signalLine = ta.ema(macdLine, signalSmooth) histogram = macdLine - signalLine histogramColor = if histogram > 0 histogram > histogram[1] ? color.lime : color.green else histogram < histogram[1] ? color.maroon : color.red // cdma histogram plot(histogram, title = "MACD histogram", linewidth = 2, style = plot.style_histogram, color = histogramColor) plot(0, title = "zero line", linewidth = 1, color = color.gray) // Divergenc calculation------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- //peak / valley fundation f_top_fractal(_src)=>_src[4] < _src[2] and _src[3] < _src[2] and _src[2] > _src[1] and _src[2] > _src[0] and _src > 0 f_bot_fractal(_src)=>_src[4] > _src[2] and _src[3] > _src[2] and _src[2] < _src[1] and _src[2] < _src[0] and _src < 0 f_fractalize(_src)=>f_top_fractal(_src) ? 1 : f_bot_fractal(_src) ? -1 : 0 //peak / valley value fractal_top1 = f_fractalize(histogram) > 0 ? true : false //histogram[2] : na fractal_bot1 = f_fractalize(histogram) < 0 ? true : false //histogram[2] : na //previouse peak or valley high_prev1 = ta.valuewhen(fractal_top1, histogram[2], 0)[2] high_price1 = ta.valuewhen(fractal_top1, high[2], 0)[2] low_prev1 = ta.valuewhen(fractal_bot1, histogram[2], 0)[2] low_price1 = ta.valuewhen(fractal_bot1, low[2], 0)[2] //Divergenc : cdma histogram against candle value regular_bearish_div1 = high[2] > high_price1 + divStren and histogram[2] < high_prev1 / divStren and ta.barssince(fractal_top1[1]) > divLength regular_bullish_div1 = low[2] < low_price1 - divStren and histogram[2] > low_prev1 / divStren and ta.barssince(fractal_bot1[1]) > divLength //-------------------------cdma Divergenc range------------------------------------------------ //histogramColor col1 = regular_bearish_div1 ? color.red : na col2 = regular_bullish_div1 ? #00FF00EB : na //plot plot(title='看跌背离', series= fractal_top1 ? histogram[2] : na, color=col1, linewidth=3, offset=DivOffset) plot(title='看涨背离', series= fractal_bot1 ? histogram[2] : na, color=col2, linewidth=3, offset=DivOffset) // calculate ATR -------------------------------------------------------------------------------------------------------------------------------------------------- atr = ta.ema(ta.tr(true), atrLength) * m up = atr + high dw = low - atr //stratety : enrty and exit--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- if regular_bearish_div1 and fractal_top1 //if regular_bullish_div1 and fractal_bot1 //label.new(bar_index, histogram[2], text = "Short", textcolor = color.white, color = color.gray, style = label.style_label_lower_left) strategy.entry("Short", strategy.short, qty = 1) strategy.exit("exitShort", "Short", stop = up, limit = dw - atr) if regular_bullish_div1 and fractal_bot1 //if regular_bearish_div1 and fractal_top1 //label.new(bar_index, histogram[2], text = "Long", textcolor = color.white, color = color.fuchsia, style = label.style_label_upper_left) strategy.entry("Long", strategy.long, qty = 1) strategy.exit("exitLong", "Long", stop = dw, limit = up + atr)