Estratégia de cruzamento de médias móveis duplas com médias móveis de vários tipos

Autora:ChaoZhang, Data: 2023-09-19 21:27:31
Tags:

Resumo

Esta estratégia gera sinais de negociação através do cálculo do cruzamento de vários tipos de médias móveis, implementando o cruzamento duplo de MA longo e curto.

Estratégia lógica

  1. Calcular dois MA: MA1 e MA2, que podem escolher entre SMA, EMA, VWMA, etc. Os comprimentos são personalizáveis.

  2. Determinação do cruzamento MA: longo quando o MA1 cruza o MA2, posição fechada quando o MA1 cruza abaixo do MA2.

  3. (Opcional) Calcule um terceiro MA - MA3, geralmente com um período mais longo como 50. Acima de MA3 é tendência de alta, abaixo é tendência de baixa.

  4. Combine as regras com o prazo de backtest para gerar sinais comerciais.

  5. Preencha com cor as áreas cruzadas para ajuda visual.

A estratégia combina o seguimento da tendência dos MA e o cruzamento longo/curto, com um terceiro MA para controlo de riscos.

Análise das vantagens

  1. O cruzamento de duas MA segue efectivamente a tendência.

  2. Suporte a múltiplas combinações de tipos de MA, pode ser otimizado para diferentes períodos.

  3. O terceiro MA controla os riscos e reduz as perdas desnecessárias.

  4. A ajuda visual melhora a experiência de negociação de gráficos.

  5. Os parâmetros ajustáveis podem ser otimizados para diferentes ciclos.

  6. Lógica simples e clara, fácil de entender e seguir.

Análise de riscos

  1. A MA dupla luta com cenários de variação de faixa e inversão de tendência. Pode ser melhorada através da otimização de parâmetros.

  2. A MA dupla pode gerar sinais falsos ou reação excessiva às vezes.

  3. O terceiro MA pode perder oportunidades de tendência forte. Pode testar o encurtamento do seu período para capturar mais lucros.

  4. Não posso garantir ganhos para cada negociação, preciso de uma gestão de stop loss adequada.

Orientações de otimização

  1. Teste diferentes tipos e períodos de MA para obter o melhor par de parâmetros.

  2. Otimizar o terceiro período de MA para equilibrar o controlo do risco e a captura de lucros.

  3. Adicionar estratégia de stop loss para controlar o montante da perda de uma única transação.

  4. Considere algoritmos de aprendizagem de máquina para encontrar parâmetros ideais com base em big data.

  5. Combinar com outros indicadores como KD, MACD para filtragem e confirmação de sinais.

Resumo

Esta estratégia de cruzamento de média móvel dupla com MAs de vários tipos incorpora seguimento de tendência, controle de risco, otimização de parâmetros, ajuda visual e muito mais. Com testes e otimização contínuos, introdução de outros indicadores ou aprendizado de máquina, etc., pode se adaptar melhor ao mercado e tem grande valor prático. Em resumo, esta é uma estratégia simples, prática e facilmente otimizável, tornando-se um ótimo ponto de partida para negociação algorítmica.


/*backtest
start: 2023-09-11 00:00:00
end: 2023-09-12 22:00:00
period: 1m
basePeriod: 1m
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/
// © HAMIDBOX

//@version=4
strategy("Multi-X by HAMID-BOX", overlay=true)

maType(source , length, type)   =>
    type    == "SMA"            ? sma(source , length)  :
     type   == "EMA"            ? ema(source , length)  :
     type   == "RMA"            ? rma(source, length)   : 
     type   == "WMA"            ? wma(source, length)   :
     type   == "VWMA"           ? vwma(source, length)  :
     na
     
////////////////////////////////////////////////////////////////////////////////
colorup             = #11ff00
colordn             = #e91e63

/////////////////////////// MOVING AVERAGE №1 INPUTS ///////////////////////////
ma1_show            = input(title="MA №1", defval=true, type=input.bool, inline="ma1")
ma1type             = input(title="", defval="EMA", options=["SMA","EMA","RMA","WMA","VWMA"], inline="ma1")
ma1src              = input(title="", defval=close, type=input.source, inline="ma1")
ma1Len              = input(title="", defval=9, type=input.integer, inline="ma1")
ma1col              = input(colorup, "", type=input.color, inline="ma1")

ma1                 = maType(ma1src, ma1Len, ma1type)

ma1p = plot(ma1_show ? ma1 : na, linewidth=1, color=color.new(ma1col , 50))

/////////////////////////// MOVING AVERAGE №2 INPUTS ///////////////////////////
ma2_show            = input(title="MA №2", defval=true, type=input.bool, inline="ma2")
ma2type             = input(title="", defval="SMA", options=["SMA","EMA","RMA","WMA","VWMA"], inline="ma2")
ma2src              = input(title="", defval=close, type=input.source, inline="ma2")
ma2Len              = input(title="", defval=21, type=input.integer, inline="ma2")
ma2col              = input(colordn, "", type=input.color, inline="ma2")

ma2                 = maType(ma2src, ma2Len, ma2type)

ma2p = plot(ma2_show ? ma2 : na, linewidth=1, color=color.new(ma2col , 50))

/////////////////////////// MOVING AVERAGE №3 INPUTS ///////////////////////////

read                = input(title="For Safe Side = Read This >>>", defval=true, tooltip="If you want to play on the safe side, Check ON Moving Average № 3, MA №3 shows the major trend, its work as a Trend-Zone,\nRule: Do not open trades if the market is below MA № 3, WHY? because Trend is Bearish and it will make more Down, NOTE:: It is possible after adding MA № 3, it will give you a small profit. But the great advantage of that, it will reduce your loss and it will also increase your Profit Factor.\nAnd if you not have any issue with Risk then you can Leave Moving Average No 3")
ma3_show            = input(title="MA №3", defval=false, type=input.bool, inline="ma3")
ma3type             = input(title="", defval="SMA", options=["SMA","EMA","RMA","WMA","VWMA"], inline="ma3")
// ma3srcH          = input(title="", defval=high, type=input.source, inline="ma3")
// ma3srcL          = input(title="", defval=low, type=input.source, inline="ma3")
ma3Len              = input(title="", defval=50, type=input.integer, inline="ma3")
ma3col              = input(colordn, "", type=input.color, inline="ma3")

ma3H                = maType(high, ma3Len, ma3type)
ma3L                = maType(low, ma3Len, ma3type)

ma3p                = plot(ma3_show ? ma3H : na, linewidth=1, color=color.new(ma3col , 50))
ma3p2               = plot(ma3_show ? ma3L : na, linewidth=1, color=color.new(ma3col , 50))

Bigcross_zone_color = if ma3_show and close > ma3H
    color.new(colorup , 90)
else
    if ma3_show and close < ma3L
        color.new(colordn , 90)
fill(ma3p , ma3p2, color=Bigcross_zone_color, title="Cross Background Color")

BigCrossSignal      = close > ma3H
ZoneCrossover       = crossover(close , ma3H)
///////////////////////////// BACK TESTING INPUTS //////////////////////////////
startTime           = input(title="Start Time", type=input.time, defval= timestamp("01 Jan 2021"))
endTime             = input(title="End Time", type=input.time, defval= timestamp("01 Jan 2100"))
inDateRange         = true

//////////////////////////// PLOTING AND COOLORING /////////////////////////////
Cross               = input(true, "Cross Sign ON/OFF") 
maCrossOver         = crossover(ma1 , ma2)
maCrossUnder        = crossunder(ma1 , ma2)
cross_zone_color    = ma1 > ma2 ? color.new(colorup , 85) : color.new(colordn , 85)

plotshape(Cross ? maCrossOver : na, title="CrossUP Sign", style=shape.triangleup, location=location.belowbar, color=color.white, size=size.tiny)
plotshape(Cross ? maCrossUnder : na, title="CrossDN Sign", style=shape.xcross, location=location.abovebar, color=#e91e63, size=size.tiny)

fill(ma1p , ma2p, color=cross_zone_color, title="Cross Background Color")

///////////////////////////////// (CONDITIONS) /////////////////////////////////

if maCrossOver and inDateRange
    if ma3_show
        strategy.entry("BUY", strategy.long, when=BigCrossSignal)
    else    
        strategy.entry("BUY", strategy.long)

if  ma3_show
    strategy.entry("BUY", strategy.long, when=ZoneCrossover)

if maCrossUnder and inDateRange
    strategy.close("BUY", comment="Exit")
if (not inDateRange)
    strategy.close_all()





Mais.