L'idée de base de cette stratégie est de combiner l'indicateur de double poussée avec une ligne moyenne mobile de base pour mettre en œuvre le suivi de la tendance et le trading d'inversion de tendance.
La stratégie repose principalement sur trois indicateurs personnalisés:
Indicateur de double poussée (tendance): Calcule la relation entre le prix et le canal de surachat/survente pour déterminer les tendances haussières et baissières, en renvoyant 1, 0, -1 trois états.
Canal de surachat/survente (Tsl): Calcule les rails supérieur et inférieur en référence à l'ATR. La rupture du rails supérieur est considérée comme surachetée et la rupture du rails inférieur est considérée comme survendue.
Ligne de moyenne mobile de base (MA): Calcule la moyenne mobile simple de 20 périodes du prix de clôture.
Plus précisément, la stratégie juge si le prix est en hausse, latérale ou baissière en fonction de la valeur de l'indicateur de double poussée. Lorsque l'indicateur de double poussée est de 1, cela signifie un état haussier; lorsque l'indicateur de double poussée est de -1, cela signifie un état baissier. À ce stade, si le prix est dans le même sens que l'indicateur, une stratégie de suivi de tendance est adoptée, allant long ou court au bon endroit. Si le prix est dans la direction opposée de l'indicateur, comme l'indicateur montrant la hausse tandis que le prix franchit le rail inférieur, une stratégie d'inversion est adoptée en allant court pour capturer les profits.
En outre, la rupture du prix sur la ligne moyenne mobile sert également de signal auxiliaire pour guider la direction du trading.
Les stratégies spécifiques de négociation à long terme sont les suivantes:
Indicateur de double poussée > 0, les hausses de prix pour briser le rail supérieur, qui appartient à la tendance suivante, aller long.
Indicateur de double poussée < 0, les chutes de prix pour briser le rail inférieur, qui appartient à l'inversion de tendance, aller court.
Prix de clôture > Prix d'ouverture > Niveau pivot, considéré comme la rupture du pivot pour aller long, aller long.
Le prix de clôture dépasse la ligne supérieure et le prix de clôture > La ligne moyenne mobile, passe à long.
Les stratégies de négociation à court terme sont les suivantes:
Indicateur de double poussée < 0, les chutes de prix pour briser le rail inférieur, qui appartient à la tendance suivante, aller court.
Indicateur de double poussée > 0, les hausses de prix pour percer le rail supérieur, qui appartient à l'inversion de tendance, aller long.
Prix d'ouverture > Prix de clôture < Niveau pivot, considéré comme une rupture du pivot pour passer à la position courte, passer à la position courte.
Le prix de clôture passe par le rail inférieur, et le prix de clôture < ligne moyenne mobile, passe court.
La stratégie de sortie est simple en arrêtant la perte lorsque le prix franchit à nouveau le canal de surachat/survente.
La stratégie présente les avantages suivants:
L'indicateur de double poussée peut déterminer avec précision la tendance du marché et constitue l'indicateur central de la stratégie.
Le canal de surachat/survente combiné à l'indicateur peut détecter des opportunités de renversement potentielles.
La ligne de base de la moyenne mobile peut servir de signal de filtrage auxiliaire pour éviter les fausses ruptures.
Le point pivot combiné à l'indicateur de double poussée forme des positions de négociation à forte probabilité.
Il possède à la fois des capacités de trading de suivi de tendance et d'inversion pour plus d'opportunités de profit.
Le canal stop loss suracheté/survendu est simple et clair, ce qui est bénéfique pour le contrôle des risques.
La stratégie comporte également les risques suivants:
L'indicateur de poussée double peut émettre des signaux erronés et doit être filtré avec d'autres indicateurs.
Le trading de rupture est sujet à être piégé, donc un stop loss strict est requis.
Un mauvais réglage de la moyenne mobile sur une période peut manquer les tendances ou générer de faux signaux.
Les points pivots ont besoin d'un backtest pour vérifier la fiabilité des probabilités.
Le canal suracheté/survendu nécessite une optimisation des paramètres pour s'adapter à différents produits.
Le décalage des paramètres d'indicateur peut entraîner des transactions fréquentes.
Pour lutter contre ces risques, les mesures suivantes peuvent être prises:
Combinez d'autres indicateurs comme la ligne K, le volume pour vérifier les signaux de double poussée.
Suivez strictement la stratégie d'arrêt des pertes de canal suracheté/survendu pour un arrêt rapide des pertes.
Testez différents paramètres de la moyenne mobile pour trouver le paramètre optimal.
Completement vérifier la probabilité de la stratégie de point de pivot.
Optimiser les paramètres pour trouver la combinaison optimale pour chaque produit.
Ajustez les paramètres de l'indicateur pour maintenir le bon fonctionnement du système global.
La stratégie peut également être optimisée dans les aspects suivants:
Augmenter les algorithmes d'apprentissage automatique pour former l'indicateur de double poussée avec des données volumineuses.
Ajouter des canaux adaptatifs pour ajuster automatiquement les paramètres des canaux en fonction de la volatilité du marché.
Utilisez l'apprentissage en profondeur pour extraire des indicateurs plus variables pour optimiser les stratégies d'entrée et de sortie.
Ajoutez des algorithmes avancés de stop loss qui peuvent suivre les tendances pour le stop loss, évitant d'être arrêté par des renversements.
Effectuer des tests d'optimisation des paramètres et de combinaison pour améliorer la stabilité globale de la stratégie.
Ajouter des modules de gestion des risques pour un contrôle plus scientifique des risques.
La stratégie combine le suivi de tendance et l'inversion de tendance de manière organique en jugeant la structure du marché avec l'indicateur de double poussée et en générant des signaux de trading avec des canaux et des lignes moyennes mobiles. Elle présente les avantages d'une bonne efficacité de l'indicateur, d'une abondance d'opportunités de trading et d'un stop loss clair. En même temps, elle comporte également certains risques qui nécessitent une optimisation supplémentaire pour améliorer la stabilité.
/*backtest start: 2023-08-25 00:00:00 end: 2023-09-24 00:00:00 period: 2h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © amysojexson //@version=3 strategy(title="Pivots strategy", overlay=true) // Input settings // Create a pull-down menu for the pivot type pivotType = input(title="Pivot Type", options=["Daily", "Intraday", "Weekly"], defval="Daily") // Make toggles for pivot level options plotPP = input(title="Plot PP", type=bool, defval=true) plotS1R1 = input(title="Plot S1 and R1", type=bool, defval=true) plotS2R2 = input(title="Plot S2 and R2", type=bool, defval=true) plotS3R3 = input(title="Plot S3 and R3", type=bool, defval=true) plotTCBC = input(title="Plot S3 and R3", type=bool, defval=true) // Configure session options sessRange = input(title="Trading Session", defval="0800-1600") showSess = input(title="Highlight Session?", type=bool, defval=false) // Enable or disable pivot labels showLabels = input(title="Show Labels?", type=bool, defval=false) // Step 2. Calculate indicator values // Create a function to fetch daily and weekly data GetData(res, data) => security(syminfo.tickerid, res, data[1], lookahead=barmerge.lookahead_on) // Fetch daily and weekly price data dailyHigh = GetData("D", high) dailyLow = GetData("D", low) dailyClose = GetData("D", close) weeklyHigh = GetData("W", high) weeklyLow = GetData("W", low) weeklyClose = GetData("W", close) // Determine session pivot data // First see how the price bar relates to // the session time range inSession = not na(time(timeframe.period, sessRange)[1]) sessStart = inSession and not inSession[1] sessEnd = not inSession and inSession[1] // Determine session price data sessHigh = 0.0 sessLow = 0.0 sessClose = 0.0 sessHigh := sessStart ? high : inSession ? max(high, sessHigh[1]) : na sessLow := sessStart ? low : inSession ? min(low, sessLow[1]) : na sessClose := sessEnd ? close[1] : na // Compute high, low, close from previous intra-day session highPrevSess = 0.0 lowPrevSess = 0.0 closePrevSess = 0.0 highPrevSess := sessEnd ? fixnan(sessHigh) : highPrevSess[1] lowPrevSess := sessEnd ? fixnan(sessLow) : lowPrevSess[1] closePrevSess := sessEnd ? fixnan(sessClose) : closePrevSess[1] // Now figure out which kind of price data // to use for the pivot calculation theHigh = if (pivotType == "Daily") dailyHigh else if (pivotType == "Intraday") highPrevSess else weeklyHigh theLow = if (pivotType == "Daily") dailyLow else if (pivotType == "Intraday") lowPrevSess else weeklyLow theClose = if (pivotType == "Daily") dailyClose else if (pivotType == "Intraday") closePrevSess else weeklyClose // Finally calculate the pivot levels pp = (theHigh + theLow + theClose) / 3 bc= (theHigh + theLow)/2 tc= (pp-bc)+pp r1 = pp+(.382*(theHigh-theLow)) s1 = pp-(.382*(theHigh-theLow)) r2 = pp +(.618*(theHigh-theLow)) s2 = pp -(.618*(theHigh-theLow)) r3 = pp +(1*(theHigh-theLow)) s3 = pp -(1*(theHigh-theLow)) // Step 3. Output indicator data // Plot the various pivot levels plot(series=plotS3R3 ? r3 : na, title="R3", style=circles, linewidth=1, color=#0023FF) plot(series=plotS2R2 ? r2 : na, title="R2", style=circles, linewidth=1, color=#1E90FF) plot(series=plotS1R1 ? r1 : na, title="R1", style=circles, linewidth=1, color=#09E0F3) plot(series=plotTCBC ? tc : na, title="TC", style=circles, linewidth=.75, color=#FF00D1) plot(series=plotPP ? pp : na, title="PP", style=circles, linewidth=1, color=#000000) plot(series=plotTCBC ? bc : na, title="BC", style=circles, linewidth=.75, color=#FF00D1) plot(series=plotS1R1 ? s1 : na, title="S1", style=circles, linewidth=1, color=#09E0F3) plot(series=plotS2R2 ? s2 : na, title="S2", style=circles, linewidth=1, color=#1E90FF) plot(series=plotS3R3 ? s3 : na, title="S3", style=circles, linewidth=1, color=#0023FF) // Display the pivot names on the chart, if applicable newPivots = (showLabels == false) ? false : (pivotType == "Intraday") ? sessEnd : (pivotType == "Daily") ? dayofmonth != dayofmonth[1] : dayofweek == monday and dayofmonth != dayofmonth[1] plotchar(series=newPivots and plotS3R3 ? r3 : na, char='', text="R3", offset=1, location=location.absolute, color=#0023FF, title="R3 label") plotchar(series=newPivots and plotS2R2 ? r2 : na, char='', text="R2", offset=1, location=location.absolute, color=#1E90FF, title="R2 label") plotchar(series=newPivots and plotS1R1 ? r1 : na, char='', text="R1", offset=1, location=location.absolute, color=#09E0F3, title="R1 label") plotchar(series=newPivots and plotTCBC ? r1 : na, char='', text="TC", offset=1, location=location.absolute, color=#FF00D1, title="TC label") plotchar(series=newPivots and plotTCBC ? r1 : na, char='', text="BC", offset=1, location=location.absolute, color=#FF00D1, title="BC label") plotchar(series=newPivots and plotS1R1 ? s1 : na, char='', text="S1", offset=1, location=location.absolute, color=#09E0F3, title="S1 label") plotchar(series=newPivots and plotS2R2 ? s2 : na, char='', text="S2", offset=1, location=location.absolute, color=#1E90FF, title="S2 label") plotchar(series=newPivots and plotS3R3 ? s3 : na, char='', text="S3", offset=1, location=location.absolute, color=#0023FF, title="S3 label") // Highlight the intra-day price data session on the chart bgcolor(color=showSess and inSession and (pivotType == "Intraday") ? orange : na, transp=95) // Step 4. Create indicator alerts alertcondition(condition=cross(close, s3), title="Pivot S3 Cross", message="Prices crossed Pivot S3 level") alertcondition(condition=cross(close, s2), title="Pivot S2 Cross", message="Prices crossed Pivot S2 level") alertcondition(condition=cross(close, s1), title="Pivot S1 Cross", message="Prices crossed Pivot S1 level") alertcondition(condition=cross(close, tc), title="Pivot TC Cross", message="Prices crossed Pivot TC level") alertcondition(condition=cross(close, pp), title="Pivot PP Cross", message="Prices crossed the main Pivot Point level") alertcondition(condition=cross(close, bc), title="Pivot BC Cross", message="Prices crossed Pivot BC level") alertcondition(condition=cross(close, r1), title="Pivot R1 Cross", message="Prices crossed Pivot R1 level") alertcondition(condition=cross(close, r2), title="Pivot R2 Cross", message="Prices crossed Pivot R2 level") alertcondition(condition=cross(close, r3), title="Pivot R3 Cross", message="Prices crossed Pivot R3 level") MA = sma(close, 20) plot(MA, color=red) Factor = input(2, type=float) Pd = input(10, minval=1,maxval = 100) Up = hl2-(Factor*atr(Pd)) Dn = hl2+(Factor*atr(Pd)) TrendUp = 0.0 TrendUp := close[1]>TrendUp[1]? max(Up,TrendUp[1]) : Up TrendDown = 0.0 TrendDown := close[1]<TrendDown[1]? min(Dn,TrendDown[1]) : Dn Trend = 0.0 Trend := close > TrendDown[1] ? 1: close< TrendUp[1]? -1: nz(Trend[1],1) Tsl = Trend==1? TrendUp: TrendDown plot(Tsl, color=blue) if close>open if open<pp if close>pp if close>MA strategy.entry("long", true) if close<open if open>pp if close<pp if close<MA strategy.entry("short", false) strategy.close("long", when = open<Tsl) strategy.close("short", when = open>Tsl)