AM2
Андрей

 
Уровень 34

  Торгую в компаниях:


Группа "Программирование на MQL"

Рейтинг 280



Работаем с группой ордеров

Для тех у кого возникают вопросы по работе с группой ордеров, я написал этот урок. Здесь мы немного затронем объектно-ориентированное программирование, а именно создание структур.

Создадим советник и массив структур, где будем хранить информацию об ордерах:


struct OrdersInfo
  {
   int               tick;                // тикет
   string            symb;                // символ
   int               cmd;                 // торговая операция
   double            oop;                 // цена открытия
   double            ocp;                 // цена закрытия
   datetime          oot;                 // время открытия
   datetime          oct;                 // время закрытия
   double            prof;                // профит
   double            lot;                 // количество лотов
   int               slip;                // проскальзывание
   double            sl;                  // stop loss
   double            tp;                  // take profit
   string            cmt;                 // комментарий
   int               mgc;                 // идентификатор
   datetime          expr;                // срок истечения ордера
  };

OrdersInfo ord[];


Изменим размерность массива и заполним данные об ордерах:


   ArrayResize(ord,OrdersTotal(),1);

   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         ord[i].tick=OrderTicket();
         ord[i].symb=OrderSymbol();
         ord[i].cmd=OrderType();
         ord[i].oop=OrderOpenPrice();
         ord[i].ocp=OrderClosePrice();
         ord[i].oot=OrderOpenTime();
         ord[i].oct=OrderCloseTime();
         ord[i].prof=OrderProfit();
         ord[i].lot=OrderLots();
         ord[i].sl=OrderStopLoss();
         ord[i].tp=OrderTakeProfit();
         ord[i].cmt=OrderComment();
         ord[i].mgc=OrderMagicNumber();
         ord[i].expr=OrderExpiration();
        }
     }



И наконец пробежимся по массиву и выведем несколько параметров на экран:


   string cm="\n";

   for(int i=0;i<ArraySize(ord);i++)
     {
      cm+=((string)ord[i].tick+" "+ord[i].symb+" "+(string)ord[i].cmd+" "+(string)ord[i].prof+"\n");
     }
     
   Comment(cm);


Чтобы продемонстрировать работу советника, я открыл по одному ордеру на трех парах:



Точно таким же образом можно вывести на экран все остальные параметры ордеров.

Вот и весь код эксперта:


//+------------------------------------------------------------------+
//|                                                  SymbolsInfo.mq4 |
//|                        Copyright 2015, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
struct OrdersInfo
  {
   int               tick;                // тикет
   string            symb;                // символ
   int               cmd;                 // торговая операция
   double            oop;                 // цена открытия
   double            ocp;                 // цена закрытия
   datetime          oot;                 // время открытия
   datetime          oct;                 // время закрытия
   double            prof;                // профит
   double            lot;                 // количество лотов
   int               slip;                // проскальзывание
   double            sl;                  // stop loss
   double            tp;                  // take profit
   string            cmt;                 // комментарий
   int               mgc;                 // идентификатор
   datetime          expr;                // срок истечения ордера
  };

OrdersInfo ord[];
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   Comment("");
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   ArrayResize(ord,OrdersTotal(),1);

   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         ord[i].tick=OrderTicket();
         ord[i].symb=OrderSymbol();
         ord[i].cmd=OrderType();
         ord[i].oop=OrderOpenPrice();
         ord[i].ocp=OrderClosePrice();
         ord[i].oot=OrderOpenTime();
         ord[i].oct=OrderCloseTime();
         ord[i].prof=OrderProfit();
         ord[i].lot=OrderLots();
         ord[i].sl=OrderStopLoss();
         ord[i].tp=OrderTakeProfit();
         ord[i].cmt=OrderComment();
         ord[i].mgc=OrderMagicNumber();
         ord[i].expr=OrderExpiration();
        }
     }

   string cm="\n";

   for(int i=0;i<ArraySize(ord);i++)
     {
      cm+=((string)ord[i].tick+" "+ord[i].symb+" "+(string)ord[i].cmd+" "+(string)ord[i].prof+"\n");
     }
     
   Comment(cm);
  }
//+------------------------------------------------------------------+



Скачать советник файлом: www.opentraders.ru/downloads/1317/
  • +2
  • Просмотров: 8767
  • 15 сентября 2016, 11:24
  • AM2
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

Вступите в группу "Программирование на MQL", чтобы следить за обновлениями
ПРИСОЕДИНИТЬСЯ К ГРУППЕ
присоединиться
  Предыдущая запись в группе
Хитрый усреднитель на MQL5
Следующая запись в группе  
Поарбитражим
13 сентября 2016
17 сентября 2016

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

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

+
+2
Так… Что то интересненькое. А есть ли возможность не перебрая ордера записать в массив информацию, а сразу при открытии ордера (в советнике)? *think* 
avatar

  8  Kudryashov Сообщений: 129

  • 1 ноября 2019, 21:33
+
+2
есть :) 
avatar

  34  AM2 Автор Сообщений: 16232 - Андрей

  • 1 ноября 2019, 22:00
+
0
avatar

  24  ShamanHand Сообщений: 1092 - Наношу добро, причиняю пользу.

  • 2 ноября 2019, 13:49
+
0
Мой первый массив :D 

int tickets_orders[];
//+------------------------------------------------------------------+
void close_all_position (string symbol,
                         int magic
                        )
{
//--------------------------------------------------------------------
int p = 0;
ArrayResize(tickets_orders,OrdersTotal(),1);
//--------------------------------------------------------------------
for (int index = 0; index < OrdersTotal(); index++)
   {
   if (OrderSelect(index, SELECT_BY_POS, MODE_TRADES) == FALSE) break;
   if (OrderSymbol() == symbol)
      {
      if (OrderMagicNumber() == magic || magic == NULL)
         {
         if (OrderType() == OP_BUY || OrderType() == OP_SELL)
            {
            tickets_orders[p] = OrderTicket();
            p++;
            }
         }
      }
   }
//--------------------------------------------------------------------
string comments="\n";
comments+=((string)p+"\n");
Comment(comments);
Sleep(10000);
//--------------------------------------------------------------------
for (int index = 0;index<ArraySize(tickets_orders);index++)
   {
   if (OrderSelect(tickets_orders[index],SELECT_BY_TICKET, MODE_TRADES) == FALSE) break;
      {
      RefreshRates();
      if(!OrderClose(OrderTicket(),OrderLots(),(OrderType()==OP_BUY?Bid:Ask),9999,clrNONE)) 
      Alert("Problem with closing #",OrderTicket(),"; Error: ",GetLastError());
      }
   
   }
//--------------------------------------------------------------------


}
//+------------------------------------------------------------------+


Странно, но он вроде как работает :D 
Однако вопросЫ:
1. Нет ли в коде ошибки?*tipatogo* 
2. Если понадобиться отдельно закрывать OP_BUY или OP_SELL тогда нужен 2 мерный массиив?
Спасибо!
avatar

  8  Kudryashov Сообщений: 129

  • 17 февраля 2020, 17:24
+
0
В чем + и — использования структур?
avatar

  8  Kudryashov Сообщений: 129

  • 13 октября 2020, 14:06

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