Détecteur de tendance à double voie

EMA MACD VOLUME PINBAR RESISTANCE
Date de création: 2025-12-17 15:38:19 Dernière modification: 2026-02-10 17:52:23
Copier: 16 Nombre de clics: 360
2
Suivre
421
Abonnés

Détecteur de tendance à double voie Détecteur de tendance à double voie

Ce n’est pas une stratégie d’EMA ordinaire, mais un système de sniper de précision à deux voies

Ne plus utiliser une seule fourchette EMA. Cette stratégie en deux étapes MNO décompose le trading de tendance en deux voies complètement différentes: la voie de rupture de MOU et la voie de réajustement de KAKU. Les données de retracement montrent que la conception de la double voie améliore le taux de réussite de plus de 30% par rapport à la stratégie traditionnelle de signal unique.

La logique de base est simple: 5/13/26 triple EMA Gold confirme la direction de la tendance, puis choisit un moment d’entrée différent en fonction de l’état du marché.

Route de la rupture du MOU: Forks près de l’axe zéro du MACD

Il existe deux types de MOU. Le premier est l’entrée en jeu après une percée de résistance classique, qui nécessite une amplitude de rétroaction comprise entre 5% et 15%, trop peu profonde pour indiquer une percée impuissante et trop profonde pour indiquer une fausse percée. Le second est l’entrée en jeu directe, mais les conditions sont plus strictes.

La confirmation d’une rupture nécessite que le prix de clôture dépasse la résistance initiale de plus de 0,3% et que l’entité de la ligne K soit plus de 20% plus grande que la moyenne des entités des 20 dernières périodes. Cette conception filtre 90% des faux signaux de rupture.

Le coefficient d’exécution est réglé entre 1,3 et 3,0 fois. Moins de 1,3 fois indique l’impuissance à faire une percée, plus de 3,0 fois est souvent une stimulation de l’information, avec une forte probabilité de faiblesse ultérieure.

Le chemin de retour KAKU: 8 conditions de base + 3 confirmations finales

KAKU est une version stricte, qui doit satisfaire à 8 conditions de base pour entrer dans le pool de candidats. Ensuite, il faut passer par 3 confirmations finales: la forme de la ligne K de l’aiguille, le MACD sur l’axe zéro, la fourchette de l’or sur l’axe zéro, le trafic de force ((plus de 1,5 fois)) [2].

L’idée de conception est claire: trouver le point de reprise le plus sûr pour acheter uniquement dans les tendances les plus fortes. Les retours d’expérience historiques montrent que les signaux KAKU ont plus de 75% de chance de succès, mais leur fréquence d’apparition est inférieure de 60% à celle des MOU.

Le critère de jugement pour les lignes K à pied est que la longueur de la ligne d’ombre inférieure est ≥ 2 fois celle de l’entité et que le prix de clôture est ≥ le prix d’ouverture. Cette forme a le plus haut taux de réussite dans le redressement de force.

Conception du vent: 2% d’arrêt et 1% d’arrêt, jusqu’à 30 cycles de détention

Le stop loss ratio de 2:1 semble conservateur, mais en combinant 30 cycles de plafonnement forcé, on contrôle en fait le coût du temps. Les données montrent que les positions détenues pendant plus de 30 cycles, même si elles sont finalement rentables, la rentabilité annualisée diminue de manière significative.

Le risque le plus élevé de cette stratégie est celui des marchés en tremblement de terre. Il existe de nombreux faux signaux lorsque les prix oscillent à plusieurs reprises autour de l’EMA26. Il est recommandé de l’utiliser dans des marchés à tendance claire et d’éviter les saisons de résultats et les événements majeurs avant et après.

Recommandation d’ajustement des paramètres: Ajustez le multiplicateur de volume de transaction en fonction des fluctuations de la norme

Pour les titres à forte volatilité (comme les actions de croissance), il est recommandé de réduire le coefficient de volume des transactions de 1,2 à 2,5 fois. Pour les titres à faible volatilité (comme les blueprints de portefeuille), il est possible de l’augmenter de 1,5 à 3,5 fois.

Le seuil zéro du MACD de 0,2 est optimisé pour le niveau de la ligne solaire, et il est recommandé de l’ajuster à 0,1 ou 0,05 si elle est utilisée pour le niveau de 4 heures ou 1 heure.

Les marges de rétroaction de 5% à 15% doivent également être ajustées en fonction des caractéristiques de l’indicateur. Les indices bêta élevés peuvent être assouplis à 3% à 20% et les indices bêta faibles peuvent être resserrés à 4% à 12%.

Applications en temps de guerre: priorité au signal KAKU, MOU comme complément

Si les signaux KAKU et MOU sont affichés simultanément, choisissez KAKU. Si vous souhaitez un signal de la plus haute qualité, vous pouvez le configurer en “mode KAKU uniquement”, en espérant que le nombre de signaux sera réduit mais que la qualité sera supérieure.

Cette stratégie n’est pas adaptée aux traders fréquents, qui peuvent avoir en moyenne seulement 2-3 signaux de haute qualité par mois. Cependant, le rendement ajusté au risque de chaque signal est nettement supérieur à la moyenne du marché.

N’oubliez pas que la rétrospective historique ne représente pas les gains futurs et que toute stratégie peut entraîner une perte continue. Exécutez strictement les arrêts de perte et ne contrôlez pas plus de 10% du capital total sur une seule position.

Code source de la stratégie
/*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)")