MACD Buffers não funcionam.

 

Boa noite.

Estava tentando fazer o macd cruzar a linha de sinal e comprar mas não consegui... oque está errado? fiz um teste simples e nada acontece... alguem me ajuda?

Segue meu código:

//+------------------------------------------------------------------+
//|                                   Hedgind_5_0_By_MaylonSales.mq5 |
//|                                                     Maylon Sales |
//|                                              nolyam@yahoo.com.br |
//+------------------------------------------------------------------+
#property copyright "Maylon Sales"
#property link      "nolyam@yahoo.com.br"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>


input int    MACD_PeriodFast  =12;
input int    MACD_PeriodSlow  =26;
input int    MACD_PeriodSignal=9;
input ENUM_APPLIED_PRICE   MACD_Applied=PRICE_CLOSE;

double   BufMACDMainLine[];
double   BufMACDSignalLine[];
int MACD_handle;
int   contador;

CTrade GoTrade;
CSymbolInfo mysymbol;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   MACD_handle=iMACD(_Symbol,_Period,MACD_PeriodFast,MACD_PeriodSlow,MACD_PeriodSignal,MACD_Applied);
   if(MACD_handle<0)
     {
      Print("Maylon a criação do iMACD falhou cara :(",INVALID_HANDLE);
      Print("Erro em tempo de execução Maylon :(",GetLastError());
      return(-1); //--- término do programa forçado
     }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   IndicatorRelease(MACD_handle);

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- Preenchimento do array BufMACDMainLine e o BufMACDSignalLine com os valores atuais de iMACD
//--- 100 elementos devem ser escritos para o array
//--- se houver um erro, nós encerramos a execução do programa
   if(CopyBuffer(MACD_handle,0,0,100,BufMACDMainLine)) return;
   if(CopyBuffer(MACD_handle,1,0,100,BufMACDSignalLine)) return;
   ArraySetAsSeries(BufMACDMainLine,true);
   ArraySetAsSeries(BufMACDSignalLine,true);

   if(BufMACDMainLine[0]>BufMACDMainLine[1])
     {
      GoTrade.Buy(0.01,NULL,NULL,mysymbol.Ask()-0.100,mysymbol.Bid()+0.100,NULL);
     }

  }

 Eu testei assim também :   MAs não funcionou. mudei os numeros dos buffer e nada acontece... tem algum artigo que esplica oque vem nos buffer do macd? oque eu faço?

   if(BufMACDMainLine[0]>BufMACDSignalLine[1])
     {
      GoTrade.Buy(0.01,NULL,NULL,mysymbol.Ask()-0.100,mysymbol.Bid()+0.100,NULL);
      Print("oi    jjjjjjjjjjjjjjj gggggggggggggggggg");
     }
 
mimilon:

Boa noite.

Estava tentando fazer o macd cruzar a linha de sinal e comprar mas não consegui... oque está errado? fiz um teste simples e nada acontece... alguem me ajuda?

Segue meu código:

 Eu testei assim também :   MAs não funcionou. mudei os numeros dos buffer e nada acontece... tem algum artigo que esplica oque vem nos buffer do macd? oque eu faço?

Olá mimilon,

Experimente trocar essas duas linhas de código

if(CopyBuffer(MACD_handle,0,0,100,BufMACDMainLine)) return;
if(CopyBuffer(MACD_handle,1,0,100,BufMACDSignalLine)) return;

por essas

CopyBuffer(MACD_handle,0,0,100,BufMACDMainLine);
CopyBuffer(MACD_handle,1,0,100,BufMACDSignalLine);

Abraços,
Malacarne 

 
O retorno da função CopyBuffer não é booleano. A função retorna o número de valores copiados ou -1 como erro da tentativa. No seu caso, provavelmente a função está retornando 100. Daí, como variáveis booleanas são na verdade valores inteiros, sua comparação por meio do if sempre retorna TRUE quando comparada com 100, fazendo com que a função retorne o tick.

Para verificar o erro do retorno dos valores você pode usar if(CopyBuffer(...) == WRONG_NUMBER) ou if(CopyBuffer(...) != 100). Atente-se que no segundo caso, a variável pode retornar 99 que ainda sim o tick será retornado via sua função. Não necessariamente um retorno de 99 indica um erro em si, pois apenas expressa que os 100 valores demandados não puderam ser copiados.
Razão: