
Strategi perdagangan multifaktor probabilitas tiga saluran mikro adalah metode perdagangan kuantitatif berdasarkan bentuk harga, yang berpusat pada identifikasi struktur saluran mikro yang terbentuk dari tiga garis K berturut-turut di pasar, dan penilaian kuantitatif terhadap sinyal perdagangan melalui 10 faktor kunci, sehingga meningkatkan probabilitas keberhasilan perdagangan. Strategi ini cocok untuk pasar keuangan dalam berbagai periode waktu, terutama bagi pedagang garis pendek dalam sehari.
Prinsip inti dari strategi perdagangan multi faktor probabilitas dinamika tiga saluran mikro adalah mengidentifikasi saluran gerakan satu arah yang terbentuk dari tiga garis K berturut-turut di pasar. Strategi ini bekerja melalui langkah-langkah berikut:
Identifikasi saluran mikroStrategi pertama adalah mencari tiga garis K identik berturut-turut ((semua positif atau semua negatif), yang menunjukkan bahwa pasar mungkin berada dalam tren satu arah jangka pendek.
Sistem penilaian multi faktorKualitas bentuk dinilai secara kuantitatif dengan mengevaluasi 10 faktor kunci:
Tingkat Probabilitas: Berdasarkan tingkat kemenangan dasar ((70%) ditambah faktor skor, menghitung tingkat kemenangan yang diharapkan untuk setiap sinyal perdagangan.
Syarat masuk: Sistem menghasilkan sinyal transaksi ketika skor keseluruhan melebihi batas default ((50%)
Manajemen Risiko:
Manajemen PosisiJumlah kontrak yang dihitung secara dinamis berdasarkan modal akun dan rasio risiko per transaksi (default = 1%).
Mekanisme Keluar: Mengadopsi strategi tracking stop loss, mengunci sebagian keuntungan setelah keuntungan mencapai target, sambil mengatur stop loss yang tetap dan waktu penutupan posisi wajib dalam sehari.
Dengan analisis mendalam dari kode, strategi ini menunjukkan keuntungan yang signifikan:
Skor kuantitatif objektifStrategi: Mengurangi penilaian subjektif dan meningkatkan konsistensi dan objektivitas transaksi dengan memberi nilai kuantitatif pada setiap sinyal perdagangan dengan 10 faktor.
AdaptifStrategi ini dapat diterapkan di berbagai pasar dan periode waktu karena didasarkan pada pola harga yang umum dan bukan pada karakteristik pasar tertentu.
Penggerak ProbabilitasStrategi berdasarkan probabilitas statistik, setiap sinyal perdagangan memiliki ekspektasi kemenangan yang jelas, memungkinkan pedagang untuk membuat keputusan berdasarkan data.
Pengendalian risiko yang sempurna: Setiap transaksi memiliki posisi stop loss yang jelas dan membatasi risiko dalam persentase tetap dari dana akun melalui penyesuaian posisi dinamis.
Mekanisme bermacam-macam penampilanStrategi ini mengintegrasikan beberapa metode keluar, termasuk pelacakan stop loss, stop loss tetap, dan penutupan posisi dalam sehari, untuk melindungi dana pedagang secara menyeluruh.
Umpan balik visualStrategi: memberikan sinyal perdagangan yang terperinci di grafik dengan penanda dan faktor skor, sehingga pedagang dapat memahami secara intuitif kualitas setiap sinyal.
Manajemen waktu yang tepatHal ini dilakukan untuk menghindari risiko bermalam dengan membatasi jendela waktu perdagangan dan memaksakan posisi kosong di akhir hari.
Meskipun ada banyak keuntungan dari strategi ini, ada risiko dan tantangan potensial seperti berikut:
Risiko overadaptasiPengaruh dan threshold seting 10 faktor mungkin berisiko terlalu cocok dengan data historis, yang dapat menyebabkan kinerja yang buruk di masa depan.
Risiko pasar dengan likuiditas rendahDalam pasar yang kurang likuid, harga masuk dan keluar dapat mengalami slippage yang mempengaruhi hasil transaksi yang sebenarnya.
Parameter SensitivitasKinerja strategi sangat sensitif terhadap beberapa parameter, termasuk panjang ATR, nilai ambang kemenangan, dan rasio pengembalian risiko. Penetapan parameter yang tidak tepat dapat secara signifikan mempengaruhi kinerja strategi.
Ketergantungan lingkungan pasarStrategi ini bekerja paling baik di pasar dengan tren yang jelas, dan dapat menghasilkan sinyal yang salah di pasar yang bergoyang atau pasar yang sangat fluktuatif.
Kekurangan sinyalStrategi mungkin menghasilkan sedikit sinyal perdagangan pada periode tertentu, yang memengaruhi pengembalian keseluruhan, karena beberapa kondisi ketat harus dipenuhi.
Kompleksitas komputasiPerhitungan multi-faktor meningkatkan kompleksitas komputasi strategi, dan dapat menimbulkan tantangan keterlambatan dalam transaksi real-time.
Cara untuk mengurangi risiko ini meliputi:
Berdasarkan analisis kode, strategi ini dapat dioptimalkan dalam beberapa arah:
Optimalisasi faktor beratDengan faktor-faktor yang memiliki bobot yang sama saat ini (dengan tingkat keberhasilan 5% dari masing-masing dampak), bobot faktor optimal dapat ditentukan melalui metode pembelajaran mesin, meningkatkan akurasi prediksi. Pengoptimalan ini dapat membuat beberapa faktor yang lebih penting mendapat bobot yang lebih tinggi dan mengurangi pengaruh faktor lain.
Filter lingkungan pasar: Menambahkan komponen penilaian kondisi pasar, seperti kekuatan tren atau indikator volatilitas, hanya berdagang dalam kondisi pasar yang menguntungkan. Hal ini dapat dilakukan dengan menambahkan indikator seperti ADX, persentase volatilitas, dan lain-lain, untuk menghindari sinyal perdagangan dalam kondisi pasar yang tidak menguntungkan.
Perbaikan filter waktu: Strategi saat ini menggunakan jendela waktu perdagangan yang tetap, yang dapat dioptimalkan dengan menganalisis kinerja strategi untuk periode waktu yang berbeda. Misalnya, beberapa pasar mungkin lebih berorientasi pada waktu tertentu, sedangkan pada waktu lain mungkin lebih bergoyang.
Parameter adaptasi: mengubah parameter tetap (seperti panjang ATR, RR) menjadi parameter yang disesuaikan berdasarkan kondisi pasar yang dinamis. Misalnya, RR dapat meningkat di pasar yang sangat fluktuatif dan menurun di pasar yang rendah.
Konfirmasi multi-periodeIntroduksi mekanisme konfirmasi untuk periode waktu yang lebih tinggi, misalnya, meminta tren garis matahari sesuai dengan arah perdagangan saat ini. Ini dapat secara signifikan meningkatkan keberhasilan strategi dan menghindari perdagangan berlawanan.
Pengoptimalan mekanisme pertandingan: Tracking stop saat ini dapat ditingkatkan menjadi tracking stop dinamis berbasis ATR, atau output terstruktur berdasarkan resistance support. Optimisasi ini dapat lebih baik menangkap perpanjangan tren, sementara keluar tepat waktu pada akhir tren.
Integrasi pembelajaran mesin: Menggunakan algoritma pembelajaran mesin untuk memprediksi sinyal mana yang lebih mungkin untuk berhasil, dan memberikan skor probabilitas yang lebih akurat untuk setiap sinyal perdagangan. Misalnya, Anda dapat menggunakan hutan acak atau model pohon peningkatan gradien untuk mengklasifikasikan sinyal historis dan mengekstrak model yang lebih kompleks.
Strategi perdagangan multifaktor probabilitas tiga saluran mikro adalah metode perdagangan sistematis yang menggabungkan pengenalan bentuk harga dan penilaian multifaktor. Dengan mengidentifikasi struktur saluran mikro yang terbentuk dari tiga garis K berturut-turut, dan menilai kualitas sinyal menggunakan 10 faktor kunci, strategi ini memberikan kerangka keputusan perdagangan yang objektif dan terukur.
Keunggulan inti dari strategi ini adalah sistem penilaian sinyal yang objektif, kontrol risiko yang ketat, dan mekanisme keluar yang fleksibel. Dengan menghitung kemenangan yang diharapkan dari setiap sinyal, pedagang dapat membuat keputusan yang lebih didorong oleh data daripada mengandalkan perasaan subjektif.
Meskipun ada tantangan seperti sensitivitas parameter dan ketergantungan pada lingkungan pasar, kinerja strategi diharapkan dapat ditingkatkan lebih lanjut melalui arah optimasi yang diusulkan, terutama optimasi faktor berat, penyaringan lingkungan pasar, dan perbaikan mekanisme keluar. Selain itu, pengenalan teknologi pembelajaran mesin mungkin merupakan arah penting dalam pengembangan strategi di masa depan, dengan potensi untuk menemukan pola yang lebih kompleks dari data historis.
Bagi trader kuantitatif, strategi ini memberikan kerangka dasar yang kuat yang dapat disesuaikan dan diperluas sesuai dengan preferensi risiko pribadi dan gaya perdagangan. Pada akhirnya, keberhasilan strategi tidak hanya tergantung pada implementasi teknisnya, tetapi juga pada pemahaman dan disiplin pelaksanaan pedagang terhadap aturan 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)