OnTick() не работает в экземпляре класса?

 

Здравствуйте!  mql5

Есть советник Sovetnik, в него подключен класс, написанный в другом файле AnyClass.mqh и создаются 3 экземпляра класса.

Событие OnTick() работает в коде советника, но не срабатывает в коде класса. Приходится его принудительно тикать из советника вот так:

OnTick()
{
AnyClass.OnTick();
}

Это событие нельзя использовать в экземплярах классов, или что?

 
Sunriser:

Здравствуйте!  mql5

Есть советник Sovetnik, в него подключен класс, написанный в другом файле AnyClass.mqh и создаются 3 экземпляра класса.

Событие OnTick() работает в коде советника, но не срабатывает в коде класса. Приходится его принудительно тикать из советника вот так:


Это событие нельзя использовать в экземплярах классов, или что?

В классе у тебя не функция обработки события OnTick, а метод OnTick, который ты сам написал и да, сам его и должен вызывать.
Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
В языке MQL5 предусмотрена обработка некоторых предопределенных событий. Функции для обработки этих событий должны быть определены в программе MQL5: имя функции, тип возвращаемого значения, состав параметров (если они есть) и их типы должны строго соответствовать описанию функции-обработчика события. Именно по типу возвращаемого значения и по...
 
Sunriser:

Здравствуйте!  mql5

Есть советник Sovetnik, в него подключен класс, написанный в другом файле AnyClass.mqh и создаются 3 экземпляра класса.

Событие OnTick() работает в коде советника, но не срабатывает в коде класса. Приходится его принудительно тикать из советника вот так:


Это событие нельзя использовать в экземплярах классов, или что?

Как верно тебе заметили - это не событие, а твой метод, который ты и должен (если надо) вызывать у всех созданных объектов.

Лично я предпочитаю использовать имя MyOnTick() - чтобы было видно, что это как раз метод, который написал я сам, и который должен вызываться в обработчике OnTick()

Документация по MQL5: Основы языка / Операторы / Оператор создания объекта new
Документация по MQL5: Основы языка / Операторы / Оператор создания объекта new
  • www.mql5.com
//| Создание фигуры                                                  |
 
Georgiy Merts:

Лично я предпочитаю использовать имя MyOnTick() - чтобы было видно, что это как раз метод, который написал я сам, и который должен вызываться в обработчике OnTick() 

Вроде бы интереснее будет выглядеть TickProcessing(). 

 
Спасибо за ответы! Жаль, что нельзя сделать классы более автономными.
 
Sunriser:
Жаль, что нельзя сделать классы более автономными.
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 в классах будут вызываться автоматически.

 
Sunriser:

Здравствуйте!  mql5

Есть советник Sovetnik, в него подключен класс, написанный в другом файле AnyClass.mqh и создаются 3 экземпляра класса.

Событие OnTick() работает в коде советника, но не срабатывает в коде класса. Приходится его принудительно тикать из советника вот так:

Это событие нельзя использовать в экземплярах классов, или что?

Можно свой метод называть OnTick() и будет работать.

 
Sunriser:
Спасибо за ответы! Жаль, что нельзя сделать классы более автономными.

С чего бы это "Жаль" ? И что значит "более автономными" ??? 

Зачем классам функции обработки событий ?  Скажем, классу массива или классу списка ?

Если такая функция тебе нужна - ну так и вставь ее в свой класс, и вызывай ! А закладываться на то, чтобы у любого класса по умолчанию уже были функции, которые, к тому же, не нужны 99% объектов ??? Какой в этом смысл ?

 
Georgiy Merts:

Зачем классам функции обработки событий ?

Не всем классам, а избранным. Это очень удобно, например, для GUI-классов или классов ТС.

 
fxsaber:

Не всем классам, а избранным. Это очень удобно, например, для GUI-классов или классов ТС.

Ну, так для классов GUI - явно не нужны функции торговых событий. А для классов ТС - врядли нужны функции событий GUI.

Речь же о том, чтобы функция обработки событий была бы у всех объектов в программе... Ясное дело, что "умный" компилятор не будет генерировать код для тех классов, где он не будет использоваться, однако, сама идея о том, чтобы любой класс в программе имел бы функции обработки событий - на мой взгляд, неправильна.

Для НЕКОТОРЫХ же классов (те же классы GUI или ТС) - вполне разумно написать соответствующие методы обработки, и вызывать их в коде эксперта.

 
Georgiy Merts:

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

не наследуйтесь где не нужно от примера класса BASE - в чем проблема?

по сабжу, пример замечательный!

имхо, в MQL лучше написать несколько небольших классов под конкретную задачу, чем писать один суперкласс, который будет управлять "стадом неразумных мелких классов" - большая часть задач пишется для разового выполнение, без переносимости в другой проект, ну и все что пишется как универсальное решение, затем вызывает трудности при поиске потери производительности когда потребуется оптимизатор