A estratégia de cruzamento da média móvel é uma estratégia de análise técnica muito clássica e comumente usada. A ideia central desta estratégia é usar o cruzamento entre as médias móveis de diferentes períodos como sinais de negociação. Quando a média móvel de curto prazo cruza acima da média móvel de longo prazo de baixo, um sinal de compra é gerado. Quando a média móvel de curto prazo cruza abaixo da média móvel de longo prazo de cima, um sinal de venda é gerado.
Esta estratégia utiliza dados de entrada para definir o tipo (SMA, EMA, WMA, RMA) e o período da média móvel, bem como o intervalo de tempo de backtesting.
Os diferentes tipos de médias móveis são calculados na função variável. A média móvel calculada é guardada na variável ma.
Quando o preço de fechamento cruza acima de ma, um sinal de compra é gerado.
Para definir um stop loss, é calculado o intervalo verdadeiro médio de 14 períodos atr.
A lógica específica de entrada e saída é a seguinte:
Entrada longa: cruzes próximas acima de ma e dentro do intervalo de tempo do backtest, ponto de stop loss é o ponto de entrada próximo
Saída longa: fechar cruzes abaixo de ma menos 2 vezes atr para saída stop loss ou preço mais alto excede o ponto de entrada fechar mais 2 vezes atr para saída take profit
Entrada curta: fechar cruzes abaixo de ma e dentro do intervalo de tempo do backtest, ponto de stop loss é ponto de entrada fechado
Saída curta: fechar cruzes acima de ma mais 2 vezes atr para saída de stop loss ou fechar o preço mais baixo abaixo do ponto de entrada menos 2 vezes atr para saída de take profit
Para enfrentar os riscos, podem ser realizadas otimizações nos seguintes aspectos:
Esta estratégia pode ser otimizada nos seguintes aspectos:
A estratégia de cruzamento de média móvel é uma estratégia de análise técnica muito típica e comumente usada. A ideia central da estratégia é simples e fácil de implementar, adequada para vários mercados, e é uma das estratégias de negociação quantitativa de nível de entrada. No entanto, a estratégia também tem alguns problemas como gerar sinais frequentes e ser propensa a parar de perder. Com otimizações adequadas, o desempenho pode ser muito melhorado.
/*backtest start: 2023-10-03 00:00:00 end: 2023-11-02 00:00:00 period: 2h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 strategy("MA Cross Strategy", overlay=true,commission_value = 0.1) type = input(defval = "WMA", title = "MA Type: ", options=["RMA", "SMA", "EMA", "WMA"]) length = input(28) source = close // === INPUT BACKTEST RANGE === FromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31) FromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12) FromYear = input(defval = 2000, title = "From Year", minval = 2000) // === FUNCTION EXAMPLE === start = timestamp(FromYear, FromMonth, FromDay, 00, 00) // backtest start window finish = timestamp(9999, 1, 1, 23, 59) // backtest finish window window() => time >= start and time <= finish ? true : false // create function "within window of time" variant(type, src, len) => v1 = sma(src, len) // Simple v2 = ema(src, len) // Exponential v5 = wma(src, len) // Weighted v7 = rma(src, len) // Smoothed type=="EMA"?v2 : type=="WMA"?v5 : type=="RMA"?v7 : v1 ma = variant(type,source, length) atr = security(syminfo.tickerid, "D", atr(14)) range = valuewhen(cross(close,ma), (atr*2), na) ep = valuewhen(cross(close,ma), close, na) plot(ma,color=ma>ma[1]?color.blue:color.red,transp=0,linewidth=1) plot(ep,color=#2196f3,transp=100,trackprice=true, offset=-9999) plot(ep+range,color=#2196f3,transp=100,trackprice=true, offset=-9999) plot(ep-range,color=#2196f3,transp=100,trackprice=true, offset=-9999) strategy.entry("Long Entry", true, when = crossover(close,ma) and window() , stop = ep ) strategy.exit("Long Exit", "Long Entry", stop = ep-range) strategy.exit("Long Exit", "Long Entry", when = high > ep+range ,stop = ep[1] ) strategy.entry("Short Entry", false, when = crossunder(close,ma) and window() , stop = ep ) strategy.exit("Short Exit", "Short Entry", stop = ep+range) strategy.exit("Short Exit", "Short Entry", when = low < ep-range ,stop = ep[1] )