
Стратегия является количественной торговой системой, основанной на анализе нескольких временных рамок, в основном использующей MACD, RSI, среднюю VWAP и комбинированные сигналы ATR-фильтров волатильности для выполнения торгов на 30-минутных и 1-часовых временных рамках. Стратегия поддерживает одновременную прибыль и убыль, подтверждается с помощью перекрестных сигналов технических показателей в разных временных рамках и в сочетании с фильтрацией волатильности для улучшения качества торгов.
В основе стратегии лежит фильтрация низкокачественных сигналов с помощью многоусловного подтверждения, которая включает в себя следующие ключевые компоненты:
Многовременные перекрестные сигналы MACD:
RSI перекупает и перепродает фрилансы:
Подтверждение двойного VWAP-ценового положения:
Фильтр частоты колебаний:
Механизм многоуровневого выхода:
С помощью такой многоуровневой фильтрации и подтверждения условий стратегия направлена на захват явно направленных среднесрочных и краткосрочных колебаний, а также на отфильтрование низкокачественных сигналов, повышение выигрышности и прибыльности.
Подтверждение многократных временных рамок: С помощью объединения сигналов в 30-минутных и 1-часовых временных рамках, стратегия позволяет лучше распознавать истинные тренды и уменьшать влияние ложных сигналов. В частности, функция подтверждения 1-часового тренда MACD помогает избежать торговли против большого тренда.
Адаптация к колебаниямATR-фильтр волатильности гарантирует, что стратегия входит в рынок только при достаточно высокой динамике, избегая торговли в низких волатильных зонах, что эффективно снижает риск колебаний в мертвой зоне.
Гибкий механизм выходаСтратегия включает в себя не только фиксированный стоп-лосс, но и динамический механизм выхода, основанный на обратном движении индикатора, что позволяет вовремя выйти на рынок, чтобы защитить прибыль, когда цена не достигла стоп-лосса, но рынок уже начал поворачиваться.
Подтверждение двойного ценового положения: требует, чтобы цена находилась одновременно выше VWAP на двух временных рамках (вверх) или ниже (вниз), что дополнительно подтверждает движение и направление цены и уменьшает ложные прорывы.
Встроенное управление рискамиСтратегия включает в себя встроенный механизм стоп-лоссажа и управление позициями (по умолчанию используется учетная доля в размере 5% на каждую сделку), что помогает контролировать риск-открытие на каждую сделку и защищает капитал.
Невыгодные шансыКак указано в комментариях к коду, стратегия может столкнуться с проблемой заниженной выигрышности. Это связано с тем, что многоусловное отсеивание, хотя и улучшает качество сигнала, также значительно снижает частоту торгов, что приводит к меньшему количеству выборки и ограниченной статистической значимости.
Параметр ЧувствительностьВ стратегии используются множество регулируемых параметров, включая длину MACD, порог RSI, параметры фильтра ATR и т. Д. Небольшие изменения в этих параметрах могут оказать существенное влияние на эффективность стратегии, и существует риск переоптимизации.
Ограничения фиксированного процента стоп-лосса: использование одинаковых остановок ((1,5%) и остановок ((0,5%) для всех рыночных условий, которые могут быть не адаптированы к различным волатильным условиям. В высоко волатильных рынках остановки могут быть слишком жесткими; в низко волатильных рынках остановки могут быть слишком далеко.
Задержка многократных временных рамок: использование сигналов в более длинных временных рамках (например, 1 час) в качестве подтверждения может привести к задержке, что может привести к пропущенным возможностям входа или задержке выхода.
Отсутствие адаптации к рыночной среде: Стратегия не содержит механизмов для различения различных рыночных условий ((тренды / колебания), которые могут плохо работать в определенных рыночных условиях.
Решение проблемы:
Оптимизация динамического стоп-стоп: изменение фиксированного процента стоп-стоп на динамические значения, основанные на ATR, например, использование 1.5×ATR в качестве стоп-стоп и 3×ATR в качестве стоп-стоп. Это позволяет стратегии лучше адаптироваться к различным рыночным волатильным условиям, предоставляя более гибкие стопы в периоды высокой волатильности и ужесточение стоп-целей в периоды низкой волатильности.
Классификация рыночной среды: внедрение механизма идентификации рыночной среды, различающего трендовые рынки от шокирующих. Можно использовать ADX, пропускную способность Блинна или отношение цены к долгосрочным движущимся средним для идентификации состояния рынка и соответственно корректировать параметры стратегии или даже полностью переключить логику торговли.
Оптимизация времени входа: текущая стратегия текущая K-линия, входящая в MACD-пересечение, может столкнуться со скольжением или задержкой исполнения. Подумайте о входе в следующем открытии K-линии после подтверждения пересечения или установите ценовую линию для входа в определенную ценовую зону, чтобы получить лучшую цену исполнения.
Фильтр времениПовышение фильтра времени торговли, чтобы избежать определенных неэффективных торговых периодов. Например, можно избежать торговли в периоды, когда ликвидность может быть низкой или нерегулярно колебаться, например, в конце азиатского времени или в пересечении между Европой и США.
Параметры индикатора адаптируютсяНапример, более короткие параметры MACD могут использоваться в высоко-волатильных рынках, а более длинные - в низко-волатильных.
Сигнальная степень: создание системы оценки силы для входящих сигналов, оценка сигналов на основе нескольких факторов (таких как размер столбца MACD, отклонение RSI, расстояние VWAP и т. Д.), выполнение только сделок, силы которых превышают определенный порог, или изменение размеров позиций в зависимости от динамики силы сигнала.
Машинное обучениеВнедрение моделей машинного обучения для прогнозирования того, какие сигналы более вероятны для получения прибыльных сделок, выявление наиболее ценного сочетания моделей на основе моделей обучения историческим данным. Это может повысить адаптивность и выигрышность стратегии.
Эти направления оптимизации направлены на повышение устойчивости, адаптивности и долгосрочной производительности стратегии, сохраняя при этом неизменную ее основную логику. Благодаря этим улучшениям стратегия может лучше реагировать на изменения в различных рыночных условиях и условиях.
Многовременные рамки MACD-RSI Стратегия торговли с переизбыточным количеством перекрестных колебаний - это комплексная торговая система, предназначенная для выявления высококачественных торговых возможностей путем объединения сигналов с несколькими техническими показателями и несколькими временными рамками. Основные преимущества этой стратегии заключаются в ее многоуровневом механизме подтверждения сигналов и встроенных функциях управления рисками, которые позволяют контролировать риск, одновременно улавливая колебания цен.
Несмотря на проблемы с низкой выигрышной вероятностью, стратегия поддерживает положительные ожидания, повышая доход от среднеприбыльных сделок. Продуктивность стратегии может быть дополнительно улучшена с помощью реализации рекомендуемых мер оптимизации, в частности, динамических стоп-стоп, классификации рыночной среды и ранжирования силы сигнала.
Эта стратегия подходит для краткосрочных и среднесрочных трейдеров, особенно тех, кто ищет систематизированный торговый метод, основанный на техническом анализе, и придает большое значение управлению рисками. Многоусловное подтверждение механизма стратегии, хотя и уменьшает частоту торгов, повышает качество каждой сделки, что соответствует философии торговли “менее значит больше”, подчеркивая качество, а не количество.
В практическом применении рекомендуется, чтобы трейдеры сначала тестировали эту стратегию в симуляторной среде, в частности, тестировали эффективность различных мер оптимизации, а затем осторожно применяли их к реальным сделкам. В то же время, постоянный мониторинг изменений рыночных условий и своевременная коррекция параметров стратегии поможет сохранить стабильную долгосрочную производительность.
/*backtest
start: 2025-01-01 00:00:00
end: 2025-06-08 00:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/
// This Pine Script® code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © GentlemanOfTrading
//@version=6
strategy(title = "ETH Day Trader", overlay = true, margin_long = 100, margin_short = 100, default_qty_type = strategy.percent_of_equity, default_qty_value = 5)
// ==== 1) USER INPUTS ====
// MACD/RSI lengths
fastLen = input.int(12, title="MACD Fast EMA Length", minval=1)
slowLen = input.int(26, title="MACD Slow EMA Length", minval=1)
signalLen = input.int(9, title="MACD Signal EMA Length", minval=1)
rsiLen = input.int(14, title="RSI Length", minval=1)
// RSI thresholds
rsiThreshLong30 = input.int(55, title="RSI30m > (Long)", minval=1, maxval=100)
rsiThreshShort30= input.int(45, title="RSI30m < (Short)", minval=1, maxval=100)
rsiThresh1h = input.int(50, title="RSI1h Threshold", minval=1, maxval=100)
// ATR filter (30m)
atrLen = input.int(14, title="ATR Length (30m)", minval=1)
atrMaLen = input.int(20, title="ATR MA Length (30m)", minval=1)
// Take Profit / Stop Loss (percent)
tpPerc = input.float(1.5, title="Take Profit (%)", minval=0.1) / 100
slPerc = input.float(0.5, title="Stop Loss (%)", minval=0.1) / 100
// Toggle whether to use 1h trend confirmation
use1hTrend = input.bool(true, title="Use 1h MACD Trend Confirmation?")
// ==== 2) FETCH INDICATORS ON 30m ====
// We assume this script is applied on a chart ≤ 30m (e.g. 15m or 5m),
// but if you apply it on a 30m chart it still works: security() with "30" just returns the same bar.
[macd30m, macdSig30m, _] = ta.macd(close, fastLen, slowLen, signalLen)
rsi30m = ta.rsi(close, rsiLen)
atr30m = ta.atr(atrLen)
// ==== 3) FETCH INDICATORS ON 1h & VWAPs via request.security() ====
// --- 1h MACD & RSI ---
[macd1h, macdSig1h, _] = request.security(syminfo.tickerid, "60", ta.macd(close, fastLen, slowLen, signalLen), lookahead=barmerge.lookahead_off)
rsi1h = request.security(syminfo.tickerid, "60", ta.rsi(close, rsiLen), lookahead=barmerge.lookahead_off)
// --- 30m VWAP & 1h VWAP (session VWAP) ---
vwap30m = request.security(syminfo.tickerid, "30", ta.vwap(close), lookahead=barmerge.lookahead_off)
vwap1h = request.security(syminfo.tickerid, "60", ta.vwap(close), lookahead=barmerge.lookahead_off)
// ==== 4) BUILD VOLATILITY FILTER (30m ATR vs ATR MA) ====
atr30m_ma = ta.sma(atr30m, atrMaLen)
volatilityOK = atr30m >= atr30m_ma
// ==== 5) MULTI-TIMEFRAME CROSS CONDITIONS ====
// 30m MACD cross signals
longCross30m = ta.crossover(macd30m, macdSig30m)
shortCross30m = ta.crossunder(macd30m, macdSig30m)
// 1h MACD trend confirmation
macdTrendUp1h = macd1h > macdSig1h
macdTrendDown1h = macd1h < macdSig1h
// ==== 6) ENTRY & EXIT CONDITIONS ====
// LONG ENTRY:
// • 30m MACD crossover
// • 30m RSI > rsiThreshLong30
// • (optionally) 1h MACD line > 1h MACD signal
// • Price > 30m VWAP AND Price > 1h VWAP
// • 30m ATR ≥ 30m ATR MA (volatility filter)
longEntryCond =
longCross30m
and (rsi30m > rsiThreshLong30)
and (close > vwap30m)
and (close > vwap1h)
and volatilityOK
and (use1hTrend ? macdTrendUp1h : true)
// LONG EXIT:
// • fixed TP/SL
// OR • 30m MACD crossunder
// OR • 1h MACD falls below signal (trend flipped)
var float entryPriceLong = na
longExitCond = false
if (strategy.position_size > 0)
// Price-based TP / SL checks
entryPriceLong := nz(entryPriceLong[1], strategy.position_avg_price)
longTPprice = entryPriceLong * (1 + tpPerc)
longSLprice = entryPriceLong * (1 - slPerc)
// check TP/SL first
longExitTP = high >= longTPprice
longExitSL = low <= longSLprice
// fallback: MACD crossunder on 30m OR 1h trend flips
macdTrendFlip1h = macdTrendUp1h and (macd1h < macdSig1h)
macdCross30m = shortCross30m
longExitCond := longExitTP or longExitSL or macdCross30m or macdTrendFlip1h
else
entryPriceLong := na // reset when no position
// SHORT ENTRY:
// • 30m MACD crossunder
// • 30m RSI < rsiThreshShort30
// • (optionally) 1h MACD line < 1h MACD signal
// • Price < 30m VWAP AND Price < 1h VWAP
// • 30m ATR ≥ 30m ATR MA (volatility filter)
shortEntryCond =
shortCross30m
and (rsi30m < rsiThreshShort30)
and (close < vwap30m)
and (close < vwap1h)
and volatilityOK
and (use1hTrend ? macdTrendDown1h : true)
// SHORT EXIT:
// • fixed TP/SL
// OR • 30m MACD crossover
// OR • 1h MACD flips up
var float entryPriceShort = na
shortExitCond = false
if (strategy.position_size < 0)
entryPriceShort := nz(entryPriceShort[1], strategy.position_avg_price)
shortTPprice = entryPriceShort * (1 - tpPerc)
shortSLprice = entryPriceShort * (1 + slPerc)
// check TP/SL first
shortExitTP = low <= shortTPprice
shortExitSL = high >= shortSLprice
macdTrendFlipUp1h = macdTrendDown1h and (macd1h > macdSig1h)
macdCrossUp30m = longCross30m
shortExitCond := shortExitTP or shortExitSL or macdCrossUp30m or macdTrendFlipUp1h
else
entryPriceShort := na // reset when no position
// ==== 7) EXECUTE STRATEGY ORDERS WITH LABELS & ALERTS ====
// — Long Entry —
if (longEntryCond and strategy.position_size == 0)
strategy.entry("Long", strategy.long)
label.new(bar_index, low, text="Buy (LT)", style=label.style_label_up, color=color.new(color.green, 0), textcolor=color.white, yloc=yloc.belowbar)
alert("Buy (LT)", alert.freq_once_per_bar_close)
// — Long Exit —
if (strategy.position_size > 0 and longExitCond)
strategy.close("Long")
label.new(bar_index, high, text="Sell (LT)", style=label.style_label_down, color=color.new(color.red, 0), textcolor=color.white, yloc=yloc.abovebar)
alert("Sell (LT)", alert.freq_once_per_bar_close)
// — Short Entry —
if (shortEntryCond and strategy.position_size == 0)
strategy.entry("Short", strategy.short)
label.new(bar_index, high, text="Sell (ST)", style=label.style_label_down, color=color.new(color.red, 0), textcolor=color.white, yloc=yloc.abovebar)
alert("Sell (ST)", alert.freq_once_per_bar_close)
// — Short Exit —
if (strategy.position_size < 0 and shortExitCond)
strategy.close("Short")
label.new(bar_index, low, text="Buy (ST)", style=label.style_label_up, color=color.new(color.green, 0), textcolor=color.white, yloc=yloc.belowbar)
alert("Buy (ST)", alert.freq_once_per_bar_close)
// ==== 8) OPTIONAL PLOTTING (for debugging) ====
// We’ve removed any `transp`/`opacity` arguments. Instead, we use `color.new(baseColor, α)`
// for transparency, where α = 0 is fully opaque and α = 255 is fully transparent.
// 30m VWAP
plot(vwap30m, title = "VWAP 30m", color = color.new(color.teal, 80)) // ~31% transparentlinewidth= 1
// 1h VWAP
plot(vwap1h, title = "VWAP 1h", color = color.new(color.fuchsia, 80), linewidth= 1) // ~31% transparent
// 30m ATR vs ATR_MA
plot(atr30m, title = "ATR 30m", color = color.new(color.orange, 80))
plot(atr30m_ma, title = "ATR30m MA", color = color.new(color.yellow, 80))
// 30m MACD Histogram (bars)
plot(macd30m - macdSig30m, title = "MACD Histogram (30m)", style = plot.style_columns, color = (macd30m - macdSig30m >= 0 ? color.new(color.green, 80) : color.new(color.red, 80)))
// 1h MACD Histogram (area)
h1 = request.security(syminfo.tickerid, "60", macd1h - macdSig1h, lookahead=barmerge.lookahead_off)
plot(1, title = "MACD Hist (1h)", style = plot.style_area, color = (h1 >= 0 ? color.new(color.green, 80) : color.new(color.red, 80)))