
La stratégie de négociation multifacteur de probabilité de la dynamique des micro-canaux triples est une méthode de négociation quantitative basée sur la morphologie des prix, qui consiste à identifier la structure de micro-canaux formée par trois lignes K consécutives dans le marché et à évaluer quantitativement les signaux de négociation à l’aide de 10 facteurs clés, afin d’améliorer la probabilité de réussite des transactions. La stratégie s’applique aux marchés financiers sur une variété de périodes de temps, en particulier aux traders de courte durée.
Le principe central de la stratégie de négociation multifacteur de probabilité de la dynamique des trois micro-canaux est d’identifier les canaux de mouvement unidirectionnels formés par trois lignes K successives dans le marché. La stratégie fonctionne par les étapes suivantes:
Identification des micro-channelsLa stratégie consiste d’abord à rechercher trois lignes K co-orientées consécutives ((toutes les lignes positives ou toutes les lignes négatives), ce qui indique que le marché pourrait être dans une tendance unidirectionnelle à court terme.
Système de notation à facteurs multiplesLa qualité de la forme est évaluée quantitativement en évaluant 10 facteurs clés:
Points de probabilité: Basé sur le taux de victoire de base ((70%) plus le score facteur, calculer le taux de victoire attendu pour chaque signal de transaction.
Conditions d’entrée: Le système génère un signal de transaction lorsque le score global dépasse le seuil par défaut (> 50%).
Gestion des risques:
Gestion des positionsLe nombre de contrats est calculé dynamiquement en fonction du ratio entre le capital du compte et le risque de chaque transaction (default: 1%).
Mécanisme de sortie: Utilisation d’une stratégie de suivi des arrêts de perte, de verrouillage partiel des bénéfices après que les bénéfices aient atteint leur objectif, tout en définissant des arrêts de perte fixes et des heures de clôture obligatoires par jour.
En analysant le code en profondeur, cette stratégie présente les avantages suivants:
Notes quantifiéesLa stratégie consiste à évaluer chaque signal de transaction par un score quantitatif de 10 facteurs, ce qui réduit les jugements subjectifs et améliore la cohérence et l’objectivité des transactions.
Une grande capacité d’adaptationCette stratégie peut être appliquée à un large éventail de marchés et de périodes de temps, car elle est basée sur des tendances de prix générales plutôt que sur des caractéristiques spécifiques du marché.
Le moteur de probabilitéLa stratégie est basée sur la probabilité statistique, chaque signal de négociation a une probabilité de victoire précise, ce qui permet aux traders de prendre des décisions basées sur les données.
Une parfaite maîtrise des risques: Chaque transaction a une position de stop-loss définie et le risque est limité à un pourcentage fixe des fonds du compte par un ajustement de position dynamique.
Mécanisme de multiples apparitionsLa stratégie intègre plusieurs méthodes de sortie, y compris le suivi des arrêts, les arrêts fixes et la clôture obligatoire de la journée, pour protéger les fonds des traders.
Retour visualiséLa stratégie fournit des marqueurs de signaux de trading détaillés et des scores de facteurs sur les graphiques, permettant aux traders de comprendre intuitivement la qualité de chaque signal.
Une bonne gestion du tempsLe risque de détention du jour au lendemain a été évité en limitant les fenêtres de négociation et en imposant des positions de clôture obligatoires.
Malgré les nombreux avantages de cette stratégie, les risques et les défis potentiels sont les suivants:
Le risque d’une suradaptationLes réglages de pondération et de seuil de 10 facteurs risquent d’être trop conformes aux données historiques, ce qui pourrait entraîner de mauvaises performances futures.
Risques liés à la faible liquidité des marchés: Dans les marchés à faible liquidité, les prix d’entrée et de sortie peuvent avoir des points de glissement qui affectent les résultats des transactions réelles.
Paramètre SensibilitéLa performance de la stratégie est hautement sensible à plusieurs paramètres, y compris la longueur de l’ATR, le seuil de victoire et le rapport de retour sur risque. Une mauvaise configuration des paramètres peut avoir un impact significatif sur la performance de la stratégie.
Dépendance à l’environnement de marché: Cette stratégie fonctionne mieux dans un environnement de marché où la tendance est claire et peut générer des signaux erronés dans un marché en turbulence ou très volatil.
Rarité des signauxLa stratégie peut produire peu de signaux de négociation à certaines périodes, ce qui affecte le rendement global, car plusieurs conditions strictes doivent être remplies.
Complexité informatiqueL’évaluation multifactorielle augmente la complexité de calcul de la stratégie et peut entraîner des défis de latence dans les transactions en temps réel.
Les moyens d’atténuer ces risques sont les suivants:
L’analyse du code permet d’optimiser cette stratégie dans les directions suivantes:
Optimisation des poids facteursL’optimisation peut donner un poids plus élevé à certains facteurs plus importants et réduire l’influence d’autres facteurs.
Filtrage de l’environnement du marché: ajouter des composants d’évaluation de l’environnement du marché, tels que l’intensité de la tendance ou l’indicateur de volatilité, pour négocier uniquement dans des conditions de marché favorables. Cela peut être réalisé en ajoutant des indicateurs tels que l’ADX, les pourcentages de volatilité, etc., pour éviter de générer des signaux de négociation dans un environnement de marché défavorable.
Amélioration du filtre temporel: La stratégie actuelle utilise des fenêtres de temps de négociation fixes, permettant d’optimiser la portée des temps de négociation en analysant la performance de la stratégie sur différentes périodes. Par exemple, certains marchés peuvent être plus directionnels à certains moments et plus volatiles à d’autres.
Paramètres d’adaptation: la conversion de paramètres fixes (comme la longueur de l’ATR, le rapport de rendement au risque) en paramètres ajustés en fonction de la dynamique des conditions du marché. Par exemple, le rapport de rendement au risque peut être augmenté dans les marchés à forte volatilité et réduit dans les marchés à faible volatilité.
Confirmation de plusieurs périodesIntroduction de mécanismes de confirmation à des périodes de temps plus élevées, par exemple, en demandant que la tendance de la ligne solaire soit conforme à la direction de la transaction en cours. Cela peut considérablement augmenter le taux de réussite de la stratégie et éviter les transactions à contre-courant.
Optimisation du mécanisme de sortie: les arrêts de suivi actuels peuvent être améliorés en arrêts de suivi dynamiques basés sur l’ATR, ou en sorties structurées basées sur des points de résistance de support. Cette optimisation permet de mieux capturer la continuation d’une tendance tout en éteignant la tendance en temps opportun.
Intégrer l’apprentissage machine: Utilisez des algorithmes d’apprentissage automatique pour prédire quels signaux sont plus susceptibles de réussir et attribuez des scores de probabilité plus précis à chaque signal de transaction. Par exemple, vous pouvez classer des signaux historiques en utilisant une forêt aléatoire ou un modèle d’arbre de progression en gradient pour extraire des modèles plus complexes.
La stratégie de négociation multifonctionnelle à probabilité de dynamique de triple micro-canal est une méthode de négociation systématisée combinant l’identification de la forme des prix et la notation multifonctionnelle. La stratégie fournit un cadre de décision de négociation objectif et quantifiable en identifiant la structure de micro-canal formée par trois lignes K successives et en évaluant la qualité du signal à l’aide de 10 facteurs clés.
Les principaux avantages de la stratégie résident dans son système de notation de signaux objectif, ses contrôles de risque stricts et ses mécanismes de sortie flexibles. En calculant la probabilité de victoire attendue pour chaque signal, les traders peuvent prendre des décisions plus basées sur les données plutôt que sur des sentiments subjectifs.
Malgré des défis tels que la sensibilité aux paramètres et la dépendance aux environnements de marché, la performance de la stratégie devrait être encore améliorée par les orientations d’optimisation proposées, en particulier l’optimisation des pondérations des facteurs, le filtrage des environnements de marché et l’amélioration des mécanismes de sortie. En outre, l’introduction de technologies d’apprentissage automatique pourrait être une direction importante pour le développement futur de la stratégie, avec le potentiel de découvrir des modèles plus complexes à partir des données historiques.
Pour les traders quantifiés, cette stratégie fournit un cadre de base solide qui peut être personnalisé et élargi en fonction des préférences de risque et du style de trading individuels. En fin de compte, le succès de la stratégie dépend non seulement de sa mise en œuvre technique, mais aussi de la compréhension et de la discipline du trader pour exécuter les règles de la stratégie.
/*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)