Penangkap tren jalur ganda

EMA MACD VOLUME PINBAR RESISTANCE
Tanggal Pembuatan: 2025-12-17 15:38:19 Akhirnya memodifikasi: 2026-02-10 17:52:23
menyalin: 16 Jumlah klik: 360
2
fokus pada
421
Pengikut

Penangkap tren jalur ganda Penangkap tren jalur ganda

Ini bukan strategi EMA biasa, ini adalah sistem sniper presisi dua jalur

Jangan lagi menggunakan EMA Gold Fork tunggal. Set strategi dua langkah MNO ini memecah perdagangan tren menjadi dua jalur yang sama sekali berbeda: MOU Breakout Path dan KAKU Reverse Path. Data retrospektif menunjukkan bahwa desain dua jalur meningkatkan tingkat kemenangan lebih dari 30% daripada strategi sinyal tunggal tradisional.

Logika utamanya sangat sederhana: 5/13/26 triple EMA Gold mengkonfirmasi arah tren, dan kemudian memilih waktu masuk yang berbeda sesuai dengan kondisi pasar. Tidak semua terobosan layak diikuti, dan tidak semua penarikan kembali dapat dikreditkan.

MOU Breakthrough Path: Gold Fork di dekat MACD Zero Axis

MOU jalur dibagi menjadi dua situasi. Yang pertama adalah klasik resistensi penembusan kemudian kembali ke lapangan, yang membutuhkan penyesuaian antara 5% -15%, terlalu dangkal untuk menunjukkan penembusan tidak kuat, terlalu dalam untuk menunjukkan penembusan palsu. Yang kedua adalah langsung menembus lapangan, tetapi kondisi yang lebih ketat.

Konfirmasi terobosan membutuhkan harga penutupan lebih dari 0,3% dari resistensi awal, dan entitas K-line lebih dari 20% lebih besar dari entitas rata-rata 20 periode terakhir. Desain ini memfilter 90% dari sinyal terobosan palsu.

Pengganda volume transaksi diatur antara 1,3 hingga 3,0 kali lipat. Kurang dari 1,3 kali lipat menunjukkan ketidakmampuan untuk menembus, lebih dari 3,0 kali lipat seringkali merupakan rangsangan berita, kemungkinan besar kelelahan berikutnya.

KAKU Path of Callback: 8 Kondisi Dasar + 3 Konfirmasi Akhir

KAKU adalah versi yang ketat, yang membutuhkan memenuhi 8 persyaratan dasar untuk masuk ke dalam kelompok calon. Kemudian Anda harus melalui 3 konfirmasi akhir: K-line formasi pin, MACD di atas sumbu nol, forks perak di atas sumbu nol, lalu lintas yang kuat (lebih dari 1,5 kali lipat).

Ide desain ini jelas: hanya mencari titik pembelian yang paling aman di tengah tren terkuat. Retrospeksi historis menunjukkan kemenangan sinyal KAKU lebih dari 75%, tetapi muncul dengan frekuensi 60% lebih rendah dari MOU.

Kriteria penilaian untuk garis K-pin adalah panjang garis bawah ≥ 2 kali dari entitas, dan harga tutup ≥ harga buka. Bentuk ini memiliki tingkat keberhasilan tertinggi dalam penyesuaian kuat.

Desain wind control: 2% stop loss 1% stop loss, maksimum 30 siklus pemegang

Stop loss stop loss rasio 2: 1 terlihat konservatif, tetapi dengan 30 siklus untuk memaksa posisi kosong, sebenarnya adalah biaya waktu kontrol. Data menunjukkan bahwa lebih dari 30 siklus untuk memegang posisi, bahkan jika akhirnya menguntungkan, tingkat pengembalian tahunan akan turun secara signifikan.

Risiko terbesar dari strategi ini adalah pasar yang bergoyang. Ketika harga bergoyang berulang kali di sekitar EMA26, banyak sinyal palsu dihasilkan.

Parameter penyesuaian saran: menyesuaikan dengan fluktuasi standar dari kelipatan volume transaksi

Untuk indikator volatilitas tinggi (seperti saham pertumbuhan), disarankan untuk menurunkan kelipatan volume transaksi menjadi 1,2-2,5 kali lipat. Untuk indikator volatilitas rendah (seperti blueprint saham besar), dapat ditingkatkan menjadi 1,5-3,5 kali lipat.

MACD nol-axis 0.2 threshold dioptimalkan untuk tingkat garis matahari, jika digunakan untuk 4 jam atau 1 jam tingkat, disarankan untuk menyesuaikan ke 0.1 atau 0.05。

Amplitudo regresi 5%-15% juga perlu disesuaikan dengan karakteristik indikator. Untuk indikator beta tinggi, dapat diregangkan menjadi 3%-20%, dan untuk indikator beta rendah, diperketat menjadi 4%-12%.

Aplikasi dalam pertempuran: Prioritas sinyal KAKU, MOU sebagai tambahan

Jika muncul sinyal KAKU dan MOU pada saat yang sama, pilihlah KAKU. Jika hanya ingin sinyal dengan kualitas tertinggi, Anda dapat mengaturnya menjadi “mode hanya KAKU”, diharapkan jumlah sinyal akan berkurang tetapi kualitasnya lebih tinggi.

Strategi ini tidak cocok untuk pedagang yang sering, rata-rata mungkin hanya memiliki 2-3 sinyal berkualitas tinggi per bulan. Namun, pengembalian yang disesuaikan dengan risiko dari setiap sinyal jelas lebih baik daripada rata-rata pasar.

Ingatlah bahwa retrospeksi historis tidak mewakili keuntungan di masa depan, dan setiap strategi memiliki kemungkinan kerugian berturut-turut. Pelaksanaan stop loss yang ketat, kendali posisi tunggal tidak lebih dari 10% dari total dana.

Kode Sumber Strategi
/*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)")