Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Прими участие в партнерской программе MQL5 Cloud Network и заработай!
Vladimir Pastushak
58772
Vladimir Pastushak 2012.12.26 11:40 

Вот код 

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 при неудачном завершении функции.

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

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

Владимир Тезис
4269
Владимир Тезис 2012.12.26 11:53  
При выборе по тикету третий параметр функции OrderSelect() не имеет значения и его можно опустить.
Константин
66
Константин 2012.12.26 11:54  

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

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

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

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

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

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

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

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

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

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

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

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

Владимир Тезис
4269
Владимир Тезис 2012.12.26 12:10  
Вы видать не поняли. Если на вход функции OrderSelect() подавать тикет, то глубоко пофигу рыночный это ордер, или он уже в истории - если ордер с таким тикетм существует, то он будет выбран. Именно поэтому третий параметр при подаче тикета можно опустить.
Константин
66
Константин 2012.12.26 12:14  
Вы выбираете ордер по тикету, третий параметр в данном случае игнорируется (выбор ведется и с истории и с рынка если выбор по тикету). Не знаю что там было у Вас раньше, но по документации работает верно и возвращает true так как ордер выбран. Если есть желание узнать закрыт ли ордер проверяйте время закрытия ордера.
Vladimir Pastushak
58772
Vladimir Pastushak 2012.12.26 12:15  
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

Константин
66
Константин 2012.12.26 12:18  

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

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);
  }
Vladimir Pastushak
58772
Vladimir Pastushak 2012.12.26 12:33  
dualbit:

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

 


Ну да ..  Спасибо что постучали в голову ! ))))  я понял .....  Странно только то что раньше все работало по методу как я писал выше .....   Мож теперь поправили все ......
PapaYozh
3768
PapaYozh 2012.12.26 12:33  
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.

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

/
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий