Esta estrategia está diseñada en base a los datos abiertos, altos y bajos de los gráficos de velas para identificar los puntos de inversión de tendencia para las entradas. Después de las entradas, se establecerán líneas de stop loss basadas en el indicador ATR y se rastrearán. También se calcularán objetivos basados en la relación riesgo-recompensa. Cuando el precio alcance el objetivo de stop loss o beneficio, se enviarán órdenes para cerrar posiciones.
Las señales de entrada de esta estrategia provienen de los precios abiertos, altos y bajos. Una señal de compra se genera cuando el precio de apertura es igual al mínimo del candelero, y una señal de venta se genera cuando el precio de apertura es igual al máximo, lo que indica oportunidades potenciales de inversión de tendencia.
Después de la entrada, se calcula la stop loss dinámica de seguimiento en función del indicador ATR. La stop loss larga se establece en el mínimo más bajo de las N barras recientes menos 1 ATR; la stop loss corta se establece en el máximo más alto de las N barras recientes más 1 ATR. La línea de stop loss se actualizará dinámicamente para seguir los movimientos del precio.
Los objetivos de utilidad se calculan en función de la fijación de la relación riesgo-beneficio: el objetivo largo se fija en el precio de entrada más (la diferencia de riesgo entre el precio de entrada y la pérdida de parada multiplicada por la relación riesgo-beneficio); el objetivo corto se fija en el precio de entrada menos (la diferencia de riesgo entre la pérdida de parada y el precio de entrada multiplicada por la relación riesgo-beneficio).
Cuando el precio alcanza el objetivo de stop loss o beneficio, las órdenes se enviarán a posiciones de aplanamiento.
Las ventajas de esta estrategia incluyen:
Señales de entrada simples y claras, evitando múltiples golpes.
El ATR dinámico para bloquear las ganancias y evita perseguir altos y bajos.
El control de la relación riesgo-recompensa evita dejar las ganancias en la mesa y el exceso de negociación.
Aplicable a diferentes productos, fácil de optimizar.
También existen algunos riesgos de esta estrategia:
Las señales de entrada pueden retrasarse en cierta medida, perdiendo la mejor entrada en el mercado.
El valor de las pérdidas de detención es el valor de las pérdidas de detención de operaciones que se registran en el balance de las pérdidas de detención.
No hay determinación de tendencia, propenso a quedar atrapado en mercados variados.
Incapaz de manejar las posiciones nocturnas.
Las direcciones de optimización son:
Incorporar otros indicadores de sesgo de tendencia para evitar problemas.
Ajuste fino de los parámetros ATR o agregue control de volatilidad para una mejor parada de pérdida.
Añadir filtro de tendencia para reducir el ruido de la señal.
Añadir el manejo de la posición durante la noche para ciertos productos.
En conclusión, esta es una estrategia simple y directa con una lógica de entrada clara, una metodología de stop loss razonable y un buen control de riesgos. Pero hay algunas limitaciones como un sesgo de tendencia insuficiente, retraso de la señal, etc. Estas fallas también señalan direcciones para la optimización futura. Al incorporar más filtros de indicadores y módulos de gestión de riesgos, esta estrategia puede mejorarse aún más y hacerse más robusta.
/*backtest start: 2024-01-01 00:00:00 end: 2024-01-31 23:59:59 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 // Open-High-Low strategy strategy('Strategy: OLH', shorttitle="OLH", overlay=true ) // Inputs slAtrLen = input.int(defval=14, title="ATR Period for placing SL", group="StopLoss settings") showSLLines = input.bool(defval=false, title="Show SL lines in chart", tooltip="Show SL lines also as dotted lines in chart. Note: chart may look untidy.", group="Stolploss settings") // Trade related rrRatio = input.float(title='Risk:Reward', step=0.1, defval=2.0, group="Trade settings") endOfDay = input.int(defval=1500, title="Close all trades, default is 3:00 PM, 1500 hours (integer)", group="Trade settings") mktAlwaysOn = input.bool(defval=true, title="Markets that never closed (Crypto, Forex, Commodity)", tooltip="Some markers never closes. For those cases, make this checked.", group="Trade settings") lotSize = input.int(title='Lot Size', step=1, defval=1, group="Trade settings") // Utils green(open, close) => close > open ? true : false red(open, close) => close < open ? true : false body(open, close) => math.abs(open - close) lowerwick = green(open, close) ? open - low : close - low upperwick = green(open, close) ? high - close : high - open crange = high - low crangep = high[1] - low[1] // previous candle's candle-range bullish = close > open ? true : false bearish = close < open ? true : false // Trade signals longCond = barstate.isconfirmed and (open == low) shortCond = barstate.isconfirmed and (open == high) // For SL calculation atr = ta.atr(slAtrLen) highestHigh = ta.highest(high, 7) lowestLow = ta.lowest(low, 7) longStop = showSLLines ? lowestLow - (atr * 1) : na shortStop = showSLLines ? highestHigh + (atr * 1) : na plot(longStop, title="Buy SL", color=color.green, style=plot.style_cross) plot(shortStop, title="Sell SL", color=color.red, style=plot.style_cross) // Trade execute h = hour(time('1'), syminfo.timezone) m = minute(time('1'), syminfo.timezone) hourVal = h * 100 + m totalTrades = strategy.opentrades + strategy.closedtrades if (mktAlwaysOn or (hourVal < endOfDay)) // Entry var float sl = na var float target = na if (longCond) strategy.entry("enter long", strategy.long, lotSize, limit=na, stop=na, comment="Enter Long") sl := longStop target := close + ((close - longStop) * rrRatio) alert('Buy:' + syminfo.ticker + ' ,SL:' + str.tostring(math.floor(sl)) + ', Target:' + str.tostring(target), alert.freq_once_per_bar) if (shortCond) strategy.entry("enter short", strategy.short, lotSize, limit=na, stop=na, comment="Enter Short") sl := shortStop target := close - ((shortStop - close) * rrRatio) alert('Sell:' + syminfo.ticker + ' ,SL:' + str.tostring(math.floor(sl)) + ', Target:' + str.tostring(target), alert.freq_once_per_bar) // Exit: target or SL if ((close >= target) or (close <= sl)) strategy.close("enter long", comment=close < sl ? "Long SL hit" : "Long target hit") if ((close <= target) or (close >= sl)) strategy.close("enter short", comment=close > sl ? "Short SL hit" : "Short target hit") else if (not mktAlwaysOn) // Close all open position at the end if Day strategy.close_all(comment = "Close all entries at end of day.")