Analogo a iBarShift - pagina 5

 
Aleksey Vyazmikin:

Perché lo script è così lento?

La risposta è nel profiler.

 
Andrey Khatimlianskii:

La risposta è nel profiler.

OK, il profiler si riferisce a questo pezzo di codice

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

Cosa non gli piace? La funzione non è mia, ma l'autore sopra ha affermato che dovrebbe funzionare rapidamente...

 
Aleksey Vyazmikin:

OK, il profiler si riferisce a questo pezzo di codice

E cosa non gli piace? La funzione non è mia, ma l'autore sopra ha affermato che dovrebbe funzionare velocemente...

Non capisco bene l'umorismo, perché hai sovraccaricato la funzioneiBarShift di MQL4? Il compilatore probabilmente si confonde per questo.
La funzione iBarShift2 è progettata per MQL5, e in MQL4, ha solo testato la correttezza della sua esecuzione confrontandola con la funzione standard.

 
Nikolai Semko:

Non capisco l'umorismo, perché hai sovraccaricato la funzione iBarShift di MQL4? Il compilatore probabilmente si confonde per questo.

Nessuno ha cancellato

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

E non ci dovrebbe essere alcuna confusione.

 
Nikolai Semko:

Non capisco l'umorismo, perché hai sovraccaricato la funzione iBarShift di MQL4? Il compilatore potrebbe confondersi a causa di ciò.
La funzione iBarShift2 è progettata per MQL5, e in MQL4, ha solo testato la correttezza della sua esecuzione, confrontandola con la funzione standard.

Devo non essere stato attento, ma ho guardato di nuovo i tuoi post - cioè le tue funzioni per MT4? È solo che l'argomento era su MT5, credo che sia questo che mi ha fuorviato.

Ho aggiunto: Accidenti, ho trovato un altro codice, è tutto sfocato, mi scuso.

 
Aleksey Vyazmikin:

Devo non essere stato attento, ma ho guardato di nuovo i tuoi post - cioè le tue funzioni per MT4? È solo che l'argomento era su MT5, credo che sia questo che mi ha fuorviato.

Aggiunto: Merda, questo è tutto - ha trovato un altro codice - è tutto sfocato, scusate.

Wow. No. Ho provato il tuo codice in MQL5 e mi sono confuso. Ora capisco cosa intende.
Ecco un'immagine interessante.
Se il tuo script gira su TF=1 Day nativo, tutto è OK.
Ma se lo eseguo su un altro TF ottengo lag sproporzionati incredibili, che non riesco ancora a spiegare, se non per qualche bug nel compilatore.
Allo stesso tempo in modalità debug o di profiling non ci sono questi freni!!!
Ora sperimenterò e cercherò la fonte dei freni.

 
Nikolai Semko:

Whoa. No. Ho provato il tuo codice in MQL5 e mi sono confuso. Ora capisco cosa intende.
Ecco un'immagine interessante.
Se il tuo script gira su TF=1 Day nativo, tutto è OK.
Ma se lo eseguo su un altro TF ottengo lag sproporzionati incredibili, che non riesco ancora a spiegare, se non per qualche bug nel compilatore.
Allo stesso tempo in modalità di debug o di profiling non ci sono questi freni!!!
Ora sperimenterò e cercherò la fonte dei freni.

Inizia la tua ricerca sostituendo un normale valore di data e ora

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

Perché lo script è così lento?


Sì, è sorprendente.

Ho localizzato la posizione dei freni.

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

Se si esegue questo script su, diciamo, H4

potete vedere che la prima volta che accede a

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

il sistema si blocca.

E questo stupore non è presente quando si profila o si esegue il debug.

Un chiaro problema per il service desk

 
Aleksey Vyazmikin:

Perché lo script è così lento?

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

Grazie Alexey per l'osservazione.
Questo è un evidente bug nella funzione Bars().
Aperto la domanda nel thread di bug, bug, query

 
Nikolai Semko:

Grazie Alexey per l'osservazione.
Questo è un chiaro bug nella funzione Bars().
Aperto una domanda nel thread dei bug, bug, query

Grazie per l'analisi, quindi non sono ancora completamente pazzo...

Motivazione: