La Supertrend Advance Strategy es una versión optimizada y mejorada basada en el clásico indicador Supertrend. Combina la acción del precio, la volatilidad y múltiples indicadores técnicos para mejorar la calidad de la señal, reducir el ruido y capturar con mayor precisión los cambios en las tendencias del mercado.
El núcleo de la estrategia de Supertrend Advance es la línea de Supertrend. Se calcula sobre la base del rango promedio verdadero y el impulso del precio para determinar la dirección de la tendencia potencial y los puntos de inflexión. Cuando el precio está por encima de la línea de Supertrend, indica una tendencia alcista. Por el contrario, cuando está por debajo de la línea, indica una tendencia bajista.
A diferencia del indicador Supertrend tradicional que considera principalmente el precio de cierre y ATR, la estrategia Advance también incorpora dimensiones como el volumen de operaciones, osciladores de impulso e incluso datos fundamentales para validar la confiabilidad de las señales.
Las principales ventajas de la estrategia Supertrend Advance incluyen:
Una mayor precisión en la identificación de tendencias y el filtrado de falsos breakouts.
Reducción de la interferencia acústica: la combinación de filtros elimina los datos de mercado excesivamente poco importantes, lo que hace que los juicios sean más claros.
Las señales comerciales claras facilitan la planificación de las pérdidas de parada y obtienen ganancias de manera más efectiva.
Además de identificar tendencias, la estrategia también puede combinarse con otras herramientas técnicas para crear sistemas comerciales integrales.
La estrategia Supertrend Advance también tiene los siguientes riesgos importantes:
Las combinaciones incorrectas de parámetros pueden hacer ineficaz la estrategia o desencadenar demasiadas señales falsas.
No hay estrategia que pueda evitar completamente el riesgo de errores de juicio. Cuando las tendencias cambian inesperadamente, se pueden incurrir en pérdidas.
Riesgos de optimización excesiva: cuando los parámetros se adaptan en exceso a los datos históricos, la estrategia puede no adaptarse a las condiciones cambiantes del mercado.
A medida que aumenta la frecuencia de las operaciones, los costos como las comisiones y el deslizamiento también aumentan significativamente.
Soluciones correspondientes:
Optimizar la configuración de los parámetros y hacer pruebas de robustez con regularidad.
Establezca el stop loss y el take profit para limitar la pérdida por operación.
Evite la sobre-optimización para mantener la capacidad de generalización.
Calcular el riesgo/beneficio de las señales y gestionar los costes de negociación.
La estrategia Supertrend Advance puede optimizarse en los siguientes aspectos:
Ajustar los parámetros basados en los diferentes mercados para adaptarlos mejor a sus características, por ejemplo, reducir las longitudes de ciclo de los mercados volátiles.
Añadir mecanismos de filtrado adaptativos a los indicadores de sintonía automática o desactivar los filtros en ciertos estados del mercado.
Explorar métodos de aprendizaje automático para optimizar dinámicamente los parámetros utilizando redes neuronales.
Incorporar datos de sentimiento y análisis de noticias para mejorar el rendimiento utilizando datos no estructurados.
Añadir capacidad de posicionamiento para aumentar los rendimientos cuando la tasa de ganancia es muy alta.
Al introducir múltiples filtros e indicadores de confirmación, la Supertrend Advance Strategy optimiza el clásico indicador de Supertrend para juzgar las tendencias con más precisión y mejorar la calidad de la señal. En comparación con los indicadores individuales, esta estrategia multidimensional proporciona soluciones comerciales más robustas, integrales y eficientes. Sin embargo, también se deben proteger contra riesgos como ajuste inadecuado de parámetros y errores de juicio adoptando medidas apropiadas de control de riesgos. Con nuevas optimizaciones e integración con otras herramientas, la Supertrend Advance Strategy tiene un inmenso potencial de aplicación.
/*backtest start: 2023-12-31 00:00:00 end: 2024-01-07 00:00:00 period: 5m basePeriod: 1m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © JS_TechTrading //@version=5 strategy("Supertrend advance", overlay=true,default_qty_type =strategy.percent_of_equity,default_qty_value = 1,process_orders_on_close = false) // group string//// var string group_text000="Choose Strategy" var string group_text0="Supertrend Settings" var string group_text0000="Ema Settings" var string group_text00="Rsi Settings" var string group_text1="Backtest Period" var string group_text2="Trade Direction" var string group_text3="Quantity Settings" var string group_text4="Sl/Tp Settings" var string group_text5="Enable/Disable Condition Filter" var string group_macd="Macd Set" var group_cci="Cci Set" var string group_text6="Choose Sl/Tp" var string group_text7="Percentage Sl/Tp" var string group_text9="Atr SL/Tp" var string group_text8='Swing Hl & Supertrend Sl/Tp' // filter enable and disbale on_ma =input.bool(true,"Ema Condition On/Off",group=group_text5,inline = "CL") en_rsi = input.bool(true,"Rsi Condition On/Off",group = group_text5,inline = "CL") en_macd=input.bool(true,title ="Enable Macd Condition",group =group_text5,inline = "CS") en_cci=input.bool(true,title ="Enable/Disable CCi Filter",group =group_text5,inline = "CS") //////////////////// option_ch=input.string('Pullback',title = "Type Of Stratgey",options =['Pullback','Simple'],group = "Choose Strategy Type") // option for stop loss and take profit option_ts=input.string("Percentage","Chosse Type Of Sl/tp",["Percentage","Supertrend","Swinghl","Atr"],group=group_text6) //atr period input supertrend atrPeriod = input(10, "ATR Length",group = group_text0) factor = input.float(3.0, "Factor", step = 0.01,group=group_text0) [supertrend, direction] = ta.supertrend(factor, atrPeriod) bodyMiddle = plot((open + close) / 2, display=display.none) upTrend = plot(direction < 0 ? supertrend : na, "Up Trend", color = color.green, style=plot.style_linebr) downTrend = plot(direction < 0? na : supertrend, "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) long=direction < 0 ? supertrend : na short=direction < 0? na : supertrend longpos=false shortpos=false longpos :=long?true :short?false:longpos[1] shortpos:=short?true:long?false:shortpos[1] fin_pullbuy= (ta.crossunder(low[1],long) and long and high>high[1]) fin_pullsell=(ta.crossover(high[1],short) and short and low<low[1]) //Ema 1 ma_len= input.int(200, minval=1, title="Ema Length",group = group_text0000) ma_src = input.source(close, title="Ema Source",group = group_text0000) ma_out = ta.ema(ma_src, ma_len) ma_buy=on_ma?close>ma_out?true:false:true ma_sell=on_ma?close<ma_out?true:false:true // rsi indicator and condition // Get user input rsiSource = input(title='RSI Source', defval=close,group = group_text00) rsiLength = input(title='RSI Length', defval=14,group = group_text00) rsiOverbought = input(title='RSI BUY Level', defval=50,group = group_text00) rsiOversold = input(title='RSI SELL Level', defval=50,group = group_text00) // Get RSI value rsiValue = ta.rsi(rsiSource, rsiLength) rsi_buy=en_rsi?rsiValue>=rsiOverbought ?true:false:true rsi_sell=en_rsi?rsiValue<=rsiOversold?true:false:true // Getting inputs macd fast_length = input(title="Fast Length", defval=12,group =group_macd) slow_length = input(title="Slow Length", defval=26,group =group_macd) macd_src = input(title="Source", defval=close,group =group_macd) signal_length = input.int(title="Signal Smoothing", minval = 1, maxval = 50, defval = 9,group =group_macd) [macdLine, signalLine, histLine] = ta.macd(macd_src, fast_length ,slow_length,signal_length) buy_macd=en_macd?macdLine>0?true:false:true sell_macd=en_macd?macdLine<0?true:false:true // CCI indicator length_cci = input.int(20, minval=1,group = group_cci) src_cci = input(hlc3, title="Source",group = group_cci) cci_gr=input.int(200,title = "CCi > Input",group = group_cci,tooltip ="CCi iS Greater thn 100 buy") cci_ls=input.int(-200,title = "CCi < -Input",group = group_cci,tooltip ="CCi iS Less thn -100 Sell") ma = ta.sma(src_cci, length_cci) cci = (src_cci - ma) / (0.015 * ta.dev(src_cci, length_cci)) //cci buy and sell buy_cci=en_cci?cci>cci_gr?true:false:true sell_cci=en_cci?cci<cci_ls?true:false:true // final condition buy_cond=option_ch=='Simple'?long and not(longpos[1]) and rsi_buy and ma_buy and buy_macd and buy_cci:option_ch=='Pullback'?fin_pullbuy and rsi_buy and ma_buy and buy_macd and buy_cci:na sell_cond=option_ch=='Simple'?short and not(shortpos[1]) and rsi_sell and ma_sell and sell_macd and sell_cci:option_ch=='Pullback'?fin_pullsell and rsi_sell and ma_sell and sell_macd and sell_cci:na //backtest engine start = input(timestamp('2005-01-01'), title='Start calculations from',group=group_text1) end=input(timestamp('2045-03-01'), title='End calculations',group=group_text1) time_cond = true // Make input option to configure trade direction tradeDirection = input.string(title='Trade Direction', options=['Long', 'Short', 'Both'], defval='Both',group = group_text2) // Translate input into trading conditions longOK = (tradeDirection == "Long") or (tradeDirection == "Both") shortOK = (tradeDirection == "Short") or (tradeDirection == "Both") // quantity qty_new=input.float(1.0,step =0.10,title ="Quantity",group =group_text3) // supertrend and swing high and low tpnewf = input.float(title="take profit swinghl||supertrend ", step=0.1, defval=1.5, group=group_text8) hiLen = input.int(title='Highest High Lookback', defval=6, minval=2, group=group_text8) loLen = input.int(title='Lowest Low Lookback', defval=6, minval=2, group=group_text8) globl = option_ts=="Swinghl"? nz(ta.lowest(low, loLen),low[1]):option_ts=="Supertrend"?nz(supertrend,low[1]):na globl2=option_ts=="Swinghl"? nz(ta.highest(high, hiLen),high[1]) :option_ts=="Supertrend"?nz(supertrend,high[1]):na var store = float(na) var store2=float(na) // strategy start if buy_cond and longOK and time_cond and strategy.position_size==0 strategy.entry("enter long",direction = strategy.long,qty =qty_new) store:=globl if sell_cond and shortOK and time_cond and strategy.position_size==0 strategy.entry("enter short",direction =strategy.short,qty =qty_new) store2:=globl2 //stop loss and take profit enable_trail=input.bool(false,"Enable Trail",group =group_text7) stopPer = input.float(1.0,step=0.10,title='Stop Loss %',group=group_text7)* 0.01 takePer = input.float(2.0,step=0.10, title='Take Profit %',group=group_text7)* 0.01 //TRAILING STOP CODE trailStop = input.float(title='Trailing Stop (%)', minval=0.0, step=0.1, defval=1,group=group_text7) * 0.01 longStopPrice = 0.0 shortStopPrice = 0.0 longStopPrice := if strategy.position_size > 0 stopValue = close * (1 - trailStop) math.max(stopValue, longStopPrice[1]) else 0 shortStopPrice := if strategy.position_size < 0 stopValue = close * (1 + trailStop) math.min(stopValue, shortStopPrice[1]) else 999999 // Determine where you've entered and in what direction longStop = 0.0 shortStop =0.0 shortTake =0.0 longTake = 0.0 if (option_ts=="Percentage" ) // Determine where you've entered and in what direction longStop := strategy.position_avg_price * (1 - stopPer) shortStop := strategy.position_avg_price * (1 + stopPer) shortTake := strategy.position_avg_price * (1 - takePer) longTake := strategy.position_avg_price * (1 + takePer) if enable_trail and (option_ts=="Percentage" ) longStop := longStopPrice shortStop := shortStopPrice //single take profit exit position if strategy.position_size > 0 and option_ts=="Percentage" strategy.exit(id='Close Long',from_entry = "enter long", stop=longStop, limit=longTake) if strategy.position_size < 0 and option_ts=="Percentage" strategy.exit(id='Close Short',from_entry = "enter short", stop=shortStop, limit=shortTake) //PLOT FIXED SLTP LINE plot(strategy.position_size > 0 and option_ts=="Percentage" ? longStop : na, style=plot.style_linebr, color=enable_trail?na:color.new(#c0ff52, 0), linewidth=1, title='Long Fixed SL') plot(strategy.position_size < 0 and option_ts=="Percentage"? shortStop : na, style=plot.style_linebr, color=enable_trail?na:color.new(#5269ff, 0), linewidth=1, title='Short Fixed SL') plot(strategy.position_size > 0 and option_ts=="Percentage"? longTake : na, style=plot.style_linebr, color=color.new(#5e6192, 0), linewidth=1, title='Long Take Profit') plot(strategy.position_size < 0 and option_ts=="Percentage"? shortTake : na, style=plot.style_linebr, color=color.new(#dcb53d, 0), linewidth=1, title='Short Take Profit') //PLOT TSL LINES plot(series=strategy.position_size > 0 and option_ts=="Percentage" and enable_trail ? longStopPrice : na, color=color.new(color.red, 0), style=plot.style_linebr, linewidth=1, title='Long Trail Stop', offset=1) plot(series=strategy.position_size < 0 and option_ts=="Percentage" and enable_trail ? shortStopPrice : na, color=color.new(color.red, 0), style=plot.style_linebr, linewidth=1, title='Short Trail Stop', offset=1) // swing high and low //take profit takeProfit_buy = strategy.position_avg_price - ((store - strategy.position_avg_price) * tpnewf) takeProfit_sell = strategy.position_avg_price - ((store2 - strategy.position_avg_price) * tpnewf) // Submit stops based on highest high and lowest low if strategy.position_size >= 0 and (option_ts=="Swinghl" or option_ts=="Supertrend") strategy.exit(id='XL HH',from_entry = "enter long", stop=store,limit=takeProfit_buy,comment ="Long Exit") if strategy.position_size <= 0 and (option_ts=="Swinghl" or option_ts=="Supertrend") strategy.exit(id='XS LL',from_entry = "enter short", stop=store2,limit=takeProfit_sell,comment = "Short Exit") // plot take profit plot(series=strategy.position_size < 0 and (option_ts=="Swinghl" or option_ts=="Supertrend")? takeProfit_sell : na, style=plot.style_circles, color=color.orange, linewidth=1, title="take profit sell") plot(series=strategy.position_size > 0 and (option_ts=="Swinghl" or option_ts=="Supertrend")? takeProfit_buy: na, style=plot.style_circles, color=color.blue, linewidth=1, title="take profit buy") // Plot stop Loss for visual confirmation plot(series=strategy.position_size > 0 and (option_ts=="Swinghl" or option_ts=="Supertrend")? store : na, style=plot.style_circles, color=color.new(color.green, 0), linewidth=1, title='Lowest Low Stop') plot(series=strategy.position_size < 0 and (option_ts=="Swinghl" or option_ts=="Supertrend")? store2 : na, style=plot.style_circles, color=color.new(color.red, 0), linewidth=1, title='Highest High Stop') // atr enable_atrtrail=input.bool(false,"Enable Atr Trail",group = group_text9) atrLength = input(title='ATR Length', defval=14,group =group_text9) slATRMult = input.float(title='Stop loss ATR multiplier',step=0.1, defval=2.0,group =group_text9) tpATRMult = input.float(title='Take profit multiplier',step=0.1, defval=1.5,group =group_text9) lookback = input.int(title='How Far To Look Back For High/Lows', defval=7, minval=1,group =group_text9) atr = ta.atr(atrLength) lowestLow = ta.lowest(low, lookback) highestHigh = ta.highest(high, lookback) longStopa = (enable_atrtrail ? lowestLow : close) - atr * slATRMult shortStopa = (enable_atrtrail ? highestHigh : close) + atr * slATRMult atr_l=0.0 atr_s=0.0 atr_l:=nz(strategy.position_avg_price-(atr[1] * slATRMult),strategy.position_avg_price-(1 * slATRMult)) atr_s:=nz(strategy.position_avg_price+ (atr[1] * slATRMult),strategy.position_avg_price-(1 * slATRMult)) stoploss_l = ta.valuewhen(strategy.position_size != 0 and strategy.position_size[1] == 0,atr_l, 0) stoploss_s = ta.valuewhen(strategy.position_size != 0 and strategy.position_size[1] == 0,atr_s, 0) takeprofit_l = strategy.position_avg_price - ((stoploss_l - strategy.position_avg_price) * tpATRMult) takeprofit_s = strategy.position_avg_price - ((stoploss_s - strategy.position_avg_price) * tpATRMult) // Submit stops based on highest high and lowest low if strategy.position_size > 0 and (option_ts=="Atr") strategy.exit(id='Xl', stop= enable_atrtrail?longStopa:stoploss_l,limit=takeprofit_l ,comment ="Long Exit") if strategy.position_size < 0 and (option_ts=="Atr") strategy.exit(id='XH', stop=enable_atrtrail?shortStopa:stoploss_s,limit=takeprofit_s,comment = "Short Exit") // // plot take profit plot(series=strategy.position_size > 0 and (option_ts=="Atr")? takeprofit_l : na, style=plot.style_circles, color=color.orange, linewidth=1, title="take profit sell") plot(series=strategy.position_size < 0 and (option_ts=="Atr")? takeprofit_s: na, style=plot.style_circles, color=color.blue, linewidth=1, title="take profit buy") // Plot stop Loss for visual confirmation plot(series=strategy.position_size >0 and (option_ts=="Atr") and not enable_atrtrail? stoploss_l : na, style=plot.style_circles, color=color.new(color.green, 0), linewidth=1, title='Lowest Low Stop') plot(series=strategy.position_size < 0 and (option_ts=="Atr") and not enable_atrtrail? stoploss_s : na, style=plot.style_circles, color=color.new(color.red, 0), linewidth=1, title='Highest High Stop') //PLOT TSL LINES plot(series=strategy.position_size >0 and option_ts=="Atr" and enable_atrtrail ? longStopa : na, color=color.new(color.green, 0), style=plot.style_linebr, linewidth=1, title='Long Trail Stop', offset=1) plot(series=strategy.position_size < 0 and (option_ts=="Atr") and enable_atrtrail? shortStopa : na, style=plot.style_linebr, color=color.new(color.red, 0), linewidth=1, title='short Trail Stop', offset=1)