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

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

Друзья, доброго времени суток. Написал функцию для получения информации по открытым позициям. Довольно удачно получилось и удобно пользоваться, всегда можно посмотреть сколько чего открыто, профит, и т.д. По аналогии туда можно и отложенные ордера добавить. Работает в 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);
}
Aleksey Semenov
3784
Aleksey Semenov  

чем вам стандартный массив не нравится или опишите чем ваша структура лучше 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, то эксперт, реализующий такую стратегию, может не вести учёт ордеров, а принимать торговые решения, ориентируясь на собственную идеологию, то есть исходя из условия, что в терминале не может оказаться более...
Alexey Valeev
5561
Alexey Valeev  
Aleksey Semenov:

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

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

Aleksey Semenov
3784
Aleksey Semenov  
Alexey Valeev:

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

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

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

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

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

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