AVERTISSEMENT : ce qui suit est uniquement à des fins de divertissement + d’apprentissage ! Ce n’est PAS un CONSEIL FINANCIER, ni un conseil en CODAGE (IA, ou autre). Ceci est uniquement pour des FINS DE DÉMONSTRATION !
Invite pour les nuages SMA
Agis en tant que développeur senior de TradingView Pine Script v5.
Créer un indicateur de superposition nommé :
« Codage des indicateurs techniques 4.0 — Configuration du nuage SMA »
OBJECTIF
Construire un indicateur multi-timeframe non repieçant qui fournit un contexte de tendance et qualifie les signaux potentiels. Il ne doit pas exécuter de transactions ni fournir de conseils financiers.
CADRE
L’indicateur utilise trois couches d’analyse :
1. Structure sur 8 heures
- Déterminez la structure globale du marché sur le timeframe 8H.
- Classez-le comme haussier, baissier ou neutre.
- Affichez la classification actuelle dans un petit tableau de bord.
2. Nuage SMA 1 heure
- Calculez une moyenne mobile simple rapide et une moyenne mobile simple lente sur le timeframe 1H.
- Rendez les deux longueurs de SMA configurables.
- Valeurs par défaut : [INSÉRER FAST SMA] et [INSÉRER SLOW SMA].
- Remplissez la zone entre les moyennes :
• Vert lorsque la SMA rapide est au-dessus de la SMA lente.
• Rouge lorsque la SMA rapide est en dessous de la SMA lente.
• Gris neutre lorsque la relation est incertaine.
- Le nuage 1H est le filtre principal de direction de tendance.
3. Déclencheur 15 minutes et confirmation IMACD
- Calculez le déclencheur d’entrée sur le timeframe 15M.
- Confirmez les déclencheurs haussiers uniquement lorsque l’élan de l’IMACD est positif.
- Confirmez les déclencheurs baissiers uniquement lorsque l’élan de l’IMACD est négatif.
- Utilisez la spécification IMACD suivante : [INSÉRER LA FORMULE IMACD EXACTE ET LES RÉGLAGES].
- Tracez un triangle vert pointant vers le haut pour les déclencheurs haussiers confirmés.
- Tracez un triangle rouge pointant vers le bas pour les déclencheurs baissiers confirmés.
HIÉRARCHIE DU SIGNAL
Une qualification haussière requiert :
- Structure 8H acceptable haussière ou neutre.
- Nuage SMA 1H haussier.
- Déclencheur 15M haussier.
- Confirmation IMACD positive.
Une qualification baissière exige exactement l’inverse des conditions.
EXIGENCES TECHNIQUES
- Utilisez request.security() avec barmerge.lookahead_off.
- Évaluez les signaux uniquement sur les bougies fermées confirmées.
- Ne pas repointer les signaux historiques.
- Ne pas utiliser de données futures.
- Permettez de modifier les trois timeframes et toutes les longueurs de calcul via des entrées.
- Incluez des interrupteurs pour afficher ou masquer le nuage, les étiquettes de structure, les marqueurs de déclenchement et le tableau de bord.
- Ajoutez des règles alertcondition() pour les qualifications haussières et baissières confirmées.
- Gardez le graphique visuellement propre.
- Ne pas inclure d’ordres automatisés, de revendications de performance, de P&L ou de recommandations d’investissement.
- Commentez clairement le code et expliquez comment chaque timeframe contribue au résultat.
Avant d’écrire le code, identifiez toute règle de calcul ou paramètre manquant. Ne n’inventez pas de réglages propriétaires. Demandez-moi d’abord les valeurs manquantes.
Après avoir reçu ces valeurs, fournissez :
1. Complétez le code Pine Script v5.
2. Une explication concise de la logique.
3. Une checklist pour tester que l’indicateur ne repasse pas (ne repointe).
CODE (COPIER & COLLER)
//@version=6
indicator("John Wick v 4.0", overlay=true)
//==================================================
// Entrées MACD
//==================================================
fastLength = input.int(12, "Longueur rapide MACD")
slowLength = input.int(26, "Longueur lente MACD")
signalLength = input.int(9, "Longueur du signal MACD")
atrLength = input.int(14, "Longueur ATR")
showExits = input.bool(true)
showCrosses = input.bool(true)
minProfitATR = input.float(0.30)
//==================================================
// Cœur MACD
//==================================================
fastMA = ta.ema(close, fastLength)
slowMA = ta.ema(close, slowLength)
macdLine = fastMA - slowMA
signalLine = ta.ema(macdLine, signalLength)
hist = macdLine - signalLine
//==================================================
// Événements de croisement
//==================================================
bullCross = ta.crossover(macdLine, signalLine)
bearCross = ta.crossunder(macdLine, signalLine)
//==================================================
// Espacement des marqueurs
//==================================================
atrValue = ta.atr(atrLength)
dotOffset = atrValue * 0.28
triOffset = atrValue * 0.70
longExitY = high + dotOffset
shortExitY = low - dotOffset
triBullY = low - triOffset
triBearY = high + triOffset
//==================================================
// Moteur d’état de transaction
//==================================================
var int activeDir = 0
var float entryPrice = na
var float bestHist = na
var bool partialTaken = false
if bullCross
activeDir := 1
entryPrice := close
bestHist := hist
partialTaken := false
if bearCross
activeDir := -1
entryPrice := close
bestHist := hist
partialTaken := false
if activeDir == 1
bestHist := na(bestHist) ? hist : math.max(bestHist, hist)
if activeDir == -1
bestHist := na(bestHist) ? hist : math.min(bestHist, hist)
//==================================================
// Logique de sortie
//==================================================
longInProfit =
activeDir == 1
and not na(entryPrice)
and high >= entryPrice + atrValue * minProfitATR
shortInProfit =
activeDir == -1
and not na(entryPrice)
and low <= entryPrice - atrValue * minProfitATR
longMomentumFade =
activeDir == 1
and bestHist > 0
and hist < hist[1]
shortMomentumFade =
activeDir == -1
and bestHist < 0
et hist > hist[1]
yellowLongExit =
showExits
and activeDir == 1
and not partialTaken
et longInProfit
et longMomentumFade
yellowShortExit =
showExits
and activeDir == -1
and not partialTaken
et shortInProfit
and shortMomentumFade
if yellowLongExit or yellowShortExit
partialTaken := true
redLongExit =
showExits
and activeDir == 1
and partialTaken
and bearCross
redShortExit =
showExits
and activeDir == -1
and partialTaken
et bullCross
if redLongExit or redShortExit
activeDir := 0
entryPrice := na
bestHist := na
partialTaken := false
//==================================================
// PILE EMA (Nuage à 5 couches)
//==================================================
ema5 = ta.ema(close, 5)
ema9 = ta.ema(close, 9)
ema12 = ta.ema(close, 12)
ema26 = ta.ema(close, 26)
ema50 = ta.ema(close, 50)
//==================================================
// Tracez les EMA (fines / atténuées)
//==================================================
p5 = plot(ema5, color=color.new(color.aqua, 20), linewidth=1)
p9 = plot(ema9, color=color.new(color.blue, 20), linewidth=1)
p12 = plot(ema12, color=color.new(color.gray, 20), linewidth=1)
p26 = plot(ema26, color=color.new(color.orange,20), linewidth=1)
p50 = plot(ema50, color=color.new(color.red, 20), linewidth=1)
//==================================================
// NUAGES
//==================================================
// 5–9 Réaction rapide
fill(p5, p9, color=color.new(color.aqua, 80))
// 9–12 Élan
fill(p9, p12, color=color.new(color.blue, 82))
// 12–26 Structure
fill(p12, p26, color=color.new(color.gray, 84))
// 26–50 Tendance
fill(p26, p50, color=color.new(color.orange, 86))
//==================================================
// Sortie Dots
//==================================================
plotshape(
yellowLongExit ? longExitY : na,
style=shape.circle,
location=location.absolute,
color=color.new(color.yellow, 20),
size=size.tiny
)
plotshape(
yellowShortExit ? shortExitY : na,
style=shape.circle,
location=location.absolute,
color=color.new(color.yellow, 20),
size=size.tiny
)
plotshape(
redLongExit ? longExitY : na,
style=shape.circle,
location=location.absolute,
color=color.red,
size=size.tiny
)
plotshape(
redShortExit ? shortExitY : na,
style=shape.circle,
location=location.absolute,
color=color.red,
size=size.tiny
)
//==================================================
// Triangles d’entrée
//==================================================
plotshape(
showCrosses and bullCross ? triBullY : na,
style=shape.triangleup,
location=location.absolute,
color=color.lime,
size=size.small
)
plotshape(
showCrosses and bearCross ? triBearY : na,
style=shape.triangledown,
location=location.absolute,
color=color.red,
size=size.small
)
Invite ATR et code
Invite
Agissez comme un développeur senior Pine Script v5 de TradingView.
Créez un indicateur superposé nommé :
“Technical Indicator Coding 5.2 — Average True Range”
OBJECTIF
Construisez un indicateur de direction de tendance adaptatif à la volatilité utilisant un niveau de suivi d’ATR (Average True Range) à cliquet. L’indicateur est destiné à une analyse éducative et ne doit exécuter aucun trade ni faire de promesses de performance.
PARAMÈTRES CENTRAUX
- Période ATR : 10
- Multiplicateur ATR : 1.9
- Tant que le prix reste en dessous du niveau de suivi précédent, le niveau peut descendre mais ne remonte jamais.
- Rendez la période ATR, le multiplicateur et la source configurables.
CALCUL
1. Calculez la True Range Moyenne sur 10 périodes.
2. Calculez la distance de suivi :
trailingDistance = 1.9 × ATR(10)
3. Créez un niveau de suivi récursif qui s’ajuste avec le prix :
- Tant que le prix reste au-dessus du niveau de suivi précédent, le niveau peut monter mais ne redescend jamais.
shortInProfit =
- Lorsque le prix franchit le niveau de suivi, changez la direction codée.
LOGIQUE DE DIRECTION
- Passez en direction haussière lorsque le prix de clôture franchit le niveau de suivi.
- Passez en direction baissière lorsque le prix de clôture franchit le niveau de suivi à la baisse.
- Générer un signal uniquement lorsque la direction change.
- Ne générez pas de signaux répétés à chaque bougie.
SORTIE VISUELLE
- Tracez le niveau de suivi de l’ATR.
- Utilisez le vert lorsque la direction codée est haussière.
- Utilisez le rouge lorsque la direction codée est baissière.
- Tracez un triangle vert pointant vers le haut lors d’un changement de direction haussier.
- Tracez un triangle rouge pointant vers le bas lors d’un changement de direction baissier.
- Optionnellement, colorez les bougies selon la direction actuelle.
NUAGE D’EMA
- Ajoutez un nuage de Moyennes Mobiles Exponentielles (EMA) sur 12 et 26 périodes.
- Remplissez le nuage en vert lorsque l’EMA 12 est au-dessus de l’EMA 26.
- Remplissez-le en rouge lorsque l’EMA 12 est en dessous de l’EMA 26.
- Considérez le nuage EMA comme un contexte d’élan ; il ne doit pas modifier le calcul du changement de direction ATR.
- Incluez une entrée pour masquer le nuage EMA.
EXIGENCES TECHNIQUES
- Utilisez des clôtures de bougies confirmées.
- Ne pas repatcher.
- N’utilisez pas d’informations futures ni d’anticipation.
- Conservez le niveau de suivi via une logique de variable récursive.
- Ajoutez des règles alertcondition() pour les changements de direction haussiers et baissiers.
- Inclure des interrupteurs pour les marqueurs, la couleur des bougies, le niveau de suivi et le nuage EMA.
- Ne créez pas d’ordres de stratégie, de tableau de résultats, de calculs de P&L ou de recommandations financières.
- Organisez et commentez clairement le code.
Fournissez:
1. Complétez le code Pine Script v5.
2. Une explication en langage simple de l’ATR et du mécanisme à cliquet.
3. Une description des conditions qui créent chaque marqueur.
4. Checklist de vérification d’une sortie courte sans repint (non-repainting).
CODE
//@version=6
indicator("JW V5.2", overlay=true)
// ── Entrées ──────────────────────────────────────────
atrPeriod = input.int(10, "Période ATR")
keyValue = input.float(1.9, "Valeur clé / multiplicateur ATR", step=0.1)
warnZoneATR = input.float(0.25, "Zone d’alerte (x ATR)", step=0.05)
cloudSmooth = input.int(3, "Lissage du nuage", minval=1, tooltip="Lisse uniquement la bande tracée — n’affecte pas le timing des signaux")
src = close
// ── ATR trailing stop — brut, alimente tout le reste ──
xATR = ta.atr(atrPeriod)
nLoss = keyValue * xATR
var float trailStop = 0.0
trailStop := src > nz(trailStop[1], 0) and src[1] > nz(trailStop[1], 0) ? math.max(nz(trailStop[1]), src - nLoss) :
src < nz(trailStop[1], 0) and src[1] < nz(trailStop[1], 0) ? math.min(nz(trailStop[1]), src + nLoss) :
src > nz(trailStop[1], 0) ? src - nLoss : src + nLoss
var int pos = 0
pos := src[1] < nz(trailStop[1], 0) and src > nz(trailStop[1], 0) ? 1 :
src[1] > nz(trailStop[1], 0) and src < nz(trailStop[1], 0) ? -1 : nz(pos[1], 0)
trendColor = pos == 1 ? color.new(color.green, 0) : pos == -1 ? color.new(color.red, 0) : color.gray
// ── Nuage — lissé visuellement pour la fluidité, purement esthétique ──
plotSrc = ta.ema(src, cloudSmooth)
plotStop = ta.ema(trailStop, cloudSmooth)
pricePlot = plot(plotSrc, title="Prix (lissé)", color=trendColor, linewidth=1)
stopPlot = plot(plotStop, title="Stop suiveur (lissé)", color=trendColor, linewidth=1)
fill(pricePlot, stopPlot, color=color.new(trendColor, 75), title="Nuage de tendance")
// ── Signaux — pilotés par des valeurs brutes, non affectés par le lissage ──
buySignal = pos == 1 and pos[1] == -1
sellSignal = pos == -1 and pos[1] == 1
plotshape(buySignal, title="Buy", text="buy", style=shape.triangleup, location=location.belowbar, color=color.green, textcolor=color.white, size=size.small)
plotshape(sellSignal, title="Sell", text="sell", style=shape.triangledown, location=location.abovebar, color=color.red, textcolor=color.white, size=size.small)
alertcondition(buySignal, "Signal d’achat", "ATR Trail retourné haussier")
alertcondition(sellSignal, "Signal de vente", "ATR Trail retourné baissier")
// ── Flip proximité — écart brut, identique à la formule du signal ──
gapATR = pos == 1 ? (src - trailStop) / xATR : (trailStop - src) / xATR
pctToFlip = math.max(0, math.min(100, 100 * (1 - gapATR / keyValue)))
dirText = pos == 1 ? "LONG" : pos == -1 ? "SHORT" : "FLAT"
nearFlip = gapATR <= warnZoneATR
labelColor = nearFlip ? color.new(color.orange, 0) : trendColor
labelText = dirText + " — " + str.tostring(gapATR, "#.##") + " ATR pour basculer (" + str.tostring(pctToFlip, "#") + "%)"
var label proximityLabel = na
if barstate.islast
label.delete(proximityLabel)
proximityLabel := label.new(bar_index + 2, src, labelText, style=label.style_label_left, color=labelColor, textcolor=color.white, size=size.normal)

