Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 508

 
В классе у меня в качестве параметров в том числе есть всякая ерунда вроде параметров индикаторов и пр. В общем, то, что будет статично и одинаково. Зачем же мне каждый раз передавать эти значения при создании объекта?
 
STARIJ:

вот так короче?  bool barup=...    WindowRedraw();   все равно выполнится - вынес из if

можно еще короче ...  посмотрите мой файл

Спасибо. Как правильно задать интервал на котором прорисовываются уровни Фибо? Если наступило (время) 9,00 он должен нарисовать на М1 уровни с 8,00 до 8,59.
 
Juer:

Как бы постановка вопроса, вроде, понятна же. Смысл инициализировать одно и то же.

Как вы собираетесь инициализировать то, чего ещё не существует? После создания объекта он начинает существовать, и вот тогда его уже можно инициализировать.

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

Можете передавать параметры через структуру, которую заполняете нужными (постоянными для всех таких объектов) данными в OnInit() программы. Далее, в OnTick(), например, или в другом стандартном обработчике, создаёте свои объекты, но при создании пишете, например так:
CMyObject object = new CMyObject(а_здесь_структура_с_установленными_параметрами);

Либо, если у вас вообще данные объекта не меняются от программы к программе, и всегда имеют одни и те же значения, то в конструкторе явно их инициализируйте нужными параметрами посредством списка инициализации как выше сказал Игорь:

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Любые вопросы новичков по MQL4, помощь и обсуждение по алгоритмам и кодам

Ihor Herasko, 2018.03.28 17:31

Это делается в списке инициализации, который располагается в конструкторе класса:

class CCandle
{
   int      m_nA;
   double   m_fB;
   datetime m_dtC;


   void CCandle::CCandle(void);
};

CCandle::CCandle(void)
            : m_nA(0)
            , m_fB(0.0)
            , m_dtC(0)
{
}

 
Artyom Trishkin:

Как вы собираетесь инициализировать то, чего ещё не существует? После создания объекта он начинает существовать, и вот тогда его уже можно инициализировать.

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

Можете передавать параметры через структуру, которую заполняете нужными (постоянными для всех таких объектов) данными в OnInit() программы. Далее, в OnTick(), например, или в другом стандартном обработчике, создаёте свои объекты, но при создании пишете, например так:
CMyObject object = new CMyObject(а_здесь_структура_с_установленными_параметрами);

Да, понятно. Спасибо. Ну как-то просто думал есть какое-то решение, чтобы при создании объект сразу имел какие-то предустановленные параметры без необходимости их передачи в конструктор или ещё как. Через какой-то родительский класс или ещё как.

 
Juer:
В классе у меня в качестве параметров в том числе есть всякая ерунда вроде параметров индикаторов и пр. В общем, то, что будет статично и одинаково. Зачем же мне каждый раз передавать эти значения при создании объекта?

Так не передавайте. Инициализируйте в списке инициализации, как я показал. В момент создания экземпляра класса автоматически будет вызван конструктор класса, что повлечет за собой инициализацию всех членов класса, указанных в списке инициализации. Поставьте в методе CCandle функцию Print и увидите, как конструктор вызывается без всякого обращения к нему.

 
Juer:

Да, понятно. Спасибо. Ну как-то просто думал есть какое-то решение, чтобы при создании объект сразу имел какие-то предустановленные параметры без необходимости их передачи в конструктор или ещё как. Через какой-то родительский класс или ещё как.

Еще раз. Можно без передачи данных в конструктор.

 
Ihor Herasko:

Так не передавайте. Инициализируйте в списке инициализации, как я показал. В момент создания экземпляра класса автоматически будет вызван конструктор класса, что повлечет за собой инициализацию всех членов класса, указанных в списке инициализации. Поставьте в методе CCandle функцию Print и увидите, как конструктор вызывается без всякого обращения к нему.

Не понял я, какая разница, через конструктор ли их передавать или через функцию инициализации?

 
Ihor Herasko:

Так не передавайте. Инициализируйте в списке инициализации, как я показал. В момент создания экземпляра класса автоматически будет вызван конструктор класса, что повлечет за собой инициализацию всех членов класса, указанных в списке инициализации. Поставьте в методе CCandle функцию Print и увидите, как конструктор вызывается без всякого обращения к нему.

Чем они будут инициализированы? Какими значениями? Непонятно

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

 

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

 int i;
   for(i=0;i<=OrderTicket();i++)
     {
      takelimit=OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES);

      if(iBarShift(Symbol(),0,OrderOpenTime())==2)//здесь нужно что бы на 2-ом баре если есть ордер его удалить, но удаляется он только если после его установки небыло на след баре еще лимитника
        {
         deletelimit=OrderDelete(ticket);
         if(!deletelimit)
           {
            Comment(GetLastError());
           }
        }
     }
if(условие для байлимита)
{ордерсенд}
else if(условие для селлимита)
{ордерсенд}
 
Juer:

Чем они будут инициализированы? Какими значениями? Непонятно

Теми, которые запишите в списке инициализации.

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

Да вот же:

input int      i_nA     = 10;
input double   i_fB     = 20.0;
input datetime i_dtC    = D'2018.03.08 10:12:14';

class CCandle
{
   int         m_nA;
   double      m_fB;
   datetime    m_dtC;
   
public:
                     CCandle(void);
};

CCandle::CCandle(void)
         : m_nA(i_nA)
         , m_fB(i_fB)
         , m_dtC(i_dtC)
{
   Print("Создан объект со значениями: A = ", m_nA, ", B = ", m_fB, ", C = ", m_dtC);
}

int OnInit()
{
   CCandle arrclass[10];
     
   return(INIT_SUCCEEDED);
}

Если запустить, то получим:

0       22:09:36.706    Test EURUSD,M1 inputs: i_nA=10; i_fB=20.0; i_dtC=1520503934; 
0       22:09:36.995    Test EURUSD,M1: Создан объект со значениями: A = 10, B = 20.0, C = 2018.03.08 10:12:14
0       22:09:36.995    Test EURUSD,M1: Создан объект со значениями: A = 10, B = 20.0, C = 2018.03.08 10:12:14
0       22:09:36.995    Test EURUSD,M1: Создан объект со значениями: A = 10, B = 20.0, C = 2018.03.08 10:12:14
0       22:09:36.995    Test EURUSD,M1: Создан объект со значениями: A = 10, B = 20.0, C = 2018.03.08 10:12:14
0       22:09:36.995    Test EURUSD,M1: Создан объект со значениями: A = 10, B = 20.0, C = 2018.03.08 10:12:14
0       22:09:36.995    Test EURUSD,M1: Создан объект со значениями: A = 10, B = 20.0, C = 2018.03.08 10:12:14
0       22:09:36.995    Test EURUSD,M1: Создан объект со значениями: A = 10, B = 20.0, C = 2018.03.08 10:12:14
0       22:09:36.995    Test EURUSD,M1: Создан объект со значениями: A = 10, B = 20.0, C = 2018.03.08 10:12:14
0       22:09:36.995    Test EURUSD,M1: Создан объект со значениями: A = 10, B = 20.0, C = 2018.03.08 10:12:14
0       22:09:36.995    Test EURUSD,M1: Создан объект со значениями: A = 10, B = 20.0, C = 2018.03.08 10:12:14
0       22:09:36.995    Test EURUSD,M1: initialized
0       22:09:36.995    Test EURUSD,M1: uninit reason 0
0       22:09:37.062    Script Test EURUSD,M1: removed
Причина обращения: