Cette stratégie utilise le modèle de pinbar avec la détermination de la tendance en déplaçant les moyennes vers les écarts commerciaux dans la direction de la tendance. Elle génère des signaux de trading lorsque le prix se démarque du haut / bas formé par le chandelier de pinbar. De plus, elle utilise des moyennes mobiles rapides et lentes pour déterminer la direction générale de la tendance, évitant ainsi les mauvais signaux pendant l'action des prix dans la plage.
Calculer les moyennes mobiles rapides (20 périodes) et lentes (50 périodes).
Identifiez les barres haussières (close>open) et baissières (close
Vérifiez si le pinbar haut/bas brise le haut/bas de la bougie précédente. Un pinbar haussier qui brise le haut précédent donne un signal long. Un pinbar baissier qui brise le bas précédent donne un signal court.
Vérifiez également si l'AM rapide est supérieure à l'AM lente pour déterminer une tendance haussière et inversement pour une tendance baissière.
Les signaux longs ne sont valables que lorsque l'AM rapide/lente indique une tendance haussière. Les signaux courts ne sont valables que lorsque l'AM rapide/lente indique une tendance baissière. Cela évite les mauvais signaux pendant l'action des prix dans la fourchette.
Sur les signaux longs valides, allez long avec stoploss et takeprofit prédéfinis. sur les signaux courts valides, allez court avec stoploss et takeprofit prédéfinis.
Si le MA rapide passe sous le MA lent, toute position existante est clôturée.
Utilise la barre haute/basse comme niveaux de rupture représentant une forte dynamique.
Considère la direction de la tendance pour éviter les mauvais signaux lors de l'action des prix dans la fourchette, améliorant ainsi la précision.
Capture les tendances et les écarts, avec de bonnes performances sur les marchés en tendance.
Les paramètres peuvent être optimisés pour différents produits et délais.
Le risque d'échec peut être atténué en utilisant des niveaux d'échec plus larges et une dynamique plus forte.
Risque d'identification de tendance inexacte, qui peut être atténué en ajustant les paramètres de l'AM ou en ajoutant d'autres indicateurs de tendance.
Le stop-loss est trop serré, ce qui conduit à une sortie prématurée.
Le "take profit" est trop serré, ce qui restreint les bénéfices.
Dans l'ensemble, les paramètres MA, breakout, stoploss et takeprofit peuvent être optimisés pour les produits et les délais pour une stratégie adaptée.
Différents indicateurs de performance tels que l'EMA, l'SMA, etc. peuvent être testés pour trouver l'indicateur optimal.
Des indicateurs supplémentaires comme le Momentum peuvent améliorer la précision de la tendance.
Les paramètres peuvent être optimisés dynamiquement à l'aide de techniques d'apprentissage automatique.
Le taux de réussite de l'évasion peut être amélioré grâce à l'apprentissage statistique.
Cette stratégie combine tendance et dynamique pour des signaux filtrés théoriquement. La clé est une optimisation des paramètres robuste à travers les produits et les délais pour une bonne performance. De plus, des indicateurs auxiliaires et des techniques d'apprentissage automatique peuvent améliorer davantage la stratégie. Avec des améliorations continues, cela peut devenir un système de trading de rupture de tendance robuste.
/*backtest start: 2023-10-15 00:00:00 end: 2023-11-14 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 //Backtested Time Frame: H1 //Default Settings: Are meant to run successfully on all currency pairs to reduce over-fitting. //Risk Warning: This is a forex trading robot, backtest performance will not equal future performance, USE AT YOUR OWN RISK. //Code Warning: Although every effort has been made for robustness, this code has not been vetted by independent 3rd parties. strategy("Pin Bar Strategy v1", overlay=true) // User Input usr_risk = input(title="Equity Risk (%)",type=input.integer,minval=1,maxval=100,step=1,defval=3,confirm=false) atr_mult = input(title="Stop Loss (x*ATR, Float)",type=input.float,minval=0.1,maxval=100,step=0.1,defval=1.9,confirm=false) trd_rewd = input(title="Risk : Reward (1 : x*SL, Float)",type=input.float,minval=0.1,maxval=100,step=0.1,defval=3.1,confirm=false) sma_fast = input(title="Fast MA (Period)",type=input.integer,minval=1,maxval=500,step=1,defval=20,confirm=false) sma_slow = input(title="Slow MA (Period)",type=input.integer,minval=1,maxval=500,step=1,defval=50,confirm=false) atr_valu = input(title="ATR (Period)",type=input.integer,minval=1,maxval=500,step=1,defval=14,confirm=false) use_slpe = input(title="Use MA Slope (Boolean)",type=input.bool,defval=true,confirm=false) slp_long = input(title="Bull Slope Angle (Deg)",type=input.integer,minval=-90,maxval=90,step=1,defval=1,confirm=false) slp_shrt = input(title="Bear Slope Angle (Deg)",type=input.integer,minval=-90,maxval=90,step=1,defval=-1,confirm=false) emg_exit = input(title="Exit When MA Re-Cross (Boolean)",type=input.bool,defval=true,confirm=false) ent_canc = input(title="Cancel Entry After X Bars (Period)",type=input.integer,minval=1,maxval=500,step=1,defval=3,confirm=false) // Create Indicators fastSMA = sma(close, sma_fast) slowSMA = sma(close, sma_slow) bullishPinBar = ((close > open) and ((open - low) > 0.66 * (high - low))) or ((close < open) and ((close - low) > 0.66 * (high - low))) bearishPinBar = ((close > open) and ((high - close) > 0.66 * (high - low))) or ((close < open) and ((high - open) > 0.66 * (high - low))) atr = atr(atr_valu) // Specify Trend Conditions smaUpTrend = (fastSMA > slowSMA) and (fastSMA[1] > slowSMA[1]) and (fastSMA[2] > slowSMA[2]) and (fastSMA[3] > slowSMA[3]) and (fastSMA[4] > slowSMA[4]) smaDnTrend = (fastSMA < slowSMA) and (fastSMA[1] < slowSMA[1]) and (fastSMA[2] < slowSMA[2]) and (fastSMA[3] < slowSMA[3]) and (fastSMA[4] < slowSMA[4]) candleUpTrend = (close[5] > fastSMA[5]) and (open[5] > fastSMA[5]) and (close[6] > fastSMA[6]) and (open[6] > fastSMA[6]) and (close[7] > fastSMA[7]) and (open[7] > fastSMA[7]) and (close[8] > fastSMA[8]) and (open[8] > fastSMA[8]) and (close[9] > fastSMA[9]) and (open[9] > fastSMA[9]) and (close[10] > fastSMA[10]) and (open[10] > fastSMA[10]) candleDnTrend = (close[5] < fastSMA[5]) and (open[5] < fastSMA[5]) and (close[6] < fastSMA[6]) and (open[6] < fastSMA[6]) and (close[7] < fastSMA[7]) and (open[7] < fastSMA[7]) and (close[8] < fastSMA[8]) and (open[8] < fastSMA[8]) and (close[9] < fastSMA[9]) and (open[9] < fastSMA[9]) and (close[10] < fastSMA[10]) and (open[10] < fastSMA[10]) // Specify Piercing Conditions bullPierce = ((low < fastSMA) and (open > fastSMA) and (close > fastSMA)) or ((low < slowSMA) and (open > slowSMA) and (close > slowSMA)) bearPierce = ((high > fastSMA) and (open < fastSMA) and (close < fastSMA)) or ((high > slowSMA) and (open < slowSMA) and (close < slowSMA)) // MA Slope Function angle(_source) => rad2degree=180/3.14159265359 ang=rad2degree*atan((_source[0] - _source[1])/atr(atr_valu)) // Calculate MA Slope fastSlope=angle(fastSMA) slowSlope=angle(slowSMA) slopingUp = fastSlope > slp_long slopingDn = fastSlope < slp_shrt // Specify Entry Conditions longEntry = smaUpTrend and bullishPinBar and bullPierce shortEntry = smaDnTrend and bearishPinBar and bearPierce longEntryWithSlope = smaUpTrend and bullishPinBar and bullPierce and slopingUp shortEntryWithSlope = smaDnTrend and bearishPinBar and bearPierce and slopingDn // Specify Secondary Exit Conditions longExit = crossunder(fastSMA, slowSMA) shortExit = crossover(fastSMA, slowSMA) // Long Entry Function enterlong() => risk = usr_risk * 0.01 * strategy.equity stopLoss = low[1] - atr[1] * atr_mult entryPrice = high[1] units = risk / (entryPrice - stopLoss) takeProfit = entryPrice + trd_rewd * (entryPrice - stopLoss) strategy.entry("long", strategy.long, units, stop=entryPrice) strategy.exit("exit long", "long", stop=stopLoss, limit=takeProfit) // Short Entry Function entershort() => risk = usr_risk * 0.01 * strategy.equity stopLoss = high[1] + atr[1] * atr_mult entryPrice = low[1] units = risk / (stopLoss - entryPrice) takeProfit = entryPrice - trd_rewd * (stopLoss - entryPrice) strategy.entry("short", strategy.short, units, stop=entryPrice) strategy.exit("exit short", "short", stop=stopLoss, limit=takeProfit) // Execute Long Entry w/o Slope if (longEntry and use_slpe == false) enterlong() // Execute Long Entry w/ Slope if (longEntryWithSlope and use_slpe == true) enterlong() // Exit Long Due to Re-Cross if(longExit and strategy.position_size > 0 and emg_exit) strategy.order("exit long, re-cross", strategy.short, abs(strategy.position_size)) // Cancel the Long Entry strategy.cancel("long", barssince(longEntry) > ent_canc) // Execute Short Entry w/o Slope if (shortEntry and use_slpe == false) entershort() // Execute Short Entry w/ Slope if (shortEntryWithSlope and use_slpe == true) entershort() // Exit Short Due to Re-Cross if(shortExit and strategy.position_size < 0 and emg_exit) strategy.order("exit short, re-cross", strategy.long, abs(strategy.position_size)) // Cancel the Short Entry strategy.cancel("short", barssince(shortEntry) > ent_canc) // Plot Moving Averages to Chart plot(fastSMA, color=color.red) plot(slowSMA, color=color.blue) // Plot Pin Bars to Chart plotshape(bullishPinBar, style=shape.arrowup, location=location.abovebar, color=#FF0000, text='') plotshape(bearishPinBar, style=shape.arrowdown, location=location.belowbar, color=#0000FF, text='')