Не видит историю ордеров при выборке функцией

 

Коллеги, просьба подсказать где косяк.

Здесь есть функция нахождения последнего ордера: https://www.mql5.com/ru/forum/131859/page4#434227

Взял ее за основу. И пытаюсь узнать последний ордер является прибыльным или нет. Для этого пишу такой код:


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

Функция вызывается перед открытием каждого ордера.

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

Тут видно, что Ордер №3 убыточный, но при этом перед открытием ордера №4 информации об этом ордере не было. Более того, видно в коде что первый Print вообще без условный - т.е должны быть выведены все ордера на покупку. Но их почему то нет.

Где косяк?

Только "Полезные функции от KimIV".
Только "Полезные функции от KimIV".
  • 2011.02.18
  • www.mql5.com
Все функции взяты из этой ветки - http://forum.mql4...
 

continue

break

Первое на что упал взгляд.

 
Konstantin Nikitin:

continue

break

Первое на что упал взгляд.

Спасибо, но я так понимаю согласно хелпу что orderselect false вернет если выборка закончилась? Или там еще какие то подводные камни?
 
SergeyN:

Коллеги, просьба подсказать где косяк.

  1. Цикл по рабочим ордерам, а выбираются ордера из истории. Нужно тогда и цикл сделать по ордерам истории, т. е. OrderSelectHistory(), а не OrdersTotal().
  2. Не инициализирована переменная при объявлении. В некоторых случаях maxTime изначально может быть не равен нулю.
  3. При неудаче выбора ордера вовсе не обязательно прерывать цикл. Можно попробовать выполнить следующую итерацию, заменив break на continue.

 
Ihor Herasko:

  1. Цикл по рабочим ордерам, а выбираются ордера из истории. Нужно тогда и цикл сделать по ордерам истории, т. е. OrderSelectHistory(), а не OrdersTotal().
  2. Не инициализирована переменная при объявлении. В некоторых случаях maxTime изначально может быть не равен нулю.
  3. При неудаче выбора ордера вовсе не обязательно прерывать цикл. Можно попробовать выполнить следующую итерацию, заменив break на continue.


Игорь, огромное спасибо. Действительно проблема была в том, что я неправильно определял количество через OrdersTotal().