
Тройная микроканальная динамическая многофакторная торговая стратегия - это количественный метод торговли, основанный на ценовых формах, в основе которого лежит выявление микроканальной структуры, образованной тремя последовательными K-линиями на рынке, и количественная оценка торговых сигналов с помощью 10 ключевых факторов, что повышает вероятность успешной торговли. Эта стратегия применима к финансовым рынкам с различными временными периодами, особенно для краткосрочных трейдеров в течение дня.
Ключевым принципом многофакторной стратегии трейдинга с вероятностной динамикой трёх микроканалов является выявление односторонних каналов движения, образованных тремя последовательными K-линиями на рынке. Стратегия работает следующими шагами:
Опознание микроканаловСтратегия: сначала искать три последовательных однонаправленных K-линий ((все - положительные или все - отрицательные), что указывает на то, что рынок может находиться в краткосрочной однонаправленной тенденции.
Многофакторная система оценкиКоличественная оценка формового качества с помощью оценки 10 ключевых факторов:
Вероятность оценки: на основе базовой победной ставки ((70%) плюс факторный рейтинг, рассчитывается ожидаемая победная ставка для каждого торгового сигнала.
Условия приемаСистема генерирует торговый сигнал, когда общий балл превышает заданный порог ((50%)).
Управление рисками:
Управление позициейКоличество контрактов динамически рассчитывается на основе суммы на счету и соотношения риска на одну сделку (по умолчанию 1%) [2].
Механизм выходаПрименение стратегии отслеживания стоп-лосса, блокирование части прибыли после достижения целевого показателя прибыли, а также установление фиксированного стоп-лосса и обязательного времени плава в течение дня.
При глубоком анализе кода выявлены следующие существенные преимущества:
Объективная количественная оценкаСтратегия: количественная оценка каждого торгового сигнала по 10 факторам, снижение субъективного суждения, повышение согласованности и объективности торгов.
Умение адаптироватьсяЭта стратегия может применяться на различных рынках и в разные периоды времени, поскольку она основана на общепринятых ценовых формах, а не на специфических рыночных особенностях.
Вероятностный драйверСтратегия основана на статистической вероятности, каждый торговый сигнал имеет четкую ожидаемую вероятность победы, что позволяет трейдерам принимать решения на основе данных.
Идеальный контроль риска: Каждая сделка имеет четкую позицию стоп-лосса и ограничивает риск в пределах фиксированной процентной доли средств в счете с помощью динамической корректировки позиции.
Механизм многоборьяСтратегия включает в себя различные методы выхода, включая отслеживание стоп-постов, фиксированные стоп-посты и обязательные внутридневные позиции, обеспечивающие полную защиту средств трейдеров.
Визуализация отзывов: Стратегия предоставляет на графике подробные маркировки торговых сигналов и факторные оценки, позволяющие трейдерам интуитивно понимать качество каждого сигнала.
Правильное управление временемСнижение риска ночного размещения за счет ограничения торговых временных рамок и обязательного закрытия позиций в конце дня.
Несмотря на многочисленные преимущества данной стратегии, существуют следующие потенциальные риски и проблемы:
Риск переизмеримостиУстановка весов и порогов на 10 факторов может привести к риску чрезмерного соответствия историческим данным, что может привести к плохим результатам в будущем.
Риски низкой ликвидности рынкаНа рынках с низкой ликвидностью могут возникать скольжения входных и выходных цен, которые могут повлиять на реальные результаты торгов.
Параметр ЧувствительностьПоказатель: Показатель стратегической эффективности очень чувствителен к нескольким параметрам, включая длину ATR, порог выигрыша и коэффициент возврата риска. Неправильная настройка параметров может существенно повлиять на эффективность стратегии.
Зависимость от рыночной средыЭта стратегия лучше всего работает в условиях четкой тенденции, а может дать ошибочный сигнал в условиях волатильности или высокой волатильности рынка.
Сигнальная дефицитностьИз-за нескольких строгих условий, которые необходимо выполнить, стратегия может в определенные периоды производить очень мало торговых сигналов, что влияет на общую отдачу.
Сложность вычисленийМногофакторная оценка увеличивает вычислительную сложность стратегии и может вызвать задержки в реальной торговле.
Среди способов смягчить эти риски:
На основе анализа кода стратегия может быть оптимизирована в следующих направлениях:
Оптимизация факторных весовВ настоящее время все факторы имеют одинаковый вес ((5% победы на каждом влиянии), и можно определить оптимальный вес фактора с помощью методов машинного обучения, повышая точность прогноза. Такая оптимизация может дать некоторым более важным факторам более высокий вес, а снизить влияние других факторов.
Фильтрация рыночной средыДобавление компонентов оценки рыночных условий, таких как интенсивность тренда или показатель волатильности, чтобы торговать только в благоприятных рыночных условиях. Это может быть достигнуто путем добавления показателей, таких как ADX, процент волатильности, чтобы избежать создания торговых сигналов в неблагоприятных рыночных условиях.
Улучшение фильтра времени: текущая стратегия использует фиксированное окно времени торговли, чтобы оптимизировать диапазон времени торговли, анализируя эффективность стратегии в разные периоды времени. Например, некоторые рынки могут быть более ориентированными в определенное время, а в другие периоды могут быть более волатильными.
Параметры адаптации: преобразование фиксированных параметров (таких как длина ATR, коэффициент возврата риска) в параметры, динамически адаптированные в зависимости от рыночных условий. Например, коэффициент возврата риска может быть увеличен в высоко-волатильных рынках и уменьшен в низко-волатильных рынках.
Подтверждение многократного циклаВнедрение механизмов подтверждения более высоких временных циклов, например, требование, чтобы тренд на солнечной линии был в соответствии с текущим направлением торгов. Это может значительно повысить успех стратегии и избежать обратной торговли.
Оптимизация механизма выхода из игры: текущие стопы отслеживания могут быть улучшены в динамические стопы отслеживания на основе ATR или структурированные выходы на основе поддерживающих точек сопротивления. Такая оптимизация может лучше улавливать продолжение тренда и вовремя выйти из него в конце тренда.
Интегрированное обучение: использование алгоритмов машинного обучения для прогнозирования, какие сигналы более вероятно, что они будут успешными, а также для распределения более точных баллов вероятности для каждого торгового сигнала. Например, можно использовать случайные леса или лесные модели для классификации исторических сигналов, чтобы извлечь более сложные модели.
Трёхканальная динамическая многофакторная стратегия торговли является систематизированным методом торговли, который сочетает в себе распознавание ценовых форм и многофакторную оценку. Эта стратегия обеспечивает объективную, количественную рамку для принятия решений о торговле путем определения структуры микроканалов, образованной тремя последовательными K-линиями, и оценки качества сигнала с использованием 10 ключевых факторов.
Ключевые преимущества этой стратегии заключаются в ее объективной системе оценки сигналов, строгом контроле риска и гибком механизме выхода. Рассчитывая ожидаемую выигрышную вероятность каждого сигнала, трейдеры могут принимать решения, основанные на данных, а не на субъективных чувствах. В то же время динамическое управление позициями стратегии обеспечивает единообразие контроля риска независимо от размера счета.
Несмотря на существующие проблемы, такие как чувствительность к параметрам и зависимость от рыночной среды, ожидается дальнейшее повышение эффективности стратегии с помощью предлагаемых направлений оптимизации, в частности оптимизации факторов веса, фильтрации рыночной среды и улучшения механизмов выхода из игры. Кроме того, внедрение технологий машинного обучения может быть важным направлением для будущего развития стратегии, с потенциалом обнаружения более сложных моделей из исторических данных.
Для квантовых трейдеров эта стратегия предоставляет прочную базовую структуру, которая может быть настроена и расширена в соответствии с личными предпочтениями в отношении риска и стилем торговли. В конечном счете, успех стратегии зависит не только от ее технической реализации, но и от понимания и дисциплины трейдером правил стратегии.
/*backtest
start: 2024-05-20 00:00:00
end: 2025-05-18 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDC"}]
*/
//@version=5
strategy("Ali 3-Bar MC v6 10 Factor", overlay=true, pyramiding=0)
// === INPUTS ===
showLabels = input.bool(true, title="Show Entry Labels")
rewardMultiple = input.float(1, title="Reward : Risk")
atrLength = input.int(4, title="ATR Length")
var int bullSignalBarIndex = na
var int bearSignalBarIndex = na
// === ATR ===
atr = ta.sma(ta.tr(true), atrLength)
signalTimeout = 1 // 例如3根bar
// === 风险控制参数 ===
riskPerTradePercent = input.float(1, title="每笔风险占比 (%)") // 如 1%
pointValue = input.float(5, title="每点价值,例如 ES 是 $50/pt")
// 10 Factor
//@version=5
baseWinRate = 0.70
tick = syminfo.mintick
tolerance = 0.2 // 用于判断 bar 大小一致的容忍比例
// 获取3根 bar 的关键数据
body(i) => math.abs(close[i] - open[i])
barSize(i) => math.abs(high[i] - low[i])
upperTailRatio(i) => (high[i] - math.max(close[i], open[i])) / barSize(i)
lowerTailRatio(i) => (math.min(close[i], open[i]) - low[i])/barSize(i)
upperTailTolerance = 0.15
lowerTailTolerance = 0.15
bodyTolerance = 0.7
barUniformTolerance = 0.3
win_threshold = 0.5
// 检测 BL MC(3-bar micro channel 向上)
isBLMC = close[2] > open[2] and close[1] > open[1] and close > open
// === 各项因子判断 ===
//f1_uniform = math.max(barSize(2)/barSize(1), barSize(1)/barSize(2)) < 1 + barUniformTolerance and math.max(barSize(1)/barSize(0), barSize(1)/barSize(0)) < 1 + barUniformTolerance
f1_uniform = math.max(barSize(2)/barSize(0) , barSize(0)/barSize(2)) < 1 + barUniformTolerance
f2_mostCOH = ((upperTailRatio(2) < upperTailTolerance? 1:0) + (upperTailRatio(1) < upperTailTolerance? 1:0) + (upperTailRatio(0) < upperTailTolerance? 1:0) )>=2
f3_microGap = low > high[2]
f4_tickGap = open > close[1] or open[1] > close[2]
f5_closesAboveHigh = close > high[1] and close[1] > high[2]
f6_higherLows = low > low[1] and low[1] > low[2]
f7_opensAbovePriorClose = open >= close[1] or open[1] >= close[2]
f8_noLowerTail = ((lowerTailRatio(2) < lowerTailTolerance? 1:0) + (lowerTailRatio(1) < lowerTailTolerance? 1:0) + (lowerTailRatio(0) < lowerTailTolerance? 1:0) )>=1
f9_noDojiOrOpposite =body(2) / barSize(2) > bodyTolerance and body(1) / barSize(1) > bodyTolerance and body(0) / barSize(0) > bodyTolerance
// === 总评分计算 ===
score = 0
score := score - (f1_uniform ? 0 : 1)
score := score - (f2_mostCOH ? 0 : 1)
score := score - (f3_microGap ? 0 : 4)
score := score - (f4_tickGap ? 0 : 1)
score := score - (f5_closesAboveHigh ? 0 : 1)
score := score - (f6_higherLows ? 0 : 1)
score := score - (f7_opensAbovePriorClose ? 0 : 1)
score := score - (f8_noLowerTail ? 0 : 1)
score := score - (f9_noDojiOrOpposite ? 0 : 1)
winProb = baseWinRate + (score * 0.05) // 每个因子加5%,最高 1.20
// === 图上标记 ===
if isBLMC
labelText = str.tostring(winProb * 100, "#.##") + "%\n" + "1️⃣ uniform: " + str.tostring(f1_uniform) + "\n" + "2️⃣ mostCOL: " + str.tostring(f2_mostCOH) + "\n" + "3️⃣ microGap: " + str.tostring(f3_microGap) + "\n" + "4️⃣ tickGap: " + str.tostring(f4_tickGap) + "\n" + "5️⃣ closes<priorLow: " + str.tostring(f5_closesAboveHigh) + "\n" + "6️⃣ lowerHighs: " + str.tostring(f6_higherLows) + "\n" + "7️⃣ opensBelowClose: " + str.tostring(f7_opensAbovePriorClose) + "\n" + "8️⃣ noLowerTail: " + str.tostring(f8_noLowerTail) + "\n" + "9️⃣ noDoji: " + str.tostring(f9_noDojiOrOpposite) ,
label.new( bar_index, low, text=labelText, style=label.style_label_up, color=color.new(color.green, 0), textcolor=color.white, size=size.small )
// === Ali BULL MC ===
isAliBull = isBLMC and winProb>=win_threshold
// === 检测 Bear Micro Channel ===
isBRMC = close[2] < open[2] and close[1] < open[1] and close < open
// === Bear 各项因子 ===
br_f1_uniform = math.max(barSize(2)/barSize(0) , barSize(0)/barSize(2)) < 1 + barUniformTolerance
br_f2_mostCOL = ((lowerTailRatio(2) < lowerTailTolerance ? 1:0) + (lowerTailRatio(1) < lowerTailTolerance ? 1:0) + (lowerTailRatio(0) < lowerTailTolerance ? 1:0)) >= 2
br_f3_microGap = low[2] > high
br_f4_tickGap = open < close[1] or open[1] < close[2]
br_f5_closesBelowLow = close < low[1] and close[1] < low[2]
br_f6_lowerHighs = high < high[1] and high[1] < high[2]
br_f7_opensBelowPriorClose = open < close[1] or open[1] < close[2]
br_f8_noUpperTail = ((upperTailRatio(2) < upperTailTolerance ? 1:0) + (upperTailRatio(1) < upperTailTolerance ? 1:0) + (upperTailRatio(0) < upperTailTolerance ? 1:0)) >= 1
br_f9_noDojiOrOpposite = body(2)/barSize(2) > bodyTolerance and body(1)/barSize(1) > bodyTolerance and body(0)/barSize(0) > bodyTolerance
// === Bear 总评分计算 ===
br_score = 0
br_score := br_score - (br_f1_uniform ? 0 : 1)
br_score := br_score - (br_f2_mostCOL ? 0 : 1)
br_score := br_score - (br_f3_microGap ? 0 : 4)
br_score := br_score - (br_f4_tickGap ? 0 : 1)
br_score := br_score - (br_f5_closesBelowLow ? 0 : 1)
br_score := br_score - (br_f6_lowerHighs ? 0 : 1)
br_score := br_score - (br_f7_opensBelowPriorClose ? 0 : 1)
br_score := br_score - (br_f8_noUpperTail ? 0 : 1)
br_score := br_score - (br_f9_noDojiOrOpposite ? 0 : 1)
br_winProb = baseWinRate + (br_score * 0.05)
// === Bear 图上标记 ===
if isBRMC
labelText = str.tostring(br_winProb * 100, "#.##") + "%\n" + "1️⃣ uniform: " + str.tostring(br_f1_uniform) + "\n" + "2️⃣ mostCOL: " + str.tostring(br_f2_mostCOL) + "\n" + "3️⃣ microGap: " + str.tostring(br_f3_microGap) + "\n" + "4️⃣ tickGap: " + str.tostring(br_f4_tickGap) + "\n" + "5️⃣ closes<priorLow: " + str.tostring(br_f5_closesBelowLow) + "\n" + "6️⃣ lowerHighs: " + str.tostring(br_f6_lowerHighs) + "\n" + "7️⃣ opensBelowClose: " + str.tostring(br_f7_opensBelowPriorClose) + "\n" + "8️⃣ noUpperTail: " + str.tostring(br_f8_noUpperTail) + "\n" + "9️⃣ noDoji: " + str.tostring(br_f9_noDojiOrOpposite) ,
label.new( bar_index, low, text=labelText, style=label.style_label_up, color=color.new(color.red, 0), textcolor=color.white, size=size.small )
// === Ali BEAR MC ===
isAliBear = isBRMC and br_winProb >=win_threshold
// === ENTRY/RISK/TARGET ===
bullEntry = (upperTailRatio(0)<0.1 ? close :high + tick)
bullStop = open[2] - tick
bullRisk = bullEntry - bullStop
bullTarget = bullEntry + bullRisk * rewardMultiple
bearEntry = (lowerTailRatio(0)<0.1? close :low - tick)
bearStop = open[2] + tick
bearRisk = bearStop - bearEntry
bearTarget = bearEntry - bearRisk * rewardMultiple
// === 动态仓位计算(基于账户资金和止损大小) ===
riskAmount = strategy.equity * (riskPerTradePercent / 100)
bullContracts = math.max(math.floor(riskAmount / (bullRisk * pointValue)),1)
bearContracts = math.max(math.floor(riskAmount / (bearRisk * pointValue)),1)
// === STATE ===
var float bullGapCloseLine = na
var float bearGapCloseLine = na
var bool inLong = false
var bool inShort = false
var bool bullStructureExitArmed = false
var bool bearStructureExitArmed = false
var float lastBullOpen = na
var float lastBearOpen = na
var line currentTPLine = na
var line currentSLLine = na
var float fixedBullStop = na
var float fixedBullTarget = na
var float fixedBearStop = na
var float fixedBearTarget = na
canTradeNow = not na(time(timeframe.period, "0930-1545", "America/New_York")) // 只在盘中前6小时交易
// === BULL ENTRY ===
if isAliBull and na(bullSignalBarIndex) and canTradeNow and strategy.position_size == 0
strategy.entry("Ali Long", strategy.long, stop=bullEntry, qty=bullContracts)
strategy.exit("Close Long", from_entry = "Ali Long", stop = bullStop, trail_price = bullTarget, trail_offset = atrLength )
bullSignalBarIndex := bar_index
fixedBullStop := bullStop
fixedBullTarget := bullTarget
// === BEAR ENTRY ===
if isAliBear and na(bearSignalBarIndex) and canTradeNow and strategy.position_size == 0
strategy.entry("Ali Short", strategy.short, stop=bearEntry, qty=bearContracts)
strategy.exit("Close Short", from_entry = "Ali Short", stop = bearStop,trail_price = bearTarget, trail_offset = atrLength)
bearSignalBarIndex := bar_index
fixedBearStop := bearStop
fixedBearTarget := bearTarget
// === RESET ===
if strategy.position_size != 0
bullSignalBarIndex := na
bearSignalBarIndex := na
if not na(bullSignalBarIndex) and (bar_index - bullSignalBarIndex >= signalTimeout) and strategy.opentrades == 0
strategy.cancel("Ali Long")
bullSignalBarIndex := na
fixedBullStop := na
fixedBullTarget := na
if not na(bearSignalBarIndex) and (bar_index - bearSignalBarIndex >= signalTimeout) and strategy.opentrades == 0
strategy.cancel("Ali Short")
bearSignalBarIndex := na
fixedBearStop := na
fixedBearTarget := na
eodTime = timestamp("America/New_York", year, month, dayofmonth, 15, 55)
if time >= eodTime and strategy.position_size != 0
strategy.close_all(comment="EOD Exit")
label.new(bar_index, close, "Exit: EOD", style=label.style_label_down, color=color.gray, textcolor=color.white, size=size.small)
bearSignalBarIndex := na
bullSignalBarIndex:=na
fixedBearStop := na
fixedBearTarget := na
plot(fixedBearTarget, title="Bull TP", color=color.green, style=plot.style_linebr)
plot(fixedBearStop, title="Bull SL", color=color.red, style=plot.style_linebr)