MetaTrader 5 Build 245: Обработка событий кастомными индикаторами - страница 2

 
vdv2001:

 

А для этого достаточно добавить вариант OnCalculate(void), без параметров и передачи массивов.

 

Скорее, это в компетенции разработчиков метатрейдера.
 

vdv2001:

 

А для этого достаточно добавить вариант OnCalculate(void), без параметров и передачи массивов.

Событие Calculate обрабатывается только одной из двух предопределенных функций-обработчиков. Любой другой вариант функции просто не будет автоматически вызываться терминалом, но вы можете самостоятельно вызывать свой вариант функции как любую другую.
 
nen:
Скорее, это в компетенции разработчиков метатрейдера.
Именно это я имел в виду, введение разработчиками OnCalculate() без параметров.
 

Прошу прощения за дурацкий вопрос, но что случится, если сделать вот такую функцию и запустить ее:

int OnCalculate_Void()
{
   const int rates_total;
   const double price[];
   OnCalculate( rates_total, 0, 0, price );
   return( 1 );
} 

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

Чтобы она сделала что-то осмысленное, нужно заполнить значениями ее параметры?

P.S. Я хочу вставить эту функцию в обработчик OnChartEvent(), вот такой я упрямый...

 
Mathemat:

Прошу прощения за дурацкий вопрос, но что случится, если сделать вот такую функцию и запустить ее:

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

Чтобы она сделала что-то осмысленное, нужно заполнить значениями ее параметры?

P.S. Я хочу вставить эту функцию в обработчик OnChartEvent(), вот такой я упрямый...

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

Если конечно речь не идет о расчете собственного куска данных.

 

Спасибо, Renat. Будем искать обходные пути.

Маленький секрет: дописываю статью об изменении параметров мува на лету (период, тип, сдвиг) программно назначенными клавишами. Обработчик в индикаторе - OnChartEvent().

Все нормально работает, можно в принципе и публиковать. Но не очень красиво: мув перерисовывается не раньше, чем придет тик. Когда он придет ночью, никто не знает, можно и несколько минут ждать.

Хочется, чтобы перерисовывался сразу (наверно, и не только мне так хочется). Для этого, с учетом Вашего ответа, пока вижу только один простой путь немедленной передачи управления от OnChartEvent() к OnCalculate() - через искусственный тик, генерируемый перед выходом из OnChartEvent().

P.S. Renat, эта команда:

PostMessageA( hwnd, WM_COMMAND, 33324, 0 );

- все еще актуальна для "пятерки"? В "четверке" она вроде бы генерировала искусственный тик.

 
Mathemat:

не очень красиво: мув перерисовывается не раньше, чем придет тик. Когда он придет ночью, никто не знает, можно и несколько минут ждать.

Хочется, чтобы перерисовывался сразу (наверно, и не только мне так хочется).

 

Алексей, а нельзя ли здесь как-то задействовать пользовательское событие?

  • CHARTEVENT_CUSTOM+n — идентификатор пользовательского события, где n находится в диапазоне от 0 до 65535.
  • CHARTEVENT_CUSTOM_LAST — последний допустимый идентификатор пользовательского события (CHARTEVENT_CUSTOM+65535).
  •  

    Поищи, где-то Рашид выкладывал код, как это программировать. Или в Справке, или в code base.

    Документация по MQL5: Основы языка / Функции / Функции обработки событий
    Документация по MQL5: Основы языка / Функции / Функции обработки событий
    • www.mql5.com
    Основы языка / Функции / Функции обработки событий - Документация по MQL5
     
    nen:

    Алексей, а нельзя ли здесь как-то задействовать пользовательское событие?

    Спасибо, Евгений. Вот что есть в справке:

    EventChartCustom

    Генерирует пользовательское событие для указанного графика.

    [...]

    Примечание

    Эксперт или индикатор, прикрепленный к указанному графику, обрабатывает данное событие при помощи функции OnChartEvent(int event_id, long& lparam, double& dparam, string& sparam);

    Там же, в справке, и пример приведен, простой и понятный.

    Специфическая проблема передачи управления на OnCalculate() с его помощью не решается. Ну разве что вставить вовнутрь искусственный тик :) ...

     

    Есть другой вариант. Расчет индикатора вести в пользовательском событии, не используя OnCalculate.  Всю расчетную часть посместить в обработчик события. Единственный серьезный момент - необходимо аккуратно делать обработку. Обрабатывать только непросчитанную часть, а не всю историю.

    Документация по MQL5: Основы языка / Функции / Функции обработки событий
    Документация по MQL5: Основы языка / Функции / Функции обработки событий
    • www.mql5.com
    Основы языка / Функции / Функции обработки событий - Документация по MQL5
     
    nen:

    Есть другой вариант. Расчет индикатора вести в пользовательском событии, не используя OnCalculate.  Всю расчетную часть посместить в обработчик события. Единственный серьезный момент - необходимо аккуратно делать обработку. Обрабатывать только непросчитанную часть, а не всю историю.

    Да, конечно, но рассматриваю как крайний вариант. Это:

    - либо расчет в том же виде, как раньше в "четверке" (и это безусловный шаг назад),

    - либо все же вызов OnCalculate() внутри OnChartEvent() с предварительным расчетом всех параметров OnCalculate() (это уже явно получше, но попахивает искусственностью).

    Фишка в том, что у меня обработка события OnChartEvent() всегда предусматривает последующий пересчет индикатора "с нуля" (изменение периода мува с 13 до 14 требует пересчета его на всей истории). Но это даже не беда, т.к. уже дальше будет оптимизация расчетов. 

    Все-таки было бы очень неплохо, если бы Метаквоты сделали функцию а ля

    void GenerateArtificialTick( string symbol, int period, double& tickval, datetime& ticktime )

    - вместо того, чтобы каждый раз, когда тик нужен, обращаться напрямую к WinAPI32, да еще и вычисляя хэндл окна (а где у нас аналог старой доброй функции WindowHandle(), кстати?).

    Для чего этот тик нужен?

    - для очень простого решения проблемы мгновенной передачи управления из обработчика в OnCalculate();

    - для эмуляции работы индикаторов и экспертов в выходные;

    - для программного обновления ТФ

    - и т.п.

    Число 33324 при поиске на сайте mql4.com не зря выдает 45 ссылок.

    P.S. Оконные функции нашлись :), да и вообще проблему решил. Всем большое спасибо за внимание.

    Документация по MQL5: Основы языка / Функции / Функции обработки событий
    Документация по MQL5: Основы языка / Функции / Функции обработки событий
    • www.mql5.com
    Основы языка / Функции / Функции обработки событий - Документация по MQL5
    Причина обращения: