Ler dados do segundo Buffer do indicador com a função GetData(1,index)

 

Olá!

 Prezados,

 Sou novato em aqui no fórum e também em mql5. 

Com objetivo de aprender, estou tentando desenvolver um EA baseado no indicador iS7N_TREND.mq5 utilizando as classes modelos do MT5 (iCustom, CExpertSignal, etc). Preciso acessar o buffer de cores (segundo buffer do indicador) mas não consigo acessar, acredito que esteja fazendo algo errado. 

Estou tentando acessar com a função  GetData() (linha 80).

Na linha 229 precisaria de saber a cor da linha para finalizar o sinal.  

 Se puderem me passar um dica sobre o problema agradeço, pois já estou vários dias tentando resolvê-lo.

Segue abaixo o código:

//+------------------------------------------------------------------+
//|                                                SignalMMColor.mqh |
//|                        Copyright 2015, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"

#include "..\ExpertSignal.mqh"
#include <Indicators\Custom.mqh>

enum eColor
  {
   one_color_indicator,
   two_color_indicator
  };
  
//#include <Expert\ExpertSignal.mqh>

// wizard description start
//+------------------------------------------------------------------+
//| Description of the class                                         |
//| Title=Signal gerado na Média Móvel Colorida                      |
//| Type=SignalAdvanced                                              |
//| Name=MySignalMMColor                                             |
//| ShortName=MMColor                                                |
//| Class=SignalMMColor                                              |
//| Page=Not needed                                                  |
//| Parameter=MmsPeriod,int,9,Periodo da MMs (Sinal)                 |
//| Parameter=MmsColor,eColor,two_color_indicator,Número de Cores    |
//| Parameter=BullColor,color, clrAqua, Cor uptrend                  |
//| Parameter=BearColor,color, clrDeepPink, Cor downtrend            |
//| Parameter=MmsRange,int, 200, Número maximo de Barras             |
//+------------------------------------------------------------------+
// wizard description end

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class SignalMMColor : public CExpertSignal
  {
   private:
               int                  mms_Period;  //Periodo da MMs
               eColor               mms_Color ;  //Qtde Cores
               color                bull_Color;  //Cor up
               color                bear_Color;  //Cor down
               int                  mms_Range;   //Qtde Barras
               CiCustom             mm_signal;   //Média móvel
               
//               int                  mmsHandle; 
//               double               mmsBuffer[];
//               double               mmsColorBuffer[];               
               
   protected:  
               //--- method of creating the indicator and timeseries
               bool        CreateMMs(CIndicators *indicators);                

   public:
                     SignalMMColor();
                    ~SignalMMColor();
                    
               //--- Definição das variáveis
               void        MmsPeriod(const int value)                {mms_Period = value;    };
               void        MmsColor(const eColor value)              {mms_Color  = value;    };
               void        BullColor(const color value)              {bull_Color = value;    }; 
               void        BearColor(const color value)              {bear_Color = value;    }; 
               void        MmsRange(const int value)                 {mms_Range  = value;    };                   
                    
               //--- method of verification of settings
               bool        ValidationSettings(void);
               
               //--- Creating indicators and timeseries for the module of signals
               bool        InitIndicators(CIndicators *indicators);
               
               //--- Acesso aos dados do indicador MM
               double      MmSignal(const int index)           const {return mm_signal.GetData(0,index); };
               
//OBS===>      //aqui está o problema: preciso acessar o segundo buffer do indicador que penso ser o índice 1
               double      MmSignalCollor(const int index)     const {return mm_signal.GetData(1,index); };
               
               //--- methods of checking if the market models are formed
               virtual int LongCondition(void);
               virtual int ShortCondition(void);
                            
  };
  
//+------------------------------------------------------------------+
//| Construtor da Classe                                             |
//+------------------------------------------------------------------+
SignalMMColor::SignalMMColor()
  {
      //--- Definindo valores padrão por segurança
      mms_Period  = 9;
      mms_Color   = two_color_indicator;
      bull_Color  = clrAqua;
      bear_Color  = clrDeepPink;
      mms_Range   = 200; 

//      ArraySetAsSeries(mmsBuffer,true);
//      ArraySetAsSeries(mmsColorBuffer,true);
  }
  
//+------------------------------------------------------------------+
//| Destrutor da Classe                                              |
//+------------------------------------------------------------------+
SignalMMColor::~SignalMMColor()
  {
  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| Método para validar os parâmtreos                                |
//+------------------------------------------------------------------+
bool SignalMMColor::ValidationSettings(void)
  {
      //--- Verificação padrão da classe
      if(!CExpertSignal::ValidationSettings())
        {
            return false;
        }
        
      //--- O period da MM deve ser maior ou igual a 2
      if(mms_Period < 2)
        {
            return false;
        }
      
      return true;
  }
  
//+------------------------------------------------------------------+
//| Método para validar a instanciação dos indicadores               |
//+------------------------------------------------------------------+
bool SignalMMColor::InitIndicators(CIndicators *indicators)
  {
      //--- Validação de indicators nullo
      if(indicators == NULL)
        {
            return false;
        }
  
      //--- Verificação padrão da classe
      if(!CExpertSignal::InitIndicators(indicators))
        {
            return false;
        }
        
        
      //--- Validação do indicador MMs
      if(!CreateMMs(indicators))
        {
            return false;
        }
  
      return true;
  }
  
//+------------------------------------------------------------------+
//| Instância do Indicador MM sinal                                  |
//+------------------------------------------------------------------+
bool SignalMMColor::CreateMMs(CIndicators *indicators)
  {
      //--- verifica se o ponteiro eh nulo
      if(indicators == NULL)
        {
            return false;
        }
        
      //--- Aponta indicators para objeto mm_signal
      if(!indicators.Add(GetPointer(mm_signal)))
        {
            printf(__FUNCTION__+": Erro ao adicionar o objeto a MM Sinal");
            return false;
        }
      
      //--- Parâmetros MA
      MqlParam pars[6];
      pars[0].type=TYPE_STRING;
      pars[0].string_value="is7n_trend.ex5";
      pars[1].type=TYPE_INT;
      pars[1].integer_value=mms_Period;      
      pars[2].type=TYPE_INT;
      pars[2].integer_value=mms_Color;
      pars[3].type=TYPE_INT;
      pars[3].integer_value=bull_Color;
      pars[4].type=TYPE_INT;
      pars[4].integer_value=bear_Color;
      pars[5].type=TYPE_INT;            
      pars[5].integer_value=mms_Range;    
      

      ResetLastError();
      if(!mm_signal.Create(m_symbol.Name(), m_period, IND_CUSTOM,6,pars))
        {
            printf(__FUNCTION__+": Erro ao instanciar o indicador MA");
            Print("Erro: ",GetLastError());
            return false;  
        }

       //somente um bufferr???
       if(!mm_signal.NumBuffers(1))
         {
            return false;
         }

        
      return true;
  }
  
//+------------------------------------------------------------------+
//| Peso do sinal de compra                                          |
//+------------------------------------------------------------------+ 
int SignalMMColor::LongCondition(void)
  {
      //--- sinal
      int signal = 0;

      //--- Função que retorna 0 (trabalhar tick a tick) ou 1 (trabalhar barra a barra)
      int idx=StartIndex();
  
      //--- Pegando os preços
      double mediaBar1 = MmSignal(idx);
      double mediaBar2 = MmSignal(idx + 1);
      double mediaBar3 = MmSignal(idx + 2);
      double mediaBar4 = MmSignal(idx + 3);
      
      //acesso ao segundo buffer
      double t = MmSignalCollor(idx);
      double t1 = MmSignalCollor(idx + 1);
      double t2 = MmSignalCollor(idx + 2);
      
      //--- Valida condição
      if(mediaBar1 > mediaBar2 && mediaBar2 > mediaBar3 && mediaBar3 < mediaBar4 )
        {
            signal = 100;
        }
  
      return signal;
  }
  
//+------------------------------------------------------------------+
//| Peso do sinal de compra                                          |
//+------------------------------------------------------------------+ 
int SignalMMColor::ShortCondition(void)
  {
      //--- sinal
      int signal = 0;
      
      //--- Função que retorna 0 (trabalhar tick a tick) ou 1 (trabalhar barra a barra)
      int idx=StartIndex();
  
      //--- Pegando os preços
      double mediaBar1 = MmSignal(idx);
      double mediaBar2 = MmSignal(idx + 1);
      double mediaBar3 = MmSignal(idx + 2);
      double mediaBar4 = MmSignal(idx + 3);
      
      //--- Valida condição
      if(mediaBar1 < mediaBar2 && mediaBar2 < mediaBar3 && mediaBar3 < mediaBar4)
        {
            signal = 100;
        }
  
      return signal;
  }  
  
  
iS7N_TREND.mq5
iS7N_TREND.mq5
  • votos: 21
  • 2014.01.14
  • Николай
  • www.mql5.com
Agora é um indicador de tendência de duas cores (ou de dois modos), o número de barras para os cálculos pode ser especificado.
Razão: