Библиотеки: 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 мс при переключении ТФ. И это не на "холодную". Получается, что даже "горячий" терминал иногда подтормаживает.

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

 

К сожалению, я не могу этого понять. В моих тестах последовательность не нарушается.

DeInit, а затем Init выполняются, как и ожидалось. Все остальное было бы весьма сомнительно.


Поэтому мне интересно, что должен делать этот пример кода!

 

Я подозреваю, что это иногда происходит, но не всегда и не обязательно.

Возможно, это связано с 'threadrace' и невозможно определить, что выполняется, когда и в каком порядке.

Однажды у меня возникла идея (в MT4, но должно работать и в MT5)

   int lastPing = TerminalInfoInteger(TERMINAL_PING_LAST);

использовать прерывание соединения с сервером - невозможно!

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

Если пинг-тест был выполнен за миллисекунду до этого, то он показывает, что все в порядке :(

Попробуйте просто потянуть за посадочный кабель...

Мое предложение, либо изменить потоковую передачу (вероятно, сложно), либо предоставить последние 2, 3 пинг-теста (было бы легко) от советника или индикатора, чтобы иметь возможность распознать прерывание супер легко: У нас нет намерений....

 
Otto Pauser:

К сожалению, я не могу этого понять. В моих тестах последовательность не нарушается.

DeInit, а затем Init выполняются, как и ожидалось. Все остальное было бы весьма сомнительно.


Поэтому мне интересно, что должен делать этот пример кода!

Если вы запустите этот индикатор и измените его таймфрейм или символ, вы увидите нарушение порядка строк "Init" и "Deinit" в журнале.
 

Сборная солянка по еще одной специфике 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));
  }


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

[Удален]  

Здравствуйте @fxsaber, я получаю следующие ошибки при попытке использовать вашу библиотеку.


Как мне исправить это? Спасибо.

 
Paul Carissimo:

Здравствуйте, @fxsaber, при попытке использовать вашу библиотеку я получаю следующие ошибки

Как мне исправить это? Спасибо.

Внимательно прочитайте описание.