Analógico para iBarShift - página 5

 
Aleksey Vyazmikin:

Porque é que o guião é tão lento?

A resposta está no perfilador.

 
Andrey Khatimlianskii:

A resposta está no perfilador.

OK, o perfilador refere-se a este pedaço de código

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

O que é que não lhe agrada? A função não é minha, mas o autor acima afirmou que deveria funcionar rapidamente...

 
Aleksey Vyazmikin:

OK, o perfilador refere-se a este pedaço de código

O que é que não lhe agrada? A função não é minha, mas o autor acima afirmou que deveria funcionar rapidamente...

Não percebo bem o humor, porque sobrecarregou a função MQL4iBarShift? O compilador provavelmente fica confuso por causa disso.
A função iBarShift2 foi concebida para MQL5, e em MQL4, apenas testou a correcção da sua execução, comparando-a com a função padrão.

 
Nikolai Semko:

Não percebo o humor, porque sobrecarregou a função MQL4 iBarShift? O compilador provavelmente fica confuso por causa disso.

Ninguém cancelou

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

E não deve haver qualquer confusão.

 
Nikolai Semko:

Não compreendo o humor, porque sobrecarregou a função MQL4 iBarShift? O compilador pode ficar confuso por causa disso.
A função iBarShift2 foi concebida para MQL5, e em MQL4, apenas testou a correcção da sua execução, comparando-a com a função padrão.

Acho que não estou a prestar atenção, mas olhei novamente para os vossos postos - ou seja, as vossas funções para o MT4? É que o tema era sobre MT5, acho que foi isso que me enganou.

Acrescentei: Raios, encontrei outro código, está tudo desfocado, peço desculpa.

 
Aleksey Vyazmikin:

Não devo ter prestado atenção, mas olhei novamente para os vossos postos - ou seja, as vossas funções para o MT4? É que o tema era sobre MT5, acho que foi isso que me enganou.

Adicionado: Merda, é isso - encontrei outro código - ficou tudo desfocado, desculpa.

Uau. Não. Experimentei o seu código em MQL5 e fiquei confuso. Agora compreendo o que quer dizer.
Aqui está uma imagem interessante.
Se o seu guião correr em TF=1 Dia nativo, tudo está bem.
Mas se o correr noutra TF, fico com atrasos desproporcionados inacreditáveis, que ainda não consigo explicar, excepto por algum bug no compilador.
Ao mesmo tempo, no modo de depuração ou de perfil não existem estes travões!!!
Vou agora experimentar e procurar a fonte dos travões.

 
Nikolai Semko:

Whoa. Não. Experimentei o vosso código na MQL5 e fiquei confuso. Compreendo agora o que quer dizer.
Aqui está uma imagem interessante.
Se o seu guião correr em TF=1 Dia nativo, tudo está bem.
Mas se o correr noutra TF, fico com atrasos desproporcionados inacreditáveis, que ainda não consigo explicar, excepto por algum bug no compilador.
Ao mesmo tempo, no modo de depuração ou de perfil não existem estes travões!!!
Vou agora experimentar e procurar a fonte dos travões.

Comece a sua pesquisa substituindo um valor de data/hora normal

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

Porque é que o guião é tão lento?


Sim, é surpreendente.

Localizei a localização dos travões.

//+------------------------------------------------------------------+
//|                                                    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 correr este guião em, digamos, H4

pode ver que a primeira vez que acede

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

o sistema congela.

E este estupor não está presente quando se faz o perfil ou a depuração.

Uma questão clara para o balcão de serviço

 
Aleksey Vyazmikin:

Porque é que o guião é tão 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

Obrigado Alexey pela observação.
Este é um erro óbvio na função Bars().
Abriu a pergunta no tópico bugs, bugs, consultas

 
Nikolai Semko:

Obrigado Alexey pela observação.
Isto é um erro claro na função Bars().
Abriu uma pergunta no tópico bugs, bugs, consultas

Obrigado pela análise, por isso ainda não estou completamente louco...