
A estratégia é baseada em um cruzamento de duas médias móveis de diferentes configurações de parâmetros para emitir um sinal de compra e venda. Um sinal de compra é emitido quando uma média móvel de curto período quebra uma média móvel de longo período em uma direção inferior; um sinal de venda é emitido quando uma média móvel de curto período quebra uma média móvel de longo período em uma direção superior.
A estratégia é escrita usando a linguagem de script pine. Primeiro, define o tipo, a duração e a origem dos preços de duas médias móveis, denominadas p1 e p2, respectivamente. P1 representa a média de um período mais curto e p2 representa a média de um período mais longo.
A função de crossover e crossunder julga a interseção de duas linhas de equilíbrio. Quando p1 atravessa p2 de baixo, emite um sinal de compra; quando p1 atravessa p2 de cima, emite um sinal de venda.
Para executar uma transação, a estratégia cria uma posição de cabeça ou de cabeça vazia ao emitir um sinal através da função strategy.entry. Se o parâmetro shortOnly estiver ativado, apenas a transação vende um sinal.
A estratégia tem as seguintes vantagens:
A estratégia também apresenta alguns riscos:
Pode-se reduzir o sinal de invalidez através do ajuste do comprimento da linha média, da introdução de condições de filtragem, etc. Pode-se também combinar o indicador de tendência para determinar o movimento da bolsa principal.
A estratégia pode ser melhorada em vários aspectos:
A introdução de uma média ponderada de volume ou um preço típico como fonte de preço aumenta a confiabilidade do sinal cruzado
Aumentar o período de validação para evitar erros de cruzamento de curto prazo
Combinado com um stop loss ATR, definindo o máximo de perdas suportáveis em função da amplitude das flutuações do mercado
Parâmetros de otimização de encaixe de curva para encontrar a combinação de parâmetros ótima
Considere emitir sinais de negociação somente quando a tendência do grande ciclo for consistente
A estratégia de cruzamento de duas linhas uniformes é fácil de entender e implementar, formando sinais de negociação através do cruzamento de duas linhas uniformes, e pode ser altamente personalizada. Mas também pode produzir sinais de invalidez em situações de turbulência. O risco pode ser reduzido por meio de otimização de parâmetros e otimização de regras, cujo espaço de otimização é grande e vale a pena estudar mais.
/*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"}]
*/
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © RafaelPiccolo
//@version=4
strategy("Double MA Cross", overlay=true)
type1 = input("SMA", "MA Type 1", options=["SMA", "EMA", "WMA", "HMA", "VWMA", "RMA", "TEMA"])
len1 = input(10, minval=1, title="Length 1")
src1 = input(close, "Source 1", type=input.source)
type2 = input("SMA", "MA Type 2", options=["SMA", "EMA", "WMA", "HMA", "VWMA", "RMA", "TEMA"])
len2 = input(50, minval=2, title="Length 2")
src2 = input(close, "Source 2", type=input.source)
shortOnly = input(false, "Short only")
tema(src, len)=>
ema1 = ema(src, len)
ema2 = ema(ema1, len)
ema3 = ema(ema2, len)
return = 3 * (ema1 - ema2) + ema3
getPoint(type, len, src)=>
return = type == "SMA" ? sma(src, len) : type == "EMA" ? ema(src, len) : type == "WMA" ? wma(src, len) : type == "HMA" ? hma(src, len) : type == "VWMA" ? vwma(src, len) : type == "RMA" ? rma(src, len) : tema(src, len)
p1 = getPoint(type1, len1, src1)
p2 = getPoint(type2, len2, src2)
shortCondition = crossunder(p1, p2)
longCondition = crossover(p1, p2)
if (shortCondition)
strategy.entry("Short", strategy.short)
if (longCondition)
if (shortOnly)
strategy.close("Short")
else
strategy.entry("Long", strategy.long)
plot(p1, "MA 1", p1 < p2 ? color.red : color.green)
plot(p2, "MA 2", color.blue)