Fehler, Irrtümer, Fragen - Seite 3147

 
Einen guten Tag an alle. Können Sie bitte mitteilen, ob die Funktion Sleep() im Testmodus des Expert Advisors ausgeführt wird (natürlich mit echten Ticks)?
 
SuhanovDM94 #:
Einen guten Tag an alle. Könnten Sie bitte mitteilen, ob Sleep() im Testmodus des Expert Advisors ausgeführt wird (natürlich mit echten Ticks)?

In Bearbeitung - die Zeit des Testers wird um einen entsprechenden Betrag geändert.

 
fxsaber #:

Ausgeführt - die Testerzeit wird um einen entsprechenden Betrag geändert.

Herzlichen Dank!

 
Wizard #:
Ist es möglich, die Größe des Ticks in mql5 zu ermitteln, nach dem eine Position eröffnet wurde?

Es stellt sich heraus, dass Sie das können. Die for-Schleife wird in eine separate Funktion, in die Funktion OnTick() oder nach eigenem Ermessen eingefügt. Ich interessiere mich für die Meinung anderer. Ich brauche es zum Beispiel, um ein ultrapräzises System zu erstellen. Deshalb schreibe ich ohne Bibliotheken, einschließlich Funktionen zum Öffnen und Schließen von Positionen. Wer auch immer was sagt, mqh-Bibliotheken verlangsamen die Arbeit, zum Beispiel dauert die Kompilierung 1,5 mal länger. Es ist besser, alles in eine Datei zu schreiben. Der Stil, OOP oder prozedural, spielt keine Rolle. MQL5 wird nie eine Sprache auf dem Niveau von C++ werden, es ist begrenzt. Der Punkt ist in Bibliotheken.

#define  EXPERT_MAGIC 261              // MagicNumber эксперта
input string Symbol_T  = "XAUUSD";    // глобальная переменная для задаваемого символа

..............

for(int i = PositionsTotal()-1; i >= 0; i--)
{
   if(PositionGetTicket(i) > 0 && PositionGetString(POSITION_SYMBOL) == Symbol_T && PositionGetInteger(POSITION_MAGIC) == EXPERT_MAGIC)
   {
      int attempts = 0;       // счетчик попыток
      bool success = false;   // флаг успешного выполнения копирования тиков
      MqlTick tick_array[];   // массив для приема тиков
         
      //--- сделаем 3 попытки получить тики
      while(attempts < 3)
      {
         //--- замерим время старта перед получением тиков
         uint start = GetTickCount();
         //--- дата, по которую запрашиваются тики (время открытия позиции)
         datetime Time_Open = (datetime)PositionGetInteger(POSITION_TIME);
         //--- дата, с которой запрашиваются тики (достаточно взять на 30 секунд раньше открытия позиции)
         datetime Time_Start = (datetime)(Time_Open-30);
         //--- запросим тиковую историю с момента Time_Start до момента Time_Open
         int received = CopyTicksRange(Symbol_T, tick_array, COPY_TICKS_ALL, Time_Start*1000, Time_Open*1000);
         if(received != -1)
         { 
            //--- выведем информацию о количестве тиков и затраченном времени
            PrintFormat("%s: received %d ticks in %d ms", Symbol_T, received, GetTickCount()-start);  
            //--- если тиковая история синхронизирована, то код ошибки равен нулю
            if(GetLastError()==0)
            {
               success = true;
               break;
            }
            else
               PrintFormat("%s: Ticks are not synchronized yet, %d ticks received for %d ms. Error=%d", Symbol_T, received, GetTickCount()-start, _LastError);
         }
         //--- считаем попытки
         attempts++;
         //--- пауза в 1 секунду в ожидании завершения синхронизации тиковой базы
         Sleep(1000);
      }
      //--- не удалось получить запрошенные тики от самого начала истории с трех попыток 
      if(!success)
      {
         PrintFormat("Ошибка! Не удалось получить %d тиков по %s с трех попыток", Symbol_T);
	 //return; (вставить, если цикл находится внутри функции типа void)
      }

      //--- узнаем количесто элементов в массиве
      int ticks = ArraySize(tick_array);

      //--- выведем bid последнего тика в массиве перед самым открытием позиции
      double last_bid_before_priceopen = tick_array[ticks-1].bid;
      Print("BID последнего тика: ", tick_array[ticks-1].bid);
      //--- выведем ask последнего тика в массиве перед самым открытием позиции
      double last_ask_before_priceopen = tick_array[ticks-1].ask;
      Print("ASK последнего тика: ", tick_array[ticks-1].ask);

      //--- узнаем цену, по которой была открыта позиция
      double Position_PriceOpen = PositionGetDouble(POSITION_PRICE_OPEN);

      if((ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY)
      {
         //--- вычислим размер последнего тика, на котором была открыта позиция (для BUY позиции открытие было по цене ASK)
         double size_last_tick_ASK = NormalizeDouble(fabs(Position_PriceOpen - last_ask_before_priceopen), _Digits);
      }
      else if((ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL)
      {
         //--- вычислим размер последнего тика, на котором была открыта позиция (для SELL позиции открытие было по цене BID)
         double size_last_tick_BID = NormalizeDouble(fabs(last_bid_before_priceopen - Position_PriceOpen), _Digits);
      }
   }
}

 

Ich habe diesen Fehler satt - es gibt einen Indikator, es gibt einen Experten, der daran arbeitet. Ich ändere den Indikator und kompiliere ihn neu. Die Änderungen des Indikators sind auf dem Chart deutlich zu sehen - der Expert Advisor wird im Tester ausgeführt - aber es ist, als hätte sich nichts geändert. Das gleiche Ergebnis.

Wenn ich das Terminal neu starte und den Tester danach durchlaufen lasse, wird ein neuer Code generiert.

Was ist das für ein Hack, ich verstehe das nicht.

Ich habe den Indikator ex5 entfernt. Das Prüfgerät läuft weiter, als wäre nichts geschehen. Woher bekommt er die Datei zur Ausführung????

 
Roman #:

3184
Seltsames Verhalten des Indikators.
Die for-Schleife geht nicht bei jedem Tick in den Body, sondern nur einmal bei einer neuen Kerze.

Aber i == 0 und die gegebene Bedingung erlaubt i>=0

auf dem Tick auf dem gleichen Bar-Limit = 0
so der erste Wert von i = -1 und Bedingung i>=0
das ist, warum es nicht in die Schleife gehen.

 
Nikolai Semko #:

beim Tick auf demselben Balken Limit = 0
also der erste Wert i = -1 und die Bedingung i>=0
deshalb geht es nicht in die Schleife.

Danke, das habe ich übersehen.

Aber jetzt Indikatorpuffer IndBuff[i] tut seinen Kopf in, Array außerhalb des Bereichs.
Was braucht es? Warum wird nicht auf den Anfangswert i=limit zugeteilt?


//+------------------------------------------------------------------+
//|                                                       Simple.mq5 |
//|                                  Copyright 2021, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window

#property indicator_buffers      1
#property indicator_plots        1


//indicator buffers
double IndBuff[];

double c = 0;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
{
   SetIndexBuffer(0, IndBuff, INDICATOR_DATA);
   PlotIndexSetInteger(0, PLOT_DRAW_TYPE,  DRAW_LINE);   //тип отрисовки
   PlotIndexSetInteger(0, PLOT_LINE_STYLE, STYLE_SOLID); //стиль отрисовки
   PlotIndexSetInteger(0, PLOT_LINE_COLOR, clrAqua);     //цвет отрисовки
   PlotIndexSetInteger(0, PLOT_LINE_WIDTH, 1);           //толщина отрисовки
   PlotIndexSetString(0,  PLOT_LABEL,"K");               //метка
   PlotIndexSetDouble(0,  PLOT_EMPTY_VALUE, 0.0);        //нулевые значения считать пустыми
   
   return(INIT_SUCCEEDED);
}


//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate (const int rates_total,       
                 const int prev_calculated,   
                 const int begin,             
                 const double& price[])      
{

   ArraySetAsSeries(IndBuff, true);
   
   //-------------------------------------------------------------------------
   //Проверка и расчёт количества просчитываемых баров
   int limit = rates_total-prev_calculated;

   
   //-------------------------------------------------------------------------
   //Расчёт индикатора
   for(int i=limit; i>=0; i--)
   {
      c = iClose(_Symbol,PERIOD_CURRENT,i);      
      
      IndBuff[i] = c;  //на этой строке array out of range

   }
   

   return(rates_total);
}


 
Roman #:

Danke, die habe ich übersehen.

Aber jetzt Indikatorpuffer IndBuff[i] ist das Gehirn tun, Array außerhalb des Bereichs.
Was braucht sie? Warum wird nicht bis zum Anfangspunkt i=limit zugeteilt?

   //Проверка и расчёт количества просчитываемых баров
   int limit = rates_total-prev_calculated;

   if(limit==1)
     limit=2;
   //-------------------------------------------------------------------------
   //Расчёт индикатора
   for(int i=limit-1; i>=0; i--)
   {
      c = iClose(_Symbol,PERIOD_CURRENT,i);      
      
      IndBuff[i] = c;  //на этой строке array out of range

   }
 
Vitaly Muzichenko #:

Es wird also bei jedem Balken eine Schleife ausgeführt, während es bei jedem Tick eine Schleife ausführen muss.

Früher funktionierte es folgendermaßen

für die Ticks i>=0,

für Balken i>0

Jetzt weiß ich nicht, wie ich mit dem Puffer arbeiten soll.

 

Das liegt daran, dass IndBuff nicht zu rates_total + 1
zugeordnet ist und ArrayResize nicht darauf anwendbar ist.
Sie brachen das Konstrukt. Müssen wir jetzt für alles if-arses verwenden?

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate (const int rates_total,       
                 const int prev_calculated,   
                 const int begin,             
                 const double& price[])      
{

   ArraySetAsSeries(IndBuff, true);
   
   //-------------------------------------------------------------------------
   //Проверка и расчёт количества просчитываемых баров
   int limit = rates_total-prev_calculated;
   
   if(limit > 1)
   {
      
      Print(rates_total,": rates_total");
      Print(limit,": limit");   
      Print(ArraySize(IndBuff),": IndBuff");
   }   
   
   //-------------------------------------------------------------------------
   //Расчёт индикатора
   for(int i=limit; i>=0; i--)
   {
      c = iClose(_Symbol,PERIOD_CURRENT,i);    

      IndBuff[i] = c;  //array out of range

   }
   

   return(rates_total);
}
100686: rates_total
100686: limit
100686: IndBuff
array out of range in 'Simple.mq5' (82,15)