
Esta es una estrategia muy simple. Consiste en un solo tracking stop. Cuando el stop se activa, la posición se invierte y se establece un tracking stop para la nueva posición.
La estrategia se basa en uno de los tres tipos de stop loss: stop loss porcentual, stop loss ATR y stop loss absoluto. Cuando el stop loss se activa, la posición se invierte y se establece un stop loss de seguimiento para la nueva posición.
Concretamente, la estrategia primero calcula el valor de la parada en función del tipo de parada elegido. Luego, decide si hay una señal de construcción de la posición, es decir, si el punto alto es mayor que el precio de parada anterior y el punto bajo es menor que el precio de parada anterior.
La mayor ventaja de esta estrategia es que es muy simple, solo se necesita rastrear un stop, no se necesita considerar la selección de puntos de entrada y salida. La configuración flexible de los valores de stop también hace que su alcance sea más amplio.
En comparación con los paros fijos, los paros de seguimiento que se utilizan pueden bloquear mayores ganancias, al tiempo que reducen la probabilidad de que los paros sean impactados. Cada vez que se activa un parón, se invierte la posición y se puede capturar la oportunidad de una reversión del precio.
El principal riesgo que puede tener esta estrategia es el riesgo de que el precio de parada no sea el adecuado. Si el valor de parada es demasiado alto, puede causar pérdidas masivas. Si el valor de parada es demasiado pequeño, puede causar que el stop se active con frecuencia.
Otro riesgo es que el juicio de la dirección de la posición de reversión después de la activación de la parada de pérdidas no sea preciso, lo que hace que se pierdan oportunidades de reversión de precios o aumenten las pérdidas. Esto requiere un juicio de tendencia y resistencia de soporte para determinar el mejor momento de reversión.
La estrategia puede ser optimizada en los siguientes aspectos:
La estrategia obtiene ganancias a través de un simple mecanismo de seguimiento de la parada de pérdidas, una estrategia de cuantificación adecuada para los principiantes. En comparación con las estrategias de parada de pérdidas tradicionales, aumenta el mecanismo de reconstrucción de la posición después de la activación de la parada de pérdidas, obteniendo así ganancias adicionales. Mediante pruebas y optimización continuas, la estrategia puede convertirse en un procedimiento de cuantificación muy práctico.
/*backtest
start: 2022-11-24 00:00:00
end: 2023-11-30 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
strategy(title="Trailing SL Strategy [QuantNomad]", shorttitle = "TrailingSL [QN]", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 50)
////////////
// Inputs //
sl_type = input("%", options = ["%", "ATR", "Absolute"])
sl_perc = input(4, title = "% SL", type = input.float)
atr_length = input(10, title = "ATR Length")
atr_mult = input(2, title = "ATR Mult", type = input.float)
sl_absol = input(10, title = "Absolute SL", type = input.float)
// BACKTESTING RANGE
// From Date Inputs
fromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
fromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
fromYear = input(defval = 2016, title = "From Year", minval = 1970)
// To Date Inputs
toDay = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
toMonth = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
toYear = input(defval = 2100, title = "To Year", minval = 1970)
// Calculate start/end date and time condition
startDate = timestamp(fromYear, fromMonth, fromDay, 00, 00)
finishDate = timestamp(toYear, toMonth, toDay, 00, 00)
time_cond = time >= startDate and time <= finishDate
//////////////////
// CALCULATIONS //
// SL values
sl_val = sl_type == "ATR" ? atr_mult * atr(atr_length) :
sl_type == "Absolute" ? sl_absol :
close * sl_perc / 100
// Init Variables
pos = 0
trailing_sl = 0.0
// Signals
long_signal = nz(pos[1]) != 1 and high > nz(trailing_sl[1])
short_signal = nz(pos[1]) != -1 and low < nz(trailing_sl[1])
// Calculate SL
trailing_sl := short_signal ? high + sl_val :
long_signal ? low - sl_val :
nz(pos[1]) == 1 ? max(low - sl_val, nz(trailing_sl[1])) :
nz(pos[1]) == -1 ? min(high + sl_val, nz(trailing_sl[1])) :
nz(trailing_sl[1])
// Position var
pos := long_signal ? 1 : short_signal ? -1 : nz(pos[1])
//////////////
// PLOTINGS //
plot(trailing_sl, linewidth = 2, color = pos == 1 ? color.green : color.red)
//////////////
// STRATEGY //
if (time_cond and pos != 1)
strategy.entry("long", true, stop = trailing_sl)
if (time_cond and pos != -1)
strategy.entry("short", false, stop = trailing_sl)