Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Пополняй свой счет через PayPal
Alexey Shpitko
57
Alexey Shpitko 2013.07.09 08:01 
как программно удалить одну отложку при рыночном открытии другой?
Bicus
2396
Bicus 2013.07.09 08:34  
Что вы понимаете под "рыночном открытии другой" отложки?
Alexey Shpitko
57
Alexey Shpitko 2013.07.09 09:41  
Bicus:
Что вы понимаете под "рыночном открытии другой" отложки?


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

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

Mikhail Kozhemyako
1235
Mikhail Kozhemyako 2013.07.09 11:02  
ashpi:
как программно удалить одну отложку при рыночном открытии другой?

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

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

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


Bicus
2396
Bicus 2013.07.09 11:43  
ashpi:


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

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

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

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

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

Alexey Shpitko
57
Alexey Shpitko 2013.07.09 12:49  
Bicus:

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

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

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


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

спасибо. 

Boeing747
241
Boeing747 2013.07.09 17:38  
ashpi:


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

спасибо. 

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

 .

Файлы:
x.mq4 11 kb
Boeing747
241
Boeing747 2013.07.09 19:24  
Boeing747:

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

 .

еще вариант x2 . думаю он лучше
Файлы:
x2.mq4 11 kb
Александр
123
Александр 2013.07.10 09:39  
//  Зто для бай стоп меняешь название ордера какой нужен или размножаешь если для разных
//  позиций 
//  Конечно громоздко и много циклов, когда разберешься что как посокращаешь 
//  Главное логику понять 
//  Фигурные скобки проверь не подсчитывал
//------------------аааааааааааааааааа
     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());             


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

Igor Kim
2740
Igor Kim 2013.07.11 05:17  
ashpi:
как программно удалить одну отложку при рыночном открытии другой?

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

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


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

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

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