Analog zu iBarShift - Seite 5

 
Aleksey Vyazmikin:

Warum ist das Skript so langsam?

Die Antwort liegt im Profiler.

 
Andrey Khatimlianskii:

Die Antwort liegt im Profiler.

OK, der Profiler verweist auf dieses Codestück

Res=::Bars(Symb,TimeFrame,time,UINT_MAX)-1;

Was mag sie nicht? Die Funktion ist nicht von mir, aber der obige Autor behauptete, sie sollte schnell funktionieren...

 
Aleksey Vyazmikin:

OK, der Profiler verweist auf dieses Codestück

Was mag sie nicht? Die Funktion ist nicht von mir, aber der obige Autor behauptete, sie sollte schnell funktionieren...

Ich verstehe den Witz nicht ganz, warum haben Sie die MQL4-FunktioniBarShift überladen? Der Compiler wird dadurch wahrscheinlich verwirrt.
Die Funktion iBarShift2 wurde für MQL5 entwickelt, und in MQL4 wurde nur die Korrektheit ihrer Ausführung getestet, indem sie mit der Standardfunktion verglichen wurde.

 
Nikolai Semko:

Ich verstehe den Humor nicht, warum haben Sie die MQL4-Funktion iBarShift überladen? Der Compiler wird dadurch wahrscheinlich verwirrt.

Keiner hat abgesagt

#ifdef __MQL5__
/**************************/
#else
/**************************/
#endif

Und es sollte keine Verwirrung geben.

 
Nikolai Semko:

Ich verstehe den Humor nicht, warum haben Sie die MQL4-Funktion iBarShift überladen? Der Compiler könnte dadurch verwirrt werden.
Die Funktion iBarShift2 wurde für MQL5 entwickelt, und in MQL4 wurde nur die Korrektheit ihrer Ausführung getestet, indem sie mit der Standardfunktion verglichen wurde.

Ich habe wohl nicht aufgepasst, aber ich habe mir Ihre Beiträge noch einmal angeschaut - d.h. Ihre Funktionen für MT4? Es ist nur, dass das Thema über MT5 war, ich denke, das hat mich in die Irre geführt.

Ich habe hinzugefügt: Verdammt, ich habe einen anderen Code gefunden, er ist ganz verschwommen, ich entschuldige mich.

 
Aleksey Vyazmikin:

Ich glaube, ich habe nicht aufgepasst, aber ich habe mir Ihre Beiträge noch einmal angesehen - also Ihre Funktionen für MT4? Es ist nur, dass das Thema über MT5 war, ich denke, das hat mich in die Irre geführt.

Hinzugefügt: Mist, das war's - ich habe einen weiteren Code gefunden - es ist alles verschwommen, tut mir leid.

Wow. Nein. Ich habe Ihren Code in MQL5 ausprobiert und war verwirrt. Jetzt verstehe ich, was Sie meinen.
Hier ist ein interessantes Bild.
Wenn Ihr Skript auf dem nativen TF=1 Day läuft, ist alles in Ordnung.
Aber wenn ich es auf einem anderen TF laufen lasse, bekomme ich unglaubliche, unverhältnismäßige Lags, die ich mir noch nicht erklären kann, außer einem Fehler im Compiler.
Gleichzeitig gibt es im Debug-Modus oder im Profiling-Modus diese Bremsen nicht!!!
Ich werde nun experimentieren und nach der Quelle der Bremsen suchen.

 
Nikolai Semko:

Wow. Nein. Ich habe Ihren Code in MQL5 ausprobiert und war verwirrt. Ich verstehe jetzt, was Sie meinen.
Hier ist ein interessantes Bild.
Wenn Ihr Skript auf dem nativen TF=1 Day läuft, ist alles in Ordnung.
Aber wenn ich es auf einem anderen TF laufen lasse, bekomme ich unglaubliche, unverhältnismäßige Lags, die ich mir noch nicht erklären kann, außer einem Fehler im Compiler.
Gleichzeitig gibt es im Debug-Modus oder im Profiling-Modus diese Bremsen nicht!!!
Ich werde nun experimentieren und nach der Quelle der Bremsen suchen.

Beginnen Sie Ihre Suche mit dem Ersetzen eines normalen Datumswertes

Res=::Bars(Symb,TimeFrame,time,UINT_MAX)-1;
 
Aleksey Vyazmikin:

Warum ist das Skript so langsam?


Ja, das ist überraschend.

Ich habe den Standort der Bremsen lokalisiert.

//+------------------------------------------------------------------+
//|                                                    iBarShift.mq5 |
//|                        Copyright 2017, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property script_show_inputs

input ENUM_TIMEFRAMES TF=PERIOD_D1;
input int Bar=3;
input int calcN=1;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   for(int index=0;index<calcN;index++)
     {
      Print("0");
      datetime T=iTime(_Symbol,PERIOD_CURRENT,index);
      Print("00  "+ TimeToString(T));
      int Day_Shift=iBarShift(_Symbol,TF,T,false);
      Print("1");
      int Start=iBarShift(_Symbol,PERIOD_CURRENT,iTime(_Symbol,TF,Bar+Day_Shift),false);
      Print("2");
      int Stop=iBarShift(_Symbol,PERIOD_CURRENT,iTime(_Symbol,TF,Day_Shift),false);
      Print("3");

      if(index<3)Print("1 Start=",Start," Stop=",Stop," Day_Shift=",Day_Shift," index=",index);
      Print("4");

      if(index<3)Print("1 Start=",TimeToString(iTime(_Symbol,TF,Bar+Day_Shift),TIME_DATE|TIME_MINUTES),
         " Stop=",TimeToString(iTime(_Symbol,TF,Day_Shift),TIME_DATE|TIME_MINUTES),
         " Day_Shift=",TimeToString(iTime(_Symbol,PERIOD_CURRENT,index),TIME_DATE|TIME_MINUTES)," index=",index);
     }

   Print("5");

  }
//+------------------------------------------------------------------+ 
//| Получим iBarShift для заданного номера бара                      | 
//+------------------------------------------------------------------+   
int iBarShift(const string Symb,const ENUM_TIMEFRAMES TimeFrame,datetime time,bool exact=false)
  {
   static int Res=-1;
   static string LastSymb=NULL;
   static ENUM_TIMEFRAMES LastTimeFrame=0;
   static datetime LastTime=0;

   if((time!=LastTime) || (Symb!=LastSymb) || (TimeFrame!=LastTimeFrame))
     {
      Print("10");
      Res=::Bars(Symb,TimeFrame,time,UINT_MAX)-1;
      Print("11");
      if(Res<0) Res=0;

      LastTime = time;
      LastSymb = Symb;
      LastTimeFrame=TimeFrame;
     }
   return(Res);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
datetime iTime(string symbol,ENUM_TIMEFRAMES tf,int index)
  {
   if(index < 0) return(-1);
   datetime Arr[];
   if(CopyTime(symbol,tf,index,1,Arr)>0)
      return(Arr[0]);
   else return(-1);
  }
//+------------------------------------------------------------------+

Wenn Sie dieses Skript z. B. auf H4 ausführen

können Sie sehen, dass der erste Zugriff auf

Res=::Bars(Symb,TimeFrame,time,UINT_MAX)-1;

friert das System ein.

Bei der Profilerstellung oder der Fehlersuche ist dieser Stupor nicht vorhanden.

Ein klares Thema für den Service Desk

 
Aleksey Vyazmikin:

Warum ist das Skript so langsam?

2018.03.30 09:21:05.208 BS (Si Splice,H4) 1 Start=15 Stop=3 Day_Shift=0 index=0

2018.03.30 09:21:05.208 BS (Si Splice,H4) 1 Start=2018.03.26 00:00 Stop=2018.03.29 00:00 Day_Shift=2018.03.29 20:00 index=0

2018.03.30 09:21:20.209 BS (Si Splice,H4) 2 Start=15 Stop=3 Day_Shift=0 index=0

2018.03.30 09:21:20.209 BS (Si Splice,H4) 2 Start=2018.03.26 00:00 Stop=2018.03.29 00:00 Day_Shift=2018.03.29 20:00 index=0

2018.03.30 09:20:49.300 Scripts script BS (Si Splice,H4) loaded successfully

2018.03.30 09:21:20.209 Scripts script BS (Si Splice,H4) removed

Vielen Dank, Alexey, für diese Beobachtung.
Dies ist ein offensichtlicher Fehler in der Funktion Bars().
Eröffnete die Frage im Thread Bugs, Bugs, Queries

 
Nikolai Semko:

Vielen Dank, Alexey, für diese Beobachtung.
Dies ist ein eindeutiger Fehler in der Funktion Bars().
Eröffnete eine Frage in der Bugs, Bugs, Queries Thread

Danke für die Analyse, ich bin also noch nicht völlig verrückt...