Двухпутевой ловец трендов

EMA MACD VOLUME PINBAR RESISTANCE
Дата создания: 2025-12-17 15:38:19 Последнее изменение: 2026-02-10 17:52:23
Копировать: 16 Количество просмотров: 360
2
Подписаться
421
Подписчики

Двухпутевой ловец трендов Двухпутевой ловец трендов

Это не обычная стратегия EMA, а двунаправленная система снайперов.

Перестаньте использовать одну золотую вилку EMA. Эта двухступенчатая стратегия MNO разбивает трендовую торговлю на два совершенно разных пути: путь прорыва MOU и путь обратной связи KAKU. Данные ретроспектив показывают, что дизайн с двумя путями повышает шансы на победу более чем на 30% по сравнению с традиционной стратегией с одним сигналом.

Основная логика проста: 5/13/26 Тройная золотая серия EMA подтверждает направление тренда, а затем выбирает различные моменты входа в зависимости от состояния рынка. Не все прорывы заслуживают внимания, и не все отклонения могут быть подкреплены.

Прорыв в MOU: золотая вилка вблизи нулевой оси MACD

MOU-путь делится на два варианта. Первый - это классический прорыв сопротивления, который требует отклонения в пределах 5% -15%, слишком неглубокий - прорыв бессилен, слишком глубокий - ложный прорыв. Второй - прямой прорыв, но условия более жесткие.

Подтверждение прорыва требует, чтобы цена закрытия превышала предыдущую устойчивость более чем на 0,3%, а объект K-линии был более чем на 20% больше, чем средний объект за последние 20 циклов. Эта конструкция отфильтровывает 90% ложных сигналов прорыва.

Количество сделанных сделок устанавливается в диапазоне от 1,3 до 3,0 раза. Ниже 1,3 раза указывает на неспособность к прорыву, а выше 3,0 раза часто является информационным стимулом, с высокой вероятностью последующей слабости.

KAKU обратный путь: 8 базовых условий + 3 окончательных подтверждений

KAKU является строгой версией, требующей удовлетворения 8 основных условий для вхождения в кандидатский пул. Затем необходимо пройти 3 окончательных подтверждения: формат иглой K-линии, MACD на нулевой оси, сильный переход ((более чем в 1,5 раза)).

Дизайн был ясен: искать наиболее безопасную точку отклонения только в самых сильных тенденциях. Исторические отзывы показывают, что сигнал KAKU имеет более 75% успеха, но частота появления его на 60% ниже, чем MOU.

Критерием оценки K-линий в иголках является длина нижней тени ≥ 2 раза, а цена закрытия ≥ цена открытия. Эта форма имеет наибольшую вероятность успеха в сильных отклонениях.

Дизайн ветроуправления: 2% стоп-прибыль 1% стоп-убыток, максимум 30 циклов хранения

Стоп-стоп соотношение 2: 1 выглядит консервативно, но в сочетании с 30 циклами принудительного плавления, фактически контролирует временные затраты. Данные показывают, что удерживание позиций более 30 циклов, даже если в конечном итоге прибыльно, значительно снижает годовую доходность.

Наибольший риск от этой стратегии представляет рынок волатильности. Когда цены постоянно колеблются вблизи EMA26, это приводит к массе ложных сигналов. Рекомендуется использовать эту стратегию на рынках с ясным трендом, избегая финансового сезона и до и после крупных событий.

Рекомендации по настройке параметров: корректировка коэффициента объема сделок в зависимости от колебаний показателя

Для показателей с высокой волатильностью (например, рост акций) рекомендуется снизить коэффициент объема сделок до 1,2-2,5 раза. Для показателей с низкой волатильностью (например, крупный план) его можно повысить до 1,5-3,5 раза.

MACD нулевой оси 0.2 является оптимизированным для уровня солнечных линий, если используется 4-часовой или 1-часовой уровень, рекомендуется корректировать до 0.1 или 0.05 ◦

Масштаб отклонения 5%-15% также требует корректировки в зависимости от характеристик индикатора. Высокий бета-индекс может быть смягчен до 3%-20%, а низкий бета-индекс может быть ужесточен до 4%-12%.

Применение в боевых условиях: приоритет сигналов KAKU, MOU в качестве дополнения

Если одновременно появляются сигналы KAKU и MOU, выберите KAKU. Если вы хотите только сигнал самого высокого качества, вы можете установить его в “только режим KAKU”, ожидая, что количество сигналов будет уменьшено, но качество будет выше.

Эта стратегия не подходит для частых трейдеров, которые могут получать в среднем 2-3 высококачественных сигнала в месяц. Однако прибыль после корректировки риска для каждого сигнала значительно выше, чем в среднем на рынке.

Имейте в виду, что исторический ретроспективный анализ не является индикатором будущей прибыли, и любая стратегия может привести к убыткам в течение длительного периода времени. Придерживайтесь строгих мер по ограничению убытков, контролируя одну позицию не более 10% от общего капитала.

Исходный код стратегии
/*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)")