
Se trata de una estrategia de ruptura basada en el seguimiento de la tendencia. Compra acciones de mayor fuerza de entrada cuando se produce una ruptura y vende acciones de menor fuerza cuando se produce una ruptura, para lograr el seguimiento de la tendencia.
La estrategia se basa principalmente en dos indicadores para determinar las señales de entrada y salida, uno es el precio más alto en un período determinado de la función highest () y el otro es el precio más bajo en un período determinado de la función lowest ().
Cuando el precio de cierre es superior al precio más alto del período anterior, se considera que es una ruptura de la tendencia alcista, por lo que se emite una señal de más. Cuando el precio de cierre es inferior al precio más bajo del período anterior, se considera que es una ruptura de la tendencia bajista, por lo que se emite una señal de vacío.
Esta estrategia establece un stop loss móvil y un stop loss fijo al mismo tiempo. El stop loss móvil se calcula basándose en el indicador ATR, y se obtiene multiplicando el valor de ATR en un determinado período por un múltiplo (el parámetro trailingAtrMultiplier) como punto de stop loss móvil. El stop loss fijo también se calcula de manera similar, basándose en el indicador ATR.
La primera línea K de la raíz después de hacer más shorting, el stop loss fijo entra en vigor; después se convierte en un stop loss móvil. Esta combinación puede bloquear parte de las ganancias, mientras se sigue la tendencia.
La estrategia también establece las reglas para calcular las posiciones. Las posiciones se calculan en función del porcentaje de pérdidas máximas aceptables, los intereses de las cuentas, etc. Y se considera el número de variedades de transacción y se reduce adecuadamente la posición de una sola variedad.
En general, esta es una estrategia típica de seguimiento de tendencias, que entra en el campo cuando se determina que se produce una ruptura, bloquea los beneficios y sigue la tendencia a través de un stop loss, y sale del campo cuando la tendencia se invierte.
Es una estrategia innovadora cuyas principales ventajas son:
Precisión en la determinación de tendencias. Se usa el precio más alto y el precio más bajo para determinar si la tendencia se ha invertido. La precisión es alta y no es fácil emitir señales erróneas.
La posición y la ciencia de la parada son razonables. La configuración de la proporción máxima de pérdidas, la correlación de intereses de las cuentas, etc. hacen que la posición sea razonable, evitando el exceso o la negociación invalida. La combinación de paradas de pérdidas bloquea los beneficios y sigue la tendencia.
Sencillo, práctico y fácil de entender. Sólo se necesitan los indicadores más básicos, la lógica de la estrategia es simple, clara y fácil de dominar.
Escalable. Los parámetros del indicador, las reglas de posición, etc. se proporcionan con una caja de entrada que el usuario puede ajustar según sea necesario.
En general, esta es una estrategia de ruptura muy práctica. La seguridad en el juicio es confiable, y la estrategia está diseñada teniendo en cuenta el control y el seguimiento del riesgo.
Los principales riesgos de esta estrategia son:
Riesgo de reversión de la tendencia. La estrategia de ruptura depende mucho del juicio de la tendencia, y puede enfrentar grandes pérdidas si se hace un error.
Los parámetros incorrectos de riesgo. La elección incorrecta de los parámetros del ciclo de precios más altos y más bajos puede perder la tendencia, y la configuración incorrecta de los parámetros de posición puede causar una pérdida excesiva.
El riesgo de que el stop loss sea demasiado radical. Si el stop loss móvil es demasiado pequeño, el ruido del mercado puede expulsarlo.
Las principales soluciones son:
Aumentar los filtros de tendencia. Por ejemplo, agregar otros indicadores de juicio para evitar errores de ruptura.
Optimización de la selección de parámetros. Prueba de los parámetros para seleccionar los valores óptimos y garantizar su estabilidad.
La distancia de frenado puede ser adecuadamente relajada. La distancia de frenado debe ser ajustada para que pueda ser tolerada.
La estrategia se puede optimizar principalmente en las siguientes direcciones:
Añadir más indicadores para juzgar la tendencia. Además de los precios más altos y más bajos, se pueden agregar juicios como la media móvil para que la tendencia sea más precisa.
Optimización de la configuración de los parámetros. Prueba de los parámetros del ciclo de precios más altos y más bajos, los parámetros de los parámetros de los parámetros de los parámetros de los parámetros de los parámetros de los parámetros de los parámetros de los parámetros de los parámetros de los parámetros de los parámetros de los parámetros de los parámetros de los parámetros.
La correlación entre posiciones y la volatilidad del mercado, como por ejemplo la reducción de posiciones cuando el VIX sube, se puede ajustar según el algoritmo de posición del mercado.
El aumento de la capacidad indica un filtro. Sólo entre en la brecha de la capacidad de aumento, para evitar falsas brechas.
Tenga en cuenta la diferencia de base y la correlación entre las variedades preferidas para el comercio. Seleccione una combinación de variedades con una variación de diferencia de base pequeña y baja correlación para reducir el riesgo de la combinación.
Optimización y ajuste de los mecanismos de detención de pérdidas. Se puede probar una combinación de proporciones de detención móvil y fija, reduciendo el riesgo de detención demasiado radical.
La estrategia se desempeña bien como una estrategia de seguimiento de tendencias de ruptura en cuanto a la precisión de los juicios, el control de la posición y el riesgo y la facilidad de operación. Captura las tendencias tempranas y equilibra el bloqueo de las ganancias y el seguimiento de la tendencia con un stop loss móvil.
Por supuesto, como una estrategia de ruptura, es muy dependiente de los juicios de tendencia y es susceptible a la interferencia del ruido. Además, la configuración incorrecta de los parámetros también puede afectar el rendimiento de la estrategia. Esto debe resolverse con una optimización adicional.
En general, esta es una estrategia muy práctica, y su estructura básica ya contiene los elementos más importantes que se necesitan para una estrategia cuantitativa. Si se puede optimizar y mejorar continuamente, puede ser una estrategia programática de ganancias estables.
/*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')