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

Автор:Чао Чжан, Дата: 2024-01-30 16:43:29
Тэги:

img

Обзор

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

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

В количественной торговой стратегии Dual MACD используется комбинация еженедельных и ежедневных индикаторов MACD для определения сигналов входа и выхода.

Во-первых, когда линия MACD еженедельного индикатора MACD пересекает линию сигнала, генерируется сигнал покупки и открывается длинная позиция. Затем, когда линия MACD ежедневного индикатора MACD пересекает линию сигнала, генерируется сигнал продажи и позиция закрывается.

Когда позиция пуста, если линия MACD ежедневного индикатора MACD снова пересекается выше линии сигнала, вновь открывается новая длинная позиция. То есть золотой крест ежедневного MACD выступает в качестве условия повторного входа.

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

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

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

  1. Еженедельный график определяет направление основного тренда, что помогает избежать противоположной торговли.

  2. Ежедневный график определяет сроки входа и выхода, что позволяет своевременно использовать краткосрочные торговые возможности.

  3. Механизм Торговый окно позволяет избежать чрезмерно частых открытий и закрытий из-за краткосрочных корректировок.

  4. Параметры индикатора MACD регулируемы и могут быть оптимизированы в соответствии с различными сортами и рыночными условиями.

  5. Интегрирует функции "приобрести прибыль", "остановить убыток" и "остановить убыток", чтобы эффективно контролировать риски.

Риски

Стратегия двойной количественной торговли MACD также сопряжена с некоторыми рисками, в основном включающими:

  1. Индикатор MACD имеет тенденцию генерировать ложные сигналы и частые перекрестки, требует подтверждения от других индикаторов.

  2. Основная тенденция, выявленная в еженедельном/месячном периоде времени, может измениться, поэтому необходима отслеживание стоп-лосса.

  3. Параметры требуют постоянной оптимизации и корректировки в соответствии с сортами и рыночными условиями.

  4. Нельзя чрезмерно полагаться на результаты обратного теста, живая производительность может отличаться от обратного теста.

Соответствующие решения:

  1. Сочетать с другими показателями для создания систем стратегии с логической оптимизацией.

  2. Установите разумный стоп-потеря, чтобы избежать превышения максимально допустимых потерь.

  3. Постоянно оптимизируйте параметры, чтобы найти оптимальные комбинации.

  4. Начните торговать с минимального капитала, чтобы подтвердить стабильность.

Оптимизация

У количественной стратегии двойной торговли MACD есть возможность дальнейшей оптимизации:

  1. Внедрение полос Боллинджера, KDJ и других индикаторов для создания стратегий, объединяющих несколько индикаторов, и улучшения качества сигналов.

  2. Включить показатели объема торговли, чтобы избежать ложных прорывов с недостаточным объемом.

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

  4. Дальнейшая корректировка стратегии по риску, например, добавление передовых методов стоп-лосса, таких как соотношение прибыли и убытка.

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

Заключение

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


/*backtest
start: 2023-01-29 00:00:00
end: 2024-01-11 05:20: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/
// © maxits

// Long Position: Weekly Macd line crosses above Signal line   
// [Trading Window Macd Line > Signal Line] (Weekly)
// Close Position: Daily Macd Line crosses above Daily Signal line.  
// Re Entry Condition: Macd line crosses above Signal line only if [Trading Window MacdLine > Sgnal Line] (Weekly)

//@version=4
strategy("Dual MACD Strategy",
         shorttitle="Dual Macd Tester",
         overlay=false,
         initial_capital=1000,
         default_qty_value=20,
         default_qty_type=strategy.percent_of_equity,
         commission_value=0.1,
         pyramiding=0)



// Define user inputs
i_time     = input(defval = timestamp("01 May 2018 13:30 +0000"), title = "Start Time", type = input.time) // Starting  time for Backtesting
f_time     = input(defval = timestamp("9 Sep 2021 13:30 +0000"), title = "Finish Time", type = input.time) // Finishing time for Backtesting

sep1          = input(false, title="------ Profit & Loss ------")

enable_TP     = input(true, title="Enable Just a Profit Level?")
enable_SL     = input(false, title="Enable Just a S.Loss Level?")
enable_TS     = input(true, title=" Enable Only Trailing Stop")
long_TP_Input = input(30.0,   title='Take Profit %',      type=input.float, minval=0)/100
long_SL_Input = input(1.0,   title='Stop Loss %',        type=input.float, minval=0)/100
long_TS_Input = input(5.0,   title='Trailing Stop %',    type=input.float, minval=0)/100
cl_low_Input  = input(low,   title="Trailing Stop Source")
long_TP       = strategy.position_avg_price * (1 + long_TP_Input)
long_SL       = strategy.position_avg_price * (1 - long_SL_Input)
long_TS       = cl_low_Input * (1 - long_TS_Input)

sep2       = input(false, title="------ Macd Properties ------")

d_res      = input(title="Short Term TimeFrame", type=input.resolution, defval="D") // Daily Time Frame
w_res      = input(title="Long Term TimeFrame", type=input.resolution, defval="W")  // Weekly Time Frame
src        = input(close, title="Source")                                           // Indicator Price Source
fast_len   = input(title="Fast Length", type=input.integer, defval=12)              // Fast MA Length
slow_len   = input(title="Slow Length", type=input.integer, defval=26)              // Slow MA Length
sign_len   = input(title="Sign Length", type=input.integer, defval=9)               // Sign MA Length
d_w        = input(title="Daily or Weekly?", type=input.bool, defval=true)          // Plot Daily or Weekly MACD

// Color Plot for Macd

col_grow_above = #26A69A
col_grow_below = #FFCDD2
col_fall_above = #B2DFDB
col_fall_below = #EF5350

// BG Color

bg_color = color.rgb(127, 232, 34, 75)

// Daily Macd

[d_macdLine, d_singleLine, d_histLine] = security(syminfo.tickerid, d_res, macd(src, fast_len, slow_len, sign_len)) // Funcion Security para poder usar correcta resolución

plot(d_w ? d_macdLine   : na, color=color.blue)
plot(d_w ? d_singleLine : na, color=color.orange)
plot(d_w ? d_histLine   : na, style=plot.style_columns,
     color=(d_histLine>=0 ? (d_histLine[1] < d_histLine ? col_grow_above : col_fall_above) : 
     (d_histLine[1] < d_histLine ? col_grow_below : col_fall_below)))
    
// Weekly Macd

[w_macdLine, w_singleLine, w_histLine] = security(syminfo.tickerid, w_res, macd(src, fast_len, slow_len, sign_len)) // Funcion Security para poder usar correcta resolución

plot(d_w ? na : w_macdLine,   color=color.blue)
plot(d_w ? na : w_singleLine, color=color.orange)
plot(d_w ? na : w_histLine,   style=plot.style_columns,
     color=(w_histLine>=0 ? (w_histLine[1] < w_histLine ? col_grow_above : col_fall_above) : 
     (w_histLine[1] < w_histLine ? col_grow_below : col_fall_below)))

///////////////////////////////// Entry Conditions
inTrade    = strategy.position_size != 0       // Posición abierta
notInTrade = strategy.position_size == 0       // Posición Cerrada
start_time = true

trading_window = w_macdLine > w_singleLine   // Weekly Macd Signal enables a trading window 
bgcolor(trading_window ? bg_color : na)
buy_cond       = crossover (w_macdLine, w_singleLine)
sell_cond      = crossunder(d_macdLine, d_singleLine)
re_entry_cond  = crossover (d_macdLine, d_singleLine) and trading_window

// Entry Exit Conditions

trailing_stop  = 0.0        // Code for calculating Long Positions Trailing Stop Loss
trailing_stop := if (strategy.position_size != 0)
    stopValue = long_TS
    max(trailing_stop[1], stopValue)
else 
    0

if (buy_cond and notInTrade and start_time)
    strategy.entry(id="First Entry", long=strategy.long, comment="First Long")

if (sell_cond and inTrade)
    strategy.close(id="First Entry", comment="Close First Long")
    
if (re_entry_cond and notInTrade and start_time)
    strategy.entry(id="Further Entry", long=strategy.long, comment="Further Entry")

if (sell_cond and inTrade)
    strategy.close(id="Further Entry", comment="Close First Long")

if enable_TP
    if (enable_TS and not enable_SL)
        strategy.exit("Long TP & TS FiEn", "First Entry",   limit = long_TP, stop = trailing_stop)
        strategy.exit("Long TP & TS FuEn", "Further Entry", limit = long_TP, stop = trailing_stop)
    else
        if (enable_SL and not enable_TS)
            strategy.exit("Long TP & TS FiEn", "First Entry",   limit = long_TP, stop = long_SL)
            strategy.exit("Long TP & TS FuEn", "Further Entry", limit = long_TP, stop = long_SL)
        else 
            strategy.exit("Long TP & TS FiEn", "First Entry",   limit = long_TP)
            strategy.exit("Long TP & TS FuEn", "Further Entry", limit = long_TP)
else
    if not enable_TP 
        if (enable_TS and not enable_SL)
            strategy.exit("Long TP & TS FiEn", "First Entry",   stop = trailing_stop)
            strategy.exit("Long TP & TS FuEn", "Further Entry", stop = trailing_stop)
        else
            if (enable_SL and not enable_TS)
                strategy.exit("Long TP & TS FiEn", "First Entry",   stop = long_SL)
                strategy.exit("Long TP & TS FuEn", "Further Entry", stop = long_SL)

plot(enable_TP ? long_TP : na, title="TP Level", color=color.green, style=plot.style_linebr, linewidth=2)
plot(enable_SL ? long_SL : na, title="SL Level", color=color.red,   style=plot.style_linebr, linewidth=2)
plot(enable_TS and trailing_stop ? trailing_stop : na, title="TS Level", color=color.red, style=plot.style_linebr, linewidth=2)


Больше