
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Вот в этом я совсем не уверен, что именно так.
Сколько раз объявление переменной variable было включено в код?
Если бы она включилась 2 раза, то были бы ошибки (вручную заменил каждую директиву #include содержимым файла):
[edit]
Теперь 2 разных файла с одинаковым содержимым:
Сколько раз объявление переменной variable было включено в код?
Если бы она включилась 2 раза, то были бы ошибки (вручную заменил каждую директиву #include содержимым файла):
[edit]
Теперь 2 файла с одинаковым содержимым:
Теперь самое интересное. Сколько объявлений переменной variable в итоговом исходном коде?
Ошибок нет, это говорит о том, что компилятор включил Bar.mqh один раз, а не 2.
P.S. Объявление переменных в глобал скоупе во включаемых файлах - зашкварная история. Это было сделано для простоты и наглядности примера. По нормальному f() и variable оборачиваются в класс.
Можно объявить макрос. Предупреждений нет.
Руками объявляю еще раз - macro redefinition
Сколько раз объявление переменной variable было включено в код?
Если бы она включилась 2 раза, то были бы ошибки (вручную заменил каждую директиву #include содержимым файла):
[edit]
Теперь 2 разных файла с одинаковым содержимым:
С объектами структур и классов, другая картина.
По идее должна быть ошибка, так как есть попытка включить объект с одним именем дважды.
Защита от двойного включения делается через #ifndef
Двойного включения у меня точно нет (это, как раз, могло бы быть в третьем советнике, но там приняты меры).
А вот что, похоже, есть и влияет - особенности обработки и фильтрации тиков.
Буквально, скопировал самый верхний файл, который включает остальные, заменил в нём только magic'и роботов (их там 6 штук), скомпилировал.
С объектами структур и классов, другая картина.
По идее должна быть ошибка, так как есть попытка включить объект с одним именем дважды.
Там в файле 30 строк, из них значимых - 14.
diff показывает отличия в 6 строчках - по одной на каждого робота, в которых меджики и задаются.
Vladislav Boyko #:
Полный аналог
Понятно, принято.
Буквально, скопировал самый верхний файл, который включает остальные, заменил в нём только magic'и роботов (их там 6 штук), скомпилировал.
Поставил (ночью, когда нет торгов!) на два графика (оба H1) одного инструмента (GOLD-12.24) внутри одного MT5.
В 10 утра открываются торги - роботы из одного советника открывают позы в 10:11:10, из другого - в 10:11:32 (все роботы тестовые, позы на самом деле не открываются, только в логи пишутся).
Прикол в том, что есть ещё и третий советник, с тем же алгоритмом, но с немного переделанной структурой классов.И его роботы тоже открыли позы на GOLD-12.24, H1 в 10:11:10, с отличием в 2-3 мс (GetTickCount64() в логах) от роботов первого.
Не могу сообразить, в какую сторону и как именно копать.
один из советников пропустил тики потому-что где-то тормозил 22 сек:
а вот не надо делать пачки роботов в одном советнике :-) такой подход только для тестов
один из советников пропустил тики потому-что где-то тормозил 22 сек:
а вот не надо делать пачки роботов в одном советнике :-) такой подход только для тестов
С объектами не общается, виртуальные позы хранит в стейте, ордера не отправляет, ибо тестовый режим, сделки имитируются.
Считается немного и сразу на всех роботов из файла.
Реквоты - это не про фортс.
Но вот тики фильтруются, для снижения нагрузки:
Думаю, с этим связано, завтра хочу проверить.
Там сильно абстрактный пример какой-то. Не могу придумать пример для реального применения, что бы прям нужен был тот менеджер, в большинстве случаев можно сделать сильно проще.
Вы вроде писали про списки. Это тоже можно назвать "взаимной увязкой объектов", когда элемент списка хранит указатель на "соседа".
Типа условимся считать, что экземпляры класса Element разрешено создавать только классу Manager (на самом деле, ничего не мешает создать отдельно экземпляр Element не используя интерфейс класса Manager).
А Element должен уметь общаться с менеджером, который его создал. То есть, просто вызывать метод того менеджера, передавая ему какую-то информацию. Что бы вызывать метод менеджера элементу нужен указатель на менеджер, вот он:
Как получить указатель на создателя? Ну пускай создатель передает указатель на себя когда создает экземпляр элемента:
Можно избавиться от списка инициализации, что бы он никого не смущал:
Можно переписать тело конструктора более очевидным (для начинающих) образом:
Еще упростим - уберем преобразование ссылки в указатель, пускай сразу указатель тот менеджер передает:
Зная указатель, элемент может вызывать методы менеджера. Добавим менеджеру метод, в который можно звонить (пускай он принимает строку, что бы не заморачиваться) и добавим элементу имя, что бы различать экземпляры.
Добавим менеджеру метод для создания экземпляров класса Element (нужно же хоть как-то обосновать существование менеджера). Не хочу делать массив как в книжке, пускай менеджер просто возвращает указатель на соданный экземпляр.
Менеджеру тоже дадим имя, так как если менеджер будет только один, то в нем нет никакого смысла.
Теперь, когда есть указатель на менеджера и у менеджера есть метод, пускай элемент его вызывает. Например, когда вызывается метод work(). Пускай хоть код еще какой-нибудь передается.
Ну и собираем в кучу всю эту сомнительную ерунду:
Большое человеческое спасибо. Чуток стало почти понятно. То-есть это можно применить как замену списку объектов?
Типа, имеем 5 валютных пар в работе советника, это будут, так сказать манагеры, открылась позиция манагер получил тикет позиции и другие её свойства. Если это так, то очень интересно, правда в реализации сложней чам список объектов.