A estratégia de rastreamento de tendência do duplo EMA é uma estratégia quantitativa de negociação que usa indicadores duplos de EMA para determinar a direção da tendência do preço. Esta estratégia calcula dois indicadores de EMA com parâmetros diferentes e combina sinais de cruz de ouro e cruz morta para julgar a tendência do preço.
Os principais indicadores desta estratégia são dois conjuntos de EMAs, incluindo um ciclo mais longo EMA1 e um ciclo mais curto EMA2. O parâmetro EMA1 é 21 e o parâmetro EMA2 é 10. A estratégia calcula esses dois EMAs com base no ciclo de 4 horas.
Para filtrar os sinais errados, a estratégia define dois conjuntos de indicadores de cruz de ouro e cruz morta. Os sinais só são acionados quando ambos os conjuntos de indicadores emitem o mesmo sinal, o que pode reduzir efetivamente os erros causados por flutuações de preços.
A estrutura dual da EMA pode capturar eficazmente as alterações das tendências de curto e médio prazo para determinar as tendências.
A filtragem adicional de dois conjuntos de indicadores de cruz de ouro e cruz morta pode reduzir os sinais errôneos e evitar transacções desnecessárias causadas por flutuações de preços.
A utilização de níveis de 4 horas para o cálculo dos indicadores pode fazer face a flutuações de preços de alta frequência.
A estrutura da estratégia é simples e clara, fácil de compreender e implementar e adequada para aplicações de negociação quantitativa.
A dupla estrutura da EMA é menos eficaz no julgamento dos mercados de consolidação, pois longos períodos de consolidação podem gerar falsos sinais.
Os indicadores de nível de 4 horas não são sensíveis o suficiente para responder a eventos repentinos.
A estratégia baseia-se exclusivamente em indicadores técnicos sem combinar a análise fundamental.
Estes riscos podem ser controlados por:
Adicionar mais indicadores de EMA de ciclo temporal para estabelecer combinações de modelos.
Use a análise do sentimento do texto para determinar grandes eventos repentinos e ajustar dinamicamente as posições.
Associar alterações no ambiente económico, nas políticas e nos fundamentos da empresa para ajustar dinamicamente os parâmetros.
A estratégia pode ser melhorada:
Adicionar combinações de modelos: podem ser estabelecidas mais combinações de indicadores com diferentes parâmetros para melhorar a estabilidade da estratégia.
Acrescente mecanismos de stop loss. Pontos de stop loss razoáveis podem controlar efetivamente perdas individuais.
Optimização de parâmetros dinâmicos. Os parâmetros EMA podem ser otimizados automaticamente com base em diferentes ambientes de mercado.
Incorporar técnicas de aprendizagem de máquina. Modelos como o Tensorflow podem ser treinados para categorizar tendências de preços em tempo real.
/*backtest start: 2023-02-22 00:00:00 end: 2024-02-28 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=3 /// Component Code Startt testStartYear = input(2017, "Backtest Start Year") testStartMonth = input(01, "Backtest Start Month") testStartDay = input(1, "Backtest Start Day") testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0) testStopYear = input(2020, "Backtest Stop Year") testStopMonth = input(1, "Backtest Stop Month") testStopDay = input(1, "Backtest Stop Day") testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,0,0) // A switch to control background coloring of the test period testPeriodBackground = input(title="Color Background?", type=bool, defval=false) testPeriodBackgroundColor = testPeriodBackground and (time >= testPeriodStart) and (time <= testPeriodStop) ? #00FF00 : na bgcolor(testPeriodBackgroundColor, transp=97) testPeriod() => true // Component Code Stop strategy(title="Ema cross strat", overlay=true) margin = input(true, title="Margin?") Margin = margin ? margin : false resCustom = input(title="EMA Timeframe", defval="240" ) source = close, len2 = input(21, minval=1, title="EMA1") len3 = input(10, minval=1, title="EMA2") ema2 = request.security(syminfo.tickerid,resCustom,ema(source,len2), lookahead=barmerge.lookahead_off) ema3 = request.security(syminfo.tickerid,resCustom,ema(source,len3), lookahead=barmerge.lookahead_off) mylong = crossover(ema3, ema2) myshort = crossunder(ema3,ema2) last_long = na last_short = na last_long := mylong ? time : nz(last_long[1]) last_short := myshort ? time : nz(last_short[1]) in_long = last_long > last_short ? 2 : 0 in_short = last_short > last_long ? 2 : 0 mylong2 = crossover(ema3, ema2) myshort2 = crossunder(ema3, ema2) last_long2 = na last_short2 = na last_long2 := mylong2 ? time : nz(last_long2[1]) last_short2 := myshort2 ? time : nz(last_short2[1]) in_long2 = last_long2 > last_short2 ? 0 : 0 in_short2 = last_short2 > last_long2 ? 0 : 0 condlongx = in_long + in_long2 condlong = crossover(condlongx, 1.9) condlongclose = crossunder(condlongx, 1.9) condshortx = in_short + in_short2 condshort = crossover(condshortx, 1.9) condshortclose = crossover(condshortx, 1.9) if crossover(condlongx, 1.9) and testPeriod() and strategy.position_size <= 0 strategy.entry("Long", strategy.long, comment="Long") if crossover(condshortx, 1.9) and testPeriod() and strategy.position_size > 0 strategy.close("Long",when = not Margin) if crossover(condshortx, 1.9) and testPeriod() and strategy.position_size >= 0 strategy.entry("Short", strategy.short, comment="Short", when = Margin)