удаление и закрытие ордеров

 
как программно удалить одну отложку при рыночном открытии другой?
 
Что вы понимаете под "рыночном открытии другой" отложки?
 
Bicus:
Что вы понимаете под "рыночном открытии другой" отложки?


советник выставляет две лимитные отложки.

по стратегии, при открытии по рынку любой из них - вторая должна удалиться 

 
ashpi:
как программно удалить одну отложку при рыночном открытии другой?

В Вашем случае, если ордеров всего два, лучше всего запомнить в переменных их тикеты, а дальше цитирую из документации:

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

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


 
ashpi:


советник выставляет две лимитные отложки.

по стратегии, при открытии по рынку любой из них - вторая должна удалиться 

Какие сложности?

Если у вас в наличии 2 ордера с типом отличным от OP_BUY и OP_SELL - ничего не делаем.

Если есть один OP_BUY или OP_SELL - удалить все отличные от OP_BUY и OP_SELL .

 
Bicus:

Какие сложности?

Если у вас в наличии 2 ордера с типом отличным от OP_BUY и OP_SELL - ничего не делаем.

Если есть один OP_BUY или OP_SELL - удалить все отличные от OP_BUY и OP_SELL .


спасибо, но мне непонятно... можно поподробнее, в виде кода?

спасибо. 

 
ashpi:


спасибо, но мне непонятно... можно поподробнее, в виде кода?

спасибо. 

 код эксперта закрывающий все отложенные ордера по одному инструменту с учетом магического номера 

 .

Файлы:
x.mq4  11 kb
 
Boeing747:

 код эксперта закрывающий все отложенные ордера по одному инструменту с учетом магического номера 

 .

еще вариант x2 . думаю он лучше
Файлы:
x2.mq4  11 kb
 
//  Зто для бай стоп меняешь название ордера какой нужен или размножаешь если для разных
//  позиций 
//  Конечно громоздко и много циклов, когда разберешься что как посокращаешь 
//  Главное логику понять 
//  Фигурные скобки проверь не подсчитывал
//------------------аааааааааааааааааа
     OpOrBUYSTOP=0;      //   считаем количество ордеров 
   for(i=0;i<OrdersTotal();i++){OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
      if (OrderType()== OP_BUYSTOP){OpOrBUYSTOP++;}}//если с магиком то так   (OrderType()== OP_BUYSTOP && OrderMagicNumber()== MAGIC )
//------------------аааааааааааааааааа
if (OpOrBUYSTOP >= 2) // предохранитель чтоб не закрывался когда один орд.
if (OpOrBUYSTOP < 2 ) // если ордеров меньше чем 2
 {
 {
      for (i=OrdersTotal();i>=1;i--){OrderSelect (i-1,SELECT_BY_POS,MODE_TRADES);{
      if  (OrderType()== OP_BUYSTOP){OrderDelete(OrderTicket());}}             //если с магиком то так   (OrderType()== OP_BUYSTOP && OrderMagicNumber()== MAGIC )
                   
 }  // предохрани.......
 }  // если ордер ...... 


//  это  был код когда пропал один из ордеров можно так же посчитать открытые ордера типа 
//  OP_BUY и если их стало 1 то действуем так
//  
//
//
     OpOrBUY=0;      //   считаем количество ордеров 
   for(i=0;i<OrdersTotal();i++){OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
      if (OrderType()== OP_BUY){OpOrBUY++;}//если с магиком то так   (OrderType()== OP_BUYSTOP && OrderMagicNumber()== MAGIC )


if (OpOrBUY == 1 ) // 
{
      for (i=OrdersTotal();i>=1;i--){OrderSelect (i-1,SELECT_BY_POS,MODE_TRADES);{
      if  (OrderType()== OP_BUYSTOP)//если с магиком то так   (OrderType()== OP_BUYSTOP && OrderMagicNumber()== MAGIC )
 if  ( здесь еще добавляешь какой ордер искать выше, ниже цены по подобию магика и т.п )
      {OrderDelete(OrderTicket());             


========================================================
   сам не программист  специалистов прошу не ругаться
=======================================================
     Александр.

 
ashpi:
как программно удалить одну отложку при рыночном открытии другой?

Легко... Используйте мою функцию DeleteOppositeOrders().
 
KimIV :

Легко... Используйте мою функцию DeleteOppositeOrders().


спасибо, но...

не получается разобраться... вижу, что все в паре простых строк, но не могу понять... сокращения менять можно? внешние библиотеки...