Inserindo dados em um Array

 

Ei pessoal! Sou novo no MQL5 e estou tentando adicionar elementos a um array. Este Vector é um Buffer de um indicador. Eu venho da linguagem python, e aí, só preciso usar a função append() para adicionar meus dados ao final do meu vetor. Meus dados serão fornecidos por eventos no DOM, então não é possível adicionar dados com um for(). Alguém poderia me ajudar nessa situação?

Muito obrigado antecipadamente!!

 
abnercta:

Ei pessoal! Sou novo no MQL5 e estou tentando adicionar elementos a um array. Este Vector é um Buffer de um indicador. Eu venho da linguagem python, e aí, só preciso usar a função append() para adicionar meus dados ao final do meu vetor. Meus dados serão fornecidos por eventos no DOM, então não é possível adicionar dados com um for(). Alguém poderia me ajudar nessa situação?

Muito obrigado antecipadamente!!

Seria interessante mostrar o código, mas falando assim recomendaria a voce ler a documentação com atenção. Nela é falado que quando definimos um buffer que irá ser plotado pelo mt5, quem gerencia o tamanho do buffer é o terminal do mt5. Logo, não podemos exceder seu tamanho alocado dinamicamente e nem apendar dados adicionais. Só podemos substitui-los.

 
Ricardo Rodrigues Lucca # :

Seria interessante mostrar o código, mas falando assim recomendaria a voce ler a documentação com atenção. Nela é falado que quando definimos um buffer que irá ser plotado pelo mt5, quem gerencia o tamanho do buffer é o terminal do mt5. Logo, não podemos exceder seu tamanho alocado dinamicamente e nem apendar dados adicionais. Só podemos substituir

What I need is, to plot the data that I calculated. I'm literally not using OnCalculate() events, only OnBookEvent. I want to calculate the total volume of orders in the DOM, both sell and buy, and plot the evolution of each event on the graph. I believe my mistake is in the way I add elements to Buffer.

 //+------------------------------------------------------------------+
//|                                                          DOM.mq5 |
//|                                  Copyright 2023, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2023, MetaQuotes Ltd."
#property link        " https://www.mql5.com "
#property version    "1.00"
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots    2
#property indicator_type1    DRAW_LINE
#property indicator_type2    DRAW_LINE
#property indicator_color1   Blue
#property indicator_color2   Silver
#property indicator_width1    2
#property indicator_width2    2
#property indicator_label1    "Volume Vendas"
#property indicator_label2    "Volume Compras"

double    VendasBuffer[];
double    ComprasBuffer[];


int j= 0 ;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
   MarketBookAdd ( _Symbol );
   Print ( "Adicionando Ativo" );
   ArraySetAsSeries (ComprasBuffer, true );
   ArraySetAsSeries (VendasBuffer, true );
   SetIndexBuffer ( 2 , ComprasBuffer, INDICATOR_DATA );
   SetIndexBuffer ( 1 , VendasBuffer, INDICATOR_DATA );
   ArrayGetAsSeries (ComprasBuffer);
   ArrayGetAsSeries (VendasBuffer);
   return ( INIT_SUCCEEDED );
   
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int    OnCalculate ( const    int            rates_total,
                 const    int        prev_calculated,
                 const    datetime           &time[],
                 const    double             &open[],
                 const    double             &high[],
                 const    double              &low[],
                 const    double           &close[],
                 const    long        &tick_volume[],
                 const    long             &volume[],
                 const    int              &spread[])
  {
//---
   
//--- valor de retorno de prev_calculated para a próxima chamada 
   return (rates_total);
  }
  
MqlBookInfo DadosDOM[];
void OnBookEvent ( const string & symbol)
  {j=j+ 1 ;
   Print (j);
   bool getBook= MarketBookGet ( NULL ,DadosDOM);
   if (getBook)
     {
       long VolCompra= 0 ;
       long VolVenda= 0 ;
       int size= ArraySize (DadosDOM);
       for ( int i= 0 ;i<size;i++)
        {
         if (DadosDOM[i].type== 1 )
                VolCompra=VolCompra +DadosDOM[i].volume;
                
               
         if (DadosDOM[i].type== 2 )
                VolVenda=VolVenda +DadosDOM[i].volume;
                
        }
      
      ComprasBuffer[j]=VolCompra;
      VendasBuffer[j]=VolVenda;
       Print ( "COMPRA" , ComprasBuffer[j]);
       Print ( "VENDAS" , VendasBuffer[j]);
     }
   else
     {
       Print ( "Não foi possível obter dados do DOM " , Symbol ());
     }
 
  
  }
  
void OnDeinit ( const int reason)
  {
   Print ( "Tchau Abner, Espero que tenha Lucrado!!!" );
  }
  
 
abnercta #:

What I need is, to plot the data that I calculated. I'm literally not using OnCalculate() events, only OnBookEvent. I want to calculate the total volume of orders in the DOM, both sell and buy, and plot the evolution of each event on the graph. I believe my mistake is in the way I add elements to Buffer.'

Tu não pode fazer o "j+=1", remove isso e coloca no OnCalculate por exemplo "j=rates_total - 1;" . Respostas em inglês vou ignorar porque o forum é em lingua portuguesa se quiser use a tradução.

Além disso, tira do OnInit as chamadas a Array*AsSeries que não vejo necessidade e SetIndexBuffer inicia no valor 0 (zero) e não 1. Logo troca os locais onde estão 1 por 0 e 2 por 1.