Вопросы по ООП в MQL5 - страница 42

 
Igor Makanu:

...

 вызовы все в privat методах, но есть ли "джедайский прием ?" чтобы уйти в тексте исходника от CheckPointer(m_order)==POINTER_INVALID  

...

Тут скорее дело не в приеме, алгоритм должен быть таким, что бы эта часть кода не выполнялась, если ордера нет.

А может быть так и задумано. Но вряд ли, если указатель есть, это не означает, что есть ордер, поэтому надо проверять существование ордера.

 
Igor Makanu:

и если мне не изменяет память, то в начале года можно было распринтовать  NULL в лог и получить там 0 , сейчас ошибку выдает

Изменяет

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

Ошибки, баги, вопросы

Kirill Belousov, 2017.12.14 21:34

Print(NULL); // 'NULL' - expression of 'void' type is illegal
Alert(NULL); // 'NULL' - expression of 'void' type is illegal

пора на пенсию

 
A100:

Изменяет

да действительно, но вспомнил как в МТ4 делал раньше, вот так распринтовывал указатели:

class A {};

A *a;
void OnStart()
{  Print("1 : ",a);
   a= new A;
   Print("2 : ",a);
   a = NULL;
   Print("3 : ",a);

delete a;
}

2019.09.17 07:52:40.855 tst (EURUSD,H1) 1 : 0

2019.09.17 07:52:40.856 tst (EURUSD,H1) 2 : 1048576

2019.09.17 07:52:40.856 tst (EURUSD,H1) 3 : 0

2019.09.17 07:52:40.856 tst (EURUSD,H1) 1 undeleted objects left

2019.09.17 07:52:40.856 tst (EURUSD,H1) 1 object of type A left

2019.09.17 07:52:40.856 tst (EURUSD,H1) 24 bytes of leaked memory

Dmitry Fedoseev:

Тут скорее дело не в приеме, алгоритм должен быть таким, что бы эта часть кода не выполнялась, если ордера нет.

А может быть так и задумано. Но вряд ли, если указатель есть, это не означает, что есть ордер, поэтому надо проверять существование ордера.

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

а если ордер был закрыт, то он все равно как бы есть для стратегии - стратегии интересен в конечном итоге профит ордера (текущий или уже закрытого - не важно!), ну и само состояние ордера (еще не выставлен, работает и уже закрыт)


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

 
Igor Makanu:

хотел написать как было раньше у меня вместо 

 было так:

но вспомнил как проверить макроподстановки в MQL

2019.09.16 22:57:42.837 tst (EURUSD,H1) a = 1

2019.09.16 22:57:42.837 tst (EURUSD,H1) POINTER_INVALID = 0

2019.09.16 22:57:42.837 tst (EURUSD,H1) NULL = 0


и если мне не изменяет память, то в начале года можно было распринтовать  NULL в лог и получить там 0 , сейчас ошибку выдает

т.е. поведение NULL  как бы не должно измениться в дальнейшем, но что там подставляется вместо NULL  не понятно, наверное если эту ситуацию сейчас проверил, то как написал  if( CheckPointer(m_order)==POINTER_INVALID ) то это так сказать правильной код )))

Смело применяйте. С уверенностью в 98% NULL в исходном коде является чем-то типа #define NULL nullptr
 
Vladimir Simakov:

Ну и вот это, для сахара:

Первый же простейший тест показывает

void OnStart()
{
    A * const a = new A;
    DELETE(a); //Error: 'a' - constant cannot be modified
}

, что это не сахар, а другая... более жидкая субстанция

 
A100:

Первый же простейший тест показывает

, что это не сахар, а другая... более жидкая субстанция

Потому что здесь вам не там)) NULL тут ни туда и ни сюда. Надо пользоваться функцией CheckPointer(). Самостоятельно обнулять указатель не нужно, он после delete сам становится POINTER_INVALID. 

 
Dmitry Fedoseev:

Потому что здесь вам не там)) NULL тут ни туда и ни сюда. Надо пользоваться функцией CheckPointer(). Самостоятельно обнулять указатель не нужно, он после delete сам становится POINTER_INVALID. 

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

с MQL вообще всегда жестко, новый билд, новые неприятности, начинаешь выяснять, ну как бы не по классике использовал, вот держите и распишитесь )))

 
A100:

Первый же простейший тест показывает

, что это не сахар, а другая... более жидкая субстанция

Мил человек. А где статистика Ваших работ на фрилансе, продукты в маркете, публикации, касающиеся программирования? Или Вы пытаетесь кому-то глаза открыть на тему константных указателей,или блеснуть так сказать знаниями на тему типов субстанций..? В будущем просьба контекст примеров учитывать, а не пытаться ошибку компилятора воспроизвести.
 
Vladimir Simakov:
Мил человек. А где статистика Ваших работ на фрилансе, продукты в маркете, публикации, касающиеся программирования? Или Вы пытаетесь кому-то глаза открыть на тему константных указателей,или блеснуть так сказать знаниями на тему типов субстанций..? В будущем просьба контекст примеров учитывать, а не пытаться ошибку компилятора воспроизвести.

У меня простой контекст: Если код (в данном случае макрос) написан с ошибкой, то считаю возможным об этом сообщить (и привести подтверждающий это пример). И в указанном контексте мне не понятно при чем здесь статистика

 
A100:

И в указанном контексте мне не понятно при чем здесь статистика

будьте проще и люди потянутся к Вам

;)

ЗЫ: в Ваших сообщениях есть рац.зерно почти всегда, но подача материала, ну как бы не совсем с благими намерениями, дело конечно Ваше, но имхо, хотите помочь - помогите, хотите по умничать, ну часто так и получается

дело конечно Ваше, но поднимать самооценку за счет интернет ресурсов - .... лень дальше мне печатать

Причина обращения: