Ошибки, баги, вопросы - страница 3035

 
Ivan Titov:

Сегодня на страницах работ фриланса появилась ошибка:

Браузер хром. С чем это связано?

Спасибо за сообщение. Исправили

 
Slava:

Самостоятельно проверить не можете?

Проверить то можно, только что проверять, когда нет понимания ))
Да и моделировать момент, когда данные ещё не готовы, не представляю возможным.

Хочется понять теорию, как правильно работать с OnCalculate в данном примере.
Если данные не готовы на текущей итерации цикла, нужно счётчик limit+1 возвращать, или что?

 
Roman:

Проверить то можно, только что проверять, когда нет понимания ))
Да и моделировать момент, когда данные ещё не готовы, не представляю возможным.

Хочется понять теорию, как правильно работать с OnCalculate в данном примере.
Если данные не готовы на текущей итерации цикла, нужно счётчик limit+1 возвращать, или что?

Ноль возвращать нужно.

 
Slava:

4. Все таймсерии обрабатываются по порядку, от младшей к старшей. Сначала применение тика, потом расчёт всех индикаторов, созданных на данной таймсерии. Если вы из индикатора, работающего на M1, спрашиваете данные для этого же символа H1, то вы никогда не получите данных с применённым тиком. Данные всегда будут на один тик назад, какие бы ухищрения вы не применяли. Потому что один поток на символ с последовательной обработкой таймфреймов.

Утверждение получилось немного двусмысленное. На всякий случай уточняю. Да, при обработке тика все таймсерии обрабатываются по порядку, от младшей к старшей. Каждый тик добавляется к данным каждой таймсерии, затем производится расчет индикаторов на каждой таймсерии, по порядку. Т.е. для индикатора в OnCalculate() данные самих таймсерий (всех) безусловно обновленные, но данные индикаторов старших таймфреймов еще не пересчитаны.

 
Slava :

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

После неудачного запроса просто пошлите своему графику команду на обновление и тут же завершайте работу OnCalculate. Гарантированно будет вызвана OnCalculate и гарантированно нужные таймсерии к этому моменту будут подготовлены

Это похоже на использование молотка, чтобы поймать муху.

Как вы знаете, эта команда обновляет все индикаторы на всех графиках рассматриваемого символа. Если у вас есть несколько индикаторов на нескольких графиках одного символа, вы можете легко получить своего рода цикл, поскольку каждый индикатор будет отправлять свою собственную команду ChartSetSymbolPeriod ().

Не могли бы вы добавить команду для обновления только индикатора ТЕКУЩИЙ?

 
Alain Verleyen:

Это похоже на использование молотка, чтобы поймать муху.

Как вы знаете, эта команда обновляет все индикаторы на всех графиках рассматриваемого символа. Если у вас есть несколько индикаторов на нескольких графиках одного символа, вы можете легко получить своего рода цикл, поскольку каждый индикатор будет отправлять свою собственную команду ChartSetSymbolPeriod ().

Не могли бы вы добавить команду для обновления только индикатора ТЕКУЩИЙ?

Можно всё что угодно получить если есть логические ошибки в коде.

 
mktr8591:

Вообще-то OnTick не синхронизирован с OnCalculate по одному и тому же символу. Теоретически OnTick может  запаздать и к его началу уже все индики на всех ТФ будут рассчитаны?

Пока вижу обратную ситуацию - индикаторы не рассчитаны с приходом нового тика на момент открытия бара.

 
Anton:

Утверждение получилось немного двусмысленное. На всякий случай уточняю. Да, при обработке тика все таймсерии обрабатываются по порядку, от младшей к старшей. Каждый тик добавляется к данным каждой таймсерии, затем производится расчет индикаторов на каждой таймсерии, по порядку. Т.е. для индикатора в OnCalculate() данные самих таймсерий (всех) безусловно обновленные, но данные индикаторов старших таймфреймов еще не пересчитаны.

Что значит "расчет индикаторов на каждой таймсерии, по порядку" т.е. в зависимости от "ENUM_TIMEFRAMES  period"?

int  iCustom(
   string           symbol,     // имя символа
   ENUM_TIMEFRAMES  period,     // период
   string           name        // папка/имя_пользовательского индикатора
   ...                          // список входных параметров индикатора
   );

А если два индикатора с одним и тем же  ENUM_TIMEFRAMES  period при этом один рассчитывается на данных другого, то как обеспечить правильность последовательного расчета?

Я правильно понял, что если индикатор рассчитывается  (ENUM_TIMEFRAMES  period) на M1, то при запроси информации OHLC он получит актуальную информацию по последнему тику для любого верхнего ТФ в любом случае?

 
Какой результат выдаёт функция 

iSpread ?


Смотрю он примерно похож значению спреда если сделать запрос баров в Символах/Бары в терминале.

При этом естественно эти значения не соответствуют реальным значениям выдаваемым SYMBOL_SPREAD.

Почему такая разница? И какой такой нереальный спред выдаётся по iSpread ?

 
Aleksey Vyazmikin:

Что значит "расчет индикаторов на каждой таймсерии, по порядку" т.е. в зависимости от "ENUM_TIMEFRAMES  period"?

int  iCustom(
   string           symbol,     // имя символа
   ENUM_TIMEFRAMES  period,     // период
   string           name        // папка/имя_пользовательского индикатора
   ...                          // список входных параметров индикатора
   );

А если два индикатора с одним и тем же  ENUM_TIMEFRAMES  period при этом один рассчитывается на данных другого, то как обеспечить правильность последовательного расчета?

Это обеспечивает терминал.

Я правильно понял, что если индикатор рассчитывается  (ENUM_TIMEFRAMES  period) на M1, то при запроси информации OHLC он получит актуальную информацию по последнему тику для любого верхнего ТФ в любом случае?

Да, именно так.

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