Две копии одного советника работают по-разному.

 

Буквально, скопировал самый верхний файл, который включает остальные, заменил в нём только magic'и роботов (их там 6 штук), скомпилировал.

Поставил (ночью, когда нет торгов!) на два графика (оба H1) одного инструмента (GOLD-12.24) внутри одного MT5.

В 10 утра открываются торги - роботы из одного советника открывают позы в 10:11:10, из другого - в 10:11:32 (все роботы тестовые, позы на самом деле не открываются, только в логи пишутся).

Прикол в том, что есть ещё и третий советник, с тем же алгоритмом, но с немного переделанной структурой классов.

И его роботы тоже открыли позы на GOLD-12.24, H1 в 10:11:10, с отличием  в 2-3 мс (GetTickCount64() в логах) от роботов первого.

Не могу сообразить, в какую сторону и как именно копать.

 
JRandomTrader:

Буквально, скопировал самый верхний файл, который включает остальные, заменил в нём только magic'и роботов (их там 6 штук), скомпилировал.

Поставил (ночью, когда нет торгов!) на два графика (оба H1) одного инструмента (GOLD-12.24) внутри одного MT5.

В 10 утра открываются торги - роботы из одного советника открывают позы в 10:11:10, из другого - в 10:11:32 (все роботы тестовые, позы на самом деле не открываются, только в логи пишутся).

Прикол в том, что есть ещё и третий советник, с тем же алгоритмом, но с немного переделанной структурой классов.

И его роботы тоже открыли позы на GOLD-12.24, H1 в 10:11:10, с отличием  в 2-3 мс (GetTickCount64() в логах) от роботов первого.

Не могу сообразить, в какую сторону и как именно копать.

крутая заявочка на арбитраж меж роботами ;)

а если серьезно, пробуйте в разных терминалах

 
Renat Akhtyamov #:
пробуйте в разных терминалах

Для начала понять бы, какую именно гипотезу таким образом проверить?

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

Да, в эту буду копать, спасибо. Хотя, вроде, слежу за этим.

 
JRandomTrader:

Буквально, скопировал самый верхний файл, который включает остальные, заменил в нём только magic'и роботов (их там 6 штук), скомпилировал.

Поставил (ночью, когда нет торгов!) на два графика (оба H1) одного инструмента (GOLD-12.24) внутри одного MT5.

В 10 утра открываются торги - роботы из одного советника открывают позы в 10:11:10, из другого - в 10:11:32 (все роботы тестовые, позы на самом деле не открываются, только в логи пишутся).

Прикол в том, что есть ещё и третий советник, с тем же алгоритмом, но с немного переделанной структурой классов.

И его роботы тоже открыли позы на GOLD-12.24, H1 в 10:11:10, с отличием  в 2-3 мс (GetTickCount64() в логах) от роботов первого.

Не могу сообразить, в какую сторону и как именно копать.

Возможно в включаемых файлах отсутствует защита от повторного включения.
Посмотри пример условной компиляции как это делается.


 
Roman #:

Возможно в включаемых файлах отсутствует защита от повторного включения.
Посмотри на примере плюсов как это делается.

Если бы у автора было взаимное включение двумя файлами друг друга, то код не скомпилировался бы.

Не могу представить себе ни одной ситуации, которая в достаточной степени обосновала бы необходимость 2х заголовочных файлов, которые включают друг друга.

 
Vladislav Boyko #:

Если бы у автора было взаимное включение двумя файлами друг друга, то код не скомпилировался бы.

Не могу представить себе ни одной ситуации, которая в достаточной степени обосновала бы необходимость 2х заголовочных файлов, которые включают друг друга.

#include <Trade\Trade.mqh>
#include <Trade\Trade.mqh>

Как пример, компилируется без ошибок.

 
Roman #:

Как пример, компилируется без ошибок.

Я говорю о взаимном включении, пример которого обсуждался на видео. Когда Bar.mqh включает Foo.mqh, а Foo.mqh включает Bar.mqh. В таком случае должна быть ошибка компиляции типа "function already defined". Если ошибок компиляции нет, то компилятор смог обеспечить только единократное включение каждого файла в итоговый код.

Roman #:
Как пример, компилируется без ошибок.

Trade.mqh будет включен один раз, а не 2.

[edit]

Перечеркнутый текст - мое ошибочное утверждение.

 
Vladislav Boyko #:

Я говорю о взаимном включении, пример которого обсуждался на видео. Когда Bar.mqh включает Foo.mqh, а Foo.mqh включает Bar.mqh. В таком случае должна быть ошибка компиляции типа "function already defined". Если ошибок компиляции нет, то компилятор смог обеспечить только единократное включение каждого файла в итоговый код.

Вот в этом я совсем не уверен, что именно так.

 
Vladislav Boyko #:
В таком случае должна быть ошибка компиляции типа "function already defined"

Я ошибся, пардон. Только что проверил, ошибки компиляции нет ни для mql4, ни для mql5.

Я когда-то проводил тесты со взаимным вклоючением файлов и были ошибки компиляции. Либо MQ что-то поменяли, либо те ошибки были связанны с чем-то другим, я не помню точно, это давно было.