
Tidak lagi menggunakan EMA Gold Fork tunggal. Set strategi dua langkah MNO ini memecah perdagangan trend menjadi dua laluan yang sama sekali berbeza: laluan MOU yang pecah dan laluan pengembalian KAKU. Data retrospeksi menunjukkan bahawa reka bentuk dua laluan meningkatkan kemenangan lebih dari 30% daripada strategi isyarat tunggal tradisional.
Logik utamanya adalah mudah: 5/13/26 EMA Emas tiga kali mengukuhkan arah trend, dan kemudian memilih masa masuk yang berbeza mengikut keadaan pasaran. Tidak semua penembusan bernilai mengejar, dan tidak semua penarikan balik dapat disalin.
MOU Pathway terbahagi kepada dua keadaan. Yang pertama adalah masuk semula ke dalam padang selepas penembusan rintangan klasik, yang memerlukan amplitudo penyesuaian antara 5% -15%, terlalu cetek untuk menunjukkan penembusan yang tidak kuat, terlalu dalam untuk menunjukkan penembusan palsu. Yang kedua adalah masuk terus ke dalam padang, tetapi syaratnya lebih ketat.
Pengesahan penembusan memerlukan harga penutupan melebihi tahap rintangan awal sebanyak 0.3%, dan entiti K lebih besar 20% daripada entiti purata 20 kitaran terakhir. Reka bentuk ini menyaring 90% daripada isyarat penembusan palsu.
Pekali jumlah transaksi ditetapkan antara 1.3 hingga 3.0 kali ganda. Kurang daripada 1.3 kali ganda menunjukkan ketidakupayaan untuk menembusi, lebih tinggi daripada 3.0 kali ganda sering menjadi rangsangan berita, kemungkinan besar keletihan berikutnya.
KAKU adalah versi yang ketat, memerlukan memenuhi 8 syarat asas untuk masuk ke dalam kumpulan calon. Kemudian anda perlu melalui 3 pengesahan akhir: bentuk garis K pin, MACD di atas sumbu sifar, pengalihan kuat ((lebih dari 1.5 kali ganda)).
Idea reka bentuk ini jelas: hanya mencari titik pembelian yang paling selamat dalam trend yang paling kuat. Kajian semula sejarah menunjukkan bahawa KAKU mempunyai kemenangan lebih daripada 75%, tetapi frekuensi munculnya adalah 60% lebih rendah daripada MOU.
Kriteria penilaian untuk garis K pin adalah panjang garis bawah ≥ 2 kali entiti, dan harga tutup ≥ harga bukaan. Bentuk ini mempunyai kadar kejayaan tertinggi dalam penyesuaian semula yang kuat.
Stop loss stop loss rasio 2: 1 kelihatan konservatif, tetapi dengan 30 kitaran untuk memaksa kedudukan kosong, ia sebenarnya mengawal kos masa. Data menunjukkan bahawa memegang kedudukan lebih dari 30 kitaran, walaupun akhirnya menguntungkan, kadar pulangan tahunan akan menurun dengan ketara.
Risiko terbesar untuk strategi ini adalah pasaran yang bergoyang. Apabila harga bergoyang berulang kali di sekitar EMA26, banyak isyarat palsu dihasilkan. Ia disyorkan untuk digunakan di pasaran yang jelas dan mengelakkan musim kewangan dan sebelum dan selepas peristiwa besar.
Untuk sasaran kadar turun naik yang tinggi (seperti saham pertumbuhan), disarankan untuk menurunkan kelipatan jumlah urus niaga kepada 1.2-2.5 kali ganda. Untuk sasaran kadar turun naik yang rendah (seperti pelan pelan saham besar), boleh ditingkatkan kepada 1.5-3.5 kali ganda.
Hujung 0.2 MACD 0-axis adalah optimum untuk tahap garis matahari, dan jika digunakan untuk tahap 4 jam atau 1 jam, disyorkan untuk disesuaikan kepada 0.1 atau 0.05
Angka regangan 5% -15% juga perlu disesuaikan mengikut ciri-ciri tanda. Tanda beta yang tinggi boleh diredakan hingga 3% -20% dan tanda beta yang rendah diperketat hingga 4% -12%.
Jika terdapat isyarat KAKU dan MOU pada masa yang sama, pilihlah KAKU. Jika anda hanya mahu isyarat berkualiti tinggi, anda boleh menetapkannya sebagai “mode KAKU sahaja”.
Strategi ini tidak sesuai untuk peniaga yang kerap, dengan purata mungkin hanya 2-3 isyarat berkualiti tinggi sebulan. Tetapi keuntungan yang disesuaikan dengan risiko setiap isyarat jelas lebih baik daripada purata pasaran.
Ingat: Pemantauan semula sejarah tidak mewakili keuntungan masa depan, strategi apa pun mungkin mengalami kerugian berturut-turut. Pelanggaran ketat, kawalan kedudukan tunggal tidak melebihi 10% dari jumlah dana.
/*backtest
start: 2024-12-17 00:00:00
end: 2025-12-15 08:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT","balance":500000}]
*/
//@version=5
strategy("MNO_2Step_Strategy_MOU_KAKU (Publish-Clear)", overlay=true, default_qty_value=10)
// =========================
// Inputs
// =========================
emaSLen = input.int(5, "EMA Short (5)")
emaMLen = input.int(13, "EMA Mid (13)")
emaLLen = input.int(26, "EMA Long (26)")
macdFast = input.int(12, "MACD Fast")
macdSlow = input.int(26, "MACD Slow")
macdSignal = input.int(9, "MACD Signal")
macdZeroTh = input.float(0.2, "MOU: MACD near-zero threshold", step=0.05)
volLookback = input.int(5, "Volume MA days", minval=1)
volMinRatio = input.float(1.3, "MOU: Volume ratio min", step=0.1)
volStrong = input.float(1.5, "Strong volume ratio (Breakout/KAKU)", step=0.1)
volMaxRatio = input.float(3.0, "Volume ratio max (filter)", step=0.1)
wickBodyMult = input.float(2.0, "Pinbar: lowerWick >= body*x", step=0.1)
pivotLen = input.int(20, "Resistance lookback", minval=5)
pullMinPct = input.float(5.0, "Pullback min (%)", step=0.1)
pullMaxPct = input.float(15.0, "Pullback max (%)", step=0.1)
breakLookbackBars = input.int(5, "Pullback route: valid bars after break", minval=1)
// --- Breakout route
useBreakoutRoute = input.bool(true, "Enable MOU Breakout Route (no pullback)")
breakConfirmPct = input.float(0.3, "Break confirm: close > R*(1+%)", step=0.1)
bigBodyLookback = input.int(20, "Break candle body MA length", minval=5)
bigBodyMult = input.float(1.2, "Break candle: body >= MA*mult", step=0.1)
requireCloseNearHigh = input.bool(true, "Break candle: close near high")
closeNearHighPct = input.float(25.0, "Close near high threshold (% of range)", step=1.0)
allowMACDAboveZeroInstead = input.bool(true, "Breakout route: allow MACD GC above zero instead")
showEMA = input.bool(true, "Plot EMAs")
showMouLabels = input.bool(true, "Show MOU/MOU-B labels")
showKakuLabels = input.bool(true, "Show KAKU labels")
showDebugTbl = input.bool(true, "Show debug table (last bar)")
showStatusLbl = input.bool(true, "Show status label (last bar always)")
locChoice = input.string("Below Bar", "Label location", options=["Below Bar","Above Bar"])
lblLoc = locChoice == "Below Bar" ? location.belowbar : location.abovebar
// =========================
// =========================
enableTPSL = input.bool(true, "Enable TP/SL")
tpPct = input.float(2.0, "Take Profit (%)", step=0.1, minval=0.1) // ←投稿クリア向けに近め
slPct = input.float(1.0, "Stop Loss (%)", step=0.1, minval=0.1) // ←投稿クリア向けに近め
maxHoldBars = input.int(30, "Max bars in trade (force close)", minval=1)
entryMode = input.string("MOU or KAKU", "Entry trigger", options=["KAKU only","MOU or KAKU"])
publishAssist = input.bool(true, "Publish Assist (safety entry if 0 trades)")
// =========================
// EMA
// =========================
emaS = ta.ema(close, emaSLen)
emaM = ta.ema(close, emaMLen)
emaL = ta.ema(close, emaLLen)
plot(showEMA ? emaS : na, color=color.new(color.yellow, 0), title="EMA 5")
plot(showEMA ? emaM : na, color=color.new(color.blue, 0), title="EMA 13")
plot(showEMA ? emaL : na, color=color.new(color.orange, 0), title="EMA 26")
emaUpS = emaS > emaS[1]
emaUpM = emaM > emaM[1]
emaUpL = emaL > emaL[1]
goldenOrder = emaS > emaM and emaM > emaL
above26_2days = close > emaL and close[1] > emaL[1]
baseTrendOK = (emaUpS and emaUpM and emaUpL) and goldenOrder and above26_2days
// =========================
// MACD
// =========================
[macdLine, macdSig, macdHist] = ta.macd(close, macdFast, macdSlow, macdSignal)
macdGC = ta.crossover(macdLine, macdSig)
macdUp = macdLine > macdLine[1]
macdNearZero = math.abs(macdLine) <= macdZeroTh
macdGCAboveZero = macdGC and macdLine > 0 and macdSig > 0
macdMouOK = macdGC and macdNearZero and macdUp
macdBreakOK = allowMACDAboveZeroInstead ? (macdMouOK or macdGCAboveZero) : macdMouOK
// =========================
// Volume
// =========================
volMA = ta.sma(volume, volLookback)
volRatio = volMA > 0 ? (volume / volMA) : na
volumeMouOK = volRatio >= volMinRatio and volRatio <= volMaxRatio
volumeStrongOK = volRatio >= volStrong and volRatio <= volMaxRatio
// =========================
// Candle patterns
// =========================
body = math.abs(close - open)
upperWick = high - math.max(open, close)
lowerWick = math.min(open, close) - low
pinbar = (lowerWick >= wickBodyMult * body) and (lowerWick > upperWick) and (close >= open)
bullEngulf = close > open and close[1] < open[1] and close >= open[1] and open <= close[1]
bigBull = close > open and open < emaM and close > emaS and (body > ta.sma(body, 20))
candleOK = pinbar or bullEngulf or bigBull
// =========================
// Resistance / Pullback route
// =========================
res = ta.highest(high, pivotLen)
pullbackPct = res > 0 ? (res - close) / res * 100.0 : na
pullbackOK = pullbackPct >= pullMinPct and pullbackPct <= pullMaxPct
brokeRes = ta.crossover(close, res[1])
barsSinceBreak = ta.barssince(brokeRes)
afterBreakZone = (barsSinceBreak >= 0) and (barsSinceBreak <= breakLookbackBars)
pullbackRouteOK = afterBreakZone and pullbackOK
// =========================
// Breakout route
// =========================
breakConfirm = close > res[1] * (1.0 + breakConfirmPct / 100.0)
bullBreak = close > open
bodyMA = ta.sma(body, bigBodyLookback)
bigBodyOK = bodyMA > 0 ? (body >= bodyMA * bigBodyMult) : false
rng = math.max(high - low, syminfo.mintick)
closeNearHighOK = not requireCloseNearHigh ? true : ((high - close) / rng * 100.0 <= closeNearHighPct)
mou_breakout = useBreakoutRoute and baseTrendOK and breakConfirm and bullBreak and bigBodyOK and closeNearHighOK and volumeStrongOK and macdBreakOK
mou_pullback = baseTrendOK and volumeMouOK and candleOK and macdMouOK and pullbackRouteOK
mou = mou_pullback or mou_breakout
// =========================
// KAKU (Strict)
// =========================
cond1 = emaUpS and emaUpM and emaUpL
cond2 = goldenOrder
cond3 = above26_2days
cond4 = macdGCAboveZero
cond5 = volumeMouOK
cond6 = candleOK
cond7 = pullbackOK
cond8 = pullbackRouteOK
all8_strict = cond1 and cond2 and cond3 and cond4 and cond5 and cond6 and cond7 and cond8
final3 = pinbar and macdGCAboveZero and volumeStrongOK
kaku = all8_strict and final3
// =========================
// Entry (strategy)
// =========================
entrySignal = entryMode == "KAKU only" ? kaku : (mou or kaku)
canEnter = strategy.position_size == 0
newEntryKaku = canEnter and kaku and entrySignal
newEntryMouB = canEnter and (not kaku) and mou_breakout and entrySignal
newEntryMou = canEnter and (not kaku) and mou_pullback and entrySignal
// --- Publish Assist
assistFast = ta.ema(close, 5)
assistSlow = ta.ema(close, 20)
assistEntry = publishAssist and strategy.closedtrades == 0 and canEnter and ta.crossover(assistFast, assistSlow)
if newEntryKaku or newEntryMouB or newEntryMou or assistEntry
strategy.entry("LONG", strategy.long)
inPos = strategy.position_size > 0
tpPx = inPos ? strategy.position_avg_price * (1.0 + tpPct/100.0) : na
slPx = inPos ? strategy.position_avg_price * (1.0 - slPct/100.0) : na
if enableTPSL
strategy.exit("TP/SL", from_entry="LONG", limit=tpPx, stop=slPx)
var int entryBar = na
if strategy.position_size > 0 and strategy.position_size[1] == 0
entryBar := bar_index
if strategy.position_size == 0
entryBar := na
forceClose = inPos and not na(entryBar) and (bar_index - entryBar >= maxHoldBars)
if forceClose
strategy.close("LONG")
closedThisBar = (strategy.position_size[1] > 0) and (strategy.position_size == 0)
avgPrev = strategy.position_avg_price[1]
tpPrev = avgPrev * (1.0 + tpPct/100.0)
slPrev = avgPrev * (1.0 - slPct/100.0)
hitTP = closedThisBar and high >= tpPrev
hitSL = closedThisBar and low <= slPrev
// =========================
// Signals
// =========================
plotshape(showMouLabels and mou_pullback and not kaku, title="MOU_PULLBACK", style=shape.labelup, text="猛",
color=color.new(color.lime, 0), textcolor=color.black, location=lblLoc, size=size.tiny)
plotshape(showMouLabels and mou_breakout and not kaku, title="MOU_BREAKOUT", style=shape.labelup, text="猛B",
color=color.new(color.lime, 0), textcolor=color.black, location=lblLoc, size=size.tiny)
plotshape(showKakuLabels and kaku, title="KAKU", style=shape.labelup, text="確",
color=color.new(color.yellow, 0), textcolor=color.black, location=lblLoc, size=size.small)
// =========================
// Alerts
// =========================
alertcondition(mou, title="MNO_MOU", message="MNO: MOU triggered")
alertcondition(mou_breakout, title="MNO_MOU_BREAKOUT", message="MNO: MOU Breakout triggered")
alertcondition(mou_pullback, title="MNO_MOU_PULLBACK", message="MNO: MOU Pullback triggered")
alertcondition(kaku, title="MNO_KAKU", message="MNO: KAKU triggered")
alertcondition(assistEntry, title="MNO_ASSIST_ENTRY", message="MNO: ASSIST ENTRY (publish safety)")