Esta es una estrategia de ruptura basada en el seguimiento de tendencias.
La estrategia se basa principalmente en dos indicadores para determinar las señales de entrada y salida: la función más alta que determina el precio más alto durante un determinado período y la función más baja que determina el precio más bajo durante un determinado período.
Cuando el precio de cierre está por encima del precio más alto durante un determinado período (parámetro highPeriod), se considera una ruptura de tendencia al alza, por lo que se emite una señal larga.
La estrategia también establece un stop loss móvil y un stop loss fijo. El stop loss móvil se basa en el indicador ATR, calculado por un valor ATR durante un cierto período multiplicado por un factor (parámetro trailingAtrMultiplier) como el nivel de stop loss móvil.
Después de ir largo o corto, el stop loss fijo entra en vigencia para la primera barra; luego cambia a un stop loss principalmente móvil.
La estrategia también establece reglas para el cálculo del tamaño de la posición. Basándose en el porcentaje máximo de pérdida aceptable, el capital de cuenta, etc., calcula el tamaño de posición adecuado. También tiene en cuenta el número de instrumentos de negociación, reduciendo adecuadamente el tamaño de posición para cada instrumento.
En resumen, esta es una estrategia típica de breakout de seguimiento de tendencias.
Las principales ventajas de esta estrategia son las siguientes:
El uso de los precios más altos y más bajos para determinar si las tendencias se invierten, la precisión es muy alta y las señales falsas son poco probables.
Tamaño razonable de la posición y stop loss. Establecimiento de porcentaje máximo de pérdida, asociación de equidad de cuenta, etc. hacen que los tamaños de posición sean razonables, evitando el exceso de negociación o la negociación ineficaz. El stop loss combinado bloquea las ganancias y sigue los movimientos de tendencia.
Es simple y práctico, fácil de entender y de utilizar, se basa únicamente en indicadores básicos y la lógica es sencilla y fácil de entender.
Los parámetros del indicador, las reglas de dimensionamiento de la posición, etc. proporcionan cajas de entrada para que los usuarios puedan ajustar según sea necesario.
En resumen, esta es una estrategia de escape muy práctica, segura y confiable en el juicio, mientras que el diseño considera el control y seguimiento de riesgos, muy adecuado para la tenencia a mediano y largo plazo.
Los principales riesgos de esta estrategia son:
Si los parámetros del ciclo de precios más altos o más bajos se eligen mal, las tendencias podrían pasarse por alto.
Si la distancia de stop loss en movimiento es demasiado pequeña, el ruido del mercado podría eliminar la posición prematuramente.
Las principales soluciones son:
Añadir filtros de tendencia, como indicadores adicionales para comprobar si hay fallas.
Optimizar la selección de parámetros mediante pruebas de estabilidad.
Relajar la distancia de stop loss adecuadamente para soportar retracements razonables.
Las principales direcciones de optimización para esta estrategia son:
Además de los precios más altos / más bajos, también se pueden agregar indicadores como promedios móviles para hacer que la determinación de tendencias sea más precisa.
Optimice la configuración de parámetros. Pruebe y encuentre las combinaciones óptimas para parámetros como ciclos de precios más altos / más bajos, factores de multiplicador de stop loss, etc.
Ajustar el tamaño del algoritmo de posiciones en función de las condiciones del mercado, por ejemplo, reducir el tamaño de las posiciones cuando aumente la volatilidad (por ejemplo, VIX).
Añadir el filtro de volumen para la confirmación de la fuga, para evitar las falsas fugas.
En la selección de instrumentos de negociación, debe tenerse en cuenta los diferenciales y las correlaciones, ya que la elección de instrumentos con pequeñas variaciones de diferenciales y correlaciones bajas puede reducir los riesgos de cartera.
Optimiza el mecanismo de stop loss. Prueba diferentes composiciones de stop loss móviles y fijos para hacer que los stop losses sean menos agresivos.
Como estrategia de ruptura de tendencia, esta estrategia tiene un buen rendimiento en la precisión del juicio, el tamaño de la posición y el control de riesgos, la facilidad de operación, etc. Captura las tendencias temprano y equilibra la obtención de ganancias y el seguimiento a través de pérdidas de parada en movimiento.
Por supuesto, como estrategia de ruptura, se basa en gran medida en el juicio de tendencias y es propenso a interferencias de ruido del mercado.
En general, esta es una estrategia muy práctica. Su estructura básica ya contiene los componentes más cruciales para una estrategia cuántica. Con optimizaciones y mejoras continuas, definitivamente puede convertirse en una estrategia automatizada estable y rentable.
/*backtest start: 2023-12-01 00:00:00 end: 2023-12-31 23:59:59 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 strategy(shorttitle="Trend Surfers - Breakout", title="Trend Surfers - Premium Breakout", overlay=true) // Risk for position and pyramid maxriskval = input(2, "Max % risk", type = input.float, tooltip="Risk % over total equity / Position", group = "Risk Management") pairnumber = input(title = "How many pairs",type = input.integer, defval= 1, tooltip="How many pairs are you trading with the strategy?", group = "Risk Management") // Emtry Exit highPeriod = input(title="Highest High Period", type=input.integer, defval=168 , tooltip="Highest High of X bars - This will trigger a Long Entry when close is above. (Thin Green Line)" , group = "Entry Condition") lowPeriod = input(title="Lowest Low Period", type=input.integer, defval=168, tooltip="Lowest low of X bars - This will trigger a Short Entry when close is under. (Thin Red Line)" , group = "Entry Condition") // Stoploss trailingAtrPeriod = input(title="Trailing ATR Pediod", type=input.integer, defval=10, tooltip="Average True Range for the Trailing Stop. (Thick Green Line) " , group = "Exit Condition") trailingAtrMultiplier = input(title="Trailing ATR Multiplier", type=input.float, defval=8 , group = "Exit Condition") fixAtrPeriod = input(title="Fix ATR Pediod", type=input.integer, defval=10, tooltip="Average True Range for the Fix Stoloss. (Thick Yellow Line)" , group = "Exit Condition") fixAtrMultiplier = input(title="Fix ATR Multiplier", type=input.float, defval=2 , group = "Exit Condition") // Pair info pair = syminfo.basecurrency + syminfo.currency // High Low Variable highestHigh = highest(high, highPeriod)[1] lowestLow = lowest(low, lowPeriod)[1] trailingAtr = atr(trailingAtrPeriod) * trailingAtrMultiplier // Trade Condition longCondition = crossover(close, highestHigh) shortCondition = crossunder(close, lowestLow) // Risk Variable fixAtr = atr(fixAtrPeriod) * fixAtrMultiplier stopvaluelong = close[1] - fixAtr[1] stopvalueshort = close[1] + fixAtr[1] // Position size Long maxpossize = strategy.equity / close positionsizelong = ( ( ( (maxriskval/100) * strategy.equity) / (close - stopvaluelong))) stopperclong = ((close - stopvaluelong) / close) * 100 leveragelong = max(1, ceil(positionsizelong / maxpossize)) * 2 posperclong = (((positionsizelong * close) / strategy.equity) *100 / leveragelong) / pairnumber realposlong = (((posperclong / 100) * strategy.equity) * leveragelong) / close // Position size Short positionsizeshort = ( ( ( (maxriskval/100) * strategy.equity) / (stopvalueshort - close))) stoppercshort = ((close - stopvalueshort) / close) * 100 leverageshort = max(1, ceil(positionsizeshort / maxpossize)) * 2 pospercshort = (((positionsizeshort * close) / strategy.equity) *100 / leverageshort) / pairnumber realposshort = (((pospercshort / 100) * strategy.equity) * leverageshort) / close // Alert Message entry_long_message = '\nGo Long for ' + pair + 'NOW!' + '\nPosition Size % =' + tostring(posperclong) + '\nLeverage' + tostring(leveragelong) + '\nStoploss Price =' + tostring(stopvaluelong) + '\nClose any Short position that are open for ' + pair + '!' + '\n\nVisit TrendSurfersSignals.com' + '\nFor automated premium signals (FREE)' entry_short_message ='\nGo Short for ' + pair + 'NOW!' + '\nPosition Size % =' + tostring(pospercshort) + '\nLeverage' + tostring(leverageshort) + '\nStoploss Price =' + tostring(stopvalueshort) + '\nClose any Long position that are open for ' + pair + '!' + '\n\nVisit TrendSurfersSignals.com' + '\nFor automated premium signals (FREE)' exit_short_message = '\nExit Short for ' + pair + 'NOW!' + '\n\nVisit TrendSurfersSignals.com' + '\nFor automated premium signals (FREE)' exit_long_message = '\nExit Long for ' + pair + 'NOW!' + '\n\nVisit TrendSurfersSignals.com' + '\nFor automated premium signals (FREE)' // Order if longCondition strategy.entry("Long", strategy.long, stop=highestHigh, comment="Long", qty=realposlong , alert_message = entry_long_message) if shortCondition strategy.entry("Short", strategy.short, stop=lowestLow, comment="Short", qty=realposshort , alert_message = entry_short_message) // Stoploss Trailing longTrailing = close - trailingAtr shortTrailing = close + trailingAtr var longTrailingStop = 0.0 var shortTrailingStop = 999999.9 trailingStopLine = 0.0 trailingStopLine := na fixedStopLine = 0.0 fixedStopLine := na var inTrade = 0 if longCondition or shortCondition if 0 == inTrade if longCondition inTrade := 1 else inTrade := -1 if 1 == inTrade and (shortCondition or low <= max(fixedStopLine[1], longTrailingStop)) inTrade := 0 if -1 == inTrade and (longCondition or high >= min(fixedStopLine[1], shortTrailingStop)) inTrade := 0 longTrailingStop := if (1 == inTrade) stopValue = longTrailing max(stopValue, longTrailingStop[1]) else 0 shortTrailingStop := if (-1 == inTrade) stopValue = shortTrailing min(stopValue, shortTrailingStop[1]) else 999999 // Fix Stoploss firstPrice = 0.0 firstFixAtr = 0.0 firstPrice := na firstFixAtr := na if 0 != inTrade firstPrice := valuewhen(inTrade != inTrade[1] and 0 != inTrade, close, 0) firstFixAtr := valuewhen(inTrade != inTrade[1] and 0 != inTrade, fixAtr, 0) if 1 == inTrade fixedStopLine := firstPrice - firstFixAtr trailingStopLine := longTrailingStop else fixedStopLine := firstPrice + firstFixAtr trailingStopLine := shortTrailingStop if (strategy.position_size > 0) strategy.exit(id="L Stop", stop=max(fixedStopLine, longTrailingStop) , alert_message = exit_long_message) if (strategy.position_size < 0) strategy.exit(id="S Stop", stop=min(fixedStopLine, shortTrailingStop) , alert_message = exit_long_message) // Plot plot(highestHigh, color=color.green, linewidth=1, transp=0, title='Highest High') plot(lowestLow, color=color.red, linewidth=1, transp=0, title='Lowest Low') plot(trailingStopLine, color=color.lime, linewidth=2, transp=0, offset=1, title='Trailing Stop') plot(fixedStopLine, color=color.orange, linewidth=2, transp=0, offset=1, title='Fixed Stop')