Questions des débutants MQL5 MT5 MetaTrader 5 - page 386

 
Roman Shiredchenko:

Ecoutez, sur la quatre, je n'arrive pas à passer...

Je travaille avec des tableaux - je dois écrire l'heure d'arrivée du tick dans le tableau - par exemple, j'écris une offre. A chaque tic. Je fais tout selon les tickets, pour lesquels je suis reconnaissant à Artyom Trishkin . Tout ne fonctionne pas. Lutte pour le deuxième jour. Imprimés

zéros.

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

Merci.

Je vois que dans la variable init SIZE est 0, alors quelle est la taille du tableau ? Mais encore une fois, la taille de départ est aussi de 0... Qu'est-ce qu'il y a dans le journal ?
 
Artyom Trishkin:
Je vois que dans init la variable SIZE a une valeur de 0, alors quelle est la taille du tableau ? Mais encore une fois, la taille de départ est aussi de 0... Qu'est-ce qu'il y a dans le journal ?
Zéros... J'essaie de comprendre...
 

Et les zéros aussi... Je ne comprends rien...

//---------------------
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:

Et les zéros aussi... Je ne comprends rien...

J'ai laissé entendre que SIZE doit d'abord être augmenté pour qu'il ne soit pas nul, et seulement ensuite la taille du tableau doit être modifiée.
 
Artyom Trishkin:
Eh bien, j'ai fait allusion au fait que SIZE doit d'abord être augmenté pour le rendre non nul, et seulement ensuite changer la taille du tableau.

:-)

Merci.

Cela fonctionne - utilisez-le si vous en avez besoin.

//---------------------
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:

:-)

Merci.

Cela fonctionne - utilisez-le si vous en avez besoin.

Il y a quelque chose que je ne comprends pas : SIZE est égal à zéro, alors pourquoi devrais-je modifier la taille du tableau d' abord, puis augmenter SIZE ? Quel gâchis...

J'ai fait une fois un tableau rempli de ticks pour un Expert Advisor ticks, qui définit l'intensité et la plage des ticks. J'ai découpé des morceaux pour des exemples :

//+------------------------------------------------------------------+
   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);
      }
//---
  }
//+------------------------------------------------------------------+

La fonction ci-dessous organise le travail avec le symbole désiré stocké dans la variable symbole, si vous avez besoin de travailler avec un autre symbole - écrivez-le là. La fonction FillArrays() remplit simplement les tableaux.

//+------------------------------------------------------------------+
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);
}
//+------------------------------------------------------------------+

J'avais besoin de remplir les tableaux avec des ticks de cette façon :

//+------------------------------------------------------------------+
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:

Je ne comprends pas - la taille est nulle, alors pourquoi changer la taille du tableau d'abord et augmenter ensuite la taille ? Quel gâchis...

J'ai fait une fois un tableau rempli de ticks pour un conseiller en tic-tac, qui détermine l'intensité et la propagation des ticks. J'ai découpé des morceaux pour des exemples :

La fonction ci-dessous organise le travail avec le symbole désiré stocké dans la variable symbole, si vous avez besoin de travailler avec un autre symbole - écrivez-le là. La fonction FillArrays() remplit simplement les tableaux.

J'avais besoin de remplir les tableaux avec des ticks de cette façon :

J'ai besoin d'un taux moyen de 1 tick/in 1 sec en n - ticks. C'est-à-dire que si n ticks sont reçus en k secondes, k/n sont reçus en ticks par seconde. Cette vitesse doit être mesurée à chaque arrivée de tique. Il changera à chaque nouvelle coche.

 

Pouvez-vous me dire s'il existe une horloge dans mt4 ? De préférence avec une seconde main.

ou peut-être existe-t-il un conseiller expert qui afficherait l'heure quelque part dans la ligne inférieure du terminal.