Бета-версия платформы MetaTrader 5 build 1845: Функции для работы с барами в MQL5 и улучшения в тестере стратегий - страница 8

 
Dina Paches:

при таком сочетании получается у меня конкретное зависание работы скрипта, с вариантом кода Sergey Klimov:

В том-то что и странность, что у меня нет. От чего это зависит - не знаю. Говорю - плавающий баг. Не исключаю, что даже, различие внутренней структуры процессора может на это влиять.

void OnStart()
{
  Print("1");
  iLowest(_Symbol, PERIOD_CURRENT, MODE_CLOSE, 1, 0);
  Print("2"); 
}

2018.06.12 20:49:05.703 HWND (EURUSD,M1)        1
2018.06.12 20:49:05.703 HWND (EURUSD,M1)        2

А такой вариант у Вас зависает? И насколько.

void OnStart()
{   
  Print("1");
  Print(Bars(_Symbol,PERIOD_D1,D'2018.05.02 01:58:03',D'2018.05.02 12:56:11')); // Подвисает на 16 секунд
  Print("2"); 
}
 
Nikolai Semko:

В том-то что и странность, что у меня нет. От чего это зависит - не знаю. Говорю - плавающий баг. Не исключаю, что даже, различие внутренней структуры процессора может на это влиять.

У меня - и в цикле (при варианте кода Сергея Климова), и отдельной строкой зависает.

Если у вас - нет, то может видимо да, что-то от внутренней структуры зависит

void OnStart()
  {
  Print("1");
  iLowest(_Symbol, PERIOD_CURRENT, MODE_CLOSE, 1, 0);
  Print("2");  
  }
//+------------------------------------------------------------------+
//2018.06.13 06:13:08.762       1
//2018.06.13 06:13:32.168       2
Nikolai Semko:

А такой вариант у Вас зависает? И насколько.

Если так, как в вашем коде (на дневном периоде, но, при этом, внутри дневного бара), то да, подвисает в 1846-м билде (в 1816 - не опробовала):

Bars(...PERIOD_D1,D'2018.05.02 01:58:03',D'2018.05.02 12:56:11')
2018.06.13 06:35:32.033 test 3 (EURUSD,D1)      1
2018.06.13 06:35:55.473 test 3 (EURUSD,D1)      0
2018.06.13 06:35:55.473 test 3 (EURUSD,D1)      2

При простых вариантах, включая, например, на М1 вызвать с дневным периодом, нет, без зависаний:

void OnStart()
{   
  Print("1");
  int bars = Bars(Symbol(),PERIOD_D1,D'2018.06.11 00:00:00',D'2018.06.12 00:00:00');
  Print(bars);
  Print("2"); 
}
//+------------------------------------------------------------------+
//2018.06.13 06:20:33.246       test 3 (EURUSD,M1)      1
//2018.06.13 06:20:33.246       test 3 (EURUSD,M1)      2
//2018.06.13 06:20:33.246       test 3 (EURUSD,M1)      2
 
Dina Paches:

У меня - и в цикле (при варианте кода Сергея Климова), и отдельной строкой подвисает.

Если у вас - нет, то может видимо да, что-то от внутренней структуры зависит

Если так, как в вашем коде (на дневном периоде, но, при этом, внутри дневного бара), то да, подвисает в 1846-м билде (в 1816 - не опробовала):

При простых вариантах, включая, например, на М1 вызвать с дневным периодом, нет, без зависаний:

int bars = Bars(Symbol(),PERIOD_D1,D'2018.06.11 00:00:00',D'2018.06.12 00:00:00');


Понятно. 
Если в функции Bars время start_time и stop_time находятся в разных барах запрашиваемого периода, то функция отрабатывает без зависаний.

Или такой вариант тоже приводит к зависанию:

Bars(Symbol(),PERIOD_H1,D'2018.06.09 16:00:00',D'2018.06.10 08:00:00');

по причине что запрашиваемый диапазон часовых баров находится внутри выходных дней, где нет баров.

 
Nikolai Semko:

Округление времени, если что, помогает.

Например (на основе вашего кода выше):

void OnStart()
{   
  datetime t0=D'2018.05.02 01:58:03';
  datetime t1=D'2018.05.02 12:56:11';
  //---
  ENUM_TIMEFRAMES period=PERIOD_D1;
  //---
  int period_seconds=PeriodSeconds(period);
  //---
  t0 = (t0-(t0%period_seconds))-period_seconds;
  t1 = (t1-(t1%period_seconds))-period_seconds;
//---
  Print("1");
  int bars = Bars(Symbol(),period,t0,t1);
  Print(bars);
  Print("2"); 
}
//+------------------------------------------------------------------+
//2018.06.13 07:25:50.967       test 3 (EURUSD,D1)      1
//2018.06.13 07:25:50.967       test 3 (EURUSD,D1)      1
//2018.06.13 07:25:50.967       test 3 (EURUSD,D1)      2

P./S.: Выше - поправила округления немного. Прежний код, который был до вашего поста ниже:

void OnStart()
{   
  datetime t0=D'2018.05.02 01:58:03';
  datetime t1=D'2018.05.02 12:56:11';
  //---
  ENUM_TIMEFRAMES period=PERIOD_D1;
  //---
  int period_seconds=PeriodSeconds(period);
  //---
  t0 = (t0-(t0%period_seconds))-period_seconds;
//---
  Print("1");
  int bars = Bars(Symbol(),period,t0,t1);
  Print(bars);
  Print("2"); 
}
 
Dina Paches:

Округление времени, если что, помогает.

Например (на основе вашего кода выше):

Нет. Там очень много нюансов. Например, это не прокатит с недельными и месячными барами, это не спасет, если запрашиваемый диапазон находиться внутри выходных дней без баров. Я очень хорошо изучил этот вопрос. Реально помогает этот мой код. Причем он работает заметно быстрее оригинальной функции.  В нем все нюансы учтены. Это оказалась весьма не простая задача и я потратил на ее решение почти неделю.

 
Nikolai Semko:

Нет. Там очень много нюансов. Например это не прокатит с недельными и месячными барами, это не спасет если запрашиваемый диапазон находиться внутри выходных дней без баров. Я очень хорошо изучил этот вопрос. Реально помогает этот мой код. В нем все нюансы учтены. Это оказалась весьма не простая задача и я потратил на ее решение почти неделю.

И я, в своё время, корпела/находила решения себе для каких-то нюансов по барам, когда мне это потребовалось. Но у меня это всё в закрытом виде. Поэтому оставлю при себе. 

С вашим кодом познакомлюсь, благодарю, интересно будет посмотреть потом на свежую голову

 
Nikolai Semko:

Я там немного уточнила код выше. Потом дошло, что вероятно нехорошо с моей стороны удалять прежний код. Поэтому добавила удалённый, но уже постскриптумом. В общем, посты, рассуждения и код у меня сейчас "на автомате". Фактически уже сплю с открытыми глазами

 
Andy:
Новости открываются только со второго раза.

Спасибо за обращение, проверим.

 
Alexander:

Спасибо за обращение, проверим.

Демо сервер MQ не работают?

 
Fast528:

Демо сервер MQ не работают?

Видимо не работает, так как я пол-часа пытаюсь отрыть новый счет и никак не получается.