MACD Закрытие Медиана Черепаха Гибридная стратегия


Дата создания: 2023-10-30 12:16:20 Последнее изменение: 2023-10-30 12:16:20
Копировать: 1 Количество просмотров: 382
1
Подписаться
1141
Подписчики

MACD Закрытие Медиана Черепаха Гибридная стратегия

Обзор

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

Стратегический принцип

Эта стратегия основана на следующих принципах:

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

  2. Используйте K-линию для определения отношений между ценой закрытия и средней линией, чтобы определить, закончилась ли полярная тенденция, а также точку начала.

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

  4. Устанавливается механизм корректировки входа, если цена частично корректируется, но еще не обращена вспять, добавляется позиция, это относится к корректировке внутри тренда.

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

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

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

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

Стратегические преимущества

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

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

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

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

  4. Поправка механизма входа позволит своевременно пополнить запасы, чтобы в полной мере уловить тенденции.

  5. Высокая частота стратегических операций, но контролируемые риски, легкий доступ к более высоким коэффициентам прибыли.

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

  7. Стратегическая мысль ясна и понятна, код написан лаконично, работа с диском проста.

  8. Данные отслеживания являются достаточными, надежными и легко проверяемыми.

Стратегический риск

В этой стратегии также есть следующие основные риски:

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

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

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

  4. В случае рецессии, скорректированная прибыль может привести к большим убыткам.

  5. Торговые сорта и параметры требуют оптимизации и не для всех сортов.

  6. Необходимо постоянно отслеживать и оптимизировать, корректируя параметры в соответствии с рынком.

  7. Необходимо учитывать влияние стоимости скольжения на фиксированный диск.

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

Направление оптимизации стратегии

Эта стратегия может быть улучшена в следующих аспектах:

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

  2. Настройка динамического торможения с автоматической адаптацией

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

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

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

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

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

  8. Рассматривается возможность использования стратегического пакета в качестве торгового робота для автоматизации торгов.

  9. Добавление факторов, связанных с диском, таких как стоимость скольжения.

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

Подвести итог

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

Исходный код стратегии
/*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", "")