Новая версия платформы MetaTrader 5 build 2007: Экономический календарь, MQL5-программы в виде сервисов - страница 57

 
Aleksey Vyazmikin:

Я показал код, суть которого в копировании в массив времени нулевого бара.

Код в функции индикатора.

Если нужно, я могу передать код индикатора для воспроизведения.

Я могу понять, когда запрошена информация исторически далекая и нужно время, что б её подготовить, но тут же расчет происходит только при появлении нового тика этого самого нулевого бара, поэтому я и не могу понять почему это так и как решить проблему без заполнения буфера индикатора нулями.

Это происходит не на каждом тике или баре.
Вы не сказали и даже не вывели в лог наименование символа, на котором возникает проблема.

Вы ничего не сказали про торговый сервер, к которому подключены.

Вы дали непонятный отрывок исходного кода, вместо нормального кода, который можно взять как есть, скомпилировать, накинуть на график и наблюдать описанную проблему.

Вы не предприняли ни одного шага, чтобы хотя бы понять проблему. Этот неведомый символ вообще выбран в обзоре рынка? Когда приходила последняя котировка по этому неведомому символу?

А ничего, что из индикатора все запросы к истории выполняются без ожидания синхронизации?

Какого ответа вы ждёте?
 

справка некорректная по iBars https://www.mql5.com/ru/docs/series/ibars

Возвращаемое значение

Количество баров в истории по соответствующему символу и периоду, но не более чем задано в настройках платформы параметром "Макс. баров в окне" ("Max bars in chart")

проверил в индикаторе:

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   static datetime t=0;
   if(t!=time[rates_total-1])
     {
      Print("rates_total = ",rates_total, ", TERMINAL_MAXBARS = ",TerminalInfoInteger(TERMINAL_MAXBARS));
      Print("iBars = ",iBars(NULL,0),", Bars = ",Bars(_Symbol,_Period));
      t=time[rates_total-1];
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }

в логе  однозначно iBars() больше TERMINAL_MAXBARS:

2019.04.30 20:11:40.256 rates (EURUSD,M1) rates_total = 50062, TERMINAL_MAXBARS = 50000

2019.04.30 20:11:40.256 rates (EURUSD,M1) iBars = 50062, Bars = 50062

2019.04.30 20:12:31.156 rates (EURUSD,M1) rates_total = 50063, TERMINAL_MAXBARS = 50000

2019.04.30 20:12:31.156 rates (EURUSD,M1) iBars = 50063, Bars = 50063

2019.04.30 20:13:29.950 rates (EURUSD,M1) rates_total = 50064, TERMINAL_MAXBARS = 50000

2019.04.30 20:13:29.950 rates (EURUSD,M1) iBars = 50064, Bars = 50064

2019.04.30 20:14:30.621 rates (EURUSD,M1) rates_total = 50065, TERMINAL_MAXBARS = 50000

2019.04.30 20:14:30.621 rates (EURUSD,M1) iBars = 50065, Bars = 50065

2019.04.30 20:15:29.649 rates (EURUSD,M1) rates_total = 50066, TERMINAL_MAXBARS = 50000

2019.04.30 20:15:29.649 rates (EURUSD,M1) iBars = 50066, Bars = 50066

2019.04.30 20:16:29.786 rates (EURUSD,M1) rates_total = 50067, TERMINAL_MAXBARS = 50000

2019.04.30 20:16:29.786 rates (EURUSD,M1) iBars = 50067, Bars = 50067

Документация по MQL5: Доступ к таймсериям и индикаторам / iBars
Документация по MQL5: Доступ к таймсериям и индикаторам / iBars
  • www.mql5.com
Количество баров в истории по соответствующему символу и периоду, но не более чем задано в настройках платформы параметром "Макс. баров в окне" ("Max bars in chart")
 
Slava:
Вы не сказали и даже не вывели в лог наименование символа, на котором возникает проблема.

Вы ничего не сказали про торговый сервер, к которому подключены.

Вы дали непонятный отрывок исходного кода, вместо нормального кода, который можно взять как есть, скомпилировать, накинуть на график и наблюдать описанную проблему.

Вы не предприняли ни одного шага, чтобы хотя бы понять проблему. Этот неведомый символ вообще выбран в обзоре рынка? Когда приходила последняя котировка по этому неведомому символу?

А ничего, что из индикатора все запросы к истории выполняются без ожидания синхронизации?

Какого ответа вы ждёте?

Не ругаетесь, пожалуйста!

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

2019.04.26 12:12:39.811 i-Regr4_05i (Si-6.19,M1)        Failed to copy data from the handle_Regressor indicator, error code 4401

Индикатор работает на том же символе и с тем же TF, т.е. получается, что на Si-6.19 M1 - в обзоре рынка символ есть. Торговый сервер брокера Открытие Access Server IX .

Я же сказал, что дам индикатор по требованию - это не проблема - требуете - давать?

Про ожидание синхронизации - как тут может возникать рассинхронизация, если я работаю с тем же ТФ и чартом, что и индикатор в целом, использую OnCalculate(), которая активируется от нового тика, но не раньше его во всяком случае, или я тут не прав?

Ранее, зимой на старом билде я месяц собирал статистику по всем индикаторам, что для меня важны, и не получал подобной ошибки - данные совпадали с тестовыми полностью, после как раз решения рассинхронизации по одному из индикаторов, но там данные были с другого ТФ и индикатора.

Я очень заинтересован в решении проблемы, поэтому, прошу Вас писать, то что со своей стороны мне требуется сделать дополнительно.

 
Aleksey Vyazmikin:

Не ругаетесь, пожалуйста!

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

Индикатор работает на том же символе и с тем же TF, т.е. получается, что на Si-6.19 M1 - в обзоре рынка символ есть. Торговый сервер брокера Открытие Access Server IX .

Я же сказал, что дам индикатор по требованию - это не проблема - требуете - давать?

Про ожидание синхронизации - как тут может возникать рассинхронизация, если я работаю с тем же ТФ и чартом, что и индикатор в целом, использую OnCalculate(), которая активируется от нового тика, но не раньше его во всяком случае, или я тут не прав?

Ранее, зимой на старом билде я месяц собирал статистику по всем индикаторам, что для меня важны, и не получал подобной ошибки - данные совпадали с тестовыми полностью, после как раз решения рассинхронизации по одному из индикаторов, но там данные были с другого ТФ и индикатора.

Я очень заинтересован в решении проблемы, поэтому, прошу Вас писать, то что со своей стороны мне требуется сделать дополнительно.

Какого качества индикатор? Вы вызываете CopyTime, а в сообщении “failed to copy data from handle”. Как можно быть уверенным, что в переменной symb содержится имя текущего символа?


Очень похоже на «на, бабка, сама занимайся сексом»

 
Slava:

Какого качества индикатор? Вы вызываете CopyTime, а в сообщении “failed to copy data from handle”. Как можно быть уверенным, что в переменной symb содержится имя текущего символа?


Очень похоже на «на, бабка, сама занимайся сексом»

Да, я запутал - признаю, просто для себя сообщения делал и вижу, что оно от индикатора - изначально я думал, что проблема в советнике и искал параллельно проблему, поэтому и упоминание хэндла.

Про уверенность в переменной symb имя текущего символа - задается параметрами функции

Coef=SKO(_Symbol,_Period,Fp,time[i],degre,kstd,HL,ML,LL);
double SKO(string symb,ENUM_TIMEFRAMES TFrame,datetime SDate,datetime EDate,ENUM_Polynomial deegre,double cstd,double &hl,double &ml,double &lll)

Код я положил Вам в личку. К сожалению, качество кода оценить правильно не могу - это порождение фриланса в целом.

 
То есть вы не можете удалять объекты в функции индикатора OnDeinit() ? Кажется странным.
 void OnDeinit ( const int reason)
  {
     ResetLastError ();
     int objects= ObjectsDeleteAll ( 0 ,CHART_OBJ_PATTERN);
     printf ( "DEBUG: %s %i objects deleted with pattern %s error: %i" , __FUNCTION__ ,objects,CHART_OBJ_PATTERN, _LastError );
  }
2019.04.30 13:59:54.110    TrueSignal (EURUSD,H1)    DEBUG: OnDeinit 0 objects deleted with pattern TS_Tr1 error: 4022 

Build 2025.

 

Согласно документации , я использую ChartSetSymbolPeriod (), чтобы обновить индикатор (пересчитать).

Меняет значения символа и периода указанного графика. Функция работает асинхронно, то есть отдает команду и не ждет окончания ее выполнения. Отданная команда поступает в очередь сообщений графика и выполняется только после обработки всех предыдущих команд.

Для воспроизведения используйте прикрепленный код на 2 графиках, один и тот же символ. Затем нажмите на ярлык «Обновить».

   bool ret=ChartSetSymbolPeriod(0,NULL,0);

2019.04.30 14:25:46.001    ChartSetSymbolPeriod (EURUSD,M15)    132011220927585854: OnCalculate prev_calculated=0
2019.04.30 14:25:52.103    ChartSetSymbolPeriod (EURUSD,H1)    132011222733257293: OnCalculate prev_calculated=0
2019.04.30 14:25:55.436    ChartSetSymbolPeriod (EURUSD,H1)    132011222733257293: OnChartEvent start
2019.04.30 14:25:55.437    ChartSetSymbolPeriod (EURUSD,H1)    132011222733257293: ChartRefresh start
2019.04.30 14:25:55.437    ChartSetSymbolPeriod (EURUSD,H1)    132011222733257293: ChartRefresh end
2019.04.30 14:25:55.437    ChartSetSymbolPeriod (EURUSD,H1)    132011222733257293: OnChartEvent end
2019.04.30 14:25:56.666    ChartSetSymbolPeriod (EURUSD,M15)    132011220927585854: OnCalculate prev_calculated=0
2019.04.30 14:25:57.703    ChartSetSymbolPeriod (EURUSD,H1)    132011222733257293: OnCalculate prev_calculated=0

Я нажал на график H1, но график M15 тоже обновился.

Build 2007/2025.

Файлы:
 

Возможно ли в ArrayPrint добавить флаг ARRAY_HEX для вывода с шестнадцатеричном виде массива?

Грубо говоря, набор байтов в HEX-формате.

Например, читаешь бинарный файл. Нужно быстро понять, прочтен тот кусок или нет. По HEX-виду прочтенного можно быстро выяснить offset/size и т.д.

 

Все еще используя ChartSetSymbolPeriod (). Я знаю, что это асинхронно, но почему для вызова OnCalculate () требуется 2.5 секунды? Это очень долго.

2019.04.30 14:35:53.349    ChartSetSymbolPeriod (EURUSD,H1)    132011222733257293: OnChartEvent start
2019.04.30 14:35:53.349    ChartSetSymbolPeriod (EURUSD,H1)    132011222733257293: ChartRefresh start
2019.04.30 14:35:53.349    ChartSetSymbolPeriod (EURUSD,H1)    132011222733257293: ChartRefresh end
2019.04.30 14:35:53.349    ChartSetSymbolPeriod (EURUSD,H1)    132011222733257293: OnChartEvent end (ChartSetSymbolPeriod() call).
2019.04.30 14:35:54.809    ChartSetSymbolPeriod (EURUSD,M15)    132011220927585854: OnCalculate prev_calculated=0
2019.04.30 14:35:55.974    ChartSetSymbolPeriod (EURUSD,H1)    132011222733257293: OnCalculate prev_calculated=0

В Market Watch есть только EURUSD, 2 графика открыты и 1 индикатор на каждом графике (этот индикатор ничего не делает, кроме обновления и регистрации). См. Выше сообщение для кода.

Можно ли его улучшить или предоставить нам способ обновить график / индикатор без задержки?

Build 2007/2025.
 
Aleksey Vyazmikin:

Да, я запутал - признаю, просто для себя сообщения делал и вижу, что оно от индикатора - изначально я думал, что проблема в советнике и искал параллельно проблему, поэтому и упоминание хэндла.

Про уверенность в переменной symb имя текущего символа - задается параметрами функции

Код я положил Вам в личку. К сожалению, качество кода оценить правильно не могу - это порождение фриланса в целом.

Вы сказали, что доступ идёт к своему символу. В качестве периода выступает 0. То есть, доступ к своему символу-периоду. Как же Вы в этом случае 4401-то получили?

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

А про 4401 на своём символе-периоде я не верю

PS https://youtu.be/GJS73dgL-QE

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