Cette stratégie est basée sur des modèles de bougies pour identifier différents signaux de bougies et négocier le long de la tendance.
La stratégie identifie principalement les modèles de bougies suivants pour les signaux de négociation:
Engulfing: tendance à la hausse et à la baisse
Ligne de perçage/couverture nuageuse: tendance haussière à la ligne de perçage et tendance baissière à la couverture nuageuse.
Étoile du matin/étoile du soir: étoile du matin haussière et étoile du soir baissière
Ceinture de maintien: tendance à la hausse et à la baisse
Trois soldats blancs/trois corbeaux noirs: trois soldats blancs et trois corbeaux noirs
Trois étoiles dans le sud: trois étoiles dans le modèle sud
Sandwich au bâton: motif de sandwich au bâton
Ligne de rencontre: tendance haussière et tendance baissière
Coupes de pied: tendance haussière et tendance baissière
Escalier en bas: modèle en bas de l'échelle
Lorsqu'il détecte ces signaux de chandelier, il placera des ordres en attente près du prix d'ouverture de la barre suivante, avec un stop loss et un profit prédéfinis pour suivre la tendance.
Il ajoute également un filtre de moyenne mobile pour éviter de prendre des signaux lorsque le prix est du mauvais côté de MA.
Basé sur les modèles classiques de chandeliers, il a une certaine applicabilité universelle.
Le trading est mécanique, basé sur des règles de modèles, non affecté par des facteurs subjectifs.
Des paramètres de stop loss et de profit raisonnables pour contrôler les risques liés aux transactions uniques.
Le mécanisme d'arrêt de suivi ajuste le stop loss dynamiquement avec le marché.
Le filtre MA ajoute plus de logique pour éviter d'être pris au piège dans de mauvais métiers.
Les modèles de chandeliers ont des problèmes d'identification erronée, ce qui peut conduire à de faux signaux.
Le stop loss statique ne peut pas éviter complètement les risques liés aux événements du marché.
Sensible aux sessions de négociation, ne peut pas fonctionner 24x7, peut ajuster les heures de négociation ou ajouter des filtres d'enchères.
Le filtre MA peut manquer certaines opportunités. peut réduire la période MA ou supprimer le filtre.
Difficile de tirer profit des deux côtés long et court ensemble en raison de conflits.
Optimiser les paramètres des motifs de chandeliers pour améliorer l'identification.
Testez différentes méthodes d'arrêt pour trouver la meilleure.
Essayez des techniques de gestion des risques plus avancées comme la gestion de l'argent ou le stop loss de volatilité.
Ajouter plus de filtres pour améliorer la logique de filtrage.
Construire des modèles de reconnaissance de modèles de chandeliers en utilisant l'apprentissage automatique.
Développer une stratégie logique qui puisse identifier les signaux longs et courts.
Cette stratégie utilise des modèles de bougies classiques pour la détection des tendances et les transactions mécaniquement basées sur les signaux. Elle gère les risques par un stop-loss strict et un stop-trailing, et améliore la logique en ajoutant un filtre MA. La stratégie est facile à comprendre et à mettre en œuvre, mais présente également des problèmes tels que l'identification erronée et les difficultés de réglage des paramètres.
/*backtest start: 2022-09-15 00:00:00 end: 2023-02-17 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=2 strategy("Candle Patterns Strategy - 2", shorttitle="CPS - 2", overlay=true) // New risk management system: order entry, moving stop loss to breakeven + moving average filter (SMA) //--- Patterns Input --- OnEngulfing = input(defval=true, title="Engulfing", type=bool) OnHarami = input(defval=true, title="Harami", type=bool) OnPiercingLine = input(defval=true, title="Piercing Line / Dark Cloud Cover", type=bool) OnMorningStar = input(defval=true, title="Morning Star / Evening Star ", type=bool) OnBeltHold = input(defval=true, title="Belt Hold", type=bool) OnThreeWhiteSoldiers = input(defval=true, title="Three White Soldiers / Three Black Crows", type=bool) OnThreeStarsInTheSouth = input(defval=true, title="Three Stars in the South", type=bool) OnStickSandwich = input(defval=true, title="Stick Sandwich", type=bool) OnMeetingLine = input(defval=true, title="Meeting Line", type=bool) OnKicking = input(defval=true, title="Kicking", type=bool) OnLadderBottom = input(defval=true, title="Ladder Bottom", type=bool) //--- Risk Management Input --- tick = input (defval = 0.01, title="Tick Size", minval = 0.001) inpsl = input(defval = 10, title="Stop Loss", minval = 1) inptp = input(defval = 100, title="Take Profit", minval = 1) inpbm = input (defval=10, title="Breakeven Margin", minval = 1) inpindent = input(defval = 5, title="Price Movement Confirmation", minval = 0) InpSmaFilter = input(defval=false, title="MA Filter", type=bool) maPer=input(defval = 50, title="MA Period", minval = 1) //inptrail = input(defval = 0, title="Trailing Stop", minval = 0) // If the zero value is set for stop loss, take profit or trailing stop, then the function is disabled //sl = inpsl >= 1 ? inpsl : na sl = inpsl * tick bm = inpbm * tick tp = inptp //* tick indent = inpindent * tick //trail = inptrail >= 1 ? inptrail : na //--- Session Input --- sess = input(defval = "0000-0000", title="Trading Session") t = time(timeframe.period, sess) session_open = na(t) ? false : true // --- Candlestick Patterns --- //Engulfing bullish_engulfing = high[0]>high[1] and low[0]<low[1] and open[0]<open[1] and close[0]>close[1] and close[0]>open[0] and close[1]<close[2] and close[0]>open[1] ? OnEngulfing : na bearish_engulfing = high[0]>high[1] and low[0]<low[1] and open[0]>open[1] and close[0]<close[1] and close[0]<open[0] and close[1]>close[2] and close[0]<open[1] ? OnEngulfing : na //Harami bullish_harami = open[1]>close[1] and close[1]<close[2] and open[0]>close[1] and open[0]<open[1] and close[0]>close[1] and close[0]<open[1] and high[0]<high[1] and low[0]>low[1] and close[0]>=open[0] ? OnHarami : na bearish_harami = open[1]<close[1] and close[1]>close[2] and open[0]<close[1] and open[0]>open[1] and close[0]<close[1] and close[0]>open[1] and high[0]<high[1] and low[0]>low[1] and close[0]<=open[0] ? OnHarami : na //Piercing Line/Dark Cloud Cover piercing_line = close[2]>close[1] and open[0]<low[1] and close[0]>avg(open[1],close[1]) and close[0]<open[1] ? OnPiercingLine : na dark_cloud_cover = close[2]<close[1] and open[0]>high[1] and close[0]<avg(open[1],close[1]) and close[0]>open[1] ? OnPiercingLine : na //Morning Star/Evening Star morning_star = close[3]>close[2] and close[2]<open[2] and open[1]<close[2] and close[1]<close[2] and open[0]>open[1] and open[0]>close[1] and close[0]>close[2] and open[2]-close[2]>close[0]-open[0] ? OnMorningStar : na evening_star = close[3]<close[2] and close[2]>open[2] and open[1]>close[2] and close[1]>close[2] and open[0]<open[1] and open[0]<close[1] and close[0]<close[2] and close[2]-open[2]>open[0]-close[0] ? OnMorningStar : na //Belt Hold bullish_belt_hold = close[1]<open[1] and low[1]>open[0] and close[1]>open[0] and open[0]==low[0] and close[0]>avg(close[0],open[0]) ? OnBeltHold :na bearish_belt_hold = close[1]>open[1] and high[1]<open[0] and close[1]<open[0] and open[0]==high[0] and close[0]<avg(close[0],open[0]) ? OnBeltHold :na //Three White Soldiers/Three Black Crows three_white_soldiers = close[3]<open[3] and open[2]<close[3] and close[2]>avg(close[2],open[2]) and open[1]>open[2] and open[1]<close[2] and close[1]>avg(close[1],open[1]) and open[0]>open[1] and open[0]<close[1] and close[0]>avg(close[0],open[0]) and high[1]>high[2] and high[0]>high[1] ? OnThreeWhiteSoldiers : na three_black_crows = close[3]>open[3] and open[2]>close[3] and close[2]<avg(close[2],open[2]) and open[1]<open[2] and open[1]>close[2] and close[1]<avg(close[1],open[1]) and open[0]<open[1] and open[0]>close[1] and close[0]<avg(close[0],open[0]) and low[1]<low[2] and low[0]<low[1] ? OnThreeWhiteSoldiers : na //Three Stars in the South three_stars_in_the_south = open[3]>close[3] and open[2]>close[2] and open[2]==high[2] and open[1]>close[1] and open[1]<open[2] and open[1]>close[2] and low[1]>low[2] and open[1]==high[1] and open[0]>close[0] and open[0]<open[1] and open[0]>close[1] and open[0]==high[0] and close[0]==low[0] and close[0]>=low[1] ? OnThreeStarsInTheSouth : na //Stick Sandwich stick_sandwich = open[2]>close[2] and open[1]>close[2] and open[1]<close[1] and open[0]>close[1] and open[0]>close[0] and close[0]==close[2] ? OnStickSandwich : na //Meeting Line bullish_ml = open[2]>close[2] and open[1]>close[1] and close[1]==close[0] and open[0]<close[0] and open[1]>=high[0] ? OnMeetingLine : na bearish_ml = open[2]<close[2] and open[1]<close[1] and close[1]==close[0] and open[0]>close[0] and open[1]<=low[0] ? OnMeetingLine : na //Kicking bullish_kicking = open[1]>close[1] and open[1]==high[1] and close[1]==low[1] and open[0]>open[1] and open[0]==low[0] and close[0]==high[0] and close[0]-open[0]>open[1]-close[1] ? OnKicking : na bearish_kicking = open[1]<close[1] and open[1]==low[1] and close[1]==high[1] and open[0]<open[1] and open[0]==high[0] and close[0]==low[0] and open[0]-close[0]>close[1]-open[1] ? OnKicking : na //Ladder Bottom ladder_bottom = open[4]>close[4] and open[3]>close[3] and open[3]<open[4] and open[2]>close[2] and open[2]<open[3] and open[1]>close[1] and open[1]<open[2] and open[0]<close[0] and open[0]>open[1] and low[4]>low[3] and low[3]>low[2] and low[2]>low[1] ? OnLadderBottom : na // --- Plotting Patterns --- plotshape(bullish_engulfing, text='Engulfing', style=shape.triangleup, color=#1FADA2, editable=true, title="Bullish Engulfing Text") plotshape(bearish_engulfing,text='Engulfing', style=shape.triangledown, color=#F35A54, editable=true, title="Bearish Engulfing Text") plotshape(bullish_harami,text='Harami', style=shape.triangleup, color=#1FADA2, editable=true, title="Bullish Harami Text") plotshape(bearish_harami,text='Harami', style=shape.triangledown, color=#F35A54, editable=true, title="BEarish Harami Text") plotshape(piercing_line,text='Piercing Line', style=shape.triangleup, color=#1FADA2, editable=false) plotshape(dark_cloud_cover,text='Dark Cloud Cover', style=shape.triangledown, color=#F35A54, editable=false) plotshape(morning_star,text='Morning Star', style=shape.triangleup, color=#1FADA2, editable=false) plotshape(evening_star,text='Evening Star', style=shape.triangledown, color=#F35A54, editable=false) plotshape(bullish_belt_hold,text='Belt Hold', style=shape.triangleup, color=#1FADA2, editable=false) plotshape(bearish_belt_hold,text='Belt Hold', style=shape.triangledown, color=#F35A54, editable=false) plotshape(three_white_soldiers,text='Three White Soldiers', style=shape.triangleup, color=#1FADA2, editable=false) plotshape(three_black_crows,text='Three Black Crows', style=shape.triangledown, color=#F35A54, editable=false) plotshape(three_stars_in_the_south,text='3 Stars South', style=shape.triangleup, color=#1FADA2, editable=false) plotshape(stick_sandwich,text='Stick Sandwich', style=shape.triangleup, color=#1FADA2, editable=false) plotshape(bullish_ml,text='Meeting Line', style=shape.triangleup, color=#1FADA2, editable=false) plotshape(bearish_ml,text='Meeting Line', style=shape.triangledown, color=#F35A54, editable=false) plotshape(bullish_kicking,text='Kicking', style=shape.triangleup, color=#1FADA2, editable=false) plotshape(bearish_kicking,text='Kicking', style=shape.triangledown, color=#F35A54, editable=false) plotshape(ladder_bottom,text='Ladder Bottom', style=shape.triangleup, color=#1FADA2, editable=false) // --- STRATEGY --- SignalUp = bullish_engulfing or bullish_harami or piercing_line or morning_star or bullish_belt_hold or three_white_soldiers or three_stars_in_the_south or stick_sandwich or bullish_ml or bullish_kicking or ladder_bottom SignalDown = bearish_engulfing or bearish_harami or dark_cloud_cover or evening_star or bearish_belt_hold or three_black_crows or bearish_ml or bearish_kicking PointOfEntry = SignalUp ? high[0] + indent : SignalDown ? low[0] - indent : na bu = strategy.position_avg_price shlo = strategy.position_size stL = shlo > 0 and close [0] > bu + bm ? bu : shlo < 0 and close [0] < bu - bm ? bu : na du = sma(close, maPer) smaF = SignalUp and high[0]>du[0] ? true : SignalUp and high[0]<du[0] ? false : SignalDown and high[0]>du[0] ? false : SignalDown and high[0]<du[0] ? true : na smaFilter = InpSmaFilter ? smaF : true duplot = InpSmaFilter ? du : na plot(duplot, color=red) // -- Orders -- strategy.order("buy", true, stop = PointOfEntry, oca_name = "trade", when = SignalUp and session_open and smaFilter) strategy.cancel("buy", when = not session_open or SignalDown or strategy.opentrades > 0) strategy.order("stop sell", false, stop = bu-sl, oca_name = "trade", when = strategy.opentrades > 0 and shlo > 0 and session_open) strategy.cancel("stop sell", close [0] > bu + bm or not session_open or strategy.opentrades == 0 ) strategy.order("breakeven sell", false, stop = bu + 1*tick, oca_name = "trade", when = strategy.opentrades > 0 and shlo > 0 and close [0] > bu + bm and session_open) strategy.cancel("breakeven sell", when = strategy.opentrades == 0 or not session_open) strategy.order("sell", false, stop = PointOfEntry, oca_name = "trade", when = SignalDown and session_open and smaFilter) strategy.cancel("sell", when = not session_open or SignalUp or strategy.opentrades > 0) strategy.order("stop buy", true, stop = bu+sl, oca_name = "trade", when = strategy.opentrades > 0 and shlo < 0 and session_open) strategy.cancel("stop buy", when = close [0] < bu - bm or not session_open or strategy.opentrades == 0 ) strategy.order("breakeven buy", true, stop = bu - 1 * tick, oca_name = "trade", when = strategy.opentrades > 0 and shlo < 0 and close [0] < bu - bm and session_open) strategy.cancel("breakeven buy", when = strategy.opentrades == 0 or not session_open) strategy.close("buy", when = not session_open or SignalDown ) strategy.close("sell", when = not session_open or SignalUp) strategy.exit("Take Profit", from_entry = "buy", profit = tp) strategy.exit("Take Profit", from_entry = "sell", profit = tp)