Preguntas de los principiantes MQL5 MT5 MetaTrader 5 - página 386

 
Roman Shiredchenko:

Mira, en el cuatro, parece que no puedo pasar...

Trabajo con arrays - necesito escribir la hora de llegada del tick en el array - por ejemplo, escribo una oferta. En cada garrapata. Lo hago todo según las entradas, por lo que estoy agradecido a Artyom Trishkin . No todo funciona. Lucha por el segundo día. Imprime

ceros.

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

Gracias.

Veo que en la variable init SIZE es 0, entonces ¿cuál es el tamaño del array? Entonces de nuevo en el inicio SIZE es también 0 ... ¿Qué hay en el registro?
 
Artyom Trishkin:
Veo que en el init la variable SIZE tiene un valor de 0, entonces ¿cuál es el tamaño del array? Entonces de nuevo en el inicio SIZE es también 0 ... ¿Qué hay en el registro?
Ceros... Estoy tratando de entenderlo...
 

Y también los ceros... No entiendo 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:

Y también los ceros... No entiendo nada...

He insinuado que primero hay que aumentar el SIZE para que no sea cero, y sólo entonces hay que cambiar el tamaño del array.
 
Artyom Trishkin:
Bueno, he insinuado que primero hay que aumentar SIZE para que sea distinto de cero, y sólo entonces cambiar el tamaño de la matriz.

:-)

Gracias.

Funciona: úsalo si lo necesitas.

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

:-)

Spc.

Funciona: úsalo si lo necesitas.

Hay algo que no entiendo: SIZE es cero, así que ¿por qué debo cambiar primero el tamaño del array y luego aumentar SIZE? Qué lío...

Una vez hice un relleno de array con ticks para un Expert Advisor de ticks, que define la intensidad y el rango de los ticks. He recortado piezas a modo de ejemplo:

//+------------------------------------------------------------------+
   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 función siguiente organiza el trabajo con el símbolo deseado almacenado en la variable de símbolo, si necesita trabajar con otro símbolo - escríbalo allí. La función FillArrays() sólo rellena arrays.

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

Necesitaba llenar las matrices con ticks de esta manera:

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

No lo entiendo - el TAMAÑO es cero, así que ¿por qué cambiar el tamaño de la matriz primero y luego aumentar el TAMAÑO? Qué lío...

Una vez hice un llenado de array con ticks para un asesor de ticking, que determina la intensidad y propagación de los ticks. He recortado piezas a modo de ejemplo:

La función siguiente organiza el trabajo con el símbolo deseado almacenado en la variable de símbolo, si necesita trabajar con otro símbolo - escríbalo allí. La función FillArrays() sólo rellena arrays.

Necesitaba llenar las matrices con ticks de esta manera:

Necesito una tasa media de 1 tick/in 1 seg en n - ticks. Es decir, n-ticks se reciben en k-segundos, k/n se reciben en ticks por segundo. Esta velocidad debe medirse en cada tic que llega. Cambiará con cada tilde posterior.

 

¿Puedes decirme si hay un reloj en mt4? Preferiblemente con una segunda mano.

o tal vez hay un Asesor Experto que mostraría el tiempo en algún lugar en la línea inferior de la terminal