Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 386

 
Roman Shiredchenko:

Guarda, sul quattro, non riesco a passare...

Lavoro con gli array - ho bisogno di scrivere il tempo di arrivo del tick nell'array - per esempio, scrivo un'offerta. Ad ogni spunta. Faccio tutto secondo i biglietti, per i quali sono grato ad Artyom Trishkin . Non tutto funziona. Combattuto per il secondo giorno. Stampe

zeri.

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

Grazie.

Vedo che nella variabile init SIZE è 0, quindi qual è la dimensione dell'array? Poi di nuovo in start SIZE è anche 0 ... Cosa c'è nel registro?
 
Artyom Trishkin:
Vedo che in init la variabile SIZE ha un valore di 0, quindi qual è la dimensione dell'array? Poi di nuovo in start SIZE è anche 0 ... Cosa c'è nel registro?
Zeri... sto cercando di capire...
 

E anche gli zeri... Non capisco niente...

//---------------------
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 anche gli zeri... Non capisco niente...

Ho accennato al fatto che SIZE deve essere aumentato prima in modo che non sia zero, e solo allora la dimensione dell'array dovrebbe essere cambiata.
 
Artyom Trishkin:
Beh, ho accennato al fatto che SIZE deve essere prima aumentato per renderlo non nullo, e solo dopo cambiare la dimensione dell'array.

:-)

Grazie.

Funziona - usatelo se ne avete bisogno.

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

:-)

Grazie.

Funziona - usatelo se ne avete bisogno.

Qualcosa che non capisco - SIZE è zero, quindi perché dovrei cambiare la dimensione dell'array prima, e poi aumentare SIZE? Che pasticcio...

Una volta ho fatto un riempimento di array con ticks per un Expert Advisor ticks, che definisce l'intensità e la gamma dei ticks. Ho ritagliato dei pezzi per gli esempi:

//+------------------------------------------------------------------+
   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 funzione qui sotto organizza il lavoro con il simbolo desiderato memorizzato nella variabile simbolo, se avete bisogno di lavorare con un altro simbolo - scrivetelo lì. La funzione FillArrays() riempie solo gli array.

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

Avevo bisogno di riempire gli array di tick in questo modo:

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

Non capisco - la SIZE è zero, quindi perché cambiare la dimensione dell'array prima e poi aumentare la SIZE? Che pasticcio...

Una volta ho fatto un riempimento di array con tick per un consulente di ticchettio, che determina l'intensità e la diffusione dei tick. Ho ritagliato dei pezzi per gli esempi:

La funzione qui sotto organizza il lavoro con il simbolo desiderato memorizzato nella variabile simbolo, se avete bisogno di lavorare con un altro simbolo - scrivetelo lì. La funzione FillArrays() riempie solo gli array.

Avevo bisogno di riempire gli array di tick in questo modo:

Ho bisogno di un tasso medio di 1 tick/in 1 sec in n - tick. Cioè n-tick sono ricevuti in k-secondi, k/n sono ricevuti in tick al secondo. Questa velocità deve essere misurata su ogni tick in arrivo. Cambierà ad ogni spunta successiva.

 

Puoi dirmi se c'è un orologio in mt4? Preferibilmente con una seconda mano.

o forse c'è un Expert Advisor che mostrerebbe l'ora da qualche parte nella linea inferiore del terminale

Motivazione: