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

 
Alexey Kozitsyn:
@Slawa уточните пожалуйста, есть ли какие-то ограничения, на запись индикаторных буферов вне функции OnCalculate()? Всегда ли будет все корректно записываться в случае записи буферов в функциях: OnTimer(), OnBookEvent(), OnChartEvent()?

Явных ограничений нет. Попробуйте.

НО можете нарваться на перераспределение буферов в момент добавления нового бара (перераспределение производится с запасом, поэтому не на каждом новом баре).

PS хотя нет. вся обработка идёт в одном потоке, поэтому коллизий не должно быть. Пробуйте
 
Slawa:
Явных ограничений нет. Попробуйте.

НО можете нарваться на перераспределение буферов в момент добавления нового бара (перераспределение производится с запасом, поэтому не на каждом новом баре)

Вот тут подробнее, пожалуйста. Что за распределение, как с ним быть?

Как раз написал вопрос потому, что замечаю "подвисания" на новом баре. Причем эти подвисания обнуляют буферные значения = 0 (причем пустое значение установленное явно мной - EMPTY_VALUE). Пока не удалось поймать этот момент. Иногда происходит просто "скачок" индикатора и сразу восстановление в нормальное состояние, иногда именно "залипает". При залипании не пишутся значения в файл и отрисовка буферов не производится. Запись в буферы произвожу в OnBookEvent().

Тот же самый код в OnCalculate() отрабатывает нормально, но OnCalculate() не позволяет собрать все значения открытого интереса и других биржевых параметров.

Лечится только переключением ТФ. Да, одновременно запущены 5-7 одинаковых индикаторов, пишущих разные данные.

Добавлено:

Да, еще сегодня при включении терминала заметил точно такую же штуку. Все просто повисло, во всех буферах, на всех значениях нули, индикатор историю (записанную в файл) не выдал. Т.е. просто все повисло. Рынок еще был закрыт. Изменил ТФ - история подргузилась, НО, опять к вопросу о необходимости временной метки к значениям SESSION: была произведена запись последнего известного значения на момент закрытия терминала! Синхронизация истории прошла успешно, ошибок не было. Но TimeCurrent() вернул ошибочное значение (где-то 21:03). Хотя реальное время прихода этого значения 23:49:59. В общем, какая-то печаль... 

 
Alexey Kozitsyn:

Вот тут подробнее, пожалуйста. Что за распределение, как с ним быть?

Как раз написал вопрос потому, что замечаю "подвисания" на новом баре. Причем эти подвисания обнуляют буферные значения = 0 (причем пустое значение установленное явно мной - EMPTY_VALUE). Пока не удалось поймать этот момент. Иногда происходит просто "скачок" индикатора и сразу восстановление в нормальное состояние, иногда именно "залипает". При залипании не пишутся значения в файл и отрисовка буферов не производится. Запись в буферы произвожу в OnBookEvent().

Тот же самый код в OnCalculate() отрабатывает нормально, но OnCalculate() не позволяет собрать все значения открытого интереса и других биржевых параметров.

Лечится только переключением ТФ. Да, одновременно запущены 5-7 одинаковых индикаторов, пишущих разные данные.

Запросто. Приходит первый тик нового бара. Буфер распределён на 1000 баров и полностью заполнен.

Делаем перераспределение буфера на 1250 баров, копируем в новый буфер 1000 баров из прежнего буфера. Новый буфер выставляем вместо прежнего буфера, прежний буфер удаляем. Добавляем 1001-й бар.

Что значит "как с ним быть"?

Имейте в виду, что все индикаторы одного символа считаются последовательно друг за другом в одном потоке. Если какой-то индикатор тормозит, то тормозится и весь поток обработки символа
 
Slawa:
Запросто. Приходит первый тик нового бара. Буфер распределён на 1000 баров и полностью заполнен.

Делаем перераспределение буфера на 1250 баров, копируем в новый буфер 1000 баров из прежнего буфера. Новый буфер выставляем вместо прежнего буфера, прежний буфер удаляем. Добавляем 1001-й бар.

Что значит "как с ним быть"?

Имейте в виду, что все индикаторы одного символа считаются последовательно друг за другом в одном потоке. Если какой-то индикатор тормозит, то тормозится и весь поток обработки символа
Про один поток - это я в курсе. А перераспределение, как я понял, влияет на OnBookEvent() сильнее, чем на OnCalculate()?
 
Alexey Kozitsyn:
Про один поток - это я в курсе. А перераспределение, как я понял, влияет на OnBookEvent() сильнее, чем на OnCalculate()?
Перераспределение производится при приходе нового тика. Сразу после прихода нового тика вне очереди вызывается OnCalculate. И только после этого продолжается обработка событий, поступивших индикатору

Но пока индикатор (любой индикатор на этом символе!) не закончит какой-либо расчёт (OnCalculate, OnTimer, OnChartEvent, OnBookEvent), новый тик не поступит на обработку.
 
Slawa:
Перераспределение производится при приходе нового тика. Сразу после прихода нового тика вне очереди вызывается OnCalculate. И только после этого продолжается обработка событий, поступивших индикатору

Но пока индикатор (любой индикатор на этом символе!) не закончит какой-либо расчёт (OnCalculate, OnTimer, OnChartEvent, OnBookEvent), новый тик не поступит на обработку.

Еще, насколько я понимаю, индикаторы на одном символе рассчитываются последовательно, т.е. если я кинул последовательно индикатор i1, i2, i3, то и рассчитываться они будут в том же порядке?

Сейчас для теста добавил еще стандартный МАКД, он последний в списке, посмотрю будет ли на нем подвисание с образованием нового бара. 

 
Alexey Kozitsyn:

Еще, насколько я понимаю, индикаторы на одном символе рассчитываются последовательно, т.е. если я кинул последовательно индикатор i1, i2, i3, то и рассчитываться они будут в том же порядке?

Сейчас для теста добавил еще стандартный МАКД, он последний в списке, посмотрю будет ли на нем подвисание с образованием нового бара. 

По началу - да, расчёт будет в той же последовательности.

Но если Вы будете удалять-добавлять разные индикаторы, то последовательность пересчёта может Вас удивить. Поэтому не закладывайтесь на последовательность
 
Slawa:
По началу - да, расчёт будет в той же последовательности.

Но если Вы будете удалять-добавлять разные индикаторы, то последовательность пересчёта может Вас удивить. Поэтому не закладывайтесь на последовательность
Это нужно для того, чтобы проверить, если повиснут мои индикаторы, рассчитается ли последний - стандартный МАКД. Все мои идут перед МАКД.
 
Slawa:

Вот о чем я говорил:

 

По GOLD-3.17 образовался новый бар, по всем моим индикаторам, рассчитываемым в OnBookEvent() по этому символу все текущие значения обнулились. По логике индикатора, в момент формирования нового бара буферы не обнуляются, а в них сразу же записывается текущее значение. МАКД не обнулился. Журнал пуст, значит рассинхронизации не было, все значения должны были быть корректны. В данном случае глюк продолжался секунд 5. Вчера ловил по несколько минут глюки.

Все остальные символы - нормально. Повторюсь, в логику индикатора не заложен сброс значений в 0! Поэтому вопрос: при перераспределении новые элементы, по идее, должны содержать мусор. А тут 0.0 и зависание...

Да, еще: если бы завис один индикатор, остальные должны были бы сохранить свои значения?! А тут все, разом обнулились. Есть ситуации, когда такое может быть?
 

Аналогичное зависание произошло по BR-3.17:

 

@Slawa есть идеи в какую сторону копать? Может быть есть более оптимальный способ сбора биржевых данных и их отображения?

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