MACD Buffers não funcionam.

Para adicionar comentários, por favor Faça o login ou registrar
Maylon Sales
181
Maylon Sales  

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");
     }
Rodrigo Malacarne
Moderador
11159
Rodrigo Malacarne  
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 

bremora
11
bremora  
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.
Para adicionar comentários, por favor Faça o login ou registrar