Библиотеки: Event_Message - страница 2

 

Для своих задач писал. С ними справляется.

 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

MT5 и скорость в боевом исполнении

fxsaber, 2020.10.07 11:42

2020.10.07 12:38:04.579 Alert: Time[Test9.mq5 5 in OnTick: EventChartCustom(ChartFirst(),123,0,0,NULL)] = 100 mсs.
2020.10.07 12:38:06.842 Alert: Time[Test9.mq5 5 in OnTick: EventChartCustom(ChartFirst(),123,0,0,NULL)] = 170 mсs.
2020.10.07 12:38:07.924 Alert: Time[Test9.mq5 5 in OnTick: EventChartCustom(ChartFirst(),123,0,0,NULL)] = 765 mсs.
2020.10.07 12:38:08.359 Alert: Time[Test9.mq5 5 in OnTick: EventChartCustom(ChartFirst(),123,0,0,NULL)] = 377 mсs.
2020.10.07 12:38:09.246 Alert: Time[Test9.mq5 5 in OnTick: EventChartCustom(ChartFirst(),123,0,0,NULL)] = 66 mсs.
2020.10.07 12:38:14.645 Alert: Time[Test9.mq5 5 in OnTick: EventChartCustom(ChartFirst(),123,0,0,NULL)] = 692 mсs.
2020.10.07 12:38:14.729 Alert: Time[Test9.mq5 5 in OnTick: EventChartCustom(ChartFirst(),123,0,0,NULL)] = 6427 mсs.
2020.10.07 12:38:15.140 Alert: Time[Test9.mq5 5 in OnTick: EventChartCustom(ChartFirst(),123,0,0,NULL)] = 479 mсs.
2020.10.07 12:38:15.222 Alert: Time[Test9.mq5 5 in OnTick: EventChartCustom(ChartFirst(),123,0,0,NULL)] = 125 mсs.
2020.10.07 12:38:15.373 Alert: Time[Test9.mq5 5 in OnTick: EventChartCustom(ChartFirst(),123,0,0,NULL)] = 606 mсs.


Отказался от столь дорогой функции в критических местах.


Если требуется за считанные микросекунды отправить данные, то данная библиотека пока не справляется. В среднем несколько сотен микросекунд на отправку уходит не на медленной машине.

 

Библиотека обновлена.

Учтено переполнение очереди событий графика и добавлены стат. данные отправки/получения (см. примеры в описании).

 

Нужно было с запущенных своих советников собрать их внутреннюю информацию.

Такой механизм использовал.

// Пример получения информации с других графиков по клику мыши.

#include <fxsaber\Event_Message\Event_Message.mqh> // https://www.mql5.com/ru/code/28835

#define EVENT_REQUEST_INFORMATION (1234 + CHARTEVENT_CUSTOM)
#define EVENT_WAIT_INFORMATION (1235 + CHARTEVENT_CUSTOM)

void OnChartEvent( const int id, const long& lparam, const double& dparam, const string& sparam )
{
  static string StrReceived = NULL; // Строка накопления запрашиваемой информации с других графиков.
  static int AmountRequests = 0;

  if (id == CHARTEVENT_CLICK)
  {
    if (!AmountRequests)
    {
      // Формируем графикам запрос на отправку ими информации.
      for (long Chart = ChartFirst(); Chart != -1; Chart = ChartNext(Chart))
        AmountRequests += EventChartCustom(Chart, EVENT_REQUEST_INFORMATION - CHARTEVENT_CUSTOM, ChartID(), 0, NULL);                          
        
      if (AmountRequests)
      {
        Print("EVENT_REQUEST_INFORMATION - " + (string)AmountRequests + " requests.");
        
        EventChartCustom(0, EVENT_WAIT_INFORMATION - CHARTEVENT_CUSTOM, GetMicrosecondCount(), AmountRequests, NULL);                                  
      }
    }
  }
  else if (id == EVENT_REQUEST_INFORMATION)
    EVENT_MESSAGE::Send(_Symbol, lparam); // Отправляем информацию запрашиваемому графику.
  else if (AmountRequests) // Прописываем в конец if/else-конструкции
  {
    if (id == EVENT_WAIT_INFORMATION)
    {
      const ulong WaitTime = GetMicrosecondCount() - lparam;
      
      if (WaitTime > 1e6)
      {
        Print("EVENT_WAIT_INFORMATION - TimeOut: " + (string)WaitTime + " mcs. " +
              (string)AmountRequests + "/" + (string)(int)dparam + " requests without answer.");
        
        AmountRequests = 0;        
      }
      else
      {
        Sleep(0);
        EventChartCustom(0, EVENT_WAIT_INFORMATION - CHARTEVENT_CUSTOM, lparam, dparam, NULL);                                  
      }
    }    
    else if (EVENT_MESSAGE::OnChartEvent(id, lparam, dparam, sparam)) // Если переданная строка полностью пришла
    {
      StrReceived += EVENT_MESSAGE::Receive(lparam) + " "; // Накапливаем поспупаемую запрошенную информацию.
      AmountRequests--;
    }
    
    if (!AmountRequests)
    {
      Print(StrReceived); // Распечатали накопленную запрошенную с графиков информацию.
      
//      Print("Received " + EVENT_MESSAGE::StatReceived()); // Статистика принятых сообщений.
//      Print("Sended " + EVENT_MESSAGE::StatSended());     // Статистика отправленных сообщений.
      
      StrReceived = NULL;
    }
  }
}


Запускаем на нескольких графиках этот советник и щелкаем по любому из этих графиков - распечатывается собранная с запущенных советников информация.

 
fxsaber #:

Нужно было с запущенных своих советников собрать их внутреннюю информацию.

Такой механизм использовал.

Запускаем на нескольких графиках этот советник и щелкаем по любому из этих графиков - распечатывается собранная с запущенных советников информация.

Оформил в виде библиотеки и прикрепил ее в КБ. Тот же советник.

#include <fxsaber\Event_Message\ChartsInfo.mqh> // https://www.mql5.com/ru/code/28835

void OnChartEvent( const int id, const long& lparam, const double& dparam, const string& sparam )
{
  static CHARTSINFO ChartsInfo;
  
  if (id == CHARTEVENT_CLICK)
    ChartsInfo.Request(); // Формирование запроса графикам на получение их информации.
  
  if (ChartsInfo.OnChartEvent(id, lparam, dparam, sparam)) // Если завершено накопление запрошенной с графиков информации,
  {
    string Str[];    
    ChartsInfo.Receive(Str);                               // получили все пришедшие данные.
    
    ArrayPrint(Str);
  }
  else if (ChartsInfo.IsStateToSend()) // Если пришел запрос на информацию,
    ChartsInfo.Send(_Symbol);          // отправляем данные.
}
Причина обращения: