Fragen von Anfängern MQL5 MT5 MetaTrader 5 - Seite 386

 
Roman Shiredchenko:

Hören Sie, auf der Vier scheine ich nicht durchzukommen...

Ich arbeite mit Arrays - ich muss die Tick-Ankunftszeit in das Array schreiben - zum Beispiel, ich schreibe ein Gebot. Auf jede Zecke. Ich mache alles nach Karten, wofür ich Artyom Trishkin dankbar bin. Nicht alles funktioniert. Kämpfte den zweiten Tag lang. Drucke

Nullen.

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

Ich danke Ihnen.

Ich sehe, dass in init Variable SIZE ist 0, so was ist die Größe des Arrays dann? Dann wiederum ist SIZE beim Start auch 0 ... Was steht in dem Protokoll?
 
Artyom Trishkin:
Wie ich sehe, hat die Variable SIZE in init den Wert 0. Wie groß ist dann das Array? Dann wiederum ist SIZE beim Start auch 0 ... Was steht in dem Protokoll?
Nullen... Ich versuche, es herauszufinden...
 

Und Nullen sind es auch... Ich verstehe gar nichts...

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

Und Nullen sind es auch... Ich verstehe gar nichts...

Ich habe angedeutet, dass SIZE zuerst erhöht werden muss, damit es nicht Null ist, und erst dann sollte die Größe des Arrays geändert werden.
 
Artyom Trishkin:
Nun, ich habe angedeutet, dass SIZE zuerst erhöht werden muss, damit es nicht Null ist, und erst dann die Größe des Arrays geändert werden kann.

:-)

Danke.

Es funktioniert - verwenden Sie es, wenn Sie es brauchen.

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

Es funktioniert - verwenden Sie es, wenn Sie es brauchen.

Was ich nicht verstehe: SIZE ist Null, warum sollte ich also zuerst die Größe des Arrays ändern und dann SIZE erhöhen? Was für ein Chaos...

Ich habe einmal ein Array mit Ticks für einen Ticks Expert Advisor gefüllt, das die Intensität und den Bereich der Ticks definiert. Ich habe Stücke für Beispiele ausgeschnitten:

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

Die folgende Funktion organisiert die Arbeit mit dem gewünschten Symbol, das in der Symbolvariablen gespeichert ist. Wenn Sie mit einem anderen Symbol arbeiten müssen, schreiben Sie es dorthin. Die Funktion FillArrays() füllt nur 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);
}
//+------------------------------------------------------------------+

Ich musste die Arrays auf diese Weise mit Ticks füllen:

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

Ich verstehe das nicht - die Größe ist Null, warum also erst die Größe des Arrays ändern und dann die Größe erhöhen? Was für ein Chaos...

Ich habe einmal ein Array mit Ticks für einen Tick-Advisor gefüllt, der die Intensität und Ausbreitung von Ticks bestimmt. Ich habe Stücke für Beispiele ausgeschnitten:

Die folgende Funktion organisiert die Arbeit mit dem gewünschten Symbol, das in der Symbolvariablen gespeichert ist. Wenn Sie mit einem anderen Symbol arbeiten müssen, schreiben Sie es dorthin. Die Funktion FillArrays() füllt nur Arrays.

Ich musste die Arrays auf diese Weise mit Ticks füllen:

Ich brauche eine durchschnittliche Rate von 1 Tick/in 1 Sekunde in n - Ticks. D.h. n-Ticks werden in k-Sekunden empfangen, k/n werden in Ticks pro Sekunde empfangen. Diese Geschwindigkeit muss bei jedem ankommenden Tick gemessen werden. Sie ändert sich mit jedem weiteren Häkchen.

 

Können Sie mir sagen, ob es eine Uhr in mt4 gibt? Vorzugsweise mit einem Sekundenzeiger.

oder vielleicht gibt es einen Expert Advisor, der die Zeit irgendwo in der unteren Zeile des Terminals anzeigt

Grund der Beschwerde: