
Strategi perdagangan pelbagai faktor kebarangkalian tiga saluran mikro adalah kaedah perdagangan kuantitatif berdasarkan bentuk harga, yang terasnya adalah untuk mengenal pasti struktur saluran mikro yang terbentuk oleh tiga garis K berturut-turut di pasaran, dan memberi penilaian kuantitatif kepada isyarat perdagangan melalui 10 faktor utama, yang meningkatkan kebarangkalian kejayaan perdagangan. Strategi ini sesuai untuk pasaran kewangan dalam pelbagai tempoh masa, terutama bagi pedagang garis pendek dalam sehari yang menyediakan mekanisme masuk dan keluar yang objektif dan sistematik.
Prinsip utama strategi perdagangan pelbagai faktor peluang tiga saluran mikro adalah untuk mengenal pasti saluran pergerakan satu arah yang terbentuk oleh tiga garis K berturut-turut di pasaran. Strategi ini berfungsi melalui langkah-langkah berikut:
Pengenalan saluran mikroStrategi pertama adalah mencari tiga garis K yang sama arah berturut-turut ((semua yang positif atau semua yang negatif), yang menunjukkan bahawa pasaran mungkin berada dalam trend satu arah jangka pendek.
Sistem penarafan pelbagai faktorKualiti bentuk dinilai secara kuantitatif dengan menilai 10 faktor utama:
Kemungkinan skorBerasaskan pada kemenangan asas ((70%) ditambah faktor penilaian, kiraan kemenangan yang dijangkakan untuk setiap isyarat perdagangan.
Syarat kemasukanSistem menghasilkan isyarat perdagangan apabila skor keseluruhan melebihi had yang ditetapkan ((50%).
Pengurusan Risiko:
Pengurusan kedudukanJumlah kontrak yang dikira secara dinamik berdasarkan jumlah dana akaun dan peratusan risiko setiap transaksi (default = 1%).
Mekanisme keluar: Menggunakan strategi tracking stop loss, mengunci sebahagian keuntungan selepas keuntungan mencapai sasaran, sambil menetapkan stop loss tetap dan masa plase wajib dalam sehari.
Dengan menganalisis kod secara mendalam, strategi ini menunjukkan kelebihan yang ketara:
Penarafan kuantitatif objektifStrategi: Mengurangkan penilaian subjektif dan meningkatkan keserasian dan objektiviti transaksi dengan memberi penilaian kuantitatif kepada setiap isyarat perdagangan melalui 10 faktor.
Kebolehan menyesuaikan diriStrategi ini boleh digunakan untuk pelbagai pasaran dan tempoh masa kerana ia berdasarkan kepada bentuk harga yang umum dan bukan ciri-ciri pasaran tertentu.
Penggerak kebarangkalianStrategi berdasarkan kebarangkalian statistik, setiap isyarat perdagangan mempunyai peluang kemenangan yang jelas, membolehkan peniaga membuat keputusan berdasarkan data.
Kawalan risiko yang sempurnaSetiap dagangan mempunyai kedudukan hentian yang jelas dan menghadkan risiko ke dalam peratusan tetap dana akaun melalui penyesuaian kedudukan dinamik.
Mekanisme pelbagai penampilanStrategi ini mengintegrasikan pelbagai kaedah keluar, termasuk penjejakan hentian, hentian tetap, dan kedudukan kosong wajib dalam hari, untuk melindungi dana peniaga secara menyeluruh.
Maklum balas visualStrategi: menyediakan penanda isyarat dagangan terperinci dan penilaian faktor dalam carta, yang membolehkan peniaga memahami kualiti setiap isyarat secara intuitif.
Pengurusan masa yang tepatIa adalah satu daripada beberapa cara untuk mengelakkan risiko bermalam dengan menghadkan tempoh masa perdagangan dan memaksa kedudukan kosong pada akhir hari.
Walaupun terdapat banyak kelebihan, strategi ini mempunyai risiko dan cabaran yang berpotensi:
Risiko terlalu serasiPenetapan berat dan nilai had 10 faktor mungkin mempunyai risiko terlalu sesuai dengan data sejarah, yang boleh menyebabkan prestasi buruk pada masa akan datang.
Risiko pasaran yang kurang kecairanDalam pasaran yang kurang cair, harga masuk dan keluar mungkin berlaku dan mempengaruhi hasil perdagangan sebenar.
Kepekaan ParameterPrestasi strategi sangat sensitif kepada pelbagai parameter, termasuk panjang ATR, had kemenangan, dan nisbah ganjaran risiko. Tetapan parameter yang tidak betul boleh menjejaskan prestasi strategi secara signifikan.
Pergantungan persekitaran pasaranStrategi ini berfungsi dengan baik dalam keadaan pasaran yang jelas dan mungkin memberi isyarat yang salah dalam pasaran yang bergolak atau sangat tidak menentu.
Kemiskinan isyaratOleh kerana beberapa syarat ketat perlu dipenuhi, strategi mungkin menghasilkan sedikit isyarat perdagangan pada masa-masa tertentu, yang mempengaruhi pulangan keseluruhan.
Kerumitan pengiraanPenilaian pelbagai faktor menambah kerumitan pengiraan strategi dan mungkin menghadapi cabaran kelewatan dalam perdagangan langsung.
Kaedah untuk mengurangkan risiko ini termasuk:
Berdasarkan analisis kod, strategi ini boleh dioptimumkan dalam beberapa arah:
Pengoptimuman faktor beratDengan menggunakan kaedah pembelajaran mesin, faktor-faktor yang paling optimum dapat ditentukan dan meningkatkan ketepatan ramalan. Pengoptimuman ini mungkin memberi berat yang lebih tinggi kepada faktor-faktor yang lebih penting dan mengurangkan pengaruh faktor-faktor lain.
Penapisan persekitaran pasaran: Tambah komponen penilaian keadaan pasaran, seperti kekuatan trend atau indikator kadar turun naik, hanya berdagang dalam keadaan pasaran yang menguntungkan. Ini boleh dilakukan dengan menambahkan ADX, peratusan kadar turun naik dan lain-lain untuk mengelakkan isyarat perdagangan dalam keadaan pasaran yang tidak menguntungkan.
Penapis masa diperbaikiStrategi semasa menggunakan tetingkap masa perdagangan yang tetap, yang dapat mengoptimumkan jangka masa perdagangan dengan menganalisis prestasi strategi untuk tempoh masa yang berbeza. Sebagai contoh, beberapa pasaran mungkin lebih berorientasikan pada waktu tertentu, dan pada masa lain mungkin lebih goyah.
Parameter penyesuaian: mengubah parameter tetap (seperti panjang ATR, nisbah pulangan risiko) menjadi parameter yang disesuaikan secara dinamik berdasarkan keadaan pasaran. Sebagai contoh, nisbah pulangan risiko boleh ditingkatkan dalam pasaran yang bergelombang tinggi dan dikurangkan dalam pasaran yang bergelombang rendah.
Pengesahan pelbagai kitaran masaMemperkenalkan mekanisme pengesahan untuk tempoh masa yang lebih tinggi, contohnya, memerlukan trend garis matahari selaras dengan arah perdagangan semasa. Ini dapat meningkatkan kejayaan strategi dengan ketara dan mengelakkan perdagangan berlawanan.
Optimumkan mekanisme keluar: Tracking stop semasa boleh diperbaiki menjadi tracking stop dinamik berdasarkan ATR, atau struktur keluar berdasarkan sokongan resistance. Pengoptimuman ini dapat menangkap lebih baik kelanjutan trend, sambil keluar tepat pada masanya apabila trend berakhir.
Pembelajaran Mesin Bersepadu: Menggunakan algoritma pembelajaran mesin untuk meramalkan isyarat mana yang lebih mungkin berjaya, untuk memberikan skor kebarangkalian yang lebih tepat untuk setiap isyarat perdagangan. Sebagai contoh, anda boleh menggunakan hutan rawak atau model pokok peningkatan gradien untuk mengklasifikasikan isyarat sejarah, untuk mengekstrak corak yang lebih kompleks.
Strategi perdagangan multi faktor peluang tiga saluran mikro adalah kaedah perdagangan sistematik yang menggabungkan pengenalan bentuk harga dan penilaian pelbagai faktor. Dengan mengenal pasti struktur saluran mikro yang terbentuk oleh tiga garis K berturut-turut, dan menilai kualiti isyarat menggunakan 10 faktor utama, strategi ini memberikan kerangka keputusan perdagangan yang objektif dan boleh diukur.
Kelebihan utama strategi ini adalah sistem penilaian isyarat yang objektif, kawalan risiko yang ketat, dan mekanisme keluar yang fleksibel. Dengan mengira peluang kemenangan yang diharapkan untuk setiap isyarat, peniaga dapat membuat keputusan yang lebih didorong oleh data daripada bergantung pada perasaan subjektif.
Walaupun terdapat cabaran seperti sensitiviti parameter dan ketergantungan kepada keadaan pasaran, prestasi strategi dijangka meningkat lagi dengan arah pengoptimuman yang dicadangkan, terutamanya pengoptimuman faktor berat, penapisan keadaan pasaran dan peningkatan mekanisme keluar. Selain itu, pengenalan teknologi pembelajaran mesin mungkin menjadi arah penting dalam pengembangan strategi di masa depan, dengan potensi untuk mencari corak yang lebih kompleks dari data sejarah.
Bagi peniaga kuantitatif, strategi ini menyediakan kerangka asas yang kukuh yang boleh disesuaikan dan diperluaskan mengikut pilihan risiko dan gaya perdagangan individu. Akhirnya, kejayaan strategi bergantung bukan sahaja pada pelaksanaan teknikal, tetapi juga pada pemahaman dan disiplin peniaga mengenai peraturan strategi.
/*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)