Обработка событий.

 
Это пожелание.

У вас сейчас пользователю доступны 3 события:
- init
- start (т.е. newTick)
- deinit

Было бы замечательно, если бы появилось еще несколько обработчиков событий:
- нажатие левой/правой кнопки мыши в окне индикатора/эксперта
- результат исполнения ордера (ответ сервера)
- ........

Это значительно упростило бы программирование многих вещей, сделало бы МТ еще более интерактивным, уменьшило бы нагрузку на систему (пользователя), позволило бы обойтись без использования Sleep и пр.

Если это реально, можно подумать и сформулировать предложение более детально.
К сожалению ответ почти известен (нет и не будет .. :(()
------------------------------

В качестве примера.

Мне сейчас в индикаторе профайла рынка нужно ткнуться мышкой в пик на графике и должно гдето както отобразиться инфо по этой точке (значение коор. Х).

На событии от мышки это сделать элементарно.
А иначе я сейчас могу это как нибудь сделать?
 
В принципе, очень интересная идея. Надо обсудить это.
 
В принципе, очень интересная идея. Надо обсудить это.

Может быть тогда еще ктото подключится к обсуждению ..

Напишу некоторые идеи, просто для обсуждения.
Наверное это не все, и не все из этого можно/нужно реализовывать в МТ4.

В идеале хотелось бы видеть полностью объектно-ориентированную систему, с графическим редактором типа Simulink в Матлабе - это идеально соответствовало бы задачам построения торговых систем и автоматов. Но в рамках МТ4 это невозможно - это совсем другая идеология. Тут хорошо бы сделать то, что ложится в концепцию МТ4 и несложно реализуется.

Нужно бы определиться со списком событий в системе (МТ4) и транслировать эти события в вызовы пользовательских функций аналогично init и start (название у последней не очень удачное - не отражает смысл).

Список событий можно проранжировать по важности и сложности реализации, и может быть включить в МТ4 наиболее важные и не слишком сложные. Причем большинство событий уже существуют в системе и нужно только в нужном месте МТ4 поставить вызов заданной (с фиксированным названием) пользовательской функции.

Категории событий.

Пока видятся четыре категории:
1. связанные с потоком котировок.
2. действия пользователя.
3. действия торгового сервера.
4. прочие (почта, новости ...)

Cвязанные с потоком котировок

Как минимум это:
- newTick (сейчас называется start)
- newBar - это событие несложно реализовать и сейчас в скрипте, позволяет упростить многие индикаторы и эксперты.
- как вариант могут быть newHour, newDay ... но не знаю насколько велик в этом смысл.

Действия пользователя

Пока вижу только:
- нажатие кнопок мыши в подокне к которому привязан эксперт или индикатор. Событие может содержать параметры с координатами и код нажатой кнопки, или эти параметры могут потом выбираться в скрипте.
- могут быть еще события связанные с открытием/закрытием ордеров и позиций и изменением их параметров. В принципе это и в скрипте отследить можно, но довольно сложно и медленно.

Действия торгового сервера.

- это сообщения от торгового сервера о принятии, отказе и исполнении ордеров и закрытии позиций по стопам.

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


Из всего перечисленного большую часть можно реализовать и сейчас в скриптах, пусть и неудобно, с кучей кода, но возможно. Правда есть и принципиальные трудности - скрипт запускается по очередному тику, и если этого тика нет, то мы не в состоянии поймать эти события. А когда тик приходит, нужно городить кучу кода для выделения этих событий. Явное введение событий могло бы значительно упростить кодирование для юзеров.

Невозможно сейчас (или крайне неудобно) отследить кнопки мыши и приход сообщений от торгового сервера.

Возможны 2 способа обработки событий:
- постановка в очередь
- потеря события если скрипт занят.

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

Если очередь сложно организовать, то реакцию на мышку можно сделать и с потерей.
----------------------------------------------------------

Кто нибудь еще что нибудь добавит/прокомментирует?
 
Кстати, у мышки кнопки на графиках уже заняты,
так что можно оставить только Клик левой кнопкой.
Или управлять обработкой из скрипта, типа так:

int ButtonDoubleClick(int btnNo)
{
    if (ItsMyEvent(btnNo)) 
    {
        ...............
        return(1); // стандартная обработка не требуется
    }
    return(0); // выполнить стандартную обработку
}
}
 
Было бы здорово. Кроме того это очень хорошо ассоциируется с архитектурными особенностями MS Windows.
Интересно, до чего договорятся. Но, если кто-то из них попробует реализовать предложенное Вами, хотя бы по причине собственного азарта... всё может быть. В каждом программисте в душе живёт Билл Гейтс.

Не помешал бы обработчик клавиатуры.
 
В пределе получится терминал в виде компоненты для дельфей :)

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

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

2. Metaquotes вводит функцию обработчик события нажатия левой кнопки мыши (например)
int LBMouse(int Bar, double Price)
{
    ...
    // обработчики
    if (GlobalVariable == 1)
    {
        Устанавливаем отложенный ордер на Price
    }
    if (GlobalVariable == 2)
    {
        Ставим стоплоссы для всех подходящих ордеров :)
    }
   ...
    return(0);
}
 
Кнопки - это чтото типа тулбара?

Типа кнопок с фиксацией:
- кнопка "Рыночный Ордер"
- кнопка "Отложенный Ордер"
...........

Нажал первую, ткнул мышью в график - ордер улетел ..
Так?

Интересный вариант.

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

Примерно так:
int init ()
{
// инициализация кнопок
   SetButtonName(1, "Рыночный Ордер");
   SetButtonName(2, "Отложенный Ордер");
   SetButtonState(1, BTN_OFF);
   SetButtonState(2, BTN_OFF);
..............
}

// событие обработки нажатия пользовательской кнопки
int CustomButton(int btn)
{
   if (btn == 1) SetButtonState(btn, BTN_SWITCH);
..........
}

// обработка мыши
int MouseButton(int mbtn)
{
   if (mbtn == MBTN_LEFT_CLICK)
   {
      if (GetButtonState(1) == BTN_ON) myPlaceMarketOrder();
      ...........
   }
   return (0);
}


Можно мышку усовершенствовать,
если из скрипта будут доступны состояния клавиш Ctrl, Alt, shift
их можно использовать как модификатор клика.

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

Я никак не могу делать ...
Но сейчас рано делить шкуру неубитого медведя.
Пока не известно как разработчики предложат привязывать код к кнопкам.

Как раз я и предлагаю для обсуждения возможные варианты.

Привязка через события - самый простой, гибкий и стандартный вариант (все винды так работают). Откройте VB или VBA для примера. Там у каждого объекта куча событий, в том числе и Click :))
 
Поддерживаю Mac. Интересная тема. Дополнил бы события MouseOver, MouseOut, Connect, Disconnect. Два последних особенно.
 
Категории событий.

Пока видятся четыре категории:
1. связанные с потоком котировок.
2. действия пользователя.
3. действия торгового сервера.
4. прочие (почта, новости ...)

Cвязанные с потоком котировок

Как минимум это:
- newTick (сейчас называется start)
- newBar - это событие несложно реализовать и сейчас в скрипте, позволяет упростить многие индикаторы и эксперты.
- как вариант могут быть newHour, newDay ... но не знаю насколько велик в этом смысл.

Кто нибудь еще что нибудь добавит/прокомментирует?


Было бы просто замечательно, если бы было! Я в своих желаниях не пошел дальше срабатывания эксперта через заданное количество ms. И когда меня Слава спросил о целесообразности, я ему ничего вразумительно не ответил. Потому как подумал, что действительно, привязка к таймеру мне нужна, фактически, в выходные и на очень вялом рынке. В выходные приходится имитировать работу рынка постоянно логинясь к серверу, в этот момент эксперт срабатывает. Аналогично и на вялом рынке, если долгое время нет котировки.
Причина обращения: