Тиковая история - страница 2

 
Mikaiel Israielian:

Спасибо за быстрый ответ! Меня интересует MQL-4, пока что. Скачал файлик, но не совсем понимаю где в нём обращение к файлу ticks.raw, в котором, как я понимаю, хранятся тики. Или я не правильно понимаю?

Мне нужно считать последние 10 тиков Бид в массив.

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

PS2. Ситуация такая. Пока выполняется OnTick(), может прийти несколько тиков, которые советник проигнорирует. Важно, чтобы он все эти тики проработал. С этой целью я запускаю на отдельном графике того же инструмента другого советника, который только и делает, что считает пришедшие тики и записывает их в отдельные глобальные переменные терминала.

Затем основной советник при помощи цикла прорабатывает эти тики. Но иногда тики приходят настолько быстро (а может даже пакетами), что даже отдельный суперскоростной советник, не успевает их фиксировать. Но они все, тем не менее хранятся в терминале, я так думаю, что в файле ticks.raw. Вот оттуда и хотелось бы их считать. Что-то наподобие функции CopyTicks() из MQL5.
ох плодить глобальные переменные идея так себе - приведёт к обратному эффекту, будет пропускать ещё больше тиков, функции перебора глоб переменных и функции чтения/записи файла очень ресурсоёмкие - в справке есть пример записи тиков в  массив-структуру с последующей выгрузкой в файл при переполнении, ищите в справке FileReadArray и FileWriteArray
 
Aleksey Semenov:
ох плодить глобальные переменные идея так себе - приведёт к обратному эффекту, будет пропускать ещё больше тиков, функции перебора глоб переменных и функции чтения/записи файла очень ресурсоёмкие

Основной советник удаляет глобальную переменную сразу после прочтения, так что там максимум 2-3 перменные могут существовать одновременно.

С массивом тоже пробовал. Один советник собирает тики в массив и через FileWriteArray() передаёт их другому советнику. Но неужели этот вариант быстрее, чем через глобальные переменные? Во время записи массива в файл тики тоже прекрасно пропускаются.

Проблема здесь не в скорости, а в другом:

Изменения могут быть пакетными: в терминал может одновременно прийти несколько тиков,
но функция OnTick будет вызвана лишь один раз для уведомления эксперта о последнем состоянии рынка.
Функция CopyTicks позволяет получать и анализировать все пришедшие тики.

Т.е. сейчас не стоит задача как ускорить советника, собирающего тики, потому что он итак очень быстрый. На запись одной глобальной переменной уходит 0,0002 миллисекунды. Но если пришёл пакет тиков, то бесполезно полагаться на скорость советника, т.к. советник получает лишь последний тик из пакета.

Сейчас стоит вопрос можно ли какими-нибудь средствами достать все тики из файла ticks.raw. Насколько я понимаю, терминал хранит тики именно в этом файле.

 
Mikaiel Israielian:

Основной советник удаляет глобальную переменную сразу после прочтения, так что там максимум 2-3 перменные могут существовать одновременно.

С массивом тоже пробовал. Один советник собирает тики в массив и через FileWriteArray() передаёт их другому советнику. Но неужели этот вариант быстрее, чем через глобальные переменные? Во время записи массива в файл тики тоже прекрасно пропускаются.

Проблема здесь не в скорости, а в другом:

Т.е. сейчас не стоит задача как ускорить советника, собирающего тики, потому что он итак очень быстрый. На запись одной глобальной переменной уходит 0,0002 миллисекунды. Но если пришёл пакет тиков, то бесполезно полагаться на скорость советника, т.к. советник получает лишь последний тик из пакета.

Сейчас стоит вопрос можно ли какими-нибудь средствами достать все тики из файла ticks.raw. Насколько я понимаю, терминал хранит тики именно в этом файле.

Первая попытка проникнуть в файл ticks.raw сорвалась. 1. Терминал открыл файл в монопольном режиме - доступ к файлу лишь после закрытия терминала. 2. MQL- программа имеет доступ только к папке files. 3. В файл ticks.raw судя по заголовкам в нем пишется что-то про все инструменты - для ускорения надо убрать лишние инструменты?

 
Процессор один. Даже многоядерный - все советники выполняются на одном ядре. Обращали ли внимание: есть индикаторы, которые в начале работы тормозят. Если его бросить на график, то тиковый график останавливается. Глобальные переменные, возможно, записываются в файл - ведь они восстанавливаются при повторном запуске терминала - и потому медленные. Надо максимально ускорить работу советника. Попробуйте также убрать все из функции OnTick - оставить только запись тиков в массив и увеличение счетчика тиков. Основную обработку выполнять по таймеру. Если тики отсутствовали - выход.
 
STARIJ:
Процессор один. Даже многоядерный - все советники выполняются на одном ядре. Обращали ли внимание: есть индикаторы, которые в начале работы тормозят. Если его бросить на график, то тиковый график останавливается. Глобальные переменные, возможно, записываются в файл - ведь они восстанавливаются при повторном запуске терминала - и потому медленные. Надо максимально ускорить работу советника. Попробуйте также убрать все из функции OnTick - оставить только запись тиков в массив и увеличение счетчика тиков. Основную обработку выполнять по таймеру. Если тики отсутствовали - выход.

Глобальные переменные записываются в файл только при закрытии терминала, либо при вызове функции GlobalVariablesFlush.

Индикаторов никаких нет. Только советник с простейшим кодом. Вот весь код советника

uint tick_count = 0;

void OnTick()
{
  tick_count++;
  GlobalVariableSet("tc", tick_count);
  GlobalVariableSet(string(tick_count), Bid);
}

Даже не представляю как ещё можно ускорить его )) Проверял скриптом. На 1 000 000 выполнений такой функции уходит 200 миллисекунд.

Да и не в скорости проблема, а в том, что тики могут приходить пакетами, а функции OnTick() передаётся только последнее значение из этого пакета. Т.е. OnTick() по определению не может поймать все тики :(

Думаю, придётся таки переметнуться на МТ5 ))

 
Mikaiel Israielian:

Глобальные переменные записываются в файл только при закрытии терминала, либо при вызове функции GlobalVariablesFlush.

Индикаторов никаких нет. Только советник с простейшим кодом. Вот весь код советника

Даже не представляю как ещё можно ускорить его )) Проверял скриптом. На 1 000 000 выполнений такой функции уходит 200 миллисекунд.

Да и не в скорости проблема, а в том, что тики могут приходить пакетами, а функции OnTick() передаётся только последнее значение из этого пакета. Т.е. OnTick() по определению не может поймать все тики :(

Думаю, придётся таки переметнуться на МТ5 ))


Юзайте OnCalculate - и будет Вам счастье. Кроме того, OnCalculate при запуске ловит буфер из нескольких тиков, приходивших до запуска индикатора.

 
Mikaiel Israielian:

Глобальные переменные записываются в файл только при закрытии терминала, либо при вызове функции GlobalVariablesFlush.

Индикаторов никаких нет. Только советник с простейшим кодом. Вот весь код советника

Даже не представляю как ещё можно ускорить его )) Проверял скриптом. На 1 000 000 выполнений такой функции уходит 200 миллисекунд.

Да и не в скорости проблема, а в том, что тики могут приходить пакетами, а функции OnTick() передаётся только последнее значение из этого пакета. Т.е. OnTick() по определению не может поймать все тики :(

Думаю, придётся таки переметнуться на МТ5 ))

Скорее всего, ловится первый тик из пакета. Он начинает обрабатываться и блокирует прием следующих тиков.
 
Ihor Herasko:

Юзайте OnCalculate - и будет Вам счастье. Кроме того, OnCalculate при запуске ловит буфер из нескольких тиков, приходивших до запуска индикатора.


Это точно? Разве OnCalculate не с OHLC работает?

 
Mikaiel Israielian:

Это точно? Разве OnCalculate не с OHLC работает?


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

 
Ihor Herasko:

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


Игорь, спасибо! Это очень хорошая новость) Я обязательно проверю! Т.е. вот этот код гарантированно запишет все тики, пришедшие в терминал?

uint tick_count = 0;

int OnCalculate(...тут все параметры...)
{
  tick_count++;
  GlobalVariableSet(string(tick_count), Bid);
  GlobalVariableSet("tc", tick_count);

  return(rates_total);
}

Или вместо Bid надо что-то другое применить?

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