Perguntas de Iniciantes MQL5 MT5 MetaTrader 5 - página 386

 
Roman Shiredchenko:

Olha, aos quatro, parece que não consigo passar...

Trabalho com arrays - preciso de escrever a hora de chegada do tick na matriz - por exemplo, escrevo uma proposta. Em cada tique. Faço tudo de acordo com os bilhetes, pelo que estou grato a Artyom Trishkin . Nem tudo funciona. Lutou pelo segundo dia. Impressões

zeros.

https://www.mql5.com/ru/forum/145455/page913#1017464

Obrigado.

Vejo que na variável init SIZE é 0, então qual é o tamanho da matriz? Então novamente no início SIZE também é 0 ... O que está no diário de bordo?
 
Artyom Trishkin:
Vejo que no init a variável TAMANHO tem um valor 0, então qual é o tamanho da matriz? Então novamente no início SIZE também é 0 ... O que está no diário de bordo?
Zeros... Estou a tentar perceber...
 

E também os zeros... Eu não entendo nada...

//---------------------
extern int MaxDrawTicks=100;
extern int Num_Aver_of_Ticks=5;  
double     xBuffer_Time [1000000]; // Массив значений  
                         // В котором индекс - номер тика, значение - это бид 
int SIZE=0;               // Вспомогательная переменная для массива                                  
int tickCounter, tickCounter_Current; 
//+------------------------------------------------------------------+
int init()
  {   
//--- устанавливаем размер динамического массива
  // if(ArrayResize(xBuffer_Time,SIZE)<0) {Print(" Ошибка в изменении размера массива времени поступления тиков "); return(false);}
//--- установим индексацию для буфера как в таймсерии для динамического массива
  // ArraySetAsSeries(xBuffer_Time,true);    
//---   Возвращает количество элементов указанного массива. 
  // int S=ArraySize(xBuffer_Time);
  // if (S>=0) Print("Размер массива: ",S);
  // else Print("Ошибка. Массив не создан ",S);        
  // ArrayInitialize(xBuffer_Time, 0);
   return(0);
  }  
//+------------------------------------------------------------------+
int start()
  {  
   //ArrayResize(ValueArr,size);
   //ValueArr[size-1] = GetValue();
   //size++; 
 //----------------------------------------  
  // ArrayResize(xBuffer_Time,SIZE);
   xBuffer_Time[SIZE] = Bid; //NormalizeDouble((iTime (_Symbol,1,0)-_start), 2); 
   SIZE ++;
   Print (" Значение xBuffer_Time[SIZE] = ", DoubleToStr(xBuffer_Time[SIZE],Digits) );
   Print (" Значение SIZE = ", DoubleToStr(SIZE,2) );  
 //---------------------------------------      
//------------
   return(0);
  }
 
Roman Shiredchenko:

E também os zeros... Eu não entendo nada...

Sugeri que o TAMANHO deve ser aumentado primeiro para que não seja zero, e só depois o tamanho da matriz deve ser alterado.
 
Artyom Trishkin:
Bem, eu insinuei que o TAMANHO deve primeiro ser aumentado para que não seja zero, e só depois mudar o tamanho da matriz.

:-)

Obrigado.

Funciona - use-o se precisar dele.

//---------------------
extern int MaxDrawTicks=100;
extern int Num_Aver_of_Ticks=5;  
double     xBuffer_Time []; // Массив значений   динамический
                            // В котором индекс - номер тика, значение - это бид 
int SIZE=0;                 // Вспомогательная переменная для массива                                  
int tickCounter, tickCounter_Current; 
//+------------------------------------------------------------------+
int init()
  {   
//--- устанавливаем размер динамического массива
   if(ArrayResize(xBuffer_Time,2000000)<0) {Alert(" Ошибка в изменении размера массива времени поступления тиков "); return(false);}
//--- установим индексацию для буфера как в таймсерии для динамического массива
  // ArraySetAsSeries(xBuffer_Time,true);    
//---   Возвращает количество элементов указанного массива. 
   int S=ArraySize(xBuffer_Time);
   if (S>=0) Alert("Размер массива: ",S);
   else Print("Ошибка. Массив не создан ",S);        
   ArrayInitialize(xBuffer_Time, 0);
   return(0);
  }  
//+------------------------------------------------------------------+
int start()
  {  
   //ArrayResize(ValueArr,size);
   //ValueArr[size-1] = GetValue();
   //size++; 
 //----------------------------------------  
   ArrayResize(xBuffer_Time,SIZE);
   xBuffer_Time[SIZE-1] = Bid; //NormalizeDouble((iTime (_Symbol,1,0)-_start), 2); 
  
   if ( SIZE >= 0 && ArraySize(xBuffer_Time) < 2147483647)
      {
      Alert (" Значение xBuffer_Time[SIZE-1] = ", DoubleToStr(xBuffer_Time[SIZE-1],Digits) );
      Alert (" Значение SIZE = ", DoubleToStr(SIZE,2) );  
      } 
    SIZE ++;   
 //---------------------------------------      
//------------
   return(0);
  }
 
Roman Shiredchenko:

:-)

Obrigado.

Funciona - use-o se precisar dele.

Algo que eu não entendo - TAMANHO é zero, então porque devo mudar primeiro o tamanho da matriz, e depois aumentar o TAMANHO? Que confusão...

Uma vez fiz um conjunto de preenchimentos de carraças para um Expert Advisor de carraças, que define a intensidade e o alcance das carraças. Recortei peças por exemplo:

//+------------------------------------------------------------------+
   MqlTick struct_tick;
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   //--- Запись ID графика
   gv_chart_id_name=Prefix+"_chart_id";                        // имя GV терминала
   long   chart_id=get.GetChartID(symbol);                     // id текущего графика
   double chart_id_double=ToDouble(chart_id);                  // id в представлении double
   if(chart_id>=0) {                                           // chart_id==0 в тестере
      if(!GlobalVariableCheck(gv_chart_id_name))               // Если GV-переменная удалена
         GlobalVariableSet(gv_chart_id_name,chart_id_double);  // создадим опять
      }
   else graph.Message("Чё-та нету chart_id : Symbol()="+symbol+", chart_id="+IntegerToString(chart_id));
   
   //--- работа с тиками текущего графика
   if(SymbolInfoTick(symbol,struct_tick)) {
      double tick_bid=struct_tick.bid;
      datetime tick_time=struct_tick.time;
      WorkOnTick(symbol,tick_bid,tick_time,slowPeriod);
      }
//---
  }
//+------------------------------------------------------------------+

A função abaixo organiza o trabalho com o símbolo desejado armazenado na variável símbolo, se precisar de trabalhar com outro símbolo - escreva-o aí. Função FillArrays() apenas preenche matrizes.

//+------------------------------------------------------------------+
void WorkOnTick(string sy, double symbol_bid, datetime symbol_time, int limit) {
   long chart_id=get.GetChartID(sy);                       
   int index_symbol=get.PositionsSymbolInList(sy);       // позиция символа в списке
   double pt=SymbolInfoDouble(sy,SYMBOL_POINT);
   double pa=SymbolInfoDouble(sy,SYMBOL_ASK);
   double pb=SymbolInfoDouble(sy,SYMBOL_BID);
   int stoplevel=(int)MarketInfo(sy,MODE_STOPLEVEL);
   int dg=(int)SymbolInfoInteger(sy,SYMBOL_DIGITS);
   //--- заполним массивы
   FillArrays(sy,symbol_bid,symbol_time,table_price,table_time);
   //--- расчёт среднего изменения цен тиков
   double avg_change_price=AverageChangePrice(index_symbol,limit,slowPeriod,table_price);
   //--- вывод информации на график
   wtf(index_symbol,avg_change_price,slowPeriod,table_price,table_time);
   return;   
   
   Trailing(sy, 50, 3, magic);
}
//+------------------------------------------------------------------+

Precisava de encher as matrizes com carraças desta forma:

//+------------------------------------------------------------------+
void FillArrays(string sy, double price, datetime time, double &mass_price[][], datetime &mass_time[][]) {
   //--- сместим данные в массивах влево
   int index_symbol=get.PositionsSymbolInList(sy);       // позиция символа в списке
   for(int i=99; i>0; i--) {                             // сместим данные в массивах влево
      mass_price[index_symbol][i]=mass_price[index_symbol][i-1];
      mass_time[index_symbol][i]=mass_time[index_symbol][i-1];
      }
   //--- запишем товый тик в массивы
   mass_price[index_symbol][0]=price;
   mass_time[index_symbol][0]=time;
}
//+------------------------------------------------------------------+
 
Artyom Trishkin:

Não percebo - o TAMANHO é zero, então porquê mudar primeiro o tamanho da matriz e depois aumentar o TAMANHO? É uma confusão...

Uma vez fiz um preenchimento de matriz com carraças para um consultor de carraças, que determina a intensidade e propagação das carraças. Recortei peças por exemplo:

A função abaixo organiza o trabalho com o símbolo desejado armazenado na variável símbolo, se precisar de trabalhar com outro símbolo - escreva-o aí. Função FillArrays() apenas preenche matrizes.

Precisava de encher as matrizes com carraças desta forma:

Preciso de uma taxa média de 1 tick/in 1 seg em n - ticks. Isto é, os n-ticks são recebidos em k-seconds, os k/n são recebidos em ticks por segundo. Esta velocidade deve ser medida em cada carrapato que chega. Mudará com cada tick subsequente.

 

Pode dizer-me se há um relógio no mt4? De preferência com uma segunda mão.

ou talvez exista um consultor especializado que indique a hora algures na linha inferior do terminal

Razão: