A ideia central desta estratégia é combinar o indicador Supertrend com a negociação da curva de ações. Quando o indicador Supertrend gera um sinal de compra ou venda, não executamos diretamente o comércio. Em vez disso, verificamos se a curva de ações atual está abaixo de sua média móvel. Abriremos posições apenas quando a curva de ações estiver acima da média móvel. Quando a curva de ações estiver abaixo da média móvel, pausaremos a negociação para a estratégia atual. Isso pode efetivamente evitar a expansão de perdas.
Esta estratégia consiste essencialmente em duas partes:
A fórmula de cálculo do indicador Supertrend é:
Faixa superior = Preço de origem - Multipliante ATR * ATR Faixa inferior = Preço de origem + Multipliante ATR * ATR
O indicador de Supertrend usa o ATR para definir as faixas superior e inferior. Uma quebra acima da faixa superior representa um sinal de venda, enquanto uma quebra abaixo da faixa inferior representa um sinal de compra.
A ideia por trás da negociação de curva de ações é que tomamos a média móvel da curva de ações da estratégia.
Esta estratégia combina as duas técnicas, de modo que depois que o indicador Supertrend gera um sinal de negociação, não entramos diretamente em negociações. Em vez disso, verificamos se a curva de ações atual está acima de sua média móvel. Somente quando ambas as condições forem atendidas, abriremos posições. Isso pode mitigar efetivamente os riscos inerentes ao próprio indicador Supertrend e evitar perdas excessivas.
As principais vantagens desta estratégia são:
O indicador de Supertrend em si não pode conter efetivamente as perdas.
Quando a negociação se torna desfavorável, ele pausa a negociação para evitar perdas excessivas. Podemos retomar a negociação quando o mercado se recuperar.
A negociação é interrompida automaticamente quando a curva de ações cai abaixo da média móvel, e retomada quando a curva de ações se recupera acima dela.
Há também alguns riscos com esta estratégia:
As configurações incorretas dos parâmetros podem tornar ineficaz a negociação da curva de ações.
Pode falhar em ajustar as posições imediatamente quando a tendência do mercado mudar, o que pode resultar em certas perdas.
Pode perder boas oportunidades de negociação enquanto espera que a curva de ações se recupere.
Contramedidas:
Otimizar os parâmetros e selecionar o melhor período de média móvel.
Incorporar outros indicadores para avaliar a tendência e ajustar as posições em conformidade.
Reduzir a duração das negociações suspensas para reduzir a probabilidade de oportunidades perdidas.
Podemos otimizar a estratégia a partir dos seguintes aspectos:
Ensaiar diferentes combinações de parâmetros para determinar o período ATR e o multiplicador ideais.
Tente outros tipos de médias móveis, como média móvel exponencial, média móvel Hull etc.
Adicionar outros indicadores para determinar a tendência do mercado e ajustar as posições quando a tendência mudar.
Otimizar o período da média móvel para encontrar o melhor equilíbrio.
Otimizar as condições para pausar a negociação, como definir um limiar de stop loss antes da suspensão.
Esta estratégia combina inteligentemente o indicador Supertrend com a negociação de curvas de ações, aproveitando os pontos fortes de ambas as técnicas. Os resultados dos testes mostram que, na maioria dos casos, a aplicação da negociação de curvas de ações realmente diminui a lucratividade. Como tal, esta estratégia é mais adequada para traders defensivos. Com a otimização de parâmetros e lógica, pode se tornar uma estratégia de negociação quantitativa muito prática.
/*backtest start: 2023-01-14 00:00:00 end: 2024-01-14 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy('Supertrend & Equity curve with EMA', overlay=false, format=format.price, precision=2, initial_capital=100000) eqlen = input.int(25, "EQ EMA len", group = "New Equity Curve Settings") shEQandMA = input.bool(true, "Show Original Equity Curve and MA") shEQfilt = input.bool(true, "Show Filtered Equity Curve by MA") Periods = input(title='ATR Period', defval=10, group = "SuperTrend Settings") src = input(hl2, title='Source', group = "SuperTrend Settings") Multiplier = input.float(title='ATR Multiplier', step=0.1, defval=3.0, group = "SuperTrend Settings") changeATR = input(title='Change ATR Calculation Method ?', defval=true, group = "SuperTrend Settings") //SuperTrend Code atr2 = ta.sma(ta.tr, Periods) atr = changeATR ? ta.atr(Periods) : atr2 up = src - Multiplier * atr up1 = nz(up[1], up) up := close[1] > up1 ? math.max(up, up1) : up dn = src + Multiplier * atr dn1 = nz(dn[1], dn) dn := close[1] < dn1 ? math.min(dn, dn1) : dn trend = 1 trend := nz(trend[1], trend) trend := trend == -1 and close > dn1 ? 1 : trend == 1 and close < up1 ? -1 : trend // Strategy main code buySignal = trend == 1 and trend[1] == -1 sellSignal = trend == -1 and trend[1] == 1 if buySignal strategy.entry('Long', strategy.long) if sellSignal strategy.entry('Short', strategy.short) //Equity Curve calcs eq = strategy.netprofit ch = ta.change(eq) neq = ch != 0 ? eq : na mova = ta.ema(neq,eqlen) // New Equity Curve var float neweq = 0 var int ttrades = 0 var int wintrades = 0 var int losetrades = 0 switch strategy.netprofit == strategy.netprofit[1] => na strategy.netprofit < mova and strategy.netprofit[1] > mova => neweq := neweq + ch strategy.netprofit < mova and strategy.netprofit[1] < mova => na strategy.netprofit > mova and strategy.netprofit[1] > mova => neweq := neweq + ch newch = ta.change(neweq) switch newch == 0 => na newch > 0 => wintrades := wintrades +1 ttrades := ttrades +1 newch < 0 => losetrades := losetrades +1 ttrades := ttrades +1 //plot(eq, linewidth = 2) //plot(mova, color=color.red) //plot(neweq, color= color.green, linewidth = 3) //Table var testTable = table.new(position = position.top_right, columns = 5, rows = 10, bgcolor = color.green, border_width = 1) table.cell(table_id = testTable, column = 0, row = 0, text = "Strategy: ", bgcolor=color.white) table.cell(table_id = testTable, column = 1, row = 0, text = "Original: ", bgcolor=color.white) table.cell(table_id = testTable, column = 2, row = 0, text = "Equity Curve EMA: ", bgcolor=color.white) table.cell(table_id = testTable, column = 0, row = 1, text = "Total Trades: ", bgcolor=color.white) table.cell(table_id = testTable, column = 0, row = 2, text = "Win Trades: ", bgcolor=color.white) table.cell(table_id = testTable, column = 0, row = 3, text = "Lose Trades: ", bgcolor=color.white) table.cell(table_id = testTable, column = 0, row = 4, text = "Win Rate: ", bgcolor=color.white) table.cell(table_id = testTable, column = 0, row = 5, text = "Net Profit: ", bgcolor=color.white) //Equity Curve EMA stat table.cell(table_id = testTable, column = 2, row = 1, text = str.tostring(ttrades), bgcolor=color.white) table.cell(table_id = testTable, column = 2, row = 2, text = str.tostring(wintrades), bgcolor=color.white) table.cell(table_id = testTable, column = 2, row = 3, text = str.tostring(losetrades), bgcolor=color.white) table.cell(table_id = testTable, column = 2, row = 4, text = str.tostring(math.round(100*wintrades/ttrades,2)), bgcolor=color.white) table.cell(table_id = testTable, column = 2, row = 5, text = str.tostring(math.round(neweq)), bgcolor=color.white) //Original Strategy stat // table.cell(table_id = testTable, column = 1, row = 1, text = str.tostring(strategy.closedtrades), bgcolor=color.white) // table.cell(table_id = testTable, column = 1, row = 2, text = str.tostring(strategy.wintrades), bgcolor=color.white) // table.cell(table_id = testTable, column = 1, row = 3, text = str.tostring(strategy.losstrades), bgcolor=color.white) // table.cell(table_id = testTable, column = 1, row = 4, text = str.tostring(math.round(100*strategy.wintrades/strategy.closedtrades,2)), bgcolor=color.white) // table.cell(table_id = testTable, column = 1, row = 5, text = str.tostring(math.round(strategy.netprofit)), bgcolor=color.white) //New Equity curve var newcurve = array.new_float(0) var int ida = 0 var bool printEQ = false if newch !=0 array.push(newcurve, neweq) if bar_index > last_bar_index - array.size(newcurve) - 1 - 20 and array.size(newcurve) > 20 printEQ := true else printEQ := false plot(printEQ and ida < strategy.closedtrades and shEQfilt ? array.get(newcurve, ida) : na, color=color.green, linewidth = 2) if printEQ ida := ida + 1 if ida >= array.size(newcurve) and printEQ ida := array.size(newcurve) -1 //Original Equity curve var newcurve2 = array.new_float(0) var int ida2 = 0 var bool printEQ2 = false if ch !=0 array.push(newcurve2, eq) if bar_index > last_bar_index - array.size(newcurve2) - 1 - 20 and array.size(newcurve2) > 20 printEQ2 := true else printEQ2 := false plot(printEQ2 and ida2 < strategy.closedtrades and shEQandMA ? array.get(newcurve2, ida2) : na, color=color.blue, linewidth = 2) if printEQ2 ida2 := ida2 + 1 if ida2 >= array.size(newcurve2) and printEQ2 ida2 := array.size(newcurve2) -1 //Moving Average Array var marray = array.new_float(0) if ch array.push(marray, mova) plot(printEQ2 and array.size(marray) > 40 and shEQandMA ? array.get(marray, ida2-1) : na, color=color.red, linewidth = 1) hline(0,"0 line", color=color.black, linestyle = hline.style_dotted) if (last_bar_index-1) and array.size(newcurve2) > 20 and array.size(newcurve) > 20 l = label.new(bar_index+2, array.get(newcurve2, array.size(newcurve2)-1), "Original Equity Curve", color=color.rgb(33, 149, 243, 85), textcolor = color.black, style = label.style_label_left) label.delete(l[1]) f = label.new(bar_index+2, array.get(newcurve, array.size(newcurve)-1), "Filtered Equity Curve", color=color.rgb(69, 238, 97, 85), textcolor = color.black, style = label.style_label_left) label.delete(f[1])