
Ne vous laissez pas tromper par le simple nom de “Price Action”. Cette stratégie intègre six dimensions techniques: le canal EMA à 34 cycles, le canal Hull MA à 89 cycles, le diagramme de la colonne MACD, le point de basculement, la forme de la barre de broches et le mode de percée Fakey.Un véritable mécanisme de validation multidimensionnelle, et non le suivi aveugle d’un seul indicateur.
La logique centrale de la stratégie est explicite: le canal EMA détermine la direction de la tendance, le Hull MA fournit la confirmation de la tendance en douceur, le diagramme MACD en colonnes identifie les changements de dynamique, le point d’oscillation fournit la résistance de support clé, les formes Pin Bar et Fakey servent de déclencheurs d’entrée.Chaque signal nécessite plusieurs confirmations, c’est pourquoi il est plus fiable que les stratégies traditionnelles à un seul indicateur.
Le taux de stop loss est de 50 points, le taux de stop loss est de 20 points, et le taux de risque/bénéfice est de 1:2,5.Ce paramètre vous dit une vérité cruelle: même avec un taux de réussite de 40%, vous pouvez toujours être rentable sur le long terme.Mais la réalité est que les mécanismes de validation multidimensionnelle peuvent généralement augmenter le taux de réussite à 55-65%.
Le Hull MA a un réglage de 89 cycles particulièrement intéressant. Contrairement aux moyennes mobiles traditionnelles, le Hull MA élimine pratiquement le retard par un calcul secondaire de la moyenne mobile pondérée.La probabilité d’une conversion de tendance est supérieure à 70% lorsque le Hull MA change de couleur, ce qui est l’un des principaux avantages de la stratégie.
Les conditions de détection des barres à broches sont extrêmement strictes: l’entité doit être inférieure à un tiers de la ligne K complète et doit franchir les hauts et les bas des oscillations.Les barres de pin n’ont pas tous le même nom, seules celles qui franchissent les points clés ont une valeur commerciale.
Il n’y a rien de mal à cela.(close - open < (high - low) / 3)Il faut s’assurer que l’entité est suffisamment petite.high > swinghigh and high > high[1]Assurer une efficacité de pointe.La qualité du signal est donc plus élevée que 90% des autres barres à broches sur le marché.
L’identification des formes de Fakey est le tueur caché de cette stratégie. La fausse percée après la ligne interne est inversée et le taux de réussite est généralement compris entre 65 et 75%. Le double jugement de Fakey dans le code de la stratégie:fakeyIl y a aussi des cas de fausses fuites.fakey1Identifier les fausses ruptures vers le bas.
La clé est de régler le ratio à 0,75.:close - low > 0.75 * (high - low)Assurez-vous que la force de retournement est suffisamment forte. Ce paramètre a été optimisé après de nombreuses répétitions, avec un taux de réussite inférieur à 0,75 et un signal insuffisant au-dessus de 0,75.Les paramètres à deux chiffres après le point décimal ne sont pas définis au hasard.
La stratégie utilise des couleurs pour visualiser l’état du marché: le vert indique une augmentation de la dynamique, le rouge une augmentation de la dynamique de baisse et l’orange une diminution de la dynamique.Ce n’est pas une décoration de luxe, c’est un signal de transaction en temps réel.
hisupethisdownLes variables suivent les variations de la dynamique de la colonne MACD. Lorsque la colonne est en croissance continue et au-dessus de l’axe zéro, la dynamique de plusieurs têtes est confirmée; à l’inverse, la dynamique de tête vide est confirmée.Il est en avance de 1 à 2 cycles sur le MACD.
Identification des points de basculement à 5 cycles:high <= high[2] and high[1] <= high[2] and high[3] <= high[2] and high[4] <= high[2]Cette logique assure que les sommets identifiés sont de véritables sommets locaux, et non des fluctuations aléatoires.
La valeur d’un point d’oscillation est de fournir une résistance de support objective.Il n’y a pas besoin de tracer des lignes subjectives, le système les reconnaît automatiquement et les met à jour en permanence. Lorsque les prix franchissent ces points critiques, cela signifie généralement le véritable début d’une tendance.
Les meilleurs:Le suivi des tendances au niveau des lignes de temps, en particulier des principales paires de devises et des futures sur indices boursiers. Les mécanismes de confirmation multidimensionnelle fonctionnent le mieux sur ces marchés.
Attention à l’utilisation:Les marchés à haute fréquence et les crypto-monnaies sont exposées à des conditions extrêmes de volatilité. Les formes Pin Bar et Fakey sont susceptibles de générer des faux signaux en cas d’excessive volatilité.
Évitez complètement:Les variétés minoritaires à très faible volume de ventes et les périodes de forte intensité d’événements de presse. L’analyse technique a une probabilité élevée d’échec dans ces situations.
L’EMA de 34 cycles peut être ajustée à une plage de 30 à 40 selon la variété échangée, et l’EMA de 89 cycles de Hull peut être testée dans la plage de 80 à 100.Il n’est pas recommandé de s’écarter de ces paramètres car ils sont éprouvés sur le marché depuis longtemps.
Le ratio de stop-loss peut être ajusté en fonction de la volatilité de la variété. Les variétés à haute volatilité peuvent être allégées à 60:25, les variétés à basse volatilité peuvent être resserrées à 40:15.La clé est de maintenir un ratio de risque/rendement supérieur à 2:1.
Toutes les stratégies comportent un risque de perte continue, et ce système multidimensionnel n’est pas une exception.Il est recommandé de limiter le risque individuel à 1 à 2% du compte, d’appliquer strictement le stop-loss et de ne pas assouplir la gestion des risques en raison de multiples confirmations.
Les changements dans l’environnement du marché peuvent influer sur la performance de la stratégie, en particulier dans des situations extrêmes où les indicateurs techniques peuvent être invalidés simultanément.Examiner régulièrement la performance de la stratégie et, si nécessaire, suspendre les transactions en attendant une meilleure conjoncture du marché.
/*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)