Especialistas: Diferença de duas moving averages

 

Diferença de duas moving averages:

Este expert advisor foi desenvolvido depois de observar quando duas médias móveis se divergem e convergem, há geralmente uma diferença máxima entre os valores instantâneos das duas médias móveis antes das mudanças de tendência.

A diferença entre as duas médias móveis é amplificado por uma função cúbica de transferência não-linear para diferenciar entre excursões maiores e menores de zero. O passo final é um discriminador de nível simples com limites de altos e baixos que responde às principais maiores excursões antes da sinalização de uma mudança de tendência.

Autor: Winston

 

Acho que o indicador precisa de ArraySetSeries (mf, true) e (ms, true) em OnInit () para funcionar corretamente.

Todos os operadores

if (flg == 0) / / initialise on first pass
      {
       ArrayInitialize (ag, EMPTY_VALUE);
       ArrayInitialize (bg, EMPTY_VALUE);
       ArrayInitialize (cg, EMPTY_VALUE);
       hi = 0;
       I = 0;
       trend = 0;
       flg = 1;
       }

seria mais eficaz em OnInit () e não teria que usar "flg"

A EA em relação... ao uso do MACD acha que o algoritmo da estratégia é simplificado assim:

Compra aberta: MACDcurrent>MACDprev && MACDcurrent<0; buyed = true.

Fechar compra: buyed && MACDcurrent<MACDprev && MACDcurrent>0; buyed = false

Para ações reversas de venda.

Se usarmos SL e TP quando não estivermos operando o EA, posso dizer "comprar" ou "vender" conforme a tendência (MA lenta) e esperar por um novo sinal.

 

Olá, não sei por que esse indicador: madelta_inc.mq5, não desenha nada quando eu o anexo ao gráfico. Anexei aqui uma imagem para que você possa ver o que estou dizendo. Também coloquei abaixo o código com a alteração sugerida por josemiguel1812 sobre não usar o sinalizador: 'flg', e mover parte do código para o evento OnInit(). Eu não usei: ArraySetAsSeries (mf, true) e ArraySetAsSeries (ms, true) porque tanto 'mf' quanto 'ms' são matrizes de apenas um elemento e acho que essa mudança não terá efeito, e o MT5 também não permite o uso dessa função para matrizes estáticas. Mas o que eu gostaria de saber é por que ele não desenha as linhas do indicador? Você poderia tentar o código a seguir e testá-lo?

Desde já agradeço, Cyberglassed.

//+------------------------------------------------------------------+
//|madelta_inc
//|Direitos autorais 2013 Winston |
//+------------------------------------------------------------------+
#property copyright "Winston 2013"
#property version "1.10"
#property description "madelta_inc"
#property indicator_separate_window
#property indicator_buffers 4
#property indicator_plots   3

#property  indicator_type1   DRAW_COLOR_LINE
#property  indicator_color1  White,Yellow,Red
#property  indicator_style1  STYLE_SOLID
#property  indicator_width1  2

#property  indicator_type2   DRAW_LINE
#property  indicator_color2  Yellow
#property  indicator_style2  STYLE_DOT
#property  indicator_width2  1

#property  indicator_type3   DRAW_LINE
#property  indicator_color3  Red
#property  indicator_style3  STYLE_DOT
#property  indicator_width3  1

input double d = 0.00195;                       //delta
input double m = 39.2;                          //mult

input int F = 26;                               //média móvel rápida
input ENUM_MA_METHOD FM = MODE_SMA;             //modo de média rápida
input ENUM_APPLIED_PRICE FP = PRICE_WEIGHTED;   //modo de preço rápido

input int S = 51;                                     /média móvel lenta
input ENUM_MA_METHOD SM = MODE_EMA;                 /modo médio lento
input ENUM_APPLIED_PRICE SP = PRICE_MEDIAN;        /modo de preço lento

int Ms, Mf, trend;
double px, hi, lo;
double ms[1], mf[1];
double ag[], bg[], cg[], ac[];

//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
void OnInit() {
        SetIndexBuffer(0, ag, INDICATOR_DATA);
        ArraySetAsSeries(ag, true);                    //sinal

        SetIndexBuffer(1, ac, INDICATOR_COLOR_INDEX);
        ArraySetAsSeries(ac, true);                    //cor da tendência do sinal

        SetIndexBuffer(2, bg, INDICATOR_DATA);
        ArraySetAsSeries(bg, true);                    //hi limiar

        SetIndexBuffer(3, cg, INDICATOR_DATA);
        ArraySetAsSeries(cg, true);                    limiar //lo

        ArrayInitialize(ag, EMPTY_VALUE);
        ArrayInitialize(bg, EMPTY_VALUE);
        ArrayInitialize(cg, EMPTY_VALUE);
        hi = 0;
        lo = 0;
        trend = 0;
        
        Mf = iMA(NULL, PERIOD_H1, F, 0, FM, FP);
        Ms = iMA(NULL, PERIOD_H1, S, 0, SM, SP);

}

//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,           // tamanho da matriz price[]
                                const int prev_calculated,               // barras tratadas em uma chamada anterior
                                const int begin,                          // onde os dados significativos começam
                                const double &price[])              // matriz para calcular
{

        CopyBuffer(Mf, 0, 0, 1, mf);                   //valor da média móvel rápida

        CopyBuffer(Ms, 0, 0, 1, ms);                   /valor da média móvel lenta

        px = pow(m * (mf[0] - ms[0]), 3);                //amplifique e cubra a diferença


        if (px > hi) {                               //identificar tendência
                hi = px;
                lo = hi - d;
                trend = 1;
        }
        if (px < lo) {                               //com mudança de cor
                lo = px;
                hi = lo + d;
                trend = 2;
        }

        ag[0] = px;
        bg[0] = hi;
        cg[0] = lo;
        ac[0] = trend;

        return (rates_total);
}

//+------------------------------------------------------------------+
Arquivos anexados:
screenshot.png  103 kb
 
cyberglassed:

Olá, não sei por que esse indicador: madelta_inc.mq5, não desenha nada quando eu o anexo ao gráfico. Anexei aqui uma imagem para que você possa ver o que estou dizendo. Também coloquei abaixo o código com a alteração sugerida por josemiguel1812 sobre não usar o sinalizador: 'flg', e mover parte do código para o evento OnInit(). Eu não usei: ArraySetAsSeries (mf, true) e ArraySetAsSeries (ms, true) porque tanto 'mf' quanto 'ms' são matrizes de apenas um elemento e acho que essa mudança não terá efeito, e o MT5 também não permite o uso dessa função para matrizes estáticas. Mas o que eu gostaria de saber é por que ele não desenha as linhas do indicador? Você poderia tentar o código a seguir e testá-lo?

Desde já, obrigado, Cyberglassed.

O que você espera? Somente os valores do índice 0 dos buffers do indicador são definidos.
 
angevoyageur:
O que você espera? Somente os valores do índice 0 dos buffers do indicador são definidos.

Foi um pouco confuso para mim ver que sempre o índice 0 dos buffers era atribuído, então eu esperava que o ArraySetAsSeries tivesse alguma influência para mudar o comportamento intuitivo do que se poderia pensar (reverso) ou algo assim, sou iniciante no mql5. De qualquer forma, tive que reiniciar meu computador por algum outro motivo e tentei novamente o indicador, e agora ele desenha linhas como eu esperava no início. Anexei uma imagem.

Obrigado, Cyberglassed.

Arquivos anexados:
screenshot.png  118 kb
 
cyberglassed:

Foi um pouco confuso para mim ver que o índice 0 dos buffers era sempre atribuído, então eu esperava que o ArraySetAsSeries tivesse alguma influência para mudar o comportamento intuitivo do que se poderia pensar (reverso) ou algo assim, pois sou iniciante no mql5. De qualquer forma, tive que reiniciar meu computador por algum outro motivo e tentei novamente o indicador, e agora ele desenha linhas como eu esperava no início. Anexei uma imagem.

Obrigado, Cyberglassed.

Ou o código que você está executando não é o mesmo que o que você postou, ou seu terminal desenha dados provenientes de alguns buffers.

O código que você postou não pode produzir esse resultado.

 

Obrigado por seus comentários. O indicador talvez seja incomum, pois foi projetado para funcionar apenas com o testador de estratégia no modo de visulização.

No Navegador, clique com o botão esquerdo do mouse na EA e, em seguida, clique com o botão direito do mouse em Testar. No Testador de estratégias EURUSD, H1 e marque a caixa Visulização e, em seguida, Iniciar, o indicador deverá aparecer.

Informe-me sobre seu progresso.

Com os melhores cumprimentos

Winston

 

Há algo errado com esse EA. Quando tento operar em apenas um par de moedas, esse EA não faz nada durante 2 dias, o indicador às vezes mostra sinais de venda e compra ao mesmo tempo.

Quando tento operar em vários pares de moedas, ele faz a mesma coisa, mas observei que, quando fecho manualmente as posições, ele começa a operar novamente. Algo está muito errado com esse EA, algo está bloqueando a operação no Meta Trader 5

Quando o testei no testador de estratégias, tudo estava ok, mas quando tentei negociar, ele só abria posições e não as fechava, eu precisava fechá-las manualmente....

Alguém poderia consertar isso?

 
Se você precisar de um marcador de período de tempo - (Ma1-Ma2) E (indicador desconhecido) funcionará bem, não é?
 
Só não tenho certeza de como ajustá-lo para permitir a seleção de um lote.
 
Boa tarde! Descobri como definir o lote necessário, mas como fazer esse bot funcionar simultaneamente em vários instrumentos.