Esta é uma estratégia de negociação personalizada que combina indicadores de impulso e filtragem de entidades de velas. Ele usa abrangentemente três indicadores técnicos - Índice de Momentum Estocástico, RSI rápido e filtragem de entidades de velas para implementar uma estratégia baseada em avanço de impulso, considerando também condições de sobrecompra e sobrevenda.
A estratégia utiliza os seguintes três indicadores para o julgamento dos sinais de negociação:
Índice de Momento Estocástico (SMI): Combina o espaçamento entre as entidades do candelabro e a posição relativa do preço de fechamento para julgar a força ou fraqueza do momento do preço.
RSI rápido (linha de 7 dias): Ele julga as condições de sobrecompra e sobrevenda dos preços. RSI abaixo de 20 gera um sinal de compra como sobrevendido enquanto acima de 80 gera um sinal de venda como sobrecomprado.
Candlestick Entity Filter: Calcule o tamanho médio da entidade do candelabro nos últimos 10 dias.
A estratégia julga primeiro os sinais do SMI e do RSI. Se qualquer requisito de sinal de indicador for atendido, em seguida, combine o filtro de entidade de velas para determinar se esse sinal é válido e gere um sinal de negociação se válido.
A estratégia apresenta as seguintes vantagens:
O julgamento é mais preciso e confiável com a combinação de múltiplos indicadores.
A adição de filtro de entidade de velas evita sinais inválidos.
Ao combinar condições de sobrecompra/supervenda, é mais fácil captar sinais em pontos de inversão da tendência.
Aumentar as oportunidades de lucro com negociações longas/cortas bidirecionais.
A negociação de posições parciais evita perdas excessivas por ocasião única.
A estratégia apresenta também alguns riscos:
Os indicadores podem gerar sinais falsos levando a perdas.
A negociação de posições parciais não pode utilizar plenamente as oportunidades de tendência em cada direção.
Como o principal indicador, o SMI é sensível às configurações dos parâmetros.
A frequente negociação com uma estratégia bidirecional aumenta os custos de transação.
A estratégia pode ser ainda melhorada nos seguintes aspectos:
Otimizar os parâmetros do SMI e do RSI para encontrar as melhores combinações de parâmetros.
Aumentar o tamanho das posições e os mecanismos de gestão das posições para obter rendimentos mais elevados durante as tendências.
Adicionar estratégias de stop loss para reduzir o risco de perda única.
Combinar mais indicadores para avaliar a fiabilidade do sinal e reduzir os falsos sinais.
Adotar contratos eficientes para reduzir os custos de transacção.
A estratégia utiliza de forma abrangente o SMI, o RSI rápido e os indicadores de filtragem de entidades de velas para implementar uma estratégia de negociação personalizada baseada em impulso, sobrecompra/supervenda consciente. Tem vantagens como julgamento preciso, identificação de sinais válidos, combinação de condições de sobrecompra/supervenda e negociação bidirecional, mas também riscos como sensibilidade de parâmetros, incapacidade de capitalizar totalmente as tendências e operações frequentes. Ao otimizar continuamente os parâmetros, aumentar o tamanho da posição e o gerenciamento de stop loss, reduzir sinais falsos, etc., a estratégia pode alcançar um melhor desempenho comercial.
/*backtest start: 2023-10-23 00:00:00 end: 2023-11-22 00:00:00 period: 6h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //Noro //2018 //@version=2 strategy(title = "Noro's Stochastic Strategy v1.2", shorttitle = "Stochastic str 1.2", overlay = false, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 0) //Settings needlong = input(true, defval = true, title = "Long") needshort = input(true, defval = true, title = "Short") usemar = input(false, defval = false, title = "Use Martingale") capital = input(100, defval = 100, minval = 1, maxval = 10000, title = "Capital, %") usesmi = input(true, defval = true, title = "Use SMI Strategy") usersi = input(true, defval = true, title = "Use RSI Strategy") usebod = input(true, defval = true, title = "Use Body-Filter") a = input(5, "SMI Percent K Length") b = input(3, "SMI Percent D Length") limit = input(50, defval = 50, minval = 1, maxval = 100, title = "SMI Limit") fromyear = input(2017, defval = 2017, minval = 1900, maxval = 2100, title = "From Year") toyear = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year") frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month") tomonth = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month") fromday = input(01, defval = 01, minval = 01, maxval = 31, title = "From day") today = input(31, defval = 31, minval = 01, maxval = 31, title = "To day") //Fast RSI fastup = rma(max(change(close), 0), 7) fastdown = rma(-min(change(close), 0), 7) fastrsi = fastdown == 0 ? 100 : fastup == 0 ? 0 : 100 - (100 / (1 + fastup / fastdown)) //Stochastic Momentum Index ll = lowest (low, a) hh = highest (high, a) diff = hh - ll rdiff = close - (hh+ll)/2 avgrel = ema(ema(rdiff,b),b) avgdiff = ema(ema(diff,b),b) SMI = avgdiff != 0 ? (avgrel/(avgdiff/2)*100) : 0 SMIsignal = ema(SMI,b) //Lines plot(SMI, color = blue, linewidth = 3, title = "Stochastic Momentum Index") plot(SMIsignal, color = red, linewidth = 3, title = "SMI Signal Line") plot(limit, color = black, title = "Over Bought") plot(-1 * limit, color = black, title = "Over Sold") plot(0, color = blue, title = "Zero Line") //Body Filter nbody = abs(close - open) abody = sma(nbody, 10) body = nbody > abody / 3 or usebod == false //Signals up1 = SMI < -1 * limit and close < open and body and usesmi dn1 = SMI > limit and close > open and body and usesmi up2 = fastrsi < 20 and close < open and body and usersi dn2 = fastrsi > 80 and close > open and body and usersi exit = ((strategy.position_size > 0 and close > open) or (strategy.position_size < 0 and close < open)) and body //Trading profit = exit ? ((strategy.position_size > 0 and close > strategy.position_avg_price) or (strategy.position_size < 0 and close < strategy.position_avg_price)) ? 1 : -1 : profit[1] mult = usemar ? exit ? profit == -1 ? mult[1] * 2 : 1 : mult[1] : 1 lot = strategy.position_size == 0 ? strategy.equity / close * capital / 100 * mult : lot[1] if up1 or up2 if strategy.position_size < 0 strategy.close_all() strategy.entry("long", strategy.long, needlong == false ? 0 : lot, when=(time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59))) if dn1 or dn2 if strategy.position_size > 0 strategy.close_all() strategy.entry("Short", strategy.short, needshort == false ? 0 : lot, when=(time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59))) if time > timestamp(toyear, tomonth, today, 23, 59) or exit strategy.close_all()