
Não se deixe enganar pelo nome simplório de “Price Action”. Esta estratégia integra 6 grandes dimensões tecnológicas: o canal EMA de 34 ciclos, o canal Hull MA de 89 ciclos, o gráfico em coluna MACD, os pontos altos e baixos de oscilação, a forma de barra de pinos e o modo de ruptura Fakey.O verdadeiro mecanismo de confirmação multidimensional, não um seguimento cego de um único indicador.
A lógica central da estratégia é direta: o canal EMA determina a direção da tendência, o Hull MA fornece a confirmação de tendência suave, o MACD identifica a mudança de dinâmica do gráfico em forma de coluna, o ponto de oscilação fornece a resistência de suporte fundamental, e as formas Pin Bar e Fakey servem como gatilhos de entrada.Cada sinal requer várias confirmações, e é por isso que é mais confiável do que a tradicional estratégia de um único indicador.
O Stop Loss é de 50 pontos, o Stop Loss é de 20 pontos, e o RRR é de 1:2,5.Esta configuração diz-lhe uma verdade cruel: mesmo com uma taxa de sucesso de apenas 40%, você ainda pode ser rentável no longo prazo.Mas a realidade é que os mecanismos de confirmação multidimensional geralmente levam a uma taxa de sucesso entre 55 e 65%.
A configuração de 89 ciclos do Hull MA é especialmente interessante. Ao contrário da média móvel tradicional, o Hull MA elimina praticamente o atraso por meio de um cálculo secundário da média móvel ponderada.Quando o Hull MA muda de cor, a probabilidade de uma reversão de tendência é superior a 70%, o que é uma das vantagens centrais da estratégia.
A estratégia de identificação de Pin Bar é extremamente rigorosa: a entidade deve ser menor que 1⁄3 da linha K inteira e deve romper os altos e baixos de oscilação.Nem todas as linhas longas são chamadas Pin Bar, e apenas as que atingem posições-chave têm valor comercial.
Veja a lógica deste julgamento:(close - open < (high - low) / 3)A empresa deve ser pequena o suficiente para ser uma empresa de negócios.high > swinghigh and high > high[1]Assegurar a eficácia do avanço.O Pin Bar é uma estratégia mais rigorosa do que 90% dos outros Pin Bar no mercado, e é por isso que a qualidade do sinal é melhor.
A identificação da forma de Fakey é o assassino oculto desta estratégia. A falsa ruptura após a linha de pacote é reversível, com uma taxa de sucesso geralmente entre 65-75%. O julgamento duplo de Fakey no código da estratégia:fakeyIdentificar brechas falsas para cima.fakey1Identificação de falhas de ruptura.
A chave está na proporção de 0.75:close - low > 0.75 * (high - low)Certifique-se de que a inversão é forte o suficiente. Este parâmetro foi otimizado com um grande número de testes de retrospectiva. A taxa de sucesso abaixo de 0,75 diminuiu, acima de 0,75 havia poucos sinais.Os parâmetros precisos de dois dígitos após o ponto decimal não são definidos aleatoriamente.
A estratégia usa cores para visualizar o estado do mercado: verde indica aumento da dinâmica ascendente, vermelho indica aumento da dinâmica descendente e laranja indica diminuição da dinâmica.Não é uma decoração sofisticada, é um sinal de negociação em tempo real.
hisupehisdownA variável segue a mudança contínua do gráfico de coluna do MACD. Quando o gráfico de coluna cresce contínua e está acima do eixo zero, a quantidade de movimento de vários cabeças é confirmada; ao contrário, a quantidade de movimento de cabeça vazia é confirmada.O MACD está 1-2 ciclos à frente do que o MACD.
Identificação de pontos de oscilação de 5 ciclos:high <= high[2] and high[1] <= high[2] and high[3] <= high[2] and high[4] <= high[2]A lógica assegura que os picos identificados são verdadeiros picos locais, e não oscilações aleatórias.
O valor do ponto de oscilação é fornecer um ponto de resistência de suporte objetivo.Não há necessidade de traçar uma linha subjetiva, o sistema identifica automaticamente e atualiza continuamente. Quando o preço ultrapassa essas posições-chave, geralmente significa o verdadeiro início da tendência.
Melhor para:O acompanhamento de tendências em nível de linha de tempo, especialmente para os principais pares de moedas e futuros de índices de ações. O mecanismo de confirmação multidimensional funciona melhor nesses mercados.
Cuidado com o uso:Os mercados de vibração de alta frequência e o ambiente de extrema flutuação das criptomoedas. Os padrões Pin Bar e Fakey são propensos a produzir falsos sinais em excesso de flutuação.
Evitar completamente:A análise técnica tem uma alta probabilidade de falhar nessas situações.
O 34 ciclo EMA pode ser ajustado para a faixa de 30-40 de acordo com a variedade de negociação, e o 89 ciclo Hull MA pode testar a faixa de 80-100.Mas não é recomendável desviar-se drasticamente, pois esses parâmetros foram comprovados pelo mercado por um longo período.
A proporção de stop loss pode ser ajustada de acordo com a volatilidade da variedade. As variedades de alta volatilidade podem ser ampliadas para 60:25, e as variedades de baixa volatilidade podem ser apertadas para 40:15.O segredo é manter uma relação de risco/benefício superior a 2:1.
Qualquer estratégia tem o risco de perdas contínuas, e este sistema multidimensional não é uma exceção.Recomenda-se que o risco individual seja controlado em 1-2% da conta, com a aplicação rigorosa do stop loss, e não relaxar o gerenciamento de risco devido à confirmação repetida.
Mudanças no ambiente de mercado podem afetar o desempenho da estratégia, especialmente em situações extremas em que os indicadores técnicos podem falhar simultaneamente.Revisar periodicamente o desempenho da estratégia e, se necessário, suspender a negociação para aguardar melhores condições de mercado.
/*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)