Esta estratégia abre e fecha posições com base no indicador Super Trend e trailing stop loss. Ele usa 4 alertas para abrir e fechar posições longas e curtas, e adota uma estratégia de super tendência. A estratégia é projetada especificamente para robôs com funcionalidade de stop loss.
A estratégia usa o indicador ATR para calcular as faixas superior e inferior. Um sinal de compra é gerado quando o preço de fechamento quebra a faixa superior e um sinal de venda é gerado quando ele quebra a faixa inferior. A estratégia também usa uma linha de super tendência para determinar a direção da tendência. Quando a linha de super tendência sobe, ela indica o início de um mercado de alta. Quando desce, ela indica o início de um mercado de baixa. A estratégia abre posições quando um sinal é gerado e define o preço inicial de stop loss.
A estratégia combina as vantagens do indicador Super Trend para determinar a direção da tendência e o indicador ATR para definir paradas. Ele pode efetivamente filtrar falhas de ruptura. Paradas de trailers podem bloquear lucros muito bem e reduzir drawdowns. Além disso, a estratégia é projetada especificamente para robôs, permitindo a negociação automatizada.
O indicador de Super Trend pode facilmente gerar mais sinais falsos. Quando a faixa de ajuste de stop loss é grande, a probabilidade de stop loss ser atingida aumenta. Além disso, a negociação de robôs também enfrenta riscos técnicos, como falhas de servidores e interrupções de rede.
Para reduzir a probabilidade de sinais falsos, os parâmetros ATR podem ser ajustados adequadamente ou outros indicadores podem ser adicionados para filtragem.
A seguir estão indicadas algumas direcções em que esta estratégia pode ser otimizada:
Adicionar indicadores ou condições para filtrar sinais de entrada e evitar sinais falsos.
Ensaiar diferentes combinações de parâmetros ATR para encontrar os parâmetros ideais.
Otimizar o intervalo de stop loss para encontrar o melhor ponto de equilíbrio.
Adicionar mais preços de stop loss para alcançar o stop batch de perdas.
Construir uma arquitetura de servidor duplo com servidores primários e de espera que possam mudar rapidamente quando o servidor principal falhar.
Esta estratégia integra as vantagens do indicador Super Trend e trailing stop loss para abertura e parada automatizada de perdas.
/*backtest start: 2023-11-18 00:00:00 end: 2023-12-18 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/ // © arminomid1375 //@version=5 strategy('Mizar_BOT_super trend', overlay=true, default_qty_value=100, currency=currency.USD, default_qty_type=strategy.percent_of_equity, initial_capital=100, max_bars_back=4000) //===== INPUTS ==========================================================================// factor = input.float(4.5, title='ATR Factor', step=0.1,group = 'ATR') period = input.int(59, minval=1, maxval=100, title='ATR Period',group = 'ATR') up = (high + low) / 2 - factor * ta.atr(period) down = (high + low) / 2 + factor * ta.atr(period) trend_up = 0.0 trend_up := close[1] > trend_up[1] ? math.max(up, trend_up[1]) : up trend_down = 0.0 trend_down := close[1] < trend_down[1] ? math.min(down, trend_down[1]) : down trend = 0.0 trend := close > trend_down[1] ? 1 : close < trend_up[1] ? -1 : nz(trend[1], 1) tsl = trend == 1 ? trend_up : trend_down line_color = trend == 1 ? 'green' : 'red' long_signal = trend == 1 and trend[1] == -1 short_signal = trend == -1 and trend[1] == 1 background = true //ss = input.float(defval=15.0, minval=0.0, title=' stop loss %',group = 'stop loss') use_sl = input(title='trailing stop ?', defval=true,group = 'stop loss') initial_sl_pct = input.float(defval=15.0, minval=0.0, title='trailing stop %',group = 'stop loss') Tpactive1 = input(title='Take profit1 On/Off ?', defval=true, group='take profit') tp1percent = input.float(5.0, title='TP1 %', group='take profit') *100 tp1amt = input.int(10, title='TP1 Amount %', group='take profit') Tpactive2 = input(title='Take profit2 On/Off ?', defval=true, group='take profit') tp2percent = input.float(10, title='TP2 %', group='take profit') *100 tp2amt = input.int(15, title='TP2 Amount %', group='take profit') Tpactive3 = input(title='Take profit3 On/Off ?', defval=true, group='take profit') tp3percent = input.float(15, title='TP3 %', group='take profit')*100 tp3amt = input.int(20, title='TP3 Amount %', group='take profit') //===== TIMEFRAME ==========================================================================// from_month = input.int(defval=1, title='From Month', minval=1, maxval=12) from_day = input.int(defval=1, title='From Day', minval=1, maxval=31) from_year = input.int(defval=2019, title='From Year', minval=2017) to_month = input.int(defval=1, title='To Month', minval=1, maxval=12) to_day = input.int(defval=1, title='To Day', minval=1, maxval=31) to_year = input.int(defval=9999, title='To Year', minval=2017) start = timestamp(from_year, from_month, from_day, 00, 00) finish = timestamp(to_year, to_month, to_day, 23, 59) window() => time >= start and time <= finish ? true : false //===== PLOTS ==========================================================================// // Line line_plot = plot(tsl, color=trend == 1 ? color.green : color.red, linewidth=2, title='Trend Line') // Labels plotshape(long_signal and window() ? up : na, title='Buy', text='Buy', location=location.absolute, style=shape.labelup, size=size.normal, color=color.new(color.green, 0), textcolor=color.new(color.white, 0)) plotshape(short_signal and window() ? down : na, title='Sell', text='Sell', location=location.absolute, style=shape.labeldown, size=size.normal, color=color.new(color.red, 0), textcolor=color.new(color.white, 0)) // Circles plotshape(long_signal and window() ? up : na, title='Uptrend starts', location=location.absolute, style=shape.circle, size=size.tiny, color=color.new(color.green, 0)) plotshape(short_signal and window() ? down : na, title='Downtrend starts', location=location.absolute, style=shape.circle, size=size.tiny, color=color.new(color.red, 0)) // Background long_fill = background ? trend == 1 ? color.green : na : na short_fill = background ? trend == -1 ? color.red : na : na candle_plot = plot(ohlc4, title='Price Line', color=trend == 1 ? long_fill : short_fill, linewidth=2, transp=90) fill(candle_plot, line_plot, title='Long Background', color=long_fill, transp=90) fill(candle_plot, line_plot, title='Short Background', color=short_fill, transp=90) //===== GLOBAL ==========================================================================// var entry_price = 0.0 var updated_entry_price = 0.0 var sl_price = 0.0 longString = "Input your custom alert message here.\nAnd put {{strategy.order.alert_message}} in the message box." longclose = "Input your custom alert message here.\nAnd put {{strategy.order.alert_message}} in the message box." shortString = "Input your custom alert message here.\nAnd put {{strategy.order.alert_message}} in the message box." shortclose = "Input your custom alert message here.\nAnd put {{strategy.order.alert_message}} in the message box." longAlertMessage = input(title="Long Alert Message", defval="long", group="Alert Messages", tooltip=longString) longcloseAlertMessage = input(title="Long close Alert Message", defval="long", group="Alert Messages", tooltip=longclose) shortAlertMessage = input(title="Short Alert Message", defval="short", group="Alert Messages", tooltip=shortString) shortcloseAlertMessage = input(title="Short close Alert Message", defval="short", group="Alert Messages", tooltip=shortclose) has_open_trade() => strategy.position_size != 0 has_no_open_trade() => strategy.position_size == 0 is_long() => strategy.position_size > 0 ? true : false is_short() => strategy.position_size < 0 ? true : false plot(use_sl ? has_no_open_trade() ? close : sl_price : na, color=has_no_open_trade() ? na : color.blue, title='Stop Loss') strategy_close() => if is_long() strategy.close('Long') alert(longcloseAlertMessage) if is_short() strategy.close('Short') alert(shortcloseAlertMessage) strategy_long() => strategy.entry('Long', strategy.long) strategy_short() => strategy.entry('Short', strategy.short) sl_pct = initial_sl_pct if long_signal or is_long() and not(short_signal or is_short()) sl_pct := initial_sl_pct * -1 sl_pct //===== STRATEGY ==========================================================================// crossed_sl = false if is_long() and use_sl crossed_sl := close <= sl_price crossed_sl if is_short() and use_sl crossed_sl := close >= sl_price crossed_sl terminate_operation = window() and has_open_trade() and crossed_sl if terminate_operation and not(long_signal or short_signal) // Do not close position if trend is flipping anyways. entry_price := 0.0 updated_entry_price := entry_price sl_price := 0.0 strategy_close() start_operation = window() and (long_signal or short_signal) if start_operation entry_price := close updated_entry_price := entry_price sl_price := entry_price + entry_price * sl_pct / 100 if long_signal strategy_long() if Tpactive1==true strategy.exit('TPL1','Long', qty_percent=tp1amt,profit =tp1percent) alert(shortcloseAlertMessage) alert(longAlertMessage) if short_signal strategy_short() if Tpactive1==true strategy.exit('TPL1','Short', qty_percent=tp1amt,profit =tp1percent) alert(longcloseAlertMessage) alert(shortAlertMessage) //===== TRAILING ==========================================================================// if is_long() and use_sl strategy_pct = (close - updated_entry_price) / updated_entry_price * 100.00 if strategy_pct > 1 sl_pct += strategy_pct - 1.0 new_sl_price = updated_entry_price + updated_entry_price * sl_pct / 100 sl_price := math.max(sl_price, new_sl_price) updated_entry_price := sl_price updated_entry_price if is_short() and use_sl strategy_pct = (close - updated_entry_price) / updated_entry_price * 100.00 if strategy_pct < -1 sl_pct += strategy_pct + 1.0 new_sl_price = updated_entry_price + updated_entry_price * sl_pct / 100 sl_price := math.min(sl_price, new_sl_price) updated_entry_price := sl_price updated_entry_price