
Не обманывайтесь простым названием “Price Action”. Эта стратегия объединяет 6 технических измерений: 34-циклический канал EMA, 89-циклический Hull MA, MACD-полиграммы, колеблющиеся высокие и низкие точки, формы Pin Bar и Fakey Breakthrough Mode.Настоящий многомерный механизм подтверждения, а не слепое следование за одним показателем.
Основная логика стратегии была прямой: EMA-каналы определяют направление тренда, Hull MA обеспечивает гладкое подтверждение тренда, MACD-полюсная диаграмма идентифицирует динамические изменения, волатильные точки обеспечивают ключевую поддерживающую сопротивление, Pin Bar и Fakey-формы служат входными триггерами.Каждый сигнал требует многократного подтверждения, поэтому он более надежен, чем традиционная стратегия с одним показателем.
Стоп-лист 50 пунктов, стоп-лост 20 пунктов, риск-прибыль соотношение достигает 1:2.5 .Эта настройка говорит вам о жестоком факте: даже если вы выиграете с вероятностью 40%, в долгосрочной перспективе вы будете иметь прибыль.Но реальность такова, что многомерные механизмы подтверждения обычно способны повысить шансы на победу до 55-65%.
Особого внимания заслуживает 89-циклическая настройка Hull MA. В отличие от традиционных скользящих средних, Hull MA практически устраняет задержку путем вторичного вычисления взвешенных скользящих средних.Когда Hull MA меняет цвет, вероятность перехода тренда превышает 70%, что является одним из основных преимуществ стратегии.
Условия идентификации Pin Bar в стратегии крайне строгие: сущности должны быть меньше, чем 1⁄3 всей линии K, и должны преодолевать высокие и низкие колебания.Не все продольные линии называются “пиновыми”, только те, которые пробиваются через ключевые позиции, имеют ценность для торговли.
Посмотрите на эту логику:(close - open < (high - low) / 3)Я думаю, что это будет очень полезно.high > swinghigh and high > high[1]Обеспечить эффективность прорыва.Это означает более высокое качество сигнала, чем у 90% других систем, работающих на рынке.
Идентификация формы Фейки является скрытым убийцей этой стратегии. Фальшивые прорывы после внутристрочной линии и обратный ход обычно имеют успех в пределах 65-75%. Двойной Фейки в коде стратегии:fakeyИдентифицируйте ложные прорывы вверхfakey1Выявление ложных прорывов вниз.
Ключ в установке пропорции 0.75:close - low > 0.75 * (high - low)Убедитесь, что обратная сила достаточно сильна. Этот параметр был оптимизирован с помощью большого количества обратных испытаний. Успех снизился ниже 0,75, а выше 0,75 было недостаточно сигналов.Параметры, точно следующие за двумя цифрами после запятой, не могут быть настроены случайным образом.
Стратегия использует цвета для визуального отображения состояния рынка: зеленый цвет означает усиление движения вверх, красный - усиление движения вниз, оранжевый - ослабление движения.Это не причудливые украшения, а сигналы о торговле в реальном времени.
hisupиhisdownПеременные отслеживают последовательное изменение MACD-постной диаграммы. Когда постная диаграмма продолжает расти и находится над нулевой осью, подтверждается многоголовая динамика; наоборот, подтверждается пустая динамика.Это на 1-2 цикла раньше, чем просто смотреть на MACD.
Опознание пяти циклических колебаний:high <= high[2] and high[1] <= high[2] and high[3] <= high[2] and high[4] <= high[2]Эта логика гарантирует, что выявленные вершины являются истинными локальными вершинами, а не случайными колебаниями.
Ценность точки колебания заключается в предоставлении объективных уровней поддержки и сопротивления.Нет необходимости в субъективной чертежной линии, система автоматически идентифицирует и постоянно обновляет. Когда цена пробивает эти ключевые позиции, это обычно означает истинное начало тренда.
Наиболее подходящие:Следить за тенденциями на уровне графиков, особенно за основными валютными парами и фьючерсами на фондовых индексах. Механизм многомерной подтверждения наиболее эффективен на этих рынках.
Осторожность в использовании:Высокочастотные колебания рынка и криптовалюты в условиях экстремальных колебаний. Формы Pin Bar и Fakey легко создают ложные сигналы при чрезмерном колебании.
Полностью избегайте:Сниженный объем продаж малочисленных сортов и интенсивность новостных событий. Технический анализ в этих случаях имеет высокую вероятность неудачи.
34-циклическая EMA может быть скорректирована в диапазон 30-40 в зависимости от торгуемой разновидности, 89-циклическая Hull MA может быть протестирована в диапазоне 80-100.Однако не рекомендуется отклоняться от этих параметров в значительной степени, поскольку они проверены на рынке на протяжении длительного времени.
Степень остановки и потери может быть скорректирована в зависимости от волатильности сорта. Высоко волатильные сорта могут быть расширены до 60:25, низко волатильные сорта могут быть сжаты до 40:15.Ключ в том, чтобы соотношение риска и прибыли было более чем 2:1.
В любой стратегии есть риск непрерывного убытка, и эта многомерная система не является исключением.Рекомендуется ограничить риски на 1-2% от счета, строго соблюдать ограничения на убытки, не ослаблять управление рисками из-за многократного подтверждения.
Изменения в рыночной среде могут повлиять на эффективность стратегии, особенно в экстремальных ситуациях, когда технические показатели могут быть одновременно неэффективными.Регулярно просматривать результаты стратегии, при необходимости приостанавливать торговлю в ожидании улучшения рыночной ситуации.
/*backtest
start: 2025-07-01 00:00:00
end: 2025-11-24 00:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_OKX","currency":"ETH_USDT"}]
*/
//@version=6
strategy("Price Action", shorttitle="Price Action", overlay=true)
// --- Inputs ---
onlybuy = input.bool(false, "Only Buy")
onlysell = input.bool(false, "Only Sell")
SL_input = input.float(50.00, title="Chốt lời (Pip)", step=1)
rr_input = input.float(20.00, title="Cắt lỗ (Pip)", step=1)
useTPandSL = input.bool(true, title="Sử dụng chốt lời và cắt lỗ?")
// --- EMAs ---
HiLoLen = 34
pacL = ta.ema(low, HiLoLen)
pacC = ta.ema(close, HiLoLen)
pacH = ta.ema(high, HiLoLen)
signalMA = ta.ema(close, 89)
col1 = pacC > signalMA ? color.lime : pacC < signalMA ? color.red : color.yellow
plot(signalMA, color=col1, title="SignalMA")
// --- Hull MA ---
n = 89
n2ma = 2 * ta.wma(close, int(math.round(n / 2)))
nma = ta.wma(close, n)
diff = n2ma - nma
sqn = int(math.round(math.sqrt(n)))
n2ma1 = 2 * ta.wma(close[1], int(math.round(n / 2)))
nma1 = ta.wma(close[1], n)
diff1 = n2ma1 - nma1
sqn1 = int(math.round(math.sqrt(n)))
n1 = ta.wma(diff, sqn)
n2 = ta.wma(diff1, sqn)
condDown = n2 >= n1
condUp = condDown != true
col = condUp ? color.lime : condDown ? color.red : color.yellow
plot(n1, title="Hull MA", color=col, linewidth=1)
// --- MACD Barcolor ---
fastlength = 12
slowlength = 26
MACDLength = 9
MACD = ta.ema(close, fastlength) - ta.ema(close, slowlength)
aMACD = ta.ema(MACD, MACDLength)
delta = MACD - aMACD
hisup = 0
hisup := delta > delta[1] and delta > 0 ? 1 : delta < delta[1] ? -1 : nz(hisup[1], 0)
hisdown = 0
hisdown := delta < delta[1] and delta < 0 ? 1 : delta > delta[1] ? -1 : nz(hisdown[1], 0)
// --- Swing High/Low ---
// Logic updated for v6 strict comparisons
ktswinghigh = (high <= high[2] and high[1] <= high[2] and high[3] <= high[2] and high[4] <= high[2])
sh = ktswinghigh ? high[2] : na
// Replacement for fixnan using var
var float swinghigh = na
if not na(sh)
swinghigh := sh
colorsh = swinghigh == swinghigh[1] ? color.white : na
plot(swinghigh, color=colorsh, title="Swing High", style=plot.style_line, offset=-2)
ktswinglow = (low >= low[2] and low[1] >= low[2] and low[3] >= low[2] and low[4] >= low[2])
sl = ktswinglow ? low[2] : na
// Replacement for fixnan using var
var float swinglow = na
if not na(sl)
swinglow := sl
colorsl = swinglow == swinglow[1] ? color.white : na
plot(swinglow, title="Swing Low", color=colorsl, style=plot.style_line, offset=-2)
// --- Pinbar & Patterns ---
ema21 = ta.ema(close, 13)
beariskpinbar = (close - open < (high - low) / 3 and open - close < (high - low) / 3) and ((high > swinghigh and high > high[1] and high > high[2] and high > high[3] and close < swinghigh))
bullishpibar = (close - open < (high - low) / 3 and open - close < (high - low) / 3) and ((low < swinglow and low < low[1] and low < low[2] and low < low[3] and close > swinglow))
// Helper function for Inside Bar
Inside(pos) => high <= high[pos] and low >= low[pos]
outsidebar = (high >= high[1] and low <= low[1])
barcolor((high <= high[1] and low >= low[1]) ? color.white : na)
// MACD Color Logic
barcolor(hisup == 1 and MACD > 0 ? color.lime : hisdown == 1 and MACD < 0 ? color.red : hisup == -1 and MACD > 0 ? color.green : color.orange)
barcolor(bullishpibar or beariskpinbar ? color.white : na)
secLast = 1
fakey = (high[1] <= high[2] and low[1] >= low[2] and high > high[2] and close >= low[2] and close < high[2]) or (high[2] <= high[3] and low[2] >= low[3] and high[1] > high[2] and close < high[2] and close > low[3] and high - close > 0.75 * (high - low))
fakey1 = (high[1] <= high[2] and low[1] >= low[2] and low < low[2] and close > low[2] and close <= high[1]) or (high[2] <= high[3] and low[2] >= low[3] and low[1] < low[2] and close > low[2] and close < high[3] and close - low > 0.75 * (high - low))
barcolor(fakey or fakey1 ? color.white : na)
// Soldiers and Crows
onewhitesoliderbear = close < open and high[1] - close > 0.5 * (high[1] - low[1]) and (open - close) > 2.0 / 3.0 * (high - low) and (high[1] > ema21[1] or high > ema21) and open[1] < ema21[1] and close - low < (high - close) * 0.3 and (open[2] < ema21[2] or close[2] < ema21[2]) and close < ema21 and low[2] < low[1] and low[3] < low[2]
onewwhitesoliderbull = close > open and close - low[1] > 0.5 * (high[1] - low[1]) and (close - open) > 2.0 / 3.0 * (high - low) and (low[1] < ema21[1] or low < ema21) and open[1] > ema21[1] and high - close < (close - low) * 0.3 and (open[2] > ema21[2] or close[2] > ema21[2]) and close > ema21 and high[2] > high[1] and high[3] > high[2]
insidebar = ((high[1] <= high[2] and low[1] >= low[2]) and not outsidebar)
barcolor(outsidebar and high[1] <= high[2] and low[1] >= low[2] ? color.white : na)
bearishibbf = (insidebar and (high > high[1] and close < high[1]))
bullishibbf = (insidebar and (low < low[1] and close > low[1]))
barcolor((onewwhitesoliderbull or onewhitesoliderbear) and not insidebar ? color.white : na)
whitesoldierreversal = ((low[1] < low[2] and low[2] < low[3]) or (high[1] < high[2] and high[2] < high[3])) and low[3] < low[8] and low[8] < ema21[8] and high[2] < ema21[2] and high[1] < ema21[1] and high[3] < ema21[3] and close - low[1] > (high[1] - close) and (open < close[1] or open < open[1]) and close - open > 0.3 * (high - low) and high - close < 0.5 * (close - open)
blackcrowreversal = ((high[1] > high[2] and high[2] > high[3]) or (low[1] > low[2] and low[2] > low[3])) and high[3] > high[8] and high[8] > ema21[8] and low[2] > ema21[2] and low[1] > ema21[1] and low[3] > ema21[3] and close - low[1] < (high[1] - close) and (open > close[1] or open > open[1]) and open - close > 0.3 * (high - low) and close - low < 0.5 * (open - close)
barcolor(blackcrowreversal or whitesoldierreversal ? color.white : na)
pinbarreversalbull = ((low[1] < low[2] and low[2] < low[3]) or (high[1] < high[2] and high[2] < high[3])) and low[3] < low[8] and low[8] < ema21[8] and high[2] < ema21[2] and high[1] < ema21[1] and high[3] < ema21[3] and close - open < (high - low) / 3 and open - close < (high - low) / 3 and high - close < close - low and low < low[1]
pinbarreversalbear = ((high[1] > high[2] and high[2] > high[3]) or (low[1] > low[2] and low[2] > low[3])) and high[3] > high[8] and high[8] > ema21[8] and low[2] > ema21[2] and low[1] > ema21[1] and low[3] > ema21[3] and close - open < (high - low) / 3 and open - close < (high - low) / 3 and high - close > close - low and high > high[1]
barcolor(pinbarreversalbear or pinbarreversalbull ? color.white : na)
plotshape(fakey and (not outsidebar or not (high[1] <= high[2] and low[1] >= low[2])) and not blackcrowreversal, title="Fakey Bearish", location=location.abovebar, color=color.white, style=shape.arrowdown, text="Fakey", size=size.tiny)
plotshape(fakey1 and (not outsidebar or not (high[1] <= high[2] and low[1] >= low[2])) and not whitesoldierreversal, title="Fakey Bullish", location=location.belowbar, color=color.white, style=shape.arrowup, text="Fakey", size=size.tiny)
// --- Strategy Logic ---
conmua = 0
conmua := hisup == 1 and MACD > 0 ? 1 : (hisdown[1] == 1 and MACD[1] < 0 and pacC[1] > signalMA[1]) or (n1[2] < n1[3] and pacC[1] > signalMA[1]) ? -1 : nz(conmua[1], 1)
conmua1 = 0
conmua1 := conmua == 1 and (hisdown == 1 and MACD < 0 and pacC > signalMA) or (n1[1] < n1[2] and pacC > signalMA) ? 1 : (close[1] > n1[1] and pacC[1] > signalMA[1] and open[1] < n1[1] and close[1] > pacC[1]) or ta.crossunder(pacC, signalMA) ? -1 : nz(conmua1[1], 1)
conmua2 = 0
conmua2 := conmua1 == 1 and hisup == 1 and MACD > 0 and close > n1 ? 1 : high[1] < high[3] and high[2] < high[3] ? -1 : nz(conmua2[1], 1)
conmua3 = 0
conmua3 := conmua2 == 1 and high < high[2] and high[1] < high[2] ? 1 : (close[1] > swinghigh[1] and hisup[1] == 1 and MACD[1] > 0) or (MACD < 0) ? -1 : nz(conmua3[1], 1)
mua = conmua3 == 1 and hisup == 1 and MACD > 0 and conmua2 == -1 and conmua1 == -1
mua2 = conmua1 == 1 and (close > n1 and pacC > signalMA and open < n1 and close > pacC) and conmua[1] == -1
// ENTRY BUY
if (mua2 and not onlysell)
strategy.entry("Buy", strategy.long)
conban = 0
conban := hisdown == 1 and MACD < 0 ? 1 : (hisup[1] == 1 and MACD[1] > 0 and pacC[1] < signalMA[1]) or (n1[2] > n1[3] and pacC[1] < signalMA[1]) ? -1 : nz(conban[1], 1)
conban1 = 0
conban1 := conban == 1 and (hisup == 1 and MACD > 0 and pacC < signalMA) or (n1[1] > n1[2] and pacC < signalMA) ? 1 : (close[1] < n1[1] and pacC[1] < signalMA[1] and open[1] > n1[1] and close[1] < pacC[1]) or ta.crossover(pacC, signalMA) ? -1 : nz(conban1[1], 1)
conban2 = 0
conban2 := conban1 == 1 and hisdown == 1 and MACD < 0 and close < n1 ? 1 : low[1] > low[3] and low[2] > low[3] ? -1 : nz(conban2[1], 1)
conban3 = 0
conban3 := conban2 == 1 and low[1] > low[2] and low > low[2] ? 1 : (close[1] < swinglow[1] and hisdown[1] == 1 and MACD[1] < 0) or (MACD > 0) ? -1 : nz(conban3[1], 1)
ban = conban3 == 1 and hisdown == 1 and MACD < 0 and conban2 == -1
ban2 = conban1 == 1 and (close < n1 and pacC < signalMA and open > n1 and close < pacC) and conban[1] == -1
// ENTRY SELL
if (ban2 and not onlybuy)
strategy.entry("Sell", strategy.short)
plotshape(conmua1 == 1 and conmua[1] == -1, style=shape.triangleup, color=color.lime, location=location.bottom, size=size.tiny)
plotshape(conban1 == 1 and conban[1] == -1, style=shape.triangledown, color=color.red, location=location.bottom, size=size.tiny)
plotshape(mua2, style=shape.labelup, color=color.lime, location=location.bottom, size=size.tiny)
plotshape(ban2, style=shape.labeldown, color=color.red, location=location.bottom, size=size.tiny)
// --- TP and SL ---
Stop = rr_input * 10
Take = SL_input * 10
if (useTPandSL)
strategy.exit("ExitBuy", "Buy", 1, profit=Take, loss=Stop)
strategy.exit("ExitSell", "Sell", 1, profit=Take, loss=Stop)