Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
от англ.
data -- данные
feed -- подача
datafeed -- источник данных (хотя слово "источник" не совсем правильно передаёт смысл)
feeder -- питатель, подающий механизм, загрузочное устройство
О датафидах. Сколько встречал этот термин, сложилось ощущение, что этим словом обозначают источник данных (котировок). Буквально "заполнитель данных". Когда речь идет о собственных инструментах, понимаю так, что мы сможем вычислять котировки, например, никем не котируемого MXNRUB по известным курсам MXNUSD и USDRUB, выгруженным из терминала в .csv формат, и легализовать для терминала новые котировки, указав файл .csv как новый датафид. Возможно, будет реализовано и более изящное решение, без выгрузки в файлы, путем онлайновых операций */ над тиками (MXNRUB = MXNUSD * USDRUB). И это будет новый датафид.
Не осталось ссылки на обсуждение, баг-репорт или что-то подобное? Или только ощущение, что такое было, но сейчас не проверяли?
Насколько помню я, собранные в OnCalculate тики совпадали с запрошенными через КопиТикс.
Сейчас специально проверил... как и предполагал, получил какую-то фигню, но не ту, которую ожидал:)
Через OnBookEvent() ловятся тики с флагом 0...
А вот это уже то, что ожидал увидеть:
Как видно, при запросе последнего тика на каждом вызове функции OnCalculate() с помощью функции SymbolInfoTick() - идет пропуск некоторых тиков, которые возвращает CopyTicks().Код для проверки:
Код для проверки:
Я бы для верности (чтоб не OnBookEvent и CopyTicks тестировать, а OnCalculate, как задумывалось), оставил бы только запись тиков в файл при вызове OnCalculate.
А потом скриптом сгенрировал бы такой же файл, получив тики через CopyTicks. Разница была бы нагляднее, и свидетельствовала бы либо о пропуске тиков в OnCalculate либо о некорректной работе CopyTicks.
Я бы для верности (чтоб не OnBookEvent и CopyTicks тестировать, а OnCalculate, как задумывалось), оставил бы только запись тиков в файл при вызове OnCalculate.
А потом скриптом сгенрировал бы такой же файл, получив тики через CopyTicks. Разница была бы нагляднее, и свидетельствовала бы либо о пропуске тиков в OnCalculate либо о некорректной работе CopyTicks.
С таким простым расчетом не вижу смысла дальше заморачиваться. Есть конкретное сравнение двух вызовов: SymbolInfoTick() и CopyTicks(). И наглядно показаны все вызовы SymbolInfoTick(). И видно, что CopyTicks() вернул тик, который не был получен при запросе из SymbolInfoTick() из OnCalculate(). И тут может быть две причины ошибки: 1. Либо OnCalculate() пропускает тики, либо 2. SymbolInfoTick() где-то возвращает не то, что должна.
Да, это часть лога, который собирался секунд так 30... так что представьте себе количество пропущенных тиков.
Наш диалог с сервис-деском:
Посмотрите, чтобы не потерялось: https://www.mql5.com/ru/forum/190129/page8#comment_5081300 и 2 следующих сообщения.
CopyTicks из индикатора дает тик, который индикатор не получает в OnCalculate (ни до ни после).
OnCalculate вызывается на каждый тик.
Тики складываются в базу в отдельном потоке. То есть, асинхронно. Не факт, что при помощи CopyTicks Вы получите тот самый тик, который вызвал OnCalculate
Речь не об этом.
С помощью CopyTicks удается получить тик, которого в OnCalculate не было (узнаем мы об этом в OnCalculate на тике, время которого больше пропущенного).
Посмотрите логи.
Речь как раз об этом
Пришла пачка тиков. Обрабатывать эту пачку начали 2 потока - один поток в цикле запускает OnCalculate на каждый тик в пачке; другой поток всю пачку укладывает в тиковую базу. Эти 2 потока никак не синхронизированы между собой, и неизвестно, какой из потоков обработает пачку тиков быстрее
Но каждый тик из пачки должен быть обработан OnCalculate. А этого не происходит.
Тика с таким временем нет. Есть тик с меньшим временем, и тик с большим временем. А между ними вызова OnCalculate не было.
komposter
Но каждый тик из пачки должен быть обработан OnCalculate. А этого не происходит.
Тика с таким временем нет. Есть тик с меньшим временем, и тик с большим временем. А между ними вызова OnCalculate не было.
Каждый тик из пачки обрабатывается в OnCalculate. Там нет никаких пропусков. Цикл так написан.
Чтобы узнать, какой тик обрабатывается в OnCalculate, используйте SymbolInfoTick - здесь всё чётко. Тик применяется к информации о символе, затем вызываются все индикаторы этого символа, всё в одном потоке
Посмотрите, пожалуйста, лог по ссылке.
SymbolInfoTick из OnCalculate не видит тика, который можно получить из CopyTicks.
Я поэтому и написал
Надо сделать именно так, как Вы предложили в https://www.mql5.com/ru/forum/190129/page8#comment_5082755
Я бы для верности (чтоб не OnBookEvent и CopyTicks тестировать, а OnCalculate, как задумывалось), оставил бы только запись тиков в файл при вызове OnCalculate.
А потом скриптом сгенрировал бы такой же файл, получив тики через CopyTicks. Разница была бы нагляднее, и свидетельствовала бы либо о пропуске тиков в OnCalculate либо о некорректной работе CopyTicks.
Мы как раз так и проверяли в своё время правильность работы CopyTicks. Тестовые скрипты и индикаторы остались, будем ещё проверять
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Ошибки, баги, вопросы
fxsaber, 2017.02.07 13:41
SymbolInfoTick в индикаторах работает совсем не так, как в советниках.
В индикаторе она возвращает всегда тот тик, который был инициатором вызова OnCalculate. И эти инициаторные тики в индикаторе не должны пропускаться - идеология разработчиков. Проблема в формировании очереди этих тиков.
В советнике же SymbolInfoTick в OnTick вовсе не возвращает тик, который инициировал запуск OnTick, а делает полноценный запрос на текущее состояние.
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Особенности языка mql5, тонкости и приёмы работы
fxsaber, 2017.03.29 22:32
Calculate-событие генерируется на КАЖДОМ тике. Поэтому есть очередь тиков для индикаторов. Если она доходит до определенного количества, в журнал идет предупреждение, что индикатор слишком медленный.
Сами бары по природе своей являются индикаторами и формируются по Calculate-событиям. Поэтому, если ТФ M1 и сейчас 10:15:00.020 и приходит пачка на 50 мс, то первый тик в ней еще имеет время 10:14:59.970. И все индикаторы вызываются сначала на этом Calculate-событии - сначала индикатор таймсерий, затем кастомные индикаторы с этими таймсериями. Т.е. при таком раскладе 10:15-бар еще не сформирован, как нулевой. А нулевой - 10:14.
Далее, когда пачка начнет раскручиваться через Calculate-события, появится и 10:15-бар. Вроде, подробно расписал.
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Особенности языка mql5, тонкости и приёмы работы
fxsaber, 2017.03.29 22:41
Как следствие, вполне нормальная ситуация, когда советник получил тик еще не сформированного бара. Но это такой тонкий момент, что даже специально воспроизвести - надо постараться. В общем, больше теоретический, чем практический.
ЗЫ Если параноидально нужна скорость, использование индикаторов (и баров, конечно) - не вариант. Все в советнике.
Наш диалог с сервис-деском:
Сервис деск, к сожалению, в своем репертуаре. Им не нужно ссылку кидать, если дело дошло до обсуждения. А приводить конкретный пример, на пальцах. Они ведь совсем не о том говорят. Как раз говорят, что SymbolInfoTick() возвращает текущий проверяемый тик, а т.к. OnCalculate() В ТЕОРИИ обрабатывает каждый тик - получается, что и вывод должен быть каждого тика. А CopyTicks() говорит нам обратное. Ну... а они говорят, дак не надо смотреть CopyTicks() :). Про два потока они мне тоже объясняли, как раз тогда, когда чинили CopyTicks() в конце того года. Только тут дело не в нем (хотя, может и в нем тоже, хз).
Про тики с флагом 0 при получении из OnBookEvent() не спрашивали у них?