Esta estratégia é baseada em padrões de velas para identificar diferentes sinais de velas e negociar ao longo da tendência.
A estratégia identifica principalmente os seguintes padrões de candelabro para os sinais de negociação:
Engulfing: padrões de engulfing de alta e de engulfing de baixa
Linha de perfuração/Cobre de nuvens escuras: padrões de linha de perfuração de alta e de cobertura de nuvens escuras de baixa
Estrela da manhã/estrela da noite: padrões de estrela da manhã alta e estrela da noite baixa
Métodos de retenção do cinturão: tendências de retenção do cinturão de alta e de retenção do cinturão de baixa
Três Soldados Brancos/Três Corvos Negros: três soldados brancos e três corvos negros padrões
Três estrelas no sul: três estrelas no padrão sul
Sandwich de pau: padrão de sanduíche de pau
Linha de encontro: padrões de linha de encontro de alta e linha de encontro de baixa
Diminuição de preços: padrões de aumento de preços e queda de preços
Base da escada: padrão da base da escada
Ao detectar esses sinais de candelabro, ele colocará ordens pendentes perto do preço de abertura da próxima barra, com stop loss e take profit pré-definidos para seguir a tendência.
Ele também adiciona um filtro de média móvel para evitar receber sinais quando o preço está no lado errado da MA.
Com base nos padrões clássicos de candelabro, tem alguma aplicabilidade universal.
Negociação mecânica baseada em regras de padrão, não afectada por factores subjetivos.
O risco de perdas e de lucros para controlar os riscos comerciais únicos.
O mecanismo de parada de tração ajusta a perda de parada dinamicamente junto com o mercado.
O filtro MA adiciona mais lógica para evitar ser preso em negócios errados.
Os padrões de velas têm alguns problemas de identificação errada, o que pode levar a sinais falsos.
O stop loss estático não pode evitar completamente os riscos dos eventos de mercado.
Sensível a sessões de negociação, não pode funcionar 24x7, pode ajustar horários de negociação ou adicionar filtros de leilão.
O filtro MA pode perder algumas oportunidades. Pode diminuir o período de MA ou remover o filtro.
Difícil de lucrar com ambos os lados longos e curtos juntos devido a conflitos.
Otimizar os parâmetros dos padrões de candelabro para melhorar a identificação.
Teste diferentes métodos de trailing stop para encontrar o ideal.
Tente técnicas mais avançadas de gestão de risco como gestão de dinheiro ou volatilidade stop loss.
Adicionar mais filtros para melhorar a lógica de filtragem.
Construir modelos de reconhecimento de padrões de velas usando aprendizado de máquina.
Desenvolver uma lógica estratégica que possa identificar sinais longos e curtos.
Esta estratégia usa padrões clássicos de velas para detecção de tendências e negocia mecânicamente com base nos sinais. Gerencia os riscos por meio de stop loss rigoroso e trailing stop, e melhora a lógica adicionando o filtro MA. A estratégia é fácil de entender e implementar, mas também tem alguns problemas como errônea identificação e dificuldades no ajuste de parâmetros. As otimizações futuras podem ser feitas introduzindo mais indicadores técnicos e modelos de aprendizado de máquina para alcançar melhor desempenho.
/*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)