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

 
Alexander:

Стабильно воспроизводится ? Какой билд?

Да, проблема воспроизводиться. Версия 1870.
 

Вопрос.

Допустим я в эксперте или индикаторе работаю по нескольким символам, точнее по всем символам, которые отображены в окне "Обзор рынка". 

Задача заключается в том, чтобы поймать момент нового тика по любому из символов.

Пока вижу только пару вариантов:
  1. через таймер c опросом всех символов. (можно, конечно, только опрашивать новое значение функции TimeCurrent(), но в этом случае погрешность будет равна 1 секунде, т.к. эта функция возвращает значение в секундах)
  2. в каждом символе в OnTick (или OnCalculate) генерировать пользовательское событие через EventChartCustom

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

Недостатком второго варианта является громоздкость, особенно если символов несколько десятков. 

Я правильно понимаю, что других вариантов (более простых и изящных) не существует? Или (надеюсь) я не прав?

 
Nikolai Semko:

Вопрос.

Допустим я в эксперте или индикаторе работаю по нескольким символам, точнее по всем символам, которые отображены в окне "Обзор рынка". 

Задача заключается в том, чтобы поймать момент нового тика по любому из символов.

Пока вижу только пару вариантов:
  1. через таймер c опросом всех символов. (можно, конечно, только опрашивать новое значение функции TimeCurrent(), но в этом случае погрешность будет равна 1 секунде, т.к. эта функция возвращает значение в секундах)
  2. в каждом символе в OnTick (или OnCalculate) генерировать пользовательское событие через EventChartCustom

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

Недостатком второго варианта является громоздкость, особенно если символов несколько десятков. 

Я правильно понимаю, что других вариантов (более простых и изящных) не существует? Или (надеюсь) я не прав?

Может это поможет? https://www.metatrader5.com/ru/terminal/help/trading_advanced/custom_instruments

Синтетические инструменты с котировками в реальном времени

Торговая платформа позволяет создавать синтетические финансовые инструменты — инструменты на основе одного или нескольких имеющихся. Нужно просто задать формулу для расчета котировок, и платформа в режиме реального времени будет генерировать тики синтетического инструмента, а также создаст его минутную историю.
Как это происходит

    Вы создаете синтетический инструмент и задаете для него формулу.
    Платформа будет рассчитывать его тики с частотой 10 раз в секунду (и только если изменилась цена хотя бы одного инструмента, входящего в формулу).
 
SEM:

Может это поможет? https://www.metatrader5.com/ru/terminal/help/trading_advanced/custom_instruments

Синтетические инструменты с котировками в реальном времени

Торговая платформа позволяет создавать синтетические финансовые инструменты — инструменты на основе одного или нескольких имеющихся. Нужно просто задать формулу для расчета котировок, и платформа в режиме реального времени будет генерировать тики синтетического инструмента, а также создаст его минутную историю.
Как это происходит

    Вы создаете синтетический инструмент и задаете для него формулу.
    Платформа будет рассчитывать его тики с частотой 10 раз в секунду (и только если изменилась цена хотя бы одного инструмента, входящего в формулу).

Да, конечно, такой вариант тоже имеет право на жизнь. Спасибо!
Но, по сути, это тоже самое что и мой вариант под № 1 с периодичностью таймера 100 мс и с теми же недостатками.

Все же вариант № 2 мне видится более рациональным. 

Кстати, я вспомнил, что второй вариант уже обсуждался вот здесь.


 
Nikolai Semko:

Да, конечно, такой вариант тоже имеет право на жизнь. Спасибо!
Но, по сути, это тоже самое что и мой вариант под № 1 с периодичностью таймера 100 мс.

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

for(int i=PositionsTotal()-1;i>=0;i--)
     {
      if(PositionGetSymbol(i)==Symbol())
        {
         //Код
        };

     }
 
SEM:
А не проще сделать эксперта с привязкой к символу на котором работает. Потом открыть все символы, и на каждый график применить шаблон с данным советником.

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

 
Nikolai Semko:

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

Реализация.

Особенности языка mql5, тонкости и приёмы работы
Особенности языка mql5, тонкости и приёмы работы
  • 2018.01.28
  • www.mql5.com
В данной теме будут обсуждаться недокументированные приёмы работы с языком mql5, примеры решения тех, или иных задач...
 
Nikolai Semko:
  1. через таймер c опросом всех символов. (можно, конечно, только опрашивать новое значение функции TimeCurrent(), но в этом случае погрешность будет равна 1 секунде, т.к. эта функция возвращает значение в секундах)

Я правильно понимаю, что других вариантов (более простых и изящных) не существует? Или (надеюсь) я не прав?

Миллисекундный таймер + SymbolInfoTick() получите время в миллисекундах.

 
Да , я уже давал эту ссылку на Вашу реализацию в 22214 сообщении. Повторюсь - считаю этот вариант пока самым разумным. И похоже,  что лучше реализации в плане минимальности нагрузки на процессор и актуальности получаемого момента нового тика просто не существует.
 
Nikolai Semko:
  1. через таймер c опросом всех символов. (можно, конечно, только опрашивать новое значение функции TimeCurrent(), но в этом случае погрешность будет равна 1 секунде, т.к. эта функция возвращает значение в секундах)

Я правильно понимаю, что других вариантов (более простых и изящных) не существует? Или (надеюсь) я не прав?

Миллисекундный таймер + SymbolInfoTick() получите время в миллисекундах.

Alexey Kozitsyn:

Миллисекундный таймер + SymbolInfoTick() получите время в миллисекундах.

Это все вариант 1. Я такую конструкцию(Миллисекундный таймер + цикл SymbolInfoTick() ) и имел ввиду. Функцию TimeCurrent()  я затронул, т.к. она возвращает "время прихода последней котировки по любому символу, доступного в окне "Обзор рынка", а не только по текущему символу, но к сожалению возвращает только секунды, что очень грубо для тиков.  
Объективно вариант с пользовательскими прерываниями все же гораздо рациональней, т.к. при нем не требуется организовывать цикл с дорогой функцией  SymbolInfoTick, причем постоянно, даже когда котировки спят, нагружая таким образом процессор в холостую. А так же потому, что погрешность вычисления прихода нового тика может равняться периодичности таймера и будут теряться все тики между выполнением OnTimer если таковых тиков было больше 1.
ЗЫ Речь про mql5. На mql4 пользовательские прерывания не работают должным образом. Поэтому для mql4 вариант только через таймер.