La estrategia detecta principalmente la ruptura de la caja formada por los puntos altos y bajos de la línea K para juzgar la dirección y la fuerza del mercado. Cuando hay una ruptura de caja ascendente, la estrategia establecerá una posición larga alrededor del punto de ruptura. Cuando hay una ruptura de caja descendente, la estrategia establecerá una posición corta alrededor del punto de ruptura. Una vez que se genera una señal comercial, la estrategia colocará órdenes para abrir posiciones y establecerá stop loss y tomar ganancias para controlar los riesgos.
La estrategia define un período de tiempo de negociación y sólo busca oportunidades comerciales durante ese período.
Después de que se forme cada línea K, la estrategia juzga si hay un avance significativo entre los precios más altos y más bajos de las dos líneas K anteriores.
2.1 Si el precio más bajo de la segunda línea K es mayor que el precio más alto de la primera línea K, se produce una ruptura de caja al alza.
2.2 Si el precio más alto de la 2a línea K es inferior al precio más bajo de la 1a línea K, se produce una ruptura a la baja.
Después de confirmar la señal de ruptura de la caja, la estrategia establece un punto de entrada largo o corto alrededor del precio más alto o más bajo de la línea K actual.
Una vez abierta la posición, la estrategia establece el beneficio basado en el doble del rango de ruptura para capturar la aceleración de la tendencia.
La estrategia también establece el stop loss en el precio más bajo o más alto de la segunda línea K para reducir el riesgo de pérdida.
La estrategia tiene las siguientes ventajas:
La lógica es simple y fácil de implementar.
El uso de las rupturas de la caja de la línea K para juzgar la dirección y la fuerza del mercado tiene una alta precisión.
La configuración de take profit captura las oportunidades de la aceleración de la tendencia.
Hay una lógica de stop loss clara para controlar una sola pérdida.
La idea de la estrategia es flexible y se puede personalizar de acuerdo con el estilo personal.
Sin embargo, la estrategia presenta algunos riesgos:
Las señales de ruptura pueden ser falsas rupturas, las pérdidas no se pueden evitar por completo.
El stop loss cerca del punto de entrada puede desencadenarse fácilmente por mercados agresivos.
No puede juzgar la estructura de la tendencia y las paradas pueden desencadenarse con frecuencia en mercados de rango.
No tiene en cuenta el impacto de diferentes productos y períodos de tiempo.
Para optimizar aún más la estrategia, podemos mejorar los siguientes aspectos:
Establecer parámetros de stop loss y take profit adaptativos para diferentes productos y períodos de tiempo.
Añadir indicadores técnicos para juzgar la tendencia para evitar quedar atrapados en mercados de rango.
Establezca oportunidades adicionales para seguir tendencias.
Combinar indicadores de volumen para juzgar la autenticidad de las señales de fuga y filtro.
Añadir algoritmos de aprendizaje automático para ayudar a determinar la dirección de la tendencia.
La estrategia está diseñada basándose en el principio de breakout simple para capturar corridas aceleradas después de los breakouts para obtener rendimientos excesivos.
/*backtest start: 2024-01-07 00:00:00 end: 2024-01-14 00:00:00 period: 3m basePeriod: 1m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © Dvitash //@version=5 strategy("Casper SMC Silver Bullet", shorttitle = "Casper SB", overlay=true, calc_on_order_fills = true) startTime = input(defval = "1000", title = "Start Time") endTime = input(defval = "1600", title = "End Time") contractAmt = input.int(defval = 2, title = "Contract Amount") fvgCol = input.color(defval = color.rgb(63, 61, 179, 41), title = "FVG Color") borderCol = input.color(defval = color.rgb(35, 33, 172, 41), title = "FVG Border Color") fvgExtendLength = input.int(defval = 0, minval = 0, title = "FVG Extend Length") allowedTime = not na(time(timeframe.period, startTime + "-" + endTime +":23456", "America/New_York")) newDay = bool(ta.change(time('D'))) h = hour(time('1'), "America/New_York") var bool fvgDrawn = na var float entryPrice = na var float stopPrice = na var float tpPrice = na if newDay fvgDrawn := false // a_allBoxes = box.all // if array.size(a_allBoxes) > 0 // for i = 0 to array.size(a_allBoxes) - 1 // box.delete(array.get(a_allBoxes, i)) if allowedTime and barstate.isconfirmed and h <= 16 //Long FVG if high[2] < low and not fvgDrawn // box.new(bar_index[2], low, bar_index + fvgExtendLength, high[2], bgcolor = fvgCol, border_color = borderCol) stopPrice := low[2] entryPrice := low tpPrice := entryPrice + (math.abs(low[2] - entryPrice) * 2) // log.info("SL: " + str.tostring(stopPrice) + " Entry: " + str.tostring(entryPrice) + " TP: " + str.tostring(tpPrice)) strategy.entry("long", strategy.long, contractAmt, limit = entryPrice, comment = "Long Entry") fvgDrawn := true if low[2] > high and not fvgDrawn // box.new(bar_index[2], high, bar_index + fvgExtendLength, low[2], bgcolor = fvgCol, border_color = borderCol) stopPrice := high[2] entryPrice := high tpPrice := entryPrice - (math.abs(high[2] - entryPrice) * 2) // log.info("SL: " + str.tostring(stopPrice) + " Entry: " + str.tostring(entryPrice) + " TP: " + str.tostring(tpPrice)) strategy.entry("short", strategy.short, contractAmt, limit = entryPrice, comment = "Short Entry") fvgDrawn := true if h >= 16 strategy.close_all() strategy.cancel_all() strategy.exit("long exit", from_entry = "long", qty = contractAmt, limit = tpPrice, stop = stopPrice, comment = "Long Exit") strategy.exit("short exit", from_entry = "short", qty = contractAmt, limit = tpPrice, stop = stopPrice, comment = "Short Exit")