Esta estrategia se basa en patrones de velas para identificar diferentes señales de velas y comerciar a lo largo de la tendencia.
La estrategia identifica principalmente los siguientes patrones de candlestick para las señales de negociación:
Tendencia de crecimiento de las tasas de interés en el mercado de valores
Línea de penetración/Cobre de nubes oscuras: patrones de línea de penetración alcista y patrones de cobertura de nubes oscuras bajistas
Estrella de la mañana/estrella de la noche: patrones alcistas de estrellas de la mañana y bajistas de estrellas de la noche
Tendencia de mantenimiento del cinturón: tendencia alcista y tendencia bajista
Tres soldados blancos / tres cuervos negros: tres soldados blancos y tres cuervos negros patrones
Tres estrellas en el sur: tres estrellas en el patrón sur
Sándwich de palo: patrón de sándwich de palo
Línea de encuentro: patrones de línea de encuentro alcista y baja
Tendencia de crecimiento: tendencia de crecimiento y tendencia de bajada
Bajo de la escalera: patrón del fondo de la escalera
Cuando detecta estas señales de candlestick, colocará órdenes pendientes cerca del precio de apertura de la siguiente barra, con un stop loss predefinido y toma ganancias para seguir la tendencia.
También agrega un filtro de promedio móvil para evitar tomar señales cuando el precio está en el lado equivocado de MA.
Basado en los patrones clásicos de candelabro, tiene cierta aplicabilidad universal.
Comercio mecánico basado en reglas de patrón, no afectado por factores subjetivos.
Establecimientos razonables de stop loss y take profit para controlar los riesgos comerciales únicos.
El mecanismo de parada de seguimiento ajusta la parada de pérdida dinámicamente junto con el mercado.
El filtro de MA añade más lógica para evitar quedar atrapados en negocios equivocados.
Los patrones de candlestick tienen algunos problemas de identificación errónea, lo que puede conducir a señales falsas.
El stop loss estático no puede evitar completamente los riesgos de los eventos del mercado.
Sensible a las sesiones de negociación, no puede funcionar 24x7, puede ajustar los tiempos de negociación o añadir filtros de subasta.
El filtro MA puede perder algunas oportunidades. Puede reducir el período de MA o eliminar el filtro.
Difícil de sacar provecho de ambos lados largo y corto juntos debido a los conflictos.
Optimizar los parámetros de los patrones de velas para mejorar la identificación.
Prueba diferentes métodos de detención para encontrar el óptimo.
Pruebe técnicas más avanzadas de gestión de riesgos como la gestión de dinero o la volatilidad stop loss.
Añadir más filtros para mejorar la lógica de filtrado.
Construir modelos de reconocimiento de patrones de velas utilizando el aprendizaje automático.
Desarrollar estrategia lógica que pueda identificar señales largas y cortas.
Esta estrategia utiliza patrones clásicos de velas para la detección de tendencias y las operaciones mecánicamente basadas en las señales. Gestiona los riesgos mediante estrictos stop loss y trailing stop, y mejora la lógica mediante la adición de un filtro MA. La estrategia es fácil de entender e implementar, pero también tiene algunos problemas como la identificación errónea y dificultades en el ajuste de parámetros. Las optimizaciones futuras se pueden hacer introduciendo más indicadores técnicos y modelos de aprendizaje automático para lograr un mejor rendimiento.
/*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)