Здравствуйте! mql5
Есть советник Sovetnik, в него подключен класс, написанный в другом файле AnyClass.mqh и создаются 3 экземпляра класса.
Событие OnTick() работает в коде советника, но не срабатывает в коде класса. Приходится его принудительно тикать из советника вот так:
Это событие нельзя использовать в экземплярах классов, или что?
- www.mql5.com
Здравствуйте! mql5
Есть советник Sovetnik, в него подключен класс, написанный в другом файле AnyClass.mqh и создаются 3 экземпляра класса.
Событие OnTick() работает в коде советника, но не срабатывает в коде класса. Приходится его принудительно тикать из советника вот так:
Это событие нельзя использовать в экземплярах классов, или что?
Как верно тебе заметили - это не событие, а твой метод, который ты и должен (если надо) вызывать у всех созданных объектов.
Лично я предпочитаю использовать имя MyOnTick() - чтобы было видно, что это как раз метод, который написал я сам, и который должен вызываться в
обработчике OnTick()
- www.mql5.com
Лично я предпочитаю использовать имя MyOnTick() - чтобы было видно, что это как раз метод, который написал я сам, и который должен вызываться в обработчике OnTick()
Вроде бы интереснее будет выглядеть TickProcessing().
Жаль, что нельзя сделать классы более автономными.
class BASE { private: static BASE* Objects[]; public: BASE() { BASE::Objects[::ArrayResize(BASE::Objects, ::ArraySize(BASE::Objects) + 1) - 1] = &this; } ~BASE() { const int Size = ::ArraySize(BASE::Objects); for (int i = Size - 1; i >= 0; i--) if (BASE::Objects[i] == &this) { for (int j = i; j < Size - 1; j++) BASE::Objects[j] = BASE::Objects[j + 1]; ::ArrayResize(BASE::Objects, Size - 1); break; } } virtual void OnTick() = 0; static void AllTick() { for (int i = ::ArraySize(BASE::Objects) - 1; i >= 0; i--) BASE::Objects[i].OnTick(); } }; static BASE* BASE::Objects[]; class A : BASE { virtual void OnTick() { Print(__FUNCSIG__); } }; class B : BASE { virtual void OnTick() { Print(__FUNCSIG__); } }; A a; B b; void OnTick() { BASE::AllTick(); }
Наследуйтесь от BASE, тогда методы OnTick в классах будут вызываться автоматически.
Здравствуйте! mql5
Есть советник Sovetnik, в него подключен класс, написанный в другом файле AnyClass.mqh и создаются 3 экземпляра класса.
Событие OnTick() работает в коде советника, но не срабатывает в коде класса. Приходится его принудительно тикать из советника вот так:
Это событие нельзя использовать в экземплярах классов, или что?
Можно свой метод называть OnTick() и будет работать.
Спасибо за ответы! Жаль, что нельзя сделать классы более автономными.
С чего бы это "Жаль" ? И что значит "более автономными" ???
Зачем классам функции обработки событий ? Скажем, классу массива или классу списка ?
Если такая функция тебе нужна - ну так и вставь ее в свой класс, и вызывай ! А закладываться на то, чтобы у любого класса по умолчанию уже были
функции, которые, к тому же, не нужны 99% объектов ??? Какой в этом смысл ?
Не всем классам, а избранным. Это очень удобно, например, для GUI-классов или классов ТС.
Не всем классам, а избранным. Это очень удобно, например, для GUI-классов или классов ТС.
Ну, так для классов GUI - явно не нужны функции торговых событий. А для классов ТС - врядли нужны функции событий GUI.
Речь же о том, чтобы функция обработки событий была бы у всех объектов в программе... Ясное дело, что "умный" компилятор не будет генерировать код для тех классов, где он не будет использоваться, однако, сама идея о том, чтобы любой класс в программе имел бы функции обработки событий - на мой взгляд, неправильна.
Для НЕКОТОРЫХ же классов (те же классы GUI или ТС) - вполне разумно написать соответствующие методы обработки, и вызывать их в коде эксперта.
однако, сама идея о том, чтобы любой класс в программе имел бы функции обработки событий - на мой взгляд, неправильна.
не наследуйтесь где не нужно от примера класса BASE - в чем проблема?
по сабжу, пример замечательный!
имхо, в MQL лучше написать несколько небольших классов под конкретную задачу, чем писать один суперкласс, который будет управлять "стадом неразумных мелких классов" - большая часть задач пишется для разового выполнение, без переносимости в другой проект, ну и все что пишется как универсальное решение, затем вызывает трудности при поиске потери производительности когда потребуется оптимизатор
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Здравствуйте! mql5
Есть советник Sovetnik, в него подключен класс, написанный в другом файле AnyClass.mqh и создаются 3 экземпляра класса.
Событие OnTick() работает в коде советника, но не срабатывает в коде класса. Приходится его принудительно тикать из советника вот так:
Это событие нельзя использовать в экземплярах классов, или что?