Esta estratégia gera sinais de entrada LONG ou SHORT quando a média móvel simples rápida de 30 dias e a média móvel simples lenta de 33 dias do preço da ação se cruzam.
O núcleo desta estratégia é calcular a MA rápida de 30 dias e a MA lenta de 33 dias. A linha rápida pode responder às mudanças de preço mais rapidamente, enquanto a linha lenta tem um melhor efeito de filtragem. Quando a linha rápida quebra a linha lenta para cima, um sinal de compra é gerado. Isso indica que o preço começa a subir e a linha rápida respondeu enquanto a linha lenta ainda está atrasada. Quando a linha rápida quebra a linha lenta para baixo, um sinal de venda é gerado. Isso indica que o preço começa a diminuir enquanto a linha rápida respondeu, mas a linha lenta ainda está atrasada.
Através de um projeto de cruzamento MA rápido e lento, ele pode gerar sinais de negociação quando uma nova tendência começa e sai em sinais opostos, capturando efetivamente tendências de preços de médio a longo prazo.
A estratégia apresenta as seguintes vantagens:
Há também alguns riscos para esta estratégia:
Métodos como otimização de parâmetros, definição do nível de stop loss, negociação apenas quando a tendência é clara, etc. podem ser utilizados para controlar e reduzir esses riscos.
A estratégia pode ser otimizada nos seguintes aspectos:
Através de testes e otimização, as regras da estratégia podem ser continuamente melhoradas para obter sinais de negociação mais confiáveis em diferentes ambientes de mercado.
Em resumo, esta estratégia de ruptura de cruzamento duplo MA é bastante simples e prática. Combinando MA rápido e MA lento, ele pode identificar efetivamente o início das tendências de médio a longo prazo e gerar sinais de negociação relativamente confiáveis. Além disso, sua regra de stop loss é fácil de implementar. Com otimização adicional, esta estratégia pode se tornar um sistema quantitativo de longo prazo que vale a pena.
/*backtest start: 2022-11-20 00:00:00 end: 2023-11-26 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=3 //future strategy //strategy(title = "es1!_1minute_hull", default_qty_type = strategy.fixed, initial_capital=250000, overlay = true, commission_type=strategy.commission.cash_per_contract,commission_value=2, calc_on_order_fills=false, calc_on_every_tick=false,pyramiding=0) //strategy.risk.max_position_size(2) //stock strategy strategy(title = "stub", default_qty_type = strategy.percent_of_equity, default_qty_value = 100, initial_capital=1000000, overlay = false)//, calc_on_order_fills=true, calc_on_every_tick=true) //forex strategy //strategy(title = "stub", default_qty_type = strategy.percent_of_equity, default_qty_value = 100, overlay = true,initial_capital=250000, default_qty_type = strategy.percent_of_equity) //crypto strategy //strategy(title = "stub", default_qty_type = strategy.percent_of_equity, default_qty_value = 100, overlay = true, commission_type=strategy.commission.percent,commission_value=.005,default_qty_value=10000) //strategy.risk.allow_entry_in(strategy.direction.long) // There will be no short entries, only exits from long. testStartYear = 2010 testStartMonth = 1 testStartDay = 1 testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0) testEndYear = 2039 testEndMonth = 1 testEndDay = 1 testPeriodEnd = timestamp(testEndYear,testEndMonth,testEndDay,0,0) testPeriod() => //true time >= testPeriodStart and time <= testPeriodEnd ? true : false fast_length = 30 slow_length = 33 ema1 = 0.0 ema2 = 0.0 volumeSum1 = sum(volume, fast_length) volumeSum2 = sum(volume, slow_length) //ema1 := (((volumeSum1 - volume) * nz(ema1[1]) + volume * close) / volumeSum1) ema1 := ema(close,fast_length) //ema2 := (((volumeSum2 - volume) * nz(ema2[1]) + volume * close) / volumeSum2) ema2 := ema(close,slow_length) plot(ema1,color=#00ff00, linewidth=3) plot(ema2, color=#ffff00, linewidth=3) go_long = crossover(ema1,ema2) go_short = crossunder(ema1,ema2) if testPeriod() strategy.entry("long_ride", strategy.long, when=go_long) strategy.entry("short_ride", strategy.short,when=go_short) strategy.close("long_ride",when=go_short) strategy.close("short_ride",when=go_long)