Закрытие гибридной стратегии MACD

Автор:Чао Чжан, Дата: 2023-10-30 12:16:20
Тэги:

img

Обзор

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

Принципы стратегии

Стратегия основывается главным образом на следующих принципах:

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

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

  3. Установите механизм повторного выхода на рынок в том же направлении после окончания текущего тренда MACD для увеличения прибыли.

  4. Установка механизма ввода коррекции для добавления позиций во время частичных корректировок цен в рамках тренда.

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

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

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

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

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

Основными преимуществами этой стратегии по использованию нескольких индикаторов являются:

  1. MACD определяет тенденции и точки перелома для входа.

  2. Отношение между ценой закрытия и средней линией точно определяет конец тренда.

  3. Возвращение увеличивает эффективность использования капитала.

  4. Ввод корректировки своевременно добавляет позиции для отслеживания тенденций.

  5. Высокая частота торговли с контролируемым риском дает высокие показатели прибыли.

  6. Настраиваемые параметры для оптимизации по всем продуктам и рынкам.

  7. Ясная логика и лаконичный код для легкой торговли.

  8. Достаточные данные обратного теста гарантируют надежность.

Риски

Основными рисками являются:

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

  2. Стойки, которые слишком тесные, могут быть остановлены волатильными движениями.

  3. Увеличение частоты торговли требует контроля за использованием капитала.

  4. Коррекционные записи могут привести к потерям во время отступления.

  5. Оптимизация необходима для различных продуктов и рынков.

  6. Требует постоянного обратного тестирования и оптимизации.

  7. Стоимость скольжения должна учитываться для торговли в режиме реального времени.

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

Возможности для расширения

Возможности повышения квалификации:

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

  2. Внедрить адаптивные динамические остановки.

  3. Оптимизируйте логику повторного входа и коррекции.

  4. Оптимизация параметров на продукт.

  5. Оптимизировать использование капитала для вводов.

  6. Включить показатели объема, чтобы избежать потерь от отзывов.

  7. Добавьте механизмы выхода, такие как движущиеся остановки.

  8. Создайте автоматизированный торговый бот.

  9. Учитывайте факторы реального мира, такие как скольжение.

Они могут еще больше улучшить стабильность, адаптивность, автоматизацию и производительность в режиме реального времени.

Заключение

Эта стратегия объединяет сигналы MACD, анализ цены закрытия и несколько механизмов входа для максимизации тенденций при одновременном контроле риска.


/*backtest
start: 2023-09-29 00:00:00
end: 2023-10-29 00:00:00
period: 2h
basePeriod: 15m
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/
// © Puckapao

//@version=4
// strategy(title="MACD", shorttitle="MACD", overlay=true, initial_capital=10000.00, currency="USD", default_qty_type=strategy.cash, default_qty_value=10000.00)
// Getting inputs
reenter_delay = input(title="Re-enter Delay", type=input.integer, defval=2)
sculp_delay = input(title="Sculp Delay", type=input.integer, defval=4)
fast_length = input(title="Fast Length", type=input.integer, defval=12)
slow_length = input(title="Slow Length", type=input.integer, defval=26)
src = input(title="Source", type=input.source, defval=close)
signal_length = input(title="Signal Smoothing", type=input.integer, minval = 1, maxval = 50, defval = 9)
sma_source = input(title="Simple MA(Oscillator)", type=input.bool, defval=false)
sma_signal = input(title="Simple MA(Signal Line)", type=input.bool, defval=true)
ema_period = input(title="EMA Period", type=input.integer, defval=21)

// Get date
startDate = input(title="Start Date", type=input.integer,
     defval=19, minval=1, maxval=31)
startMonth = input(title="Start Month", type=input.integer,
     defval=09, minval=1, maxval=12)
startYear = input(title="Start Year", type=input.integer,
     defval=2017, minval=1800, maxval=2100)

endDate = input(title="End Date", type=input.integer,
     defval=31, minval=1, maxval=31)
endMonth = input(title="End Month", type=input.integer,
     defval=3, minval=1, maxval=12)
endYear = input(title="End Year", type=input.integer,
     defval=2021, minval=1800, maxval=2100)
     
// STEP 2:
// Look if the close time of the current bar
// falls inside the date range
inDateRange =  true

reenter_cnt = 0
reenter_cnt := nz(reenter_cnt[1])

sculp_cnt = 0
sculp_cnt := nz(sculp_cnt[1])

close_cnt = 0
close_cnt := nz(close_cnt[1])

on_long = false
on_long := nz(on_long[1])

on_short = false
on_short := nz(on_short[1])

sculp = false
reenter = false
slowdown = false

ema = ema(close, ema_period)

// Plot colors
col_grow_above = #26A69A
col_grow_below = #FFCDD2
col_fall_above = #B2DFDB
col_fall_below = #EF5350
col_macd = #0094ff
col_signal = #ff6a00
// Calculating
fast_ma = sma_source ? sma(src, fast_length) : ema(src, fast_length)
slow_ma = sma_source ? sma(src, slow_length) : ema(src, slow_length)
macd = fast_ma - slow_ma
signal = sma_signal ? sma(macd, signal_length) : ema(macd, signal_length)
hist = macd - signal
// plot(hist, title="Histogram", style=plot.style_columns, color=(hist>=0 ? (hist[1] < hist ? col_grow_above : col_fall_above) : (hist[1] < hist ? col_grow_below : col_fall_below) ), transp=0 )
// plot(macd, title="MACD", color=col_macd, transp=0)
// plot(signal, title="Signal", color=col_signal, transp=0)

cross_up = crossover(macd, signal)
cross_down = crossunder(macd, signal)

if (inDateRange)

    over_macd = macd > 0 and signal > 0 ? true : false
    under_macd = macd < 0 and signal < 0 ? true : false
    over_water = close > ema ? true : false
    under_water = close < ema ? true : false
    slowdown := hist >= 0 ? (hist[1] > hist ? true : false) : (hist[1] > hist ? false : true)
    reenter := hist >= 0 ? (hist[1] < hist ? true : false) : (hist[1] > hist ? true : false)
    sculp := (hist >= 0 ? (hist[1] > hist ? true : false) : (hist[1] < hist ? true : false))
    
    if(reenter == true)
        if(reenter_cnt < reenter_delay)
            reenter_cnt := reenter_cnt + 1
    else
        if(reenter_cnt > 0)
            reenter_cnt := reenter_cnt - 1
                    
    if(sculp == true)
        if(sculp_cnt < sculp_delay)
            sculp_cnt := sculp_cnt + 1
    else
        if(sculp_cnt > 0)
            sculp_cnt := sculp_cnt - 1
        
    if(slowdown == false)
        if(close_cnt < 2)
            close_cnt := close_cnt + 1
        else
            close_cnt := 0
    
    // plotchar(fork_cnt, "fork count", "")
    // plotchar(spoon_cnt, "spoon count", "")

    // Entry
    if (cross_up == true)
        strategy.entry("long", strategy.long, comment = "long", alert_message = "long")
        on_long := true
        on_short := false
    if (cross_down == true)
        strategy.entry("short", strategy.short, comment = "short", alert_message = "short")
        on_short := true
        on_long := false
        
    // Sculp bottom / top
    if (sculp == true and sculp_cnt >= sculp_delay)
        if (hist >= 0)
            strategy.entry("sculp-short", strategy.short, comment = "sculp-short", alert_message = "sculp-short")
        else
            strategy.entry("sculp-long", strategy.long, comment = "sculp-long", alert_message = "sculp-long")
        
        sculp_cnt := 0
        sculp := false
            
    // Re-Entry
    if (reenter == true and reenter_cnt >= reenter_delay)
        if (hist >= 0)
            strategy.entry("re-long", strategy.long, comment = "re-long", alert_message = "re-long")
        else
            strategy.entry("re-short", strategy.short, comment = "re-short", alert_message = "re-short")
            
        reenter_cnt := 0
        reenter := false
            
    // Close
    strategy.close("long", when = slowdown, comment = "close long", alert_message = "close long")
    strategy.close("short", when = slowdown, comment = "close short", alert_message = "close short")
    strategy.close("re-long", when = slowdown, comment = "close re-long", alert_message = "close re-long")
    strategy.close("re-short", when = slowdown, comment = "close re-short", alert_message = "close re-short")
    strategy.close("sculp-long", when = slowdown, comment = "close sculp-long", alert_message = "close sculp-long")
    strategy.close("sculp-short", when = slowdown, comment = "close sculp-short", alert_message = "close sculp-short")
    
    if (slowdown)
        if (hist >= 0)
            on_long := false
        else
            on_short := false


plotchar(slowdown, "close", "")
plotchar(reenter, "reenter", "")
plotchar(reenter_cnt, "reenter count", "")
plotchar(sculp, "sculp", "")
plotchar(sculp_cnt, "sculp count", "")

Больше