БАГ после обновления !!!

 

Вот код 

int ticket;
int flag=0;
int start()
  {
  if (flag==0)//если ноль то открыть ордер
  {
   ticket=OrderSend(Symbol(),OP_BUY,1,Ask,3,0,0,"My order #",16384,0,Green);
   if (ticket>0){flag=1;}// если тикет больше ноля изменим флаг
  }
  if (flag==1)//если флаг равен одному тоесть ордер открыт
  {
  if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)==true) //найдем ордер и если он есть
  {
  Comment("Наш ордер в рынке"); // напишем об этом
  }
  else
  {
  Comment("Нет ордера"); // если нет напишем об этом
  }
  }
   return(0);
  }

 Он открывает ордер , запоминает тикет , и потом по результату еть тикет или нет пишет нам комментарий ...

Баг в том что  OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)  находит ордер который закрыт руками и все равно  пишет что ордер есть !!!!

согласно документации

bool OrderSelect( int index, int select, int pool=MODE_TRADES)

Функция выбирает ордер для дальнейшей работы с ним. Возвращает TRUE при успешном завершении функции. Возвращает FALSE при неудачном завершении функции.

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

А мож я что то не так понимаю ???????? 

 
При выборе по тикету третий параметр функции OrderSelect() не имеет значения и его можно опустить.
 

Прочитайте внимательно док. по OrderSelect

bool OrderSelect( int index, int select, int pool=MODE_TRADES)

Параметр pool игнорируется, если ордер выбирается по номеру тикета. Номер тикета является уникальным идентификатором ордера. Чтобы определить, из какого списка выбран ордер, необходимо проанализировать его время закрытия. Если время закрытия ордера равно 0, то ордер является открытым или отложенным и взят из списка открытых позиций терминала. Отличить открытую позицию от отложенного ордера можно по типу ордера. Если время закрытия ордера не равно 0, то ордер является закрытым или удаленным отложенным и был выбран из истории терминала. Отличить закрытый ордер от удаленного отложенного также можно по типу ордера
 
dualbit:

Прочитайте внимательно док. по OrderSelect

bool OrderSelect( int index, int select, int pool=MODE_TRADES)

Параметр pool игнорируется, если ордер выбирается по номеру тикета. Номер тикета является уникальным идентификатором ордера. Чтобы определить, из какого списка выбран ордер, необходимо проанализировать его время закрытия. Если время закрытия ордера равно 0, то ордер является открытым или отложенным и взят из списка открытых позиций терминала. Отличить открытую позицию от отложенного ордера можно по типу ордера. Если время закрытия ордера не равно 0, то ордер является закрытым или удаленным отложенным и был выбран из истории терминала. Отличить закрытый ордер от удаленного отложенного также можно по типу ордера

Я уже прочитал .... Вопрос не в этом что вы пишите ....

ордер открылся > запомнили тикет ордера>ордер закрыли руками>но ордер селект пишет что ордер еще есть а по документации ордер селект в случае неудачи должно вернуть фальсе 

а функция постоянно возвращает труе .... Что не есть правильно так как ордер уже закрыт .......    При этом мы явно указываем MODE_TRADES что ордер ищем который в рынке ..... а не в истории....

Я почему "затрубил"  так как советники которые были написаны до обновления работали адекватно ....  Есть ордер работаем дальше если ордера нет делаем другое ....

сейчас функция постоянно пишет что ордер есть ...... 

даже если мы убираем MODE_TRADES всеравно ничего не меняется ... Пишет ордер есть ..... 

 
Вы видать не поняли. Если на вход функции OrderSelect() подавать тикет, то глубоко пофигу рыночный это ордер, или он уже в истории - если ордер с таким тикетм существует, то он будет выбран. Именно поэтому третий параметр при подаче тикета можно опустить.
 
Вы выбираете ордер по тикету, третий параметр в данном случае игнорируется (выбор ведется и с истории и с рынка если выбор по тикету). Не знаю что там было у Вас раньше, но по документации работает верно и возвращает true так как ордер выбран. Если есть желание узнать закрыт ли ордер проверяйте время закрытия ордера.
 
drknn:
Вы видать не поняли. Если на вход функции OrderSelect() подавать тикет, то глубоко пофигу рыночный это ордер, или он уже в истории - если ордер с таким тикетм существует, то он будет выбран. Именно поэтому третий параметр при подаче тикета можно опустить.

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

если нам нужен ордер из истории то мы явно выбираем  MODE_HISTORY ели текущий то SELECT_BY_TICKET при SELECT_BY_TICKET третий параметр можно опустить если SELECT_BY_POS  то тоже треттиий параметр можно опустить но если мы ищем по истории то третий параметр обязателен MODE_HISTORY

 

Попробуйте так

int ticket;
int flag=0;
int start()
  {
  if (flag==0)//если ноль то открыть ордер
  {
   ticket=OrderSend(Symbol(),OP_BUY,1,Ask,3,0,0,"My order #",16384,0,Green);
   if (ticket>0){flag=1;}// если тикет больше ноля изменим флаг
  }
  if (flag==1)//если флаг равен одному тоесть ордер открыт
  {
  if(OrderSelect(ticket,SELECT_BY_TICKET) && OrderCloseTime()==0) //найдем ордер и если он есть
  {
  Comment("Наш ордер в рынке"); // напишем об этом
  }
  else
  {
  Comment("Нет ордера"); // если нет напишем об этом
  }
  }
   return(0);
  }
 
dualbit:

Попробуйте так

 


Ну да ..  Спасибо что постучали в голову ! ))))  я понял .....  Странно только то что раньше все работало по методу как я писал выше .....   Мож теперь поправили все ......
 
VOLDEMAR:

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

если нам нужен ордер из истории то мы явно выбираем  MODE_HISTORY ели текущий то SELECT_BY_TICKET при SELECT_BY_TICKET третий параметр можно опустить если SELECT_BY_POS  то тоже треттиий параметр можно опустить но если мы ищем по истории то третий параметр обязателен MODE_HISTORY

Еще раз прочитайте:

Параметр pool  игнорируется, если ордер выбирается по номеру тикета 

ИГНОРИРУЕТСЯ параметр pool, если у вас используется  SELECT_BY_TICKET.

И так было всегда. 

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