Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 386

 
Roman Shiredchenko:

Гляньте плз, по четвёрке - там похоже не достучаться...

С массивами работаю - надо писать время прихода тика в массив - для примера - пишу бид. На каждом тике. Делаю всё согласно билетов, за что благодарен  Artyom Trishkin. Не всё получается. Второй день бьюсь... Принтует 

нули.

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

Благодарю.

Вижу, что в init переменная SIZE имеет значение 0, и какой тогда размер массива? Далее опять же в start SIZE тоже 0 ... Что в журнале-то?
 
Artyom Trishkin:
Вижу, что в init переменная SIZE имеет значение 0, и какой тогда размер массива? Далее опять же в start SIZE тоже 0 ... Что в журнале-то?
нули...  Разбираюсь...
 

И так тоже нули... Ничё понять не могу...

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

И так тоже нули... Ничё понять не могу...

Так я ж намекнул на то, что SIZE нужно сначала увеличить, чтобы не ноль был, а уже потом размер массива менять.
 
Artyom Trishkin:
Так я ж намекнул на то, что SIZE нужно сначала увеличить, чтобы не ноль был, а уже потом размер массива менять.

:-)

Спс.

Работает - кому надо - пользуйтесь.

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

:-)

Спс.

Работает - кому надо - пользуйтесь.

Что-то я не пойму - SIZE равен нулю, а зачем сначала изменять размер массива, а уже потом увеличивать SIZE ? Бардак какой-то...

Я как-то делал заполнение массивов тиками для тикового советника, определяющего интенсивность и размах тиков. Повырезал кусочки для примеров:

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

В функции ниже организована работа с нужным символом, хранящемся в переменной symbol, если нужна работа с другим символом - запишем туда его. Функция FillArrays() как раз и заполняет массивы.

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

Мне нужно было так заполнять массивы тиками:

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

Что-то я не пойму - SIZE равен нулю, а зачем сначала изменять размер массива, а уже потом увеличивать SIZE ? Бардак какой-то...

Я как-то делал заполнение массивов тиками для тикового советника, определяющего интенсивность и размах тиков. Повырезал кусочки для примеров:

В функции ниже организована работа с нужным символом, хранящемся в переменной symbol, если нужна работа с другим символом - запишем туда его. Функция FillArrays() как раз и заполняет массивы.

Мне нужно было так заполнять массивы тиками:

мне нужна средняя скорость 1 тик/в 1 сек за н - тиков. Т.е.  н-тиков поступают за к-секунд, к/н получаются тики в секунду. Эту скорость  необходимо  мерить на каждом тике поступающем. Она будет меняться с каждым последующим тиком.

 

подскажите- в мт4  можно  гдето часы увидеть?  желательно с секундной стрелкой.

 или может  есть советник такой? выводить время куданить в самую нижнюю строку терминала 

Причина обращения: