Помогите разобраться с OrderCloseTime

 
NOrd - переменная, содержащая номер открытого ордера

OrderSelect(NOrd,SELECT_BY_TICKET);
orderclose=OrderCloseTime();
Print("Время закрытия ордера "+DoubleToStr(NOrd,0)+" по символу "+Symbol()+" = "+TimeToStr(orderclose,TIME_DATE));
Print("Время закрытия ордера "+DoubleToStr(NOrd,0)+" по символу "+Symbol()+" = "+DoubleToStr(orderclose,4));
if(orderclose != 0) //если ордер закрыт
//если номер ордера есть, а самого ордера нет
//это значит, что произошёл либо StopLoss либо TakeProfit либо ордер был закрыт вручную
{
Print("Ордер " + DoubleToStr(NOrd,0)+" по символу "+Symbol()+" найден не был");
NOrd=0;
}

так вот IF срабатывает ВСЕГДА. Что я делаю не так?
 
Наличие ордера проверяется при его выборе в OrderSelect(NOrd,SELECT_BY_TICKET), а не при проверке параметров выбранного ордера.

Должно быть так:

if(OrderSelect(NOrd,SELECT_BY_TICKET)==true) 
  {
   //--- ордер существует и он теперь выбран, можно дальше идти
   ...
  }



Всегда и в любом случае проверяйте результат операции OrderSelect.

 
Наличие ордера проверяется при его выборе в OrderSelect(NOrd,SELECT_BY_TICKET), а не при проверке параметров выбранного ордера.

Всегда и в любом случае проверяйте результат операции OrderSelect.


но ведь OrderSelect даст положительный результат ВО ВСЯКОМ случае - И когда ордер активен И когда он закрыт
 
но ведь OrderSelect даст положительный результат ВО ВСЯКОМ случае - И когда ордер активен И когда он закрыт

не факт. Вы можете ошибиться с номером тикета
 
но ведь OrderSelect даст положительный результат ВО ВСЯКОМ случае - И когда ордер активен И когда он закрыт

не факт. Вы можете ошибиться с номером тикета


факт!... в том-то и дело!
с номером ошибки ЗДЕСЬ быть не может, потому что я получаю его из OrderSend
а дальше мне нужно периодически проверять его состояние
и OrderClose почему-то ВСЕГДА получается БОЛЬШЕ НУЛЯ
 
я бы не спорил с разработчиками =))) а OrderSend может и -1 вернуть ;)
во-вторых, если выбирать ордер из MODE_TRADES (по умолчанию), то время закрытия всегда будет 0, потому что MODE_TRADES - это открытые позиции и отложенные ордера (ещё не сработали)
в-третьих, if(orderclose != 0) я бы заменил на if(orderclose > 0) - так логичнее, что ли =) Если он меньше нуля - значит ошибка ;)

и в-последних, пока писАл, посмотрел хэлп по OrderCloseTime(), и угадай, что я там увидел =)))
 if(OrderSelect(10,SELECT_BY_POS,MODE_HISTORY)==true)
    {
     datetime ctm=OrderCloseTime();
     if(datetime>0)
       Print("close time for the order 10 ", ctm);
    }
 
я бы не спорил с разработчиками =))) а OrderSend может и -1 вернуть ;)
во-вторых, если выбирать ордер из MODE_TRADES (по умолчанию), то время закрытия всегда будет 0, потому что MODE_TRADES - это открытые позиции и отложенные ордера (ещё не сработали)
в-третьих, if(orderclose != 0) я бы заменил на if(orderclose > 0) - так логичнее, что ли =) Если он меньше нуля - значит ошибка ;)

и в-последних, пока писАл, посмотрел хэлп по OrderCloseTime(), и угадай, что я там увидел =)))
 if(OrderSelect(10,SELECT_BY_POS,MODE_HISTORY)==true)
    {
     datetime ctm=OrderCloseTime();
     if(datetime>0)
       Print("close time for the order 10 ", ctm);
    }



1. if(orderclose > 0) так я тоже пробовал, но он ВСЕГДА больше 0.
2. HELP я тоже смотрел,но так, как ТАМ НЕ ПОЛУЧАЕТСЯ. Мне нужно ПРОВЕРИТЬ ОРДЕР ПО ТИКЕТУ и ОПРЕДЕЛИТЬ ЕГО СОСТОЯНИЕ
 
Мне нужно ПРОВЕРИТЬ ОРДЕР ПО ТИКЕТУ и ОПРЕДЕЛИТЬ ЕГО СОСТОЯНИЕ

Если OrderSelect(10,SELECT_BY_POS,MODE_HISTORY)==true, значит ордер закрыт или отменён.
Тоже самое, только наоборот:
Если OrderSelect(10,SELECT_BY_POS,MODE_TRADES)==true, значит ордер ещё не сработал (отложенный) или позиция открыта.
Не вижу сложностей ))
 
Мне нужно ПРОВЕРИТЬ ОРДЕР ПО ТИКЕТУ и ОПРЕДЕЛИТЬ ЕГО СОСТОЯНИЕ

Если OrderSelect(10,SELECT_BY_POS,MODE_HISTORY)==true, значит ордер закрыт или отменён.
Тоже самое, только наоборот:
Если OrderSelect(10,SELECT_BY_POS,MODE_TRADES)==true, значит ордер ещё не сработал (отложенный) или позиция открыта.
Не вижу сложностей ))


мне нужно OrderSelect(NOrd,SELECT_BY_TICKET) где NOrd - номер тикета из OrderSend
и надо узнать его состояние

то, что в HELP, позволяет узнать только НАЛИЧИЕ ордера, но он также покажет наличие, если ордер ЗАКРЫТ по какой-то причине

иными словами надо гарантированно узнать ЗАКРЫТ ордер ИЛИ НЕ ЗАКРЫТ
 
Сорри, у меня - описка =)
OrderSelect(NOrd,SELECT_BY_TICKET,MODE_HISTORY)==true


это значит, что ордер с тикетом NOrd закрыт.


OrderSelect(NOrd,SELECT_BY_TICKET,MODE_TRADES)==true


значит, что ордер с тикетом NOrd НЕ закрыт.


как объяснить по-другому - не знаю =)))

 
Сорри, у меня - описка =)
OrderSelect(NOrd,SELECT_BY_TICKET,MODE_HISTORY)==true


это значит, что ордер с тикетом NOrd закрыт.


OrderSelect(NOrd,SELECT_BY_TICKET,MODE_TRADES)==true


значит, что ордер с тикетом NOrd НЕ закрыт.


как объяснить по-другому - не знаю =)))



цитирую HELP (это к тому что SELECT_BY_TICKET здесь не прокатит)
pool - Дополнительный индекс объеденения (pool) ордера. Используется, когда выборан параметр - SELECT_BY_POS.Mожет быть одним из следующих величин:
MODE_TRADES (по умолчанию)- ордер выбирается среди открытых и отложенных ордеров,
MODE_HISTORY - ордер выбирается среди закрытых и удаленных ордеров.
Причина обращения: