
Esta es una estrategia de seguimiento de tendencias basada en indicadores de Supertrend, combinada con un mecanismo de seguimiento de pérdidas adaptativo. La estrategia identifica principalmente la dirección de la tendencia del mercado a través de indicadores de Supertrend y utiliza el seguimiento de las pérdidas de ajuste dinámico para administrar el riesgo y optimizar el tiempo de salida.
La lógica central de la estrategia se basa en los siguientes elementos clave:
Se trata de una estrategia de seguimiento de tendencias de diseño razonable y controlada por el riesgo. Combinando los indicadores de Supertrend con un mecanismo de stop loss flexible, la estrategia puede controlar el riesgo de manera efectiva y al mismo tiempo mantener una alta rentabilidad. La estrategia es altamente configurable y es adecuada para su uso en diferentes entornos de mercado, pero requiere una adecuada optimización de los parámetros y verificación de la retrospectiva.
/*backtest
start: 2019-12-23 08:00:00
end: 2024-12-18 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=6
strategy("Supertrend Strategy with Adjustable Trailing Stop [Bips]", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=15)
// Inputs
atrPeriod = input(10, "ATR Länge", "Average True Range „wahre durchschnittliche Schwankungsbreite“ und stammt aus der technischen Analyse. Die ATR misst die Volatilität eines Instruments oder eines Marktes. Mit ihr kann die Wahrscheinlichkeit für einen Trendwechsel bestimmt werden.", group="Supertrend Settings")
factor = input.float(3.0, "Faktor", step=0.1, group="Supertrend Settings")
tradeDirection = input.string("Long", "Trade Direction", options=["Both", "Long", "Short"], group="Supertrend Settings")
sl_type = input.string("%", "SL Type", options=["%", "ATR", "Absolute"])
// Parameter für ST nur für einstieg -> Beim Ausstieg fragen ob der bool WWert true ist -> Für weniger und längere Trädes
sl_perc = input.float(4.0, "% SL", group="Stop Loss Einstellung")
atr_length = input.int(10, "ATR Length", group="Stop Loss Einstellung")
atr_mult = input.float(2.0, "ATR Mult", group="Stop Loss Einstellung")
sl_absol = input.float(10.0, "Absolute SL", group="Stop Loss Einstellung")
//-------------------------//
// BACKTESTING RANGE
fromDay = input.int(defval=1, title="From Day", minval=1, maxval=31, group="Backtesting Einstellung")
fromMonth = input.int(defval=1, title="From Month", minval=1, maxval=12, group="Backtesting Einstellung")
fromYear = input.int(defval=2016, title="From Year", minval=1970, group="Backtesting Einstellung")
toDay = input.int(defval=1, title="To Day", minval=1, maxval=31, group="Backtesting Einstellung")
toMonth = input.int(defval=1, title="To Month", minval=1, maxval=12, group="Backtesting Einstellung")
toYear = input.int(defval=2100, title="To Year", minval=1970, group="Backtesting Einstellung")
startDate = timestamp(fromYear, fromMonth, fromDay, 00, 00)
finishDate = timestamp(toYear, toMonth, toDay, 00, 00)
time_cond = time >= startDate and time <= finishDate
//-------------------------//
// Supertrend calculation
[_, direction] = ta.supertrend(factor, atrPeriod)
// SL values
sl_val = sl_type == "ATR" ? atr_mult * ta.atr(atr_length) :
sl_type == "Absolute" ? sl_absol :
close * sl_perc / 100
// Init Variables
var pos = 0
var float 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 ? math.max(low - sl_val, nz(trailing_sl[1])) :
nz(pos[1]) == -1 ? math.min(high + sl_val, nz(trailing_sl[1])) :
nz(trailing_sl[1])
// Position var
pos := long_signal ? 1 : short_signal ? -1 : nz(pos[1])
// Entry logic
if ta.change(direction) < 0 and time_cond
if tradeDirection == "Both" or tradeDirection == "Long"
strategy.entry("Long", strategy.long, stop=trailing_sl)
else
strategy.close_all("Stop Short")
if ta.change(direction) > 0 and time_cond
if tradeDirection == "Both" or tradeDirection == "Short"
strategy.entry("Short", strategy.short, stop=trailing_sl)
else
strategy.close_all("Stop Long")
// Exit logic: Trailing Stop and Supertrend
//if strategy.position_size > 0 and not na(trailing_sl)
//strategy.exit("SL-Exit Long", from_entry="Long", stop=trailing_sl)
//if strategy.position_size < 0 and not na(trailing_sl)
//strategy.exit("SL-Exit Short", from_entry="Short", stop=trailing_sl)
// Trailing Stop visualization
plot(trailing_sl, linewidth = 2, color = pos == 1 ? color.green : color.red)
//plot(not na(trailing_sl) ? trailing_sl : na, color=pos == 1 ? color.green : color.red, linewidth=2, title="Trailing Stop")