Аналог iBarShift - страница 5

 
Aleksey Vyazmikin:

Почему так медленно работает скрипт?

Ответ в профилировщике.

 
Andrey Khatimlianskii:

Ответ в профилировщике.

Хорошо, профилировщик ссылается на этот кусок кода

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

И что ему не нравится? Функция не моя, но автор выше утверждал что она должна быстро работать...

 
Aleksey Vyazmikin:

Хорошо, профилировщик ссылается на этот кусок кода

И что ему не нравится? Функция не моя, но автор выше утверждал что она должна быстро работать...

Что-то я юмора не понял, а зачем Вы перегрузили штатную функцию в MQL4 iBarShift? Компилятор возможно входит в ступор из-за этого.
Тем более функция iBarShift2 предназначена для MQL5, а в MQL4 лишь тестировалась корректность выполнения, сравнивая с эталоном штатной функции.

 
Nikolai Semko:

Что-то я юмора не понял, а зачем Вы перегрузили штатную функцию в MQL4 iBarShift? Компилятор возможно входит в ступор из-за этого.

Ни кто не отменял

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

И ни что в ступор входить не должно.

 
Nikolai Semko:

Что-то я юмора не понял, а зачем Вы перегрузили штатную функцию в MQL4 iBarShift? Компилятор возможно входит в ступор из-за этого.
Тем более функция iBarShift2 предназначена для MQL5, а в MQL4 лишь тестировалась корректность выполнения, сравнивая с эталоном штатной функции.

Наверное я не внимателен, но ещё раз посмотрел Ваши посты - т.е. Ваши функции для MT4? Просто тема было про MT5, видимо это и ввело меня в заблуждение.

Добавил: Млин всё - нашел другой код - всё замылилось, извиняюсь.

 
Aleksey Vyazmikin:

Наверное я не внимателен, но ещё раз посмотрел Ваши посты - т.е. Ваши функции для MT4? Просто тема было про MT5, видимо это и ввело меня в заблуждение.

Добавил: Млин всё - нашел другой код - всё замылилось, извиняюсь.

Ух ты. Да нет. Я тут попробовал Ваш код на MQL5 и впал в ступор. Я теперь понял, что Вы имеете ввиду.
Интересная картина получается. 
Если Ваш скрипт запустить на родном ТФ= 1 День, то все ОК.
Но если его запустить на другом ТФ, то невероятные несоразмерные  тормоза, которые я никак не могу объяснить пока, только как каким-то багом в компиляторе.
При этом в режиме отладки или режиме профилировании этих тормозов нет!!!
Сейчас буду экспериментировать и искать источник тормозов.

 
Nikolai Semko:

Ух ты. Да нет. Я тут попробовал Ваш код на MQL5 и впал в ступор. Я теперь понял, что Вы имеете ввиду.
Интересная картина получается. 
Если Ваш скрипт запустить на родном ТФ= 1 День, то все ОК.
Но если его запустить на другом ТФ, то невероятные несоразмерные  тормоза, которые я никак не могу объяснить пока, только как каким-то багом в компиляторе.
При этом в режиме отладки или режиме профилировании этих тормозов нет!!!
Сейчас буду экспериментировать и искать источник тормозов.

Начните поиски с подстановки нормального значения datetime

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

Почему так медленно работает скрипт?


Да, это удивительно. 

Я локализовал место тормозов.

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

Если запустить этот скрипт скажем на H4

то видно что при первом обращении к 

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

происходит ступор системы.

Причем этого ступора нет при профилировании или отладки.

Явный вопрос для сервисдеска

 
Aleksey Vyazmikin:

Почему так медленно работает скрипт?

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

Спасибо Алексей за наблюдательность.
Это явный баг функции Bars()
Открыл вопрос в ветке Ошибки, баги, воросы

 
Nikolai Semko:

Спасибо Алексей за наблюдательность.
Это явный баг функции Bars()
Открыл вопрос в ветке Ошибки, баги, воросы

Спасибо за анализ, значит я ещё не до конца сошел с ума...

Причина обращения: