A ideia principal desta estratégia é combinar níveis de suporte/resistência e quebras de volume para determinar sinais de entrada e utilizar o indicador ATR para ajustar dinamicamente o stop loss para a obtenção de lucros, a fim de captar mais lucros potenciais.
A estratégia consiste nas seguintes lógicas principais:
Use ta.pivothigh e ta.pivotlow para calcular o preço mais alto das velas L_Bars anteriores e o preço mais baixo das velas R_Bars anteriores, como níveis de resistência e suporte.
Quando o preço de fechamento ultrapassar o nível de resistência e o volume ultrapassar o limiar do volumeRange, vá para longo.
Após a entrada longa, defina a perda de parada em close-ATR_LO. Após a entrada curta, defina a perda de parada em close+ATR_SH. Isso realiza o ajuste dinâmico da perda de parada de atraso.
Só receberá o primeiro sinal durante as horas de negociação (0915-1445) todos os dias, sem novas ordens após atingir o limite de risco diário definido pela entrada de risco.
Utilize a teoria de suporte/resistência combinada com o indicador de volume para melhorar a precisão de entrada.
O nível de stop loss de trailing baseado no ATR pode ser ajustado de forma flexível com base na volatilidade do mercado, reduzindo a possibilidade de retracement de lucro.
O controlo adequado dos horários diários de negociação e do risco por negociação ajuda a captar a tendência e evitar perdas de parada excessivas.
Os níveis de suporte/resistência podem falhar e não fornecer sinais de entrada eficazes.
O multiplicador ATR demasiado elevado pode conduzir a que a parada de perdas esteja demasiado distante, aumentando o risco de perda.
O limiar de volume demasiado baixo pode perder oportunidades, demasiado elevado pode causar falsos sinais.
Soluções:
Ajustar os parâmetros de suporte/resistência com base nas diferentes características dos produtos.
Otimizar os parâmetros do multiplicador ATR e do limiar de volume.
Adicionar outros indicadores para confirmar os sinais de entrada.
Adicionar outros indicadores como médias móveis para ajudar a determinar os sinais de entrada.
Otimizar parâmetros como o multiplicador ATR e o limiar de volume.
Usar algoritmos de aprendizagem de máquina para realizar a otimização de parâmetros dinâmicos.
Expandir a estratégia para outros produtos para encontrar padrões de parâmetros.
A estratégia integra várias ferramentas analíticas, aplicando métodos de suporte / resistência, volume e stop loss, e alcançou bons resultados de backtest.
/*backtest start: 2024-01-03 00:00:00 end: 2024-01-10 00:00:00 period: 30m basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // ____________ _________ _____________ // |____________| ||________| ||__________| // || ____ || || || ______ ________ _____ ________ // || | || || ||________|| | || || || || | || /\\ | // |______| || || |______| // || |===|| |=== ||__________ | || || || || |===|| /__\\ |=== || || \\ || // || | || ||___ || || |___|| ||___ ||___ || | || / \\ | \\ || || ___|| || // || ||________|| ||__________ // || ||________| ||__________| //@version=5 strategy("SUPPORT RESISTANCE STRATEGY [5MIN TF]",overlay=true ) L_Bars = input.int(defval = 10, minval = 1 , maxval = 50, step =1) R_Bars = input.int(defval = 15, minval = 1 , maxval = 50, step =1) volumeRange = input.int(20, title='Volume Break [threshold]', minval = 1) // ═══════════════════════════ // // ——————————> INPUT <——————— // // ═══════════════════════════ // EMA1 = input.int(title='PRICE CROSS EMA', defval = 150, minval = 10 ,maxval = 400) factor1 = input.float(title='_ATR LONG',defval = 3.2 , minval = 1 , maxval = 5 , step = 0.1, tooltip = "ATR TRAIL LONG") factor2 = input.float(title='_ATR SHORT',defval = 3.2 , minval = 1 , maxval = 5 , step = 0.1, tooltip = "ATR TRAIL SHORT") risk = input.float(title='RISK',defval = 200 , minval = 1 , maxval = 5000 , step = 50, tooltip = "RISK PER TRADE") var initialCapital = strategy.equity t = time(timeframe.period, '0915-1445:1234567') time_cond = not na(t) // ══════════════════════════════════ // // ———————————> EMA DATA <——————————— // // ══════════════════════════════════ // ema1 = ta.ema(close, EMA1) plot(ema1, color=color.new(color.yellow, 0), style=plot.style_linebr, title='ema1') // ══════════════════════════════════ // // ————————> TRAIL DATA <———————————— // // ══════════════════════════════════ // // *******Calculate LONG TRAIL data***** ATR_LO = ta.atr(14)*factor1 // *******Calculate SHORT TRAIL data***** ATR_SH = ta.atr(14)*factor2 long_trail = close - ATR_LO short_trail = close + ATR_SH // Plot atr data //plot(longStop, color=color.new(color.green, 0), style=plot.style_linebr, title='Long Trailing Stop') //plot(shortStop , color=color.new(color.red, 0), style=plot.style_linebr, title='Short Trailing Stop') // ══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════ // // ————————————————————————————————————————————————————————> RESISTANCE/SUPPORT LEVELS DATA <————————————————————————————————————————————————————————————————————————————————————————————— // // ══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════ // Resistance_pi = fixnan(ta.pivothigh(L_Bars, R_Bars)[1]) Support_pi = fixnan(ta.pivotlow(L_Bars, R_Bars)[1]) r1 = plot(Resistance_pi, color=ta.change(Resistance_pi) ? na : color.red, offset=-(R_Bars + 1),linewidth=2, title='RESISTANCE') s1 = plot(Support_pi, color=ta.change(Support_pi) ? na : color.green, offset=-(R_Bars + 1),linewidth=2, title='SUPPORT') //Volume vol_1 = ta.ema(volume, 5) vol_2 = ta.ema(volume, 10) osc_vol = 100 * (vol_1 - vol_2) / vol_2 // ══════════════════════════════════// // ————————> LONG POSITIONS <————————// // ══════════════════════════════════// //******barinstate.isconfirmed used to avoid repaint in real time******* if ( ta.crossover(close, Resistance_pi) and osc_vol > volumeRange and not(open - low > close - open) and strategy.opentrades==0 and barstate.isconfirmed and time_cond and close >= ema1 ) strategy.entry(id= "Long" ,direction = strategy.long, comment = "BUY") plot(long_trail , color=color.new(color.blue, 0), style=plot.style_linebr, title='long Stop') if strategy.position_size > 0 strategy.exit("long tsl", "Long" , stop = long_trail ,comment='SELL') // ═════════════════════════════════════// // ————————> SHORT POSITIONS <————————— // // ═════════════════════════════════════// if ( ta.crossunder(close, Support_pi) and osc_vol > volumeRange and not(open - close < high - open) and strategy.opentrades==0 and barstate.isconfirmed and time_cond and close <= ema1 ) strategy.entry(id = "Short" ,direction = strategy.short, comment = "SELL") if strategy.position_size < 0 strategy.exit("short tsl", "Short" , stop = short_trail ,comment='BUY') // ════════════════════════════════════════════════// // ————————> CLOSE ALL POSITIONS BY 3PM <————————— // // ════════════════════════════════════════════════// strategy.close_all(when = hour == 14 and minute == 55) // ════════════════════════════════════════// // ————————> MAX INTRADAY LOSS <————————— // // ════════════════════════════════════════// // strategy.risk.max_intraday_loss(type = strategy.cash, value = risk)