Esta estratégia utiliza os princípios de cruzamento entre médias móveis rápidas e lentas para determinar as direções da tendência do mercado e gerar sinais de compra e venda.
A estratégia emprega duas médias móveis, uma linha rápida e uma linha lenta. A linha rápida usa a EMA de 3 dias e a linha lenta usa a EMA de 15 dias. Quando a linha rápida cruza acima da linha lenta de baixo, ela indica uma tendência de alta e dá um sinal de compra. Pelo contrário, quando a linha rápida cruza abaixo da linha lenta de cima, ela sinaliza uma tendência de baixa e dá um sinal de venda.
A estratégia também define uma EMA de 3 dias mais rápida como a linha de saída rápida. Quando o preço quebra abaixo desta linha de saída rápida, ele julga que a tendência se inverteu e deve sair da posição longa existente. Da mesma forma, quando o preço quebra acima da linha de saída, ele indica uma tendência de alta renovada e dá um sinal para voltar a entrar em longo.
Os sinais de funcionamento específicos são definidos como:
Linha rápida cruza acima linha lenta de baixo, vai longo
Linha rápida cruza abaixo linha lenta de cima, vai curto
Preço abaixo da linha de saída rápida, fechar posição longa
O preço retorna acima da linha de saída rápida, reentrada longa
Simples de usar, apenas precisa configurar dois parâmetros de média móvel, fácil de implementar
Dados de backtesting suficientes, utilizando indicadores comuns para avaliar a viabilidade
Muitos parâmetros configuráveis para otimização
Adota a linha de saída rápida como stop loss para melhor controlar o risco
Lógica estratégica clara, sinais explícitos de compra e venda
Frequência de operação adequada, evitar excesso de negociação
São propensos a mais sinais falsos quando a tendência não é clara como a tendência segue a estratégia
As médias móveis têm natureza atrasada, podem perder pontos de viragem
Parâmetros fixos não podem adaptar-se às alterações do mercado, necessitam de otimização
Stop loss pode ser demasiado fraco, incapaz de parar a perda a tempo
Os sinais frequentes podem conduzir a custos de negociação mais elevados
Os sinais podem divergir e necessitam de confirmação com outros indicadores
Os riscos podem ser geridos pela otimização de parâmetros, adição de filtros, relaxamento de stop loss, atualização de parâmetros em tempo útil, etc.
Teste e otimização dos parâmetros para melhor adaptá-los às condições de mercado
Introduzir mais indicadores para formar um sistema robusto
Construir configurações de parâmetros adaptáveis com base no mercado em tempo real
Aplicar modelos de aprendizagem de máquina para otimização mais inteligente
Definição de paralisação dinâmica ou de paralisação para melhor controlo do risco
Combinar indicadores de volume para evitar divergências
Esta é uma estratégia de cruzamento de média móvel dupla relativamente simples. Determina a tendência do mercado e os sinais de negociação com base na interação entre médias móveis rápidas e lentas. A estratégia é fácil de implementar e pode ser adaptada por meio de otimização. Mas também tem alguns riscos. Mais filtros são necessários para confirmar sinais e gerenciar riscos. Quando adequadamente otimizado e aplicado à negociação de médio prazo, pode se tornar um sistema de negociação quantitativa muito prático.
/*backtest start: 2023-01-01 00:00:00 end: 2023-02-03 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © ehaarjee, ECHKAY, JackBauer007 //@version=4 //study(title="Tale_indicators", overlay=true) strategy("Tale Indicators Strategy", overlay=true, precision=8, max_bars_back=200, pyramiding=0, initial_capital=20000, commission_type="percent", commission_value=0.1) len_fast = input(3, minval=1, title="FAST EMA") src_fast = input(close, title="Source for Fast") fastMA = ema(src_fast, len_fast) plot(fastMA, title="Slow EMA", color=color.orange) len_slow = input(15, minval=1, title="SLOW EMA") src_slow = input(close, title="Source for Slow") slowMA = ema(src_slow, len_slow) plot(slowMA, title="Fast EMA", color=color.blue) len_fast_exit = input(3, minval=1, title="FAST EMA Exit") src_fast_exit = input(close, title="Source for Fast Exit") fastMAE = ema(src_fast_exit, len_fast_exit) plot(fastMAE, title="Fast EMA Ex", color=color.red) src_slow_enter_short = input(low, title="Source for Short Entry") slowMASEn = ema(src_slow_enter_short, len_slow) src_slow_enter_long = input(high, title="Source for Long Entry") slowMALEn = ema(src_slow_enter_long, len_slow) src_slow_exit_short = input(low, title="Source for Short Exit") slowMASEx = ema(src_slow_enter_short, len_slow) src_slow_exit_long = input(high, title="Source for Long Exit") slowMALEx = ema(src_slow_enter_long, len_slow) enter_long = crossover(fastMA, slowMALEn) enter_short = crossunder(fastMA, slowMASEn) exit_long = crossunder(fastMAE, slowMALEx) exit_short = crossover(fastMAE, slowMALEx) out_enter = iff(enter_long == true, 1, iff(enter_short == true, -1, 0)) plotarrow(out_enter, "Plot Enter Points", colorup=color.green, colordown=color.red, maxheight = 30) bull = fastMA > slowMALEn bear = fastMA < slowMASEn c = bull ? color.green : bear ? color.red : color.white bgcolor(c) exit_tuner = input(0.005, title="Exit Tuner to touch slowEMA") bull_exit = (bull and (low>(fastMAE*(1+exit_tuner)))) or exit_long or (not(bear) and (fastMAE>high)) bear_exit = (bear and ((fastMAE*(1-exit_tuner))>high)) or exit_short or (not(bull) and (low>fastMAE)) bull_r = (bull and ((bull_exit[1]) or (bull_exit[2] and bull_exit[1])) and (low<=fastMAE)) bear_r = (bear and ((bear_exit[1]) or (bull_exit[2] and bull_exit[1])) and (fastMAE<=high)) bull_re = (bull and (low<slowMALEn)) and not(enter_long) bear_re = (bear and (high>slowMASEn)) and not(enter_short) bull_ree = (bull and ((low<slowMALEn) and not(bull_re[1] or enter_long[1]))) bear_ree = (bear and ((high>slowMASEn) and not(bear_re[1] or enter_short[1]))) bull_reenter = (bull_r) and not(enter_long) bear_reenter = (bear_r) and not(enter_short) plotshape(bull_exit, "Plot Bull Exit", style = shape.arrowdown, color=color.green, size=size.small, text="ExL", location=location.abovebar) plotshape(bear_exit, "Plot Bear Exit", style = shape.arrowup, color=color.red, size=size.small, text="ExS", location=location.belowbar) plotshape(bull_reenter, "Plot Bull ReEnter", style = shape.arrowup, color=color.green, size=size.small, text="ReL", location=location.belowbar) plotshape(bear_reenter, "Plot Bear ReEnter", style = shape.arrowdown, color=color.red, size=size.small, text="ReS", location=location.abovebar) run_strategy = input(true, title="Run Strategy") // === INPUT BACKTEST RANGE === fromMonth = input(defval = 1, title = "From Month", type = input.integer, minval = 1, maxval = 12) fromDay = input(defval = 1, title = "From Day", type = input.integer, minval = 1, maxval = 31) fromYear = input(defval = 2020, title = "From Year", type = input.integer, minval = 2000) thruMonth = input(defval = 1, title = "Thru Month", type = input.integer, minval = 1, maxval = 12) thruDay = input(defval = 1, title = "Thru Day", type = input.integer, minval = 1, maxval = 31) thruYear = input(defval = 2100, title = "Thru Year", type = input.integer, minval = 2000) // === INPUT SHOW PLOT === showDate = input(defval = true, title = "Show Date Range", type = input.bool) // === FUNCTION EXAMPLE === start = timestamp(fromYear, fromMonth, fromDay, 00, 00) // backtest start window finish = timestamp(thruYear, thruMonth, thruDay, 23, 59) // backtest finish window window() => true // create function "within window of time" var long_position_open = false var short_position_open = false if (enter_long and not(bull_exit) and not(long_position_open)) // strategy.entry("LO", strategy.long, qty=4) long_position_open := true if (short_position_open) // strategy.close("SO") short_position_open := false if (bull_reenter and not(long_position_open)) // strategy.entry("LO", strategy.long, qty=1) long_position_open := true if (bull_exit and long_position_open) // strategy.close("LO") long_position_open := false if (enter_short and not(bear_exit) and not(short_position_open)) // strategy.entry("SO", strategy.short, qty=4) short_position_open := true if(long_position_open) // strategy.close("LO") long_position_open := false if (bear_reenter and not(short_position_open)) // strategy.entry("SO", strategy.long, qty=1) long_position_open := true if (bear_exit and short_position_open) // strategy.close("SO") short_position_open := false if(run_strategy) strategy.entry("LO", strategy.long, when=(window() and enter_long), qty=4) strategy.entry("LO", strategy.long, when=(window() and bull_reenter and not(long_position_open)), qty=1) strategy.close("LO", when=(window() and bull_exit and long_position_open)) strategy.entry("SO", strategy.short, when=(window() and enter_short), qty=4) strategy.entry("SO", strategy.short, when=(window() and bear_reenter and not(short_position_open)), qty=1) strategy.close("SO", when=(window() and bear_exit and short_position_open))