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

Автор:Чао Чжан, Дата: 2023-11-16 17:25:13
Тэги:

img

Обзор

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

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

Стратегия создает двойные скользящие средние с использованием быстрой EMA и медленной EMA и определяет направление тренда на основе перекрестки между быстрой и медленной линиями.

Согласно коду, длина быстрой линии составляет 12 и длина медленной линии - 26, представляя краткосрочные и долгосрочные тенденции.

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

  • trend_up = macd > сигнал: быстрая линия пересекает медленную линию, указывая на краткосрочный восходящий тренд

  • trend_dn = macd < сигнал: быстрая линия пересекается ниже медленной линии, что указывает на краткосрочный нисходящий тренд

Определение точки перекрестка:

  • cross_UP = сигнал[1] >= macd[1] и сигнал < macd: быстрая линия пересекает медленную линию снизу

  • cross_DN = сигнал[1] <= macd[1] и сигнал > macd: быстрая линия пересекает медленную линию сверху

Изменение цвета гистограммы определяет силу импульса:

  • histA_IsUp = рост столбца гистограммы и больше 0, укрепление импульса в восходящем тренде

  • histA_IsDown = колонка гистограммы снижается, но все еще больше 0, импульс ослабляется в восходящем тренде

  • Та же логика ниже 0.

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

  1. Двойные скользящие средние определяют среднесрочную тенденцию, избегают краткосрочного шума

  2. MACD помогает оценивать краткосрочные тенденции и динамику для повышения рентабельности

  3. Изменение цвета гистограммы помогает лучше определить время входа

  4. Цвет перекрестного фона подчеркивает сигналы

  5. Настраиваемые скользящие средние периоды соответствуют различным рыночным условиям

  6. Регулируемые параметры MACD оптимизируют индикатор

  7. Предоставляет несколько подтверждений входа: тренд, перекресток, прорыв паттерна

Риски

  1. Двойные МА, нечувствительные к краткосрочным колебаниям, могут упустить краткосрочные возможности

  2. Плохой эффект MACD при неправильном настройке параметров может генерировать ложные сигналы

  3. Вложения, основанные исключительно на МА и MACD, имеют некоторые слепые точки

  4. Отсутствие механизма стоп-лосса приводит к риску увеличения потерь

  5. Отсутствие строгого управления денежными средствами и размещения позиций

Возможные решения:

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

  2. Оптимизировать параметры MACD и тестировать на разных рынках

  3. Добавьте рисунок, импульс и т. д. для подтверждения сигналов

  4. Создать механизмы остановки потерь для ограничения размера потерь

  5. Добавление модуля управления денежными средствами к размеру позиций на основе капитала

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

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

  2. Попробуйте различные типы MA, такие как VWAP, Bollinger midline и т.д.

  3. Учитывайте объем торговли, чтобы избежать ложных прорывов

  4. Включить RSI и т.д. для подтверждения перекупления/перепродажи

  5. Создайте надежные механизмы остановки потерь, такие как остановка отслеживания, остановка волатильности и т.д.

  6. Включить размеры позиций на основе размера счета

  7. Рассмотрим машинное обучение для оптимизации параметров

  8. Расширение стратегии для улучшения подхода портфеля

Заключение

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


/*backtest
start: 2022-11-15 00:00:00
end: 2023-11-15 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy(title="Histogram MacD MVP_V2.1", shorttitle="Histogram MacD MVP_2.1")
//Plot Inputs
res           = input.timeframe("",  "Indicator TimeFrame")
fast_length   = input.int(title="Fast Length", defval=12)
slow_length   = input.int(title="Slow Length", defval=26)
src           = input.source(title="Source", defval=close)
signal_length = input.int(title="Signal Smoothing", minval = 1, maxval = 999, defval = 9)
sma_source    = input.string(title="Oscillator MA Type", defval="EMA", options=["SMA", "EMA"])
sma_signal    = input.string(title="Signal Line MA Type", defval="EMA", options=["SMA", "EMA"])
// Show Plots T/F
show_macd     = input.bool(true, title="Show MACD Lines", group="Show Plots?", inline="SP10")
show_macd_LW  = input.int(3, minval=0, maxval=5, title = "MACD Width", group="Show Plots?", inline="SP11")
show_signal_LW= input.int(2, minval=0, maxval=5, title = "Signal Width", group="Show Plots?", inline="SP11")
show_Hist     = input.bool(true, title="Show Histogram", group="Show Plots?", inline="SP20")
show_hist_LW  = input.int(5, minval=0, maxval=5, title = "-- Width", group="Show Plots?", inline="SP20")
show_trend    = input.bool(true, title = "Show MACD Lines w/ Trend Color", group="Show Plots?", inline="SP30")
show_HB       = input.bool(false, title="Show Highlight Price Bars", group="Show Plots?", inline="SP40")
show_cross    = input.bool(false, title = "Show BackGround on Cross", group="Show Plots?", inline="SP50")
show_dots     = input.bool(true, title = "Show Circle on Cross", group="Show Plots?", inline="SP60")
show_dots_LW  = input.int(5, minval=0, maxval=5, title = "-- Width", group="Show Plots?", inline="SP60")

//show_trend    = input(true, title = "Colors MACD Lines w/ Trend Color", group="Show Plots?", inline="SP5")
// MACD Lines colors
col_macd      = input.color(#FF6D00, "MACD Line  ",  group="Color Settings", inline="CS1")
col_signal    = input.color(#2962FF, "Signal Line  ",  group="Color Settings", inline="CS1")
col_trnd_Up   = input.color(#4BAF4F, "Trend Up      ",  group="Color Settings", inline="CS2")
col_trnd_Dn   = input.color(#B71D1C, "Trend Down    ",  group="Color Settings", inline="CS2")
// Histogram Colors
col_grow_above = input.color(#26A69A, "Above   Grow",  group="Histogram Colors", inline="Hist10")
col_fall_above = input.color(#FF5252, "Fall",  group="Histogram Colors", inline="Hist10")
col_grow_below = input.color(#FF5252, "Below Grow",  group="Histogram Colors", inline="Hist20")
col_fall_below = input.color(#f8f524, "Fall",  group="Histogram Colors", inline="Hist20")
// Alerts T/F Inputs
alert_Long    = input.bool(true, title = "MACD Cross Up", group = "Alerts", inline="Alert10")
alert_Short   = input.bool(true, title = "MACD Cross Dn", group = "Alerts", inline="Alert10")
alert_Long_A  = input.bool(false, title = "MACD Cross Up & > 0", group = "Alerts", inline="Alert20")
alert_Short_B = input.bool(false, title = "MACD Cross Dn & < 0", group = "Alerts", inline="Alert20")
// Calculating
fast_ma = request.security(syminfo.tickerid, res, sma_source == "SMA" ? ta.sma(src, fast_length) : ta.ema(src, fast_length))
slow_ma = request.security(syminfo.tickerid, res, sma_source == "SMA" ? ta.sma(src, slow_length) : ta.ema(src, slow_length))
macd = fast_ma - slow_ma
signal = request.security(syminfo.tickerid, res, sma_signal == "SMA" ? ta.sma(macd, signal_length) : ta.ema(macd, signal_length))
hist = macd - signal
// MACD Trend and Cross Up/Down conditions
trend_up   = macd > signal
trend_dn   = macd < signal
cross_UP   = signal[1] >= macd[1] and signal < macd
cross_DN   = signal[1] <= macd[1] and signal > macd
cross_UP_A = (signal[1] >= macd[1] and signal < macd) and macd > 0
cross_DN_B = (signal[1] <= macd[1] and signal > macd) and macd < 0
// Condition that changes Color of MACD Line if Show Trend is turned on..
trend_col = show_trend  and trend_up ? col_trnd_Up : trend_up ? col_macd : show_trend  and trend_dn ? col_trnd_Dn: trend_dn ? col_macd : na 

//Var Statements for Histogram Color Change
var bool histA_IsUp = false
var bool histA_IsDown = false
var bool histB_IsDown = false
var bool histB_IsUp = false
histA_IsUp   := hist == hist[1] ? histA_IsUp[1] : hist > hist[1] and hist > 0
histA_IsDown := hist == hist[1] ? histA_IsDown[1] : hist < hist[1] and hist > 0
histB_IsDown := hist == hist[1] ? histB_IsDown[1] : hist < hist[1] and hist <= 0
histB_IsUp   := hist == hist[1] ? histB_IsUp[1] : hist > hist[1] and hist <= 0

hist_col =  histA_IsUp ? col_grow_above : histA_IsDown ? col_fall_above : histB_IsDown ? col_grow_below : histB_IsUp ? col_fall_below :color.silver 

// Plot Statements
//Background Color
bgcolor(show_cross and cross_UP ? col_trnd_Up : na, editable=false)
bgcolor(show_cross and cross_DN ? col_trnd_Dn : na, editable=false)
//Highlight Price Bars
barcolor(show_HB and trend_up ? col_trnd_Up : na, title="Trend Up", offset = 0, editable=false)
barcolor(show_HB and trend_dn ? col_trnd_Dn : na, title="Trend Dn", offset = 0, editable=false)
//Regular Plots
plot(show_Hist and hist ? hist : na, title="Histogram", style=plot.style_columns, color=color.new(hist_col ,0),linewidth=show_hist_LW)
plot(show_macd  and signal ? signal : na, title="Signal", color=color.new(col_signal, 0),  style=plot.style_line ,linewidth=show_signal_LW)
plot(show_macd  and macd ? macd : na, title="MACD", color=color.new(trend_col, 0),  style=plot.style_line ,linewidth=show_macd_LW)
hline(0, title="0 Line", color=color.new(color.gray, 0), linestyle=hline.style_dashed, linewidth=1, editable=false)
plot(show_dots and cross_UP ? macd : na, title="Dots", color=color.new(trend_col ,0), style=plot.style_circles, linewidth=show_dots_LW, editable=false)
plot(show_dots and cross_DN ? macd : na, title="Dots", color=color.new(trend_col ,0), style=plot.style_circles, linewidth=show_dots_LW, editable=false)

//Alerts
if alert_Long and cross_UP
    alert("Symbol = (" + syminfo.tickerid + ") TimeFrame = (" + timeframe.period + ") Current Price (" + str.tostring(close) + ") MACD Crosses Up.", alert.freq_once_per_bar_close)

if alert_Short and cross_DN
    alert("Symbol = (" + syminfo.tickerid + ") TimeFrame = (" + timeframe.period + ") Current Price (" + str.tostring(close) + ") MACD Crosses Down.", alert.freq_once_per_bar_close)
//Alerts - Stricter Condition - Only Alerts When MACD Crosses UP & MACD > 0 -- Crosses Down & MACD < 0
if alert_Long_A and cross_UP_A
    alert("Symbol = (" + syminfo.tickerid + ") TimeFrame = (" + timeframe.period + ") Current Price (" + str.tostring(close) + ") MACD > 0 And Crosses Up.", alert.freq_once_per_bar_close)

if alert_Short_B and cross_DN_B
    alert("Symbol = (" + syminfo.tickerid + ") TimeFrame = (" + timeframe.period + ") Current Price (" + str.tostring(close) + ") MACD < 0 And Crosses Down.", alert.freq_once_per_bar_close)


if (histA_IsUp)
	strategy.entry("buy", strategy.long, comment="buy")
if (histA_IsDown)
	strategy.entry("sell", strategy.short, comment="sell")


Больше