Господа посмотрите в чем ошибка? (вопрос программерам)

 

if (OrdersTotal()==2)
  {
  int m_1=1;
  int m_2=2;
   
  OrderSelect(m_1,SELECT_BY_POS);
  int info_6=OrderType();
  if(info_6==OP_BUY || info_6==OP_SELL)
  {
  bool info_7=OrderSelect(m_2,SELECT_BY_POS);
  OrderDelete(OrderTicket());
  }
   
  OrderSelect(m_2,SELECT_BY_POS);
  int info_8=OrderType();
  if(info_8==OP_BUY || info_7==OP_SELL)
  {
  bool info_9=OrderSelect(m_1,SELECT_BY_POS);
  OrderDelete(OrderTicket());
  }
  return(0); 
  }


 Эта часть советника должна закрывать один из отложенных ордеров при срабатывании другого. Но он закрывает второй из выставленных отложенных ордеров сразу после установки.

в чем проблемма-не могу понять?

Заранее всем респект! 

 
if(info_8==OP_BUY || info_7==OP_SELL)
 

Бред, все не так...

Ну что б работало попробуйте просто:

int m_1=0;
int m_2=1;

Еще неплохо проверять результат OrderSelect

 
mamma >>:
if(info_8==OP_BUY || info_7==OP_SELL)

Это я заметил-исправил(не помогло)

 
info_7 относится к удаленному ордеру и если это был OP_SELL, то info_7==OP_SEL будет неверно возвращать true
 
поменяйте индекс как подсказал Figar0
 
Figar0 >>:

Бред, все не так...

Ну что б работало попробуйте просто:

int m_1=0;
int m_2=1;

Еще неплохо проводить результат OrderSelect

Да понимаю что все не так! На большее пока ума не хватает)))))))))))

А так работает! (не могли бы обьяснить почему м_1=0) ведь нет ордера с порядковым номером "0"  или я ошибаюсь?

А OrderSelect  я проведу и OrderDelete тоже, просто с этим не мог разобраться!

И все же можете обьяснить?

Спасибо Figar0!! 

 
mozg писал(а) >>

А так работает! (не могли бы обьяснить почему м_1=0) ведь нет ордера с порядковым номером "0" или я ошибаюсь?

А OrderSelect я проведу и OrderDelete тоже, просто с этим не мог разобраться!

И все же можете обьяснить?

1)Именно с "0" индекса и начинается нумерация ордеров.

2)Не провести, а проверить результат операции, я сначала немного очепятался:)

3)В таких простых программах гораздо удобне работать с ордерами в цикле их полного перебора, чем пытаться подсунуть номер ордера... Что проще сделать две функции, первая перебирает все ордера советника, и возвращает "true" если находит рыночный ордер (Бай или селл), вторая в случае возврата первой "true", снова перебирает все ордера и удаляет отложки. Так сможете избежать лишних ошибок, и гораздо удобнее обрабатывать нештатные ситуации.

 
mozg писал(а) >>

Да понимаю что все не так! На большее пока ума не хватает)))))))))))

А так работает! (не могли бы обьяснить почему м_1=0) ведь нет ордера с порядковым номером "0" или я ошибаюсь?

А OrderSelect я проведу и OrderDelete тоже, просто с этим не мог разобраться!

И все же можете обьяснить?

Спасибо Figar0!!

нумерация списковая с нуля

 
Всем огромное спасибо! Вот ведь как трудно самому изучать програмирование. Эх....был бы учитель!)))))
 

if(OrderSelect(0,SELECT_BY_POS) && OrderType()<2) {if(OrderSelect(1,SELECT_BY_POS)) OrderDelete(OrderTicket());}
if(OrderSelect(1,SELECT_BY_POS) && OrderType()<2) {if(OrderSelect(0,SELECT_BY_POS)) OrderDelete(OrderTicket());}


Figar0 >>:

3)В таких простых программах гораздо удобне работать с ордерами в цикле их полного перебора, чем пытаться подсунуть номер ордера... Что проще сделать две функции, первая перебирает все ордера советника, и возвращает "true" если находит рыночный ордер (Бай или селл), вторая в случае возврата первой "true", снова перебирает все ордера и удаляет отложки. Так сможете избежать лишних ошибок, и гораздо удобнее обрабатывать нештатные ситуации.


Figar0, предполагаю, что у автора изначально всего два отложенника поэтому, думаю, можно и не в цикле?

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