ФОРТС Прошу помощи - страница 9

 
komposter:

А какая разница между "нет" и "не готовы" для программы (и программиста)?

Если данные не готовы, будет ошибка.

 

А может эта информация тоже не доступна моментально, поэтому ее и не показывают.

А для того чтобы не "лезть" на сервер.

И ещё "читающий" Вы наш... Вопрос:

Для чего делают билд таймсерии, если данные готовы ( CopyTime(symbol,period,first_date+PeriodSeconds(period),1,times) )?

Если мы успешно прошли все проверки, то сделаем последнюю попытку обойтись без обращения к торговому серверу. Сначала узнаем начальную дату, для которой доступны минутные данные в формате HCC.
Запросим это значение функцией SeriesInfoInteger() с модификатором SERIES_TERMINAL_FIRSTDATE и опять сравним со значением параметра start_date.

   if(SeriesInfoInteger(symbol,PERIOD_M1,SERIES_TERMINAL_FIRSTDATE,first_date))
     {
      //--- there is loaded data to build timeseries
      if(first_date>0)
        {
         //--- force timeseries build                                            
         CopyTime(symbol,period,first_date+PeriodSeconds(period),1,times);
         //--- check date
         if(SeriesInfoInteger(symbol,period,SERIES_FIRSTDATE,first_date))
            if(first_date>0 && first_date<=start_date) return(2);
        }
     }
 
 
MigVRN:
Всё правильно - она и загружает подготавливает то что есть. Но из-за того что любое промедление в индикаторе тормозит чат со всем что на нем висит - в индикаторах сделали так, что если серия к моменту вызова не готова - функция вернет ошибку и ИНИЦИАЛИЗИРУЕТ подготовку данных. Через какое-то время она уже не будет возвращать ошибку. Это у Вас в логах и происходит.

MigVRN!

Чукча перечитал справку и вынужден НЕ согласиться с Вами. 

"Всё правильно - она и загружает подготавливает то что есть."

Это Ваши домыслы....

А с справке написано, что функция SeriesInfoInteger с идентификатором  SERIES_TERMINAL_FIRSTDATE

Должна возвращать:

SERIES_TERMINAL_FIRSTDATE

Самая первая дата в истории по символу в клиентском терминале независимо от периода

 

Ничего она не должна подготавливать!

Данные в истории терминала есть - получите дату.

Нет - возвращается "0". 

 
Новый день и снова по кругу.
 
barabashkakvn:
Новый день и снова по кругу.
Покажите в справке, что-то ДРУГОЕ
 
papaklass:
Подготовьте данные и работайте с ними. Вы можете еще 150 раз сказать что что-то не то, и получить 150 ответов как надо поступать. Работать то Вам, поэтому позаботьтесь о себе сами!

Спасибо, но Вы-то прекрасно знаете, что ВСЁ нужно доказывать.

СД считает, что возврат 0, при наличии данных, не ошибка их функции.

Если так, то это ДОЛЖНО быть написано в документации! 

 

Mikalas:

Должна, не должна - это все наши разговоры. Ну Вы же сами видите как она работает :)

Единственно с чем могу согласиться - в справке не совсем очевидно какие данные готовы СРАЗУ (доступны в любой момент), а какие терминал готовит при обращении.

Я(!) так понимаю, что при обращении к любым данным таймсерий (время и цена, количество баров, перечисление ENUM_SERIES_INFO_INTEGER, может ещё что забыл) данные не готовы сразу.

Чтобы не возникало таких ситуаций - в справке и написано: 

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

Алгоритмы с использованием циклов ожидания готовности данных являются не лучшим решением. Единственное исключение в данном случае — скрипты, так как у них нет другого выбора алгоритма в виду отсутствия обработки событий. Для пользовательских индикаторов подобные алгоритмы, как и любые другие циклы ожидания, категорически не рекомендуются, так как приводят к остановке расчета всех индикаторов и другой обработки ценовых данных по данному символу.

Для экспертов и пользовательских индикаторов лучше использовать событийную модель обработки. Если при обработке события OnTick() или OnCalculate() не удалось получить все необходимые данные требуемой таймсерии, то следует выйти из обработчика события, рассчитывая на появление доступа к данным при следующем вызове обработчика.

 
MigVRN:

Должна, не должна - это все наши разговоры. Ну Вы же сами видите как она работает :)

Единственно с чем могу согласиться - в справке не совсем очевидно какие данные готовы СРАЗУ (доступны в любой момент), а какие терминал готовит при обращении.

Я(!) так понимаю, что при обращении к любым данным таймсерий (время и цена, количество баров, перечисление ENUM_SERIES_INFO_INTEGER, может ещё что забыл) данные не готовы сразу.

Чтобы не возникало таких ситуаций - в справке и написано: 

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

Алгоритмы с использованием циклов ожидания готовности данных являются не лучшим решением. Единственное исключение в данном случае — скрипты, так как у них нет другого выбора алгоритма в виду отсутствия обработки событий. Для пользовательских индикаторов подобные алгоритмы, как и любые другие циклы ожидания, категорически не рекомендуются, так как приводят к остановке расчета всех индикаторов и другой обработки ценовых данных по данному символу.

Для экспертов и пользовательских индикаторов лучше использовать событийную модель обработки. Если при обработке события OnTick() или OnCalculate() не удалось получить все необходимые данные требуемой таймсерии, то следует выйти из обработчика события, рассчитывая на появление доступа к данным при следующем вызове обработчика.

Андрей!

Я не знаю как Вы, а я уже много лет работаю с документациями. 

Смотрите, из документации следует, как я(!) понял.

1. Смотрим есть ли данные истории по символу в терминале (SeriesInfoInteger c  идентификатором  SERIES_TERMINAL_FIRSTDATE )

Возможно, я об этом не спорю, она и строит и инициализирует что-то.

2. Нет данных  (возвращает пустую дату начала истории) - идем на сервер за данными.

3. Есть дата - строим заданный таймфрейм функцией CopyTime(symbol,period,first_date+PeriodSeconds(period),1,times);

4. Проверяем начало таймсерии с заданной нашей датой (SeriesInfoInteger(symbol,period,SERIES_FIRSTDATE,first_date)

 Так написано в документации.

НО, когда я(!) запрашиваю данные истории по символу (не по таймсерии!!!!) в терминале, которые там ТОЧНО есть

функция возвращает "0"

Вы считаете, что это ПРАВИЛЬНО? 

 

 
Mikalas:

НО, когда я(!) запрашиваю данные истории по символу (не по таймсерии!!!!) в терминале, которые там ТОЧНО есть

функция возвращает "0"

Вы считаете, что это ПРАВИЛЬНО? 

Данные (не подготовленные) есть на диске. Данные (подготовленные) могут быть на соседнем чате. Но подготовленных данных нет в на том чате, на котором запущен индюк. Поэтому и ошибка. Это правильно. Но это не удобно :)

Хоть и не люблю сам такие вопросы - Вам критично из индикатора запрашивать данные по соседним символам??? (с учетом того что написано в справке и моего примера - как индюк может тормозить выполнение эксперта и чата). Можно ведь обойти все эти трудности...

 
papaklass:

Вы запрашиваете "FIRSDDATE", а не данные. Дата наверняка есть, а вот данные могут отсутствовать из-за экономии. Зачем закачивать данные по всем символам, если их не используют в данный момент. Разработчики пошли рациональным путем - подкачивать данные только тогда, когда пользователь обратится к этим данным. Это нормальный подход. Вы, работая с терминалом, должны это ЗНАТЬ и поступать в соответствии с таким положением дел.

Вместо того, что бы тратить время на торговлю, Вы зациклились на элементарщине и тратите время в холостую. Пожалейте свое время. :)

За меня роботы торгуют, я сейчас вообще не дома...

А индикатор мне нужен как раз для того, чтобы улучшить свою торговлю :) 

 
Mikalas:

Андрей!

Я не знаю как Вы, а я уже много лет работаю с документациями. 

Смотрите, из документации следует, как я(!) понял.

1. Смотрим есть ли данные истории по символу в терминале (SeriesInfoInteger c  идентификатором  SERIES_TERMINAL_FIRSTDATE )

Возможно, я об этом не спорю, она и строит и инициализирует что-то.

2. Нет данных  (возвращает пустую дату начала истории) - идем на сервер за данными.

3. Есть дата - строим заданный таймфрейм функцией CopyTime(symbol,period,first_date+PeriodSeconds(period),1,times);

4. Проверяем начало таймсерии с заданной нашей датой (SeriesInfoInteger(symbol,period,SERIES_FIRSTDATE,first_date)

 Так написано в документации.

НО, когда я(!) запрашиваю данные истории по символу (не по таймсерии!!!!) в терминале, которые там ТОЧНО есть

функция возвращает "0"

Вы считаете, что это ПРАВИЛЬНО? 

Внимательнее читайте документацию, не выборочно. Наличие данных истории на диске вовсе не означает для терминала "ТОЧНО есть". В данном случае (при обращении из индикатора), функции работают только с кэшем таймсерии в памяти. Т.е. происходит моментальное синхронное обращение к памяти, и если там нет подготовленной таймсерии, то и дату SERIES_FIRSTDATE (первого элемента массива) вам не вернут. Но запрос конечно инициирует подготовку-загрузку таймсерии в память.

Запрос SERIES_TERMINAL_FIRSTDATE связан с инициализацией базы и с синхронизацией ее с сервером, т.е. первое обращение в любом случае моментально не отработает.

Принципиальная возможность получения необходимой истории проверяется через SERIES_SERVER_FIRSTDATE. Т.е. можно конечно заложится и на X итераций запроса истории, но если терминал подтверждает наличие истории по SERIES_SERVER_FIRSTDATE, то доступность соответствующих данных таймсерии лишь вопрос времени (синхронизация базы м1 с сервером и генерация таймсерии).

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