Советник, записывающий тиковую историю. Как сохранить все тики ? - страница 3

 
hrenfx:

Нет, я воспроизвел Ваш способ: на двух терминалах. Результат скомпоновал из логов этих терминалов.

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

В моем способе было два индикатора, а не советник и индикатор. Советник будет реагировать на все тики, если скорость выполнения одной итерации советника выше, чем частота поступления тиков. Очевидно, что приведенный советник - "легкий", что не вызывает в нем существенных задержек выполнения. Кроме того, Вам не попались промежутки с высокой частотой поступления тиков. Добавьте в советник торговые операции и увидите пропуск тиков.

 
Так на исходниках советник собирает больше тиков, чем индикатор. Об этом логи и говорят.
 
hrenfx:

Как видно, все отлично может работать, если захотеть. 

Ну не хотят они, разве непонятно? ))) Зачем людям душу бередить, заставляя делать то, чего они не хотят? Уже неоднократно разработчики говорили об этом. Все, проехали. Захотят (или увидят целесообразность) - сделают. Такое уже не раз бывало: сначала отказывались, доказывали, что это не нужно, а потом делали.

MetaQuotes умеют признавать свои ошибки. Дайте возможность этому процессу пройти эволюционный путь, а не революционный. Нужно понимать, что для осознания ошибки требуется время и зачастую немалое. 

 
Scriptong:

Ну не хотят они, разве непонятно? ))) Зачем людям душу бередить, заставляя делать то, чего они не хотят?

Благими намеряниями дорога... садизм, короче. 

MetaQuotes умеют признавать свои ошибки.

Прецедент по тому же тестеру?
 
Scriptong:

Чтобы собирать тики, советник использовать нельзя. Только индикатор. 

Таких программ (сборщиков тиков) великое множество. На моем сайте есть такой в исходном коде. Также бесплатно прилагается история тиков по трем брокерам и 24-м парам более чем за год.

Смотрите, Вы в своем сборщике используете функцию OnCalculate. Вот здесь https://www.mql5.com/ru/forum/14794/page2 человек написал: "у индикаторов MQL5, в отличие от их MQL4 собратьев, стало больше событий, приводящих к запуску функции индикатора. Ведь даже само название функции поменялось (OnCalculate, а не start)". То есть, кроме прихода нового тика в MQL5 функция OnCalculate может сработать и по другой причине, спровоцировав при этом запись ложного нового тика. Ваш код я посмотрел, но не обнаружил там какого-нибудь фильтра на такие ложные тики (в принципе, посмотрел не очень внимательно). Что можете сказать по этому поводу ? Или в MQL4 все не так ? И просветите тёмного, есть ли какая-нибудь разница между функциями OnCalculate и Start, используемых в индикаторах ?
 

Kir_7:
Смотрите, Вы в своем сборщике используете функцию OnCalculate. Вот здесь https://www.mql5.com/ru/forum/14794/page2 человек написал: "у индикаторов MQL5, в отличие от их MQL4 собратьев, стало большесобытий, приводящих к запуску функции индикатора. Ведь даже самоназвание функции поменялось (OnCalculate, а не start)".

То есть, кроме прихода нового тика в MQL5 функция OnCalculate может сработать и по другой причине, спровоцировав при этом запись ложного нового тика. Ваш код я посмотрел, но не обнаружил там какого-нибудь фильтра на такие ложные тики (в принципе, посмотрел не очень внимательно). Что можете сказать по этому поводу ? Или в MQL4 все не так ?  

Насколько я понял, этот человек - я ))

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

 И просветите тёмного, есть ли какая-нибудь разница между функциями OnCalculate и Start, используемых в индикаторах ?

К сожалению, не могу сказать точно, какая между ними разница. Скорее всего, никакой. Пишу через OnCalculate, т. к. этот стиль единый для MQL4 и MQL5, что облегчает переносимость кода.
 
Scriptong:

Насколько я понял, этот человек - я ))

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

К сожалению, не могу сказать точно, какая между ними разница. Скорее всего, никакой. Пишу через OnCalculate, т. к. этот стиль единый для MQL4 и MQL5, что облегчает переносимость кода.

1. При любом изменении ценовых данных. В том числе - исторических. 

2. Что такое поток кто-нибудь помнит?

3. Тик не знает времени.  

 
tara:

1. При любом изменении ценовых данных. В том числе - исторических. 

Верно. Это учтено. Смотрите фразу: "кроме первого вызова".

2. Что такое поток кто-нибудь помнит?

Не совсем понятно, к чему здесь это. Если это намек на разделение потоков при выполнении программ, то в таком случае мимо: индикатор выполняется в интерфейсном потоке терминала. Если индикатор не будет отдавать управление терминалу, то терминал зависнет. Да, при этом терминал будет продолжать получение котировок. Только никто об этом не узнает.

3. Тик не знает времени.  

Да. Это тоже уже учтено. Смотрите фразу: "Единственный минус - все тики пакета будут иметь одно и то же время прихода." Имеется в виду, что регистрация времени пришедшего тика производится путем обращения к TimeCurrent(). Это значение для всего пакета тиков, конечно же, одно.
 
tara:

1. При любом изменении ценовых данных. В том числе - исторических.

Что Вы имеете в виду ?

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

 
Kir_7:

Что Вы имеете в виду ?

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

Не понял, почему нет выбора? Запускаем в скрипте бесконечный цикл с задержкой Sleep(11) (реальная задержка будет все равно 16 мс). На каждом проходе для всех нужных символов считываем текущие аск и бид NewBid = MarketInfo(Symb,MODE_BID). Если оба ненулевые и хоть один отличается от предыдущего своего значения, значит, "обновились". Пишем в файл все обновленные тики разных инстументов сразу. Терминал выполняет этот скрипт в отдельном потоке, и отвлечений на перевывод графиков, окон, как в интерфейсном потоке, нет. Параллельно в другом потоке советник, торгуя, может простаивать в ожидании ответов сервера на торговые запросы сколько угодно, может и долго считать что-нибудь, тики продолжают приниматься без задержек.

А вот что такое "массивы тиков без ошибок", пусть и не связанных с простоями в их приеме, вопрос сложный. У меня это: контроль бид<=аск; реальности самих значений бид и аск; игнорирование шпилек высотой, например, больше 80 спредов; контроль неубывания времени при корректировках системного таймера на сервере или на компьютере с терминалом (игнорирование тиков, пришедших после сдвига времени до достижения отметки времени, имевшейся до этого сдвига). Совсем не представляю, как бороться с тем, что последовательность тиков меняется из-за разных маршрутов и продолжительности интернет-доставки пакетов с тиками от сервера. Это обычно неважно в случае 4-разрядного котирования, где тики по одному инструменту появляются в среднем через 3 секунды. Но для 5-разрядного, на новостях, не знаю, как оно выходит.