Esta es una estrategia de negociación cuantitativa automatizada para Bitcoin basada en el indicador SuperTrend. Utiliza el indicador SuperTrend para determinar las tendencias del mercado y combina el principio de stop loss ATR para controlar los riesgos, lo que permite el comercio largo y corto. La mayor ventaja de esta estrategia es una buena relación riesgo-recompensa y una estrategia de stop loss confiable, adecuada para la tenencia a medio y largo plazo.
Esta estrategia utiliza el indicador SuperTrend para determinar la dirección de las tendencias del mercado.
Específicamente, esta estrategia primero calcula el período ATR como 14 barras, y determina la distancia de stop loss para cada operación multiplicándola por un multiplicador de stop loss ATR (como 1.5x). Luego calcula el indicador SuperTrend utilizando parámetros predeterminados (período ATR = 9, multiplicador SuperTrend = 2.5).
Después de entrar en una operación, el stop loss se fija por encima o por debajo del stop loss ATR. El primer nivel de take profit se calcula en función de una relación riesgo-recompensa, por defecto a 0.75, lo que significa que la distancia de take profit es 0.75x de la distancia de stop loss. Cuando el precio alcanza el primer nivel de take profit, el 50% de la posición se cerrará, y el stop loss se mueve al precio de entrada (break even) para bloquear las ganancias. El segundo nivel de take profit continúa utilizando una relación riesgo-recompensación de 0.75. Si el precio alcanza el stop loss, la posición restante se cerrará con el stop loss.
Al hacerlo, esta estrategia garantiza un riesgo de stop loss controlado y, al mismo tiempo, mantiene los beneficios mediante ganancias parciales, adecuadas para estrategias de inversión a medio y largo plazo.
La mayor ventaja de esta estrategia es la buena relación riesgo-rendimiento, que permite la tenencia a medio y largo plazo.
Usando SuperTrend para determinar las tendencias del mercado, filtrando el ruido del mercado y capturando las tendencias principales.
Seguimiento ATR dinámico de la pérdida de parada, control fiable de pérdidas de operaciones individuales.
Las ganancias parciales se bloquean en las ganancias, lo que resulta en una alta relación riesgo-recompensación.
Trasladar el stop loss al precio de entrada después de alcanzar el TP1 bloquea los beneficios y mejora la estabilidad de la estrategia.
Una lógica extremadamente simple, fácil de entender e implementar, con un gran espacio de ajuste de parámetros.
Aplicable en los intercambios convencionales que utilizan datos intradiarios o de alta frecuencia, con una gran flexibilidad.
Esta estrategia también conlleva algunos riesgos, principalmente en los siguientes ámbitos:
El riesgo de brecha no puede activar el stop loss, enfrentándose a una gran pérdida.
SuperTrend no puede determinar la tendencia correcta, lo que resulta en señales comerciales incorrectas.
Si tomamos un ratio de ganancias demasiado alto, no podemos seguir la tendencia.
La frecuencia de negociación puede ser demasiado alta o demasiado baja.
Todavía queda mucho espacio para optimizar esta estrategia, principalmente en las siguientes áreas:
El método de evaluación de la rentabilidad de las operaciones de inversión se basa en el método de valoración de la rentabilidad de las operaciones de inversión.
Optimice los parámetros de SuperTendencia utilizando algoritmos de avanzada o genéticos para obtener los mejores parámetros.
Añadiendo una segunda capa de stop loss como los canales de Donchian para hacer el stop más confiable.
Prueba diferentes ratios de ganancias para obtener ganancias óptimas frente al equilibrio de riesgos.
Explorar las técnicas de aprendizaje automático para el stop loss dinámico, el ajuste de posición, etc.
Esta es una estrategia cuantitativa basada en SuperTrend para tendencia, ATR parada dinámica y toma parcial de ganancias. Tiene una relación riesgo-recompensa equilibrada, adecuada para el comercio de algo. Hay un amplio margen para optimizar parámetros, stop loss, toma de ganancias, etc. Vale la pena ajustar y aplicar a largo plazo.
/*backtest start: 2024-01-06 00:00:00 end: 2024-02-05 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // Developed by © StrategiesForEveryone //@version=5 strategy("SuperTrend Strategy for BTCUSD 4H", overlay=true, process_orders_on_close = true, initial_capital = 100, default_qty_type = strategy.cash, precision = 2, slippage = 50, commission_value = 0.03, backtest_fill_limits_assumption = 50) // ------ Date filter (obtained from ZenAndTheArtOfTrading) --------- initial_date = input(title="Initial date", defval=timestamp("10 Feb 2014 13:30 +0000"), group="Time filter", tooltip="Enter the start date and time of the strategy") final_date = input(title="Final date", defval=timestamp("01 Jan 2030 19:30 +0000"), group="Time filter", tooltip="Enter the end date and time of the strategy") dateFilter(int st, int et) => time >= st and time <= et colorDate = input.bool(defval=false, title="Date background", tooltip = "Add color to the period of time of the strategy tester") bgcolor(colorDate and dateFilter(initial_date, final_date) ? color.new(color.blue, transp=90) : na) // ------------ Super Trend ---------- atrPeriod = input(9, "ATR Length SuperTrend") factor = input.float(2.5, "Factor SuperTrend", step = 0.05) [supertrend, direction] = ta.supertrend(factor, atrPeriod) show_supertrend = input.bool(defval = false, title="Show supertrend ?", group = "Appearance") bodyMiddle = plot(show_supertrend ? ((open + close) / 2) : na, display=display.none) upTrend = plot(show_supertrend and direction < 0 ? supertrend : na, "Up Trend", color = color.green, style=plot.style_linebr) downTrend = plot(show_supertrend and direction > 0 ? supertrend : na, "Down Trend", color = color.red, style=plot.style_linebr) fill(bodyMiddle, upTrend, color.new(color.green, 90), fillgaps=false) fill(bodyMiddle, downTrend, color.new(color.red, 90), fillgaps=false) // ---------- Atr stop loss (obtained from garethyeo) source_atr = input(close, title='Source', group = "Atr stop loss", inline = "A") length_atr = input.int(14, minval=1, title='Period', group = "Atr stop loss" , inline = "A") multiplier = input.float(1.5, minval=0.1, step=0.1, title='Atr multiplier', group = "Atr stop loss", inline = "A", tooltip = "Defines the stop loss distance based on the Atr stop loss indicator") shortStopLoss = source_atr + ta.atr(length_atr) * multiplier longStopLoss = source_atr - ta.atr(length_atr) * multiplier show_atr_stoploss = input.bool(defval=false, title="Show Atr stop loss ?", group = "Appearance") plot(show_atr_stoploss ? longStopLoss : na, color=color.white, style = plot.style_circles) plot(show_atr_stoploss ? shortStopLoss : na, color=color.white, style = plot.style_circles) // ------------- Money management -------------- strategy_contracts = strategy.equity / close distance_sl_atr_long = -1 * (longStopLoss - close) / close distance_sl_atr_short = (shortStopLoss - close) / close risk = input.float(2.5, '% Account risk per trade', step=1, group = "Risk management for trades", tooltip = "Percentage of total account to risk per trade") long_amount = strategy_contracts * (risk / 100) / distance_sl_atr_long short_amount = strategy_contracts * (risk / 100) / distance_sl_atr_short // ---------- Risk management --------------- risk_reward_breakeven_long= input.float(title="Risk/reward for breakeven long", defval=0.75, step=0.05, group = "Risk management for trades") risk_reward_take_profit_long= input.float(title="Risk/reward for take profit long", defval=0.75, step=0.05, group = "Risk management for trades") risk_reward_breakeven_short= input.float(title="Risk/reward for break even short", defval=0.75, step=0.05, group = "Risk management for trades") risk_reward_take_profit_short= input.float(title="Risk/reward for take profit short", defval=0.75, step=0.05, group = "Risk management for trades") tp_percent=input.float(title="% of trade for first take profit", defval=50, step=5, group = "Risk management for trades", tooltip = "Closing percentage of the current position when the first take profit is reached.") // ------------ Trade conditions --------------- bought = strategy.position_size > 0 sold = strategy.position_size < 0 long_supertrend=ta.crossover(close, supertrend) short_supertrend=ta.crossunder(close, supertrend) var float sl_long = na var float sl_short = na var float be_long = na var float be_short = na var float tp_long = na var float tp_short = na if not bought sl_long:=na if not sold sl_short:=na // ---------- Strategy ----------- // Long position if not bought and long_supertrend sl_long:=longStopLoss long_stoploss_distance = close - longStopLoss be_long := close + long_stoploss_distance * risk_reward_breakeven_long tp_long:=close+(long_stoploss_distance*risk_reward_take_profit_long) strategy.entry('L', strategy.long, long_amount, alert_message = "Long") strategy.exit("Tp", "L", stop=sl_long, limit=tp_long, qty_percent=tp_percent) strategy.exit('Exit', 'L', stop=sl_long) if high > be_long sl_long := strategy.position_avg_price strategy.exit("Tp", "L", stop=sl_long, limit=tp_long, qty_percent=tp_percent) strategy.exit('Exit', 'L', stop=sl_long) if bought and short_supertrend strategy.close("L", comment="CL") // Short position if not sold and short_supertrend sl_short:=shortStopLoss short_stoploss_distance=shortStopLoss - close be_short:=((short_stoploss_distance*risk_reward_breakeven_short)-close)*-1 tp_short:=((short_stoploss_distance*risk_reward_take_profit_short)-close)*-1 strategy.entry("S", strategy.short, short_amount, alert_message = "Short") strategy.exit("Tp", "S", stop=sl_short, limit=tp_short, qty_percent=tp_percent) strategy.exit("Exit", "S", stop=sl_short) if low < be_short sl_short:=strategy.position_avg_price strategy.exit("Tp", "S", stop=sl_short, limit=tp_short, qty_percent=tp_percent) strategy.exit("Exit", "S", stop=sl_short) if sold and long_supertrend strategy.close("S", comment="CS") // ---------- Draw position on chart ------------- if high>tp_long tp_long:=na if low<tp_short tp_short:=na if high>be_long be_long:=na if low<be_short be_short:=na show_position_on_chart = input.bool(defval=true, title="Draw position on chart ?", group = "Appearance", tooltip = "Activate to graphically display profit, stop loss and break even") position_price = plot(show_position_on_chart? strategy.position_avg_price : na, style=plot.style_linebr, color = color.new(#ffffff, 10), linewidth = 1) sl_long_price = plot(show_position_on_chart and bought ? sl_long : na, style = plot.style_linebr, color = color.new(color.red, 10), linewidth = 1) sl_short_price = plot(show_position_on_chart and sold ? sl_short : na, style = plot.style_linebr, color = color.new(color.red, 10), linewidth = 1) tp_long_price = plot(strategy.position_size>0 and show_position_on_chart? tp_long : na, style = plot.style_linebr, color = color.new(#11eb47, 10), linewidth = 1) tp_short_price = plot(strategy.position_size<0 and show_position_on_chart? tp_short : na, style = plot.style_linebr, color = color.new(#11eb47, 10), linewidth = 1) breakeven_long = plot(strategy.position_size>0 and high<be_long and show_position_on_chart ? be_long : na , style = plot.style_linebr, color = color.new(#00ff40, 60), linewidth = 1) breakeven_short = plot(strategy.position_size<0 and low>be_short and show_position_on_chart ? be_short : na , style = plot.style_linebr, color = color.new(#00ff40, 60), linewidth = 1) position_profit_long = plot(bought and show_position_on_chart and strategy.openprofit>0 ? close : na, style = plot.style_linebr, color = color.new(#4cd350, 10), linewidth = 1) position_profit_short = plot(sold and show_position_on_chart and strategy.openprofit>0 ? close : na, style = plot.style_linebr, color = color.new(#4cd350, 10), linewidth = 1) fill(plot1 = position_price, plot2 = position_profit_long, color = color.new(color.green,90)) fill(plot1 = position_price, plot2 = position_profit_short, color = color.new(color.green,90)) fill(plot1 = position_price, plot2 = sl_long_price, color = color.new(color.red,90)) fill(plot1 = position_price, plot2 = sl_short_price, color = color.new(color.red,90)) fill(plot1 = position_price, plot2 = tp_long_price, color = color.new(color.green,90)) fill(plot1 = position_price, plot2 = tp_short_price, color = color.new(color.green,90))