Versão extrema da estratégia de médias móveis de tendência da Noro

Autora:ChaoZhang, Data: 2024-01-31 17:00:53
Tags:

img

Resumo

Esta estratégia usa dois indicadores de média móvel para identificar a direção da tendência e as oportunidades de longo / curto. A média móvel mais lenta (linha azul) é usada para determinar a direção geral da tendência, enquanto a média móvel mais rápida (linha vermelha) combinada com o canal de preços é usada para descobrir oportunidades de negociação.

Estratégia lógica

  1. Calcule duas médias móveis - uma MA mais lenta com o período 21 para determinar a tendência geral e uma MA mais rápida com o período 5 que combina com o canal de preços para encontrar oportunidades de negociação.

  2. Verifique se o preço atual atravessa o canal de preços formado no período anterior.

  3. Contagem do número e direção de velas recentes. Por exemplo, várias velas de baixa consecutiva podem sinalizar uma oportunidade longa, enquanto velas de alta consecutivas podem sinalizar uma oportunidade curta.

  4. Combine todos os fatores acima para gerar sinais longos / curtos. Um sinal é acionado quando o movimento do preço se alinha com a direção da tendência MA mais lenta, o MA rápido ou o canal de preço produz sinal e o movimento do candelabro corresponde à condição.

Vantagens

  1. O sistema de média móvel dupla efetivamente acompanha a direção da tendência.

  2. Uma MA mais rápida e um canal de preços combinados detectam pontos de ruptura precoces para capturar oportunidades de negociação.

  3. Também considera a direção do candelabro e conta para evitar ser preso por reversões do mercado.

  4. Os parâmetros MA personalizáveis funcionam para diferentes produtos e prazos.

Riscos e atenuações

  1. Os MAs duplos podem produzir sinais falsos durante os mercados laterais.

  2. Ainda corre o risco de ficar preso em movimentos excepcionais do mercado.

  3. É impossível evitar completamente reversões, continuará a melhorar a lógica e os parâmetros para tornar a estratégia mais robusta.

Oportunidades de melhoria

  1. Adicione indicadores de apoio como ADX, MACD para evitar trocas erradas em mercados agitados.

  2. Calculo dinâmico de stop loss, por exemplo baseado no ATR e na preferência de risco.

  3. Optimização de parâmetros através de aprendizagem de máquina para capacidade adaptativa.

  4. Parâmetros de ajuste fino baseados nas características do instrumento, por exemplo, períodos mais curtos para criptomoedas.

Conclusão

No geral, esta estratégia funciona muito bem no acompanhamento de tendências de mercados, com oportunidades de ruptura adicionais. Com melhorias adequadas, pode ser transformada em uma estratégia quantitativa de alta qualidade comercialmente viável. Continuaremos a melhorá-la para negociar mais mercados de forma estável.


/*backtest
start: 2023-12-31 00:00:00
end: 2024-01-30 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=2
strategy(title = "Noro's Trend MAs Strategy v1.9 Extreme", shorttitle = "Trend MAs str 1.9 extreme", overlay=true, default_qty_type = strategy.percent_of_equity, default_qty_value=100.0, pyramiding=0)

//Settings
needlong = input(true, "long")
needshort = input(true, "short")
needstops = input(false, "stops")
stoppercent = input(5, defval = 5, minval = 1, maxval = 50, title = "Stop, %")
useohlc4 = input(false, defval = false, title = "Use OHLC4")
usefastsma = input(true, "Use fast MA Filter")
fastlen = input(5, defval = 5, minval = 1, maxval = 50, title = "fast MA Period")
slowlen = input(21, defval = 20, minval = 2, maxval = 200, title = "slow MA Period")
bars = input(2, defval = 2, minval = 0, maxval = 3, title = "Bars Q")
needbg = input(false, defval = false, title = "Need trend Background?")
needarr = input(false, defval = false, title = "Need entry arrows?")
needex = input(true, defval = true, title = "Need extreme? (crypto/fiat only!!!)")

src = useohlc4 == true ? ohlc4 : close

//PriceChannel 1
lasthigh = highest(src, slowlen)
lastlow = lowest(src, slowlen)
center = (lasthigh + lastlow) / 2

//PriceChannel 2
lasthigh2 = highest(src, fastlen)
lastlow2 = lowest(src, fastlen)
center2 = (lasthigh2 + lastlow2) / 2

//Trend
trend = low > center and low[1] > center[1] ? 1 : high < center and high[1] < center[1] ? -1 : trend[1]

//Bars
bar = close > open ? 1 : close < open ? -1 : 0
redbars = bars == 0 ? 1 : bars == 1 and bar == -1 ? 1 : bars == 2 and bar == -1 and bar[1] == -1 ? 1 : bars == 3 and bar == -1 and bar[1] == -1 and bar[2] == -1 ? 1 : 0
greenbars = bars == 0 ? 1 : bars == 1 and bar == 1 ? 1 : bars == 2 and bar == 1 and bar[1] == 1 ? 1 : bars == 3 and bar == 1 and bar[1] == 1 and bar[2] == 1 ? 1 : 0

//Signals
up = trend == 1 and (low < center2 or usefastsma == false) and (redbars == 1) ? 1 : 0
dn = trend == -1 and (high > center2 or usefastsma == false) and (greenbars == 1) ? 1 : 0

up2 = high < center and high < center2 and bar == -1 ? 1 : 0
dn2 = low > center and low > center2 and bar == 1 ? 0 : 0

//Lines
plot(center, color = blue, linewidth = 3, transp = 0, title = "Slow MA")
plot(center2, color = red, linewidth = 3, transp = 0, title = "PriceChannel 2")

//Arrows
plotarrow(up == 1 and needarr == true ? 1 : 0, colorup = black, colordown = black, transp = 0)
plotarrow(dn == 1 and needarr == true ? -1 : 0, colorup = black, colordown = black, transp = 0)

//Background
col = needbg == false ? na : trend == 1 ? lime : red
bgcolor(col, transp = 90)

//Alerts
alertcondition(up == 1, title='buy', message='Uptrend')
alertcondition(dn == 1, title='sell', message='Downtrend')

//Trading
stoplong = up == 1 and needstops == true ? close - (close / 100 * stoppercent) : stoplong[1]
stopshort = dn == 1 and needstops == true ? close + (close / 100 * stoppercent) : stopshort[1]

longCondition = up == 1 or (up2 == 1 and needex == true)
if (longCondition)
    strategy.entry("Long", strategy.long, needlong == false ? 0 : na)
    strategy.exit("Stop Long", "Long", stop = stoplong)

shortCondition = dn == 1
if (shortCondition)
    strategy.entry("Short", strategy.short, needshort == false ? 0 : na)
    strategy.exit("Stop Short", "Short", stop = stopshort)

Mais.