
A estratégia de cruzamento de média móvel é uma estratégia de análise técnica muito clássica e comum. A ideia central da estratégia é usar cruzamentos entre médias móveis de diferentes períodos como um sinal de compra. Um sinal de compra é gerado quando uma média móvel de curto prazo atravessa a média móvel de longo prazo de baixo; um sinal de venda é gerado quando uma média móvel de curto prazo atravessa a média móvel de longo prazo de cima para baixo.
A estratégia usa o tipo de média móvel (SMA, EMA, WMA, RMA) e a duração do período, bem como o intervalo de tempo de retrospecção.
Calcule os diferentes tipos de médias móveis em funções variantes. As médias móveis calculadas são mantidas pela variável ma.
Quando o preço de fechamento está acima de ma, gera um sinal de compra; quando o preço de fechamento está abaixo de ma, gera um sinal de venda.
Para definir o stop loss, calcule a amplitude média real de oscilação de 14 ciclos através de atr. Utilize o ponto de passagem como referência, aumentando ou diminuindo 2 vezes atr como o intervalo de stop loss.
A lógica de entrada e saída é a seguinte:
Entrada múltipla: close sobre ma e no tempo de retorno, o ponto de parada é o ponto de entrada close Parar de partida quando o preço mais alto excede o ponto de entrada, ou quando o preço mais alto excede o ponto de entrada, ou quando o preço mais alto excede o ponto de entrada, ou quando o preço mais alto excede o ponto de entrada. Entrada a céu aberto: close abaixo do ma e, no tempo de retorno, o ponto de parada é o ponto de entrada close Saída de cabeça vazia: fechar em cima usando ma mais 2 vezesatr para parar a saída, ou o preço mínimo abaixo do ponto de entrada fechar menos 2 vezesatr para parar a saída
Otimizar para o risco pode ser feito através de:
A estratégia pode ser melhorada em vários aspectos:
A estratégia de cruzamento de média móvel é uma estratégia de análise técnica muito típica e comum. A ideia central da estratégia é simples, fácil de implementar e aplicável a todos os mercados, e é uma das estratégias de entrada para negociação quantitativa. Mas a estratégia também tem alguns problemas, como a geração de sinais frequentes, fácil de parar, etc.
/*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] )