Получение информации по открытым позициям.

 

Друзья, доброго времени суток. Написал функцию для получения информации по открытым позициям. Довольно удачно получилось и удобно пользоваться, всегда можно посмотреть сколько чего открыто, профит, и т.д. По аналогии туда можно и отложенные ордера добавить. Работает в Mt4, изменить под пятёрку дело пары минут.

struct OrderData
{
   string symbol;
   long type;
   double volume;
   double price;
   double stop_loss;
   double take_profit;
   double profit;
   double swap;
   double commission;
   double close_price;
   datetime open_time;
   datetime close_time;
   datetime expiration;
   long magic;
   int ticket;
   string comment;
   
   void operator = (OrderData &or);
};
void OrderData::operator=(OrderData &or)
{
   symbol=or.symbol;
   type=or.type;
   volume=or.volume;
   price=or.price;
   stop_loss=or.stop_loss;
   take_profit=or.take_profit;
   profit=or.profit;
   swap=or.swap;
   commission=or.commission;
   close_price=or.close_price;
   open_time=or.open_time;
   close_time=or.close_time;
   expiration=or.expiration;
   magic=or.magic;
   ticket=or.ticket;
   comment=or.comment;
}
struct TradeData
{
   int      positions_buy;
   int      positions_sell;
   int      positions_total;
   double   volume_high_buy;
   double   volume_low_buy;
   double   volume_total_buy;
   double   volume_high_sell;
   double   volume_low_sell;
   double   volume_total_sell;
   double   price_high_buy;
   double   price_low_buy;
   double   price_high_sell;
   double   price_low_sell;
   double   profit_buy;
   double   profit_sell;
   double   profit_total;
   OrderData arr_buy[];
   OrderData arr_sell[];
};

TradeData trade;

//+------------------------------------------------------------------+
//| автор: Pozitif                              mail: alex-w-@bk.ru  |
//+------------------------------------------------------------------+
//| Версия: 23.02.2018                                               |
//| Описание: Заполняет структуру данными.                           |
//+------------------------------------------------------------------+
int GetTradeData(const string symbol,const long magic, TradeData &src)
{
//---
   string order_symbol;
   long order_magic,order_type;
   int err,arr_size,count=0;
   double order_volume,order_profit,order_swap,order_commission,order_price;
   OrderData order_data;
//---
   int orders_total=OrdersTotal();
   
   ArrayFree(src.arr_buy);
   ArrayFree(src.arr_sell);
   ZeroMemory(src);
   
   //--- Получаем информацию об открытых ордерах ---
   for(int i=0; i<orders_total; i++)
   {
      if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {
         err=GetLastError();
         Print("[Error(",err,")] "+__FUNCTION__+" -> OrderSelect() ",ErrorDescription(err));
         continue;
      }
      order_magic=OrderMagicNumber();
      order_type=OrderType();
      order_symbol=OrderSymbol();
      
      if(order_type!=OP_BUY && order_type!=OP_SELL)continue;
      if(magic>0 && order_magic!=magic)continue;
      if(symbol!=NULL && symbol!="" && order_symbol!=symbol)continue;
      
      order_volume=OrderLots();
      order_profit=OrderProfit();
      order_price=OrderOpenPrice();
      order_swap=OrderSwap();
      order_commission=OrderCommission();
      
      order_data.symbol=order_symbol;
      order_data.type=order_type;
      order_data.volume=order_volume;
      order_data.price=order_price;
      order_data.stop_loss=OrderStopLoss();
      order_data.take_profit=OrderTakeProfit();
      order_data.profit=order_profit;
      order_data.swap=order_swap;
      order_data.commission=order_commission;
      order_data.close_price=OrderClosePrice();
      order_data.open_time=OrderOpenTime();
      order_data.close_time=OrderCloseTime();
      order_data.expiration=OrderExpiration();
      order_data.magic=order_magic;
      order_data.ticket=OrderTicket();
      order_data.comment=OrderComment();
      
      if(order_type==OP_BUY)
      {
         arr_size=ArraySize(src.arr_buy);
         ArrayResize(src.arr_buy, arr_size+1, 20);
         
         src.arr_buy[arr_size]=order_data;
         
         src.positions_buy++;
         src.volume_total_buy+=order_volume;
         src.profit_buy+=order_profit;
         src.profit_buy+=order_swap;
         src.profit_buy+=order_commission;
         
         if(order_volume > src.volume_high_buy)src.volume_high_buy=order_volume;
         if(order_volume < src.volume_low_buy || src.volume_low_buy==0)src.volume_low_buy=order_volume;
         if(order_price > src.price_high_buy)src.price_high_buy=order_price;
         if(order_price < src.price_low_buy || src.price_low_buy==0)src.price_low_buy=order_price;
      }
      if(order_type==OP_SELL)
      {
         arr_size=ArraySize(src.arr_sell);
         ArrayResize(src.arr_sell, arr_size+1, 20);
         
         src.arr_sell[arr_size]=order_data;
         
         src.positions_sell++;
         src.volume_total_sell+=order_volume;
         src.profit_sell+=order_profit;
         src.profit_sell+=order_swap;
         src.profit_sell+=order_commission;
         
         if(order_volume > src.volume_high_sell)src.volume_high_sell=order_volume;
         if(order_volume < src.volume_low_sell || src.volume_low_sell==0)src.volume_low_sell=order_volume;
         if(order_price > src.price_high_sell)src.price_high_sell=order_price;
         if(order_price < src.price_low_sell || src.price_low_sell==0)src.price_low_sell=order_price;
      }
   }
   src.positions_total=src.positions_buy+src.positions_sell;
   src.profit_total=src.profit_buy+src.profit_sell;
//---
   return(src.positions_total);
}
 

чем вам стандартный массив не нравится или опишите чем ваша структура лучше https://www.mql5.com/ru/articles/1390

// Terminal.mq4
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж
int Terminal()
   {
//============================================== Предопределения ==
   ArrayCopy(Mas_Ord_Old, Mas_Ord_Tek);
// Сохраняем предыдущую историю
   int Kol=0;                         // Обнуление счётчика ордеров
   ArrayInitialize(Mas_Ord_Tek,0);    // Обнуление массива
//=============================================== Анализ ордеров ==
   for (int i=0; i<OrdersTotal(); i++)// По всем ордерам терминала
     {
      if((OrderSelect(i, SELECT_BY_POS)==true) && 
          (OrderSymbol()==Symbol()))
                                //Если есть следующ и наша вал.пара
       {                                                                     
        Kol++;                  // Считаем общее количество ордеров
//-------------------------- Формирование нового массива ордеров --
        Mas_Ord_Tek[Kol][1] = NormalizeDouble(OrderOpenPrice(),
                                              Digits); 
// Курс открытия ордеров
        Mas_Ord_Tek[Kol][2] = NormalizeDouble(OrderStopLoss(),
                                              Digits); 
// Курс SL 
        Mas_Ord_Tek[Kol][3] = NormalizeDouble(OrderTakeProfit(),
                                              Digits); 
// Курс ТР 
        Mas_Ord_Tek[Kol][4] = OrderTicket();     // Номер ордера
        Mas_Ord_Tek[Kol][5] = OrderLots();       // Количество лотов
        Mas_Ord_Tek[Kol][6] = OrderType();       // Тип ордера
        Mas_Ord_Tek[Kol][7] = OrderMagicNumber();// Магическое число 
//------------------------------------------------------------------
       }
     }
   Mas_Ord_Tek[0][0] = Kol; // Сохраняем в нулевую ячеечку
//==================================================================
   return();
   }
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж
Учёт ордеров в большой программе
Учёт ордеров в большой программе
  • 2006.06.01
  • Сергей Ковалев
  • www.mql5.com
Если торговая стратегия предполагает работу с небольшим количеством ордеров, например, только с одним ордером Buy и с одним ордером Sell, то эксперт, реализующий такую стратегию, может не вести учёт ордеров, а принимать торговые решения, ориентируясь на собственную идеологию, то есть исходя из условия, что в терминале не может оказаться более...
 
Aleksey Semenov:

чем вам стандартный массив не нравится или опишите чем ваша структура лучше https://www.mql5.com/ru/articles/1390

Чтоб посчитать профит допустим, нужно дополнительный цикл написать, по вашему примеру, или если вдруг ещё какая информация понадобилась ещё один цикл. Плюс как вижу отдельные переменные кол-во, если нужно кол-во по типу то в вашем примере ещё две отдельные переменные добавляются. У меня за один проход собирается вся необходимая информация, и содержится она в одной переменной. Ну и плюс это всегда в голове держать нужно в какой ячейке что хранится, а тут именованные поля, с массивами же при каждом новом проекте что-то изменять потребуется, тут же код переносимый, просто вставил и всё.

 
Alexey Valeev:

Чтоб посчитать профит допустим, нужно дополнительный цикл написать, по вашему примеру, или если вдруг ещё какая информация понадобилась ещё один цикл. Плюс как вижу отдельные переменные кол-во, если нужно кол-во по типу то в вашем примере ещё две отдельные переменные добавляются. У меня за один проход собирается вся необходимая информация, и содержится она в одной переменной. Ну и плюс это всегда в голове держать нужно в какой ячейке что хранится, а тут именованные поля, с массивами же при каждом новом проекте что-то изменять потребуется, тут же код переносимый, просто вставил и всё.

так это "базовый" вариант из справки, всё что нужно, можно туда же дописать в тот же цикл и сумму профита и отдельно по типам и вместе и средневзвешенный рассчитать тп сл бу, всё можно в один цикл засунуть и провернуть до характерного хруста
 
Aleksey Semenov:
так это "базовый" вариант из справки, всё что нужно, можно туда же дописать в тот же цикл и сумму профита и отдельно по типам и вместе и средневзвешенный рассчитать тп сл бу, всё можно в один цикл засунуть и провернуть до характерного хруста
Но чтоб получить дополнительные сведения, о кол-ве позиций, самой низкой цене и т.д. Добавляются ячейки, что приводит к путанице, нужно постоянно в памяти держать какая ячейка что содержит или постоянно обращаться к самой функции чтоб посмотреть. К примеру как вы в данном массиве сохраните имя символа которому принадлежит ордер? Время и т.д. Будут постоянные предупреждения о том что типы не совпадают, или постоянно конвертировать тип.
 
Aleksey Semenov:

чем вам стандартный массив не нравится или опишите чем ваша структура лучше https://www.mql5.com/ru/articles/1390

Этой статье уже ДВЕНАДЦАТЬ лет!!!! В то время структур небыло, вот и приходилось изгаляться.

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