Эта стратегия сочетает в себе сигналы золотого креста и мертвого креста индикатора MACD, отношение цены закрытия к медианной линии и характеристики волатильности цен для определения точек входа и выхода.
Стратегия основывается главным образом на следующих принципах:
Для определения бычьих и медвежьих рынков и конкретных точек входа используйте быструю линию MACD и медленную линию золотой крест и мертвый крест.
Для определения конца тренда и точки выхода используйте соотношение цены закрытия к медианной линии.
Установите механизм повторного выхода на рынок в том же направлении после окончания текущего тренда MACD для увеличения прибыли.
Установка механизма ввода коррекции для добавления позиций во время частичных корректировок цен в рамках тренда.
Динамически корректируйте позиции, основываясь на вышеизложенном, чтобы максимизировать прибыль в рамках трендов, быстро выходя из них, когда тренд заканчивается.
В частности, стратегия сначала проверяет, происходит ли золотой крест или мертвый крест между быстрой и медленной линиями MACD для длинного или короткого хода. Затем она проверяет, касается ли цена закрытия медианной линии, чтобы определить конец тренда и закрыть позиции.
Кроме того, стратегия имеет механизм повторного входа для повторного открытия позиций в первоначальном направлении, если MACD продолжает показывать сигналы в том же направлении после окончания начальной тенденции.
С помощью этих настроек стратегия может динамически корректировать позиции, увеличивать частоту входа и выхода и максимизировать доходность, контролируя риски в рамках тенденций.
Основными преимуществами этой стратегии по использованию нескольких индикаторов являются:
MACD определяет тенденции и точки перелома для входа.
Отношение между ценой закрытия и средней линией точно определяет конец тренда.
Возвращение увеличивает эффективность использования капитала.
Ввод корректировки своевременно добавляет позиции для отслеживания тенденций.
Высокая частота торговли с контролируемым риском дает высокие показатели прибыли.
Настраиваемые параметры для оптимизации по всем продуктам и рынкам.
Ясная логика и лаконичный код для легкой торговли.
Достаточные данные обратного теста гарантируют надежность.
Основными рисками являются:
Вероятность ложных сигналов MACD требует проверки с помощью других индикаторов.
Стойки, которые слишком тесные, могут быть остановлены волатильными движениями.
Увеличение частоты торговли требует контроля за использованием капитала.
Коррекционные записи могут привести к потерям во время отступления.
Оптимизация необходима для различных продуктов и рынков.
Требует постоянного обратного тестирования и оптимизации.
Стоимость скольжения должна учитываться для торговли в режиме реального времени.
Меры управления рисками включают использование остановок для ограничения потерь, оценку использования капитала, оптимизацию параметров на продукт с помощью обратного тестирования, мониторинг динамики рынка для уточнения параметров и учет скольжения в тестах.
Возможности повышения квалификации:
Добавить другие показатели для проверки сигналов, например, KDJ.
Внедрить адаптивные динамические остановки.
Оптимизируйте логику повторного входа и коррекции.
Оптимизация параметров на продукт.
Оптимизировать использование капитала для вводов.
Включить показатели объема, чтобы избежать потерь от отзывов.
Добавьте механизмы выхода, такие как движущиеся остановки.
Создайте автоматизированный торговый бот.
Учитывайте факторы реального мира, такие как скольжение.
Они могут еще больше улучшить стабильность, адаптивность, автоматизацию и производительность в режиме реального времени.
Эта стратегия объединяет сигналы 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", "")