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

 
fxsaber:

Не нашел опасного примера.

На моей памяти, это единственная такая библиотека, когда #include есть, но нигде в коде ничего из нее не вызывается пользователем.

Ну, в этой же библиотеке главное - это хитрое переопределение стандартных функций. Получается неявный вызов.

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

 
fxsaber:


Кстати, спасибо за код. Много ценного узнал и подчерпнул интересных идей.
 
Замерил время задержки
    static const ulong StartTime = GetMicrosecondCount();    

//    if (FirstRun && (!::GlobalVariableCheck(INIT_SYNC::InitSync.GlobalName)))
    if (FirstRun && (!INIT_SYNC::ResourceCheck(INIT_SYNC::InitSync.GlobalName)))
    {
//      FirstRun = (::GlobalVariableSet(INIT_SYNC::InitSync.GlobalName, 0) == 0);
      FirstRun = !INIT_SYNC::ResourceCreate(INIT_SYNC::InitSync.GlobalName);

      if (!FirstRun)
      {
        Print(GetMicrosecondCount() - StartTime);

Иногда доходит до 300 мс при переключении ТФ. И это не на "холодную". Получается, что даже "горячий" терминал иногда подтормаживает.

Наверное, надо об этом в СД писать, чтобы устраняли.

 

Сборная солянка по еще одной специфике MT5-индикаторов.


В исходнике библиотеки есть очень тонкий момент

  static string GetMyUniqueName( void )
  {
    const int handle = GetMyHandle();

    MqlParam Params[];
    ENUM_INDICATOR Type;

    const int Total = ::IndicatorParameters(handle, Type, Params);
    ::IndicatorRelease(handle);

    uchar Bytes[];

    for (int i = 1; i < Total; i++)
    {
      ::ArrayCopy(Bytes, _R(Params[i].double_value).Bytes, ::ArraySize(Bytes));
      ::ArrayCopy(Bytes, _R(Params[i].integer_value).Bytes, ::ArraySize(Bytes));
      ::ArrayCopy(Bytes, _R(Params[i].string_value).Bytes, ::ArraySize(Bytes));
    }

    return("::" + (string)::ChartID() + (string)INIT_SYNC::crc64(Bytes) + ::MQLInfoString(MQL_PROGRAM_NAME));
  }


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

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