Группа "Стол заказов MQL"

Рейтинг 2146



РЕКОМЕНДУЮ



Удаление всех противоположных отложенных ордеров

Добрый день! Андрей, подскажите пожалуйста, т.к. только начинаю разбираться, как удалить отложенные ордера только определенного типа, в советнике www.opentraders.ru/downloads/2811/. Условия: советник выставил сетку противоположных ордеров, при срабатывании одного из типов Buy\Sell, отложенные ордера противоположного типа удаляются остальные остаются.
Можно просто частью кода в сообщении, постараюсь разобраться.
Спасибо!
  • +0
  • Просмотров: 1095
  • 20 ноября 2020, 12:01
  • Batusay
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

Вступите в группу "Стол заказов MQL", чтобы следить за обновлениями
ПРИСОЕДИНИТЬСЯ К ГРУППЕ
присоединиться
  Предыдущая запись в группе
Андрей, помогите переписать этот индикатор
20 ноября 2020
20 ноября 2020

Брокер для ваших роботов, 15 лет на рынке

Комментарии (9)

+
0

//+------------------------------------------------------------------+
//| Удаление отложенных ордеров                                      |
//+------------------------------------------------------------------+
void DelOrder(int type=-1)
  {
   bool del;
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==type || type==-1)
               del=OrderDelete(OrderTicket());
           }
        }
     }
  }
avatar

  35  AM2 Сообщений: 16266 - Андрей

  • 20 ноября 2020, 17:58
+
0
Андрей, спасибо огромное!!!
Редактирован: 21 ноября 2020, 18:03
avatar

  7  Batusay Автор Сообщений: 20

  • 21 ноября 2020, 16:41
+
0
Не помогло, удаляет все отложенные ордера, как и универсальный код по удалению. Советник выставляет сетку отложенных ордеров на разной дистанции от цены как бай лимиты так и сел лимиты, вот если допустим бай сработал, необходимо чтобы он удалил только сел лимиты, а бай лимиты так и оставил.

Какое условия еще необходимо?
avatar

  7  Batusay Автор Сообщений: 20

  • 21 ноября 2020, 18:33
+
0
Посмотрите этот вариант. Условия для удаления запишите сами.

//+----------------------------------------------------------------------------+
//|                                             test_DeleteOppositeOrders.mq4  |
//|                                                                            |
//|                                                    Ким Игорь В. aka KimIV  |
//|                                                       http://www.kimiv.ru  |
//|                                                                            |
//|  16.06.2008  Скрипт для тестирования функции DeleteOppositeOrders().       |
//+----------------------------------------------------------------------------+
#property copyright "Ким Игорь В. aka KimIV"
#property link  "http://www.kimiv.ru"
#property show_confirm

//------- Глобальные переменные скрипта ---------------------------------------+
color  clDelete      = Yellow;         // Цвет значка удаление ордера
int    NumberOfTry   = 3;              // Количество торговых попыток
bool   UseSound      = True;           // Использовать звуковой сигнал
string NameFileSound = "expert.wav";   // Наименование звукового файла

//------- Подключение внешних модулей -----------------------------------------+
#include <stdlib.mqh>                  // Стандартная библиотека


void start() {
  DeleteOppositeOrders();
}

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 16.06.2008                                                     |
//|  Описание : Удаление ордеров, противоположных позиции                      |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
void DeleteOppositeOrders(string sy="", int op=-1, int mn=-1) {
  bool eb, es;

  switch (op) {
    case OP_BUY : eb=ExistPositions(sy, OP_BUY , mn); break;
    case OP_SELL: es=ExistPositions(sy, OP_SELL, mn); break;
    default:      eb=ExistPositions(sy, OP_BUY , mn);
                  es=ExistPositions(sy, OP_SELL, mn); break;
  }

  if (eb) {
    DeleteOrders(sy, OP_SELLLIMIT, mn);
    DeleteOrders(sy, OP_SELLSTOP , mn);
  }
  if (es) {
    DeleteOrders(sy, OP_BUYLIMIT, mn);
    DeleteOrders(sy, OP_BUYSTOP , mn);
  }
}

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 28.11.2006                                                     |
//|  Описание : Удаление ордеров                                               |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любой ордер)                    |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
void DeleteOrders(string sy="", int op=-1, int mn=-1) {
  bool fd;
  int  err, i, it, k=OrdersTotal(), ot;

  if (sy=="0") sy=Symbol();
  for (i=k-1; i>=0; i--) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      ot=OrderType();
      if (ot>1 && ot<6) {
        if ((OrderSymbol()==sy || sy=="") && (op<0 || ot==op)) {
          if (mn<0 || OrderMagicNumber()==mn) {
            for (it=1; it<=NumberOfTry; it++) {
              if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) break;
              while (!IsTradeAllowed()) Sleep(5000);
              fd=OrderDelete(OrderTicket(), clDelete);
              if (fd) {
                if (UseSound) PlaySound(NameFileSound); break;
              } else {
                err=GetLastError();
                Print("Error(",err,") delete order ",GetNameOP(ot),": ",ErrorDescription(err),", try ",it);
                Sleep(1000*5);
              }
            }
          }
        }
      }
    }
  }
}

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 06.03.2008                                                     |
//|  Описание : Возвращает флаг существования позиций                          |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//|    ot - время открытия             ( 0   - любое время открытия)           |
//+----------------------------------------------------------------------------+
bool ExistPositions(string sy="", int op=-1, int mn=-1, datetime ot=0) {
  int i, k=OrdersTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (ot<=OrderOpenTime()) return(True);
            }
          }
        }
      }
    }
  }
  return(False);
}

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.09.2005                                                     |
//|  Описание : Возвращает наименование торговой операции                      |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    op - идентификатор торговой операции                                    |
//+----------------------------------------------------------------------------+
string GetNameOP(int op) {
  switch (op) {
    case OP_BUY      : return("Buy");
    case OP_SELL     : return("Sell");
    case OP_BUYLIMIT : return("BuyLimit");
    case OP_SELLLIMIT: return("SellLimit");
    case OP_BUYSTOP  : return("BuyStop");
    case OP_SELLSTOP : return("SellStop");
    default          : return("Unknown Operation");
  }
}
//+----------------------------------------------------------------------------+

avatar

  16  ssg Сообщений: 817

  • 21 ноября 2020, 19:06
+
0
Посмотрите этот вариант. Условия для удаления запишите сами.


Спасибо посмотрю!!!
avatar

  7  Batusay Автор Сообщений: 20

  • 21 ноября 2020, 19:39
+
0
Посмотрите этот вариант. Условия для удаления запишите сами.


Спасибо посмотрю!!!

Громоздко конечно, но все получилось спасибо огромное!!!
avatar

  7  Batusay Автор Сообщений: 20

  • 21 ноября 2020, 19:57
+
0
Не помогло, удаляет все отложенные ордера, как и универсальный код по удалению.


написал пример. все работает:




//+------------------------------------------------------------------+
//|                                                     Grider22.mq4 |
//|                                              Copyright 2020, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, AM2"
#property link      "http://www.forexsystems.biz"
#property version   "1.00"
#property strict

//--- Inputs
extern double  Lots        = 0.1;      // объем первого ордера
extern int     StopLoss    = 0;        // стоплосс
extern int     TakeProfit  = 100;      // тейкпрофит
extern int     Step        = 100;      // шаг ордеров
extern int     Count       = 5;        // количество ордеров
extern int     Slip        = 3;        // проскальзывание
extern int     Magic       = 123;      // магик
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutOrder(int type,double price)
  {
   int r=0;
   color clr=Green;
   double sl=0,tp=0;

   if(type==1 || type==3 || type==5)
     {
      clr=Red;
      if(StopLoss>0)
         sl=NormalizeDouble(price+StopLoss*_Point,_Digits);
      if(TakeProfit>0)
         tp=NormalizeDouble(price-TakeProfit*_Point,_Digits);
     }

   if(type==0 || type==2 || type==4)
     {
      clr=Blue;
      if(StopLoss>0)
         sl=NormalizeDouble(price-StopLoss*_Point,_Digits);
      if(TakeProfit>0)
         tp=NormalizeDouble(price+TakeProfit*_Point,_Digits);
     }

   r=OrderSend(NULL,type,Lots,NormalizeDouble(price,_Digits),Slip,sl,tp,"",Magic,0,clr);
  }
//+------------------------------------------------------------------+
//| Подсчет ордеров по типу                                          |
//+------------------------------------------------------------------+
int CountOrders(int type=-1)
  {
   int count=0;
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==type)
               count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//| Удаление отложенных ордеров                                      |
//+------------------------------------------------------------------+
void DelOrder(int type=-1)
  {
   bool del;
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==type || type==-1)
               del=OrderDelete(OrderTicket());
           }
        }
     }
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   double ma=iMA(NULL,0,20,0,0,0,1);

   if(Close[1]>ma && CountOrders(4)<1)
     {
      for(int i=1; i<=Count; i++)
         PutOrder(4,Bid+Step*_Point*i);
      DelOrder(5);
     }
   if(Close[1]<ma && CountOrders(5)<1)
     {
      for(int i=1; i<=Count; i++)
         PutOrder(5,Bid-Step*_Point*i);
      DelOrder(4);
     }
  }
//+------------------------------------------------------------------+

avatar

  35  AM2 Сообщений: 16266 - Андрей

  • 21 ноября 2020, 22:22
+
0
У Вас ситуация чуть другая, нет в моменте отложенных ордеров и на Селл и на Бай. Спасибо, это тоже замечательный пример использования кода, очень пригодиться в дальнейшем.
avatar

  7  Batusay Автор Сообщений: 20

  • 22 ноября 2020, 04:58
+
0
У Вас ситуация чуть другая, нет в моменте отложенных ордеров и на Селл и на Бай.


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

  35  AM2 Сообщений: 16266 - Андрей

  • 22 ноября 2020, 09:46

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