Article-17803-MQL5-MVC-Tabl.../TestDealsTable.mq5

214 lines
13 KiB
MQL5

2026-03-30 00:37:05 +07:00
//+------------------------------------------------------------------+
//| TestDealsTable.mq5 |
//| Copyright 2025, MetaQuotes Ltd. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2025, MetaQuotes Ltd."
#property link "https://www.mql5.com"
#property version "1.00"
//+------------------------------------------------------------------+
//| Включаемые библиотеки |
//+------------------------------------------------------------------+
#include "Tables.mqh"
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- Объявляем список сделок, объект параметров сделки и структуру параметров
CList rows_data;
CMqlParamObj *cell=NULL;
MqlParam param={};
//--- Выбираем всю историю
if(!HistorySelect(0,TimeCurrent()))
return;
//--- Создаём список сделок в массиве массивов (CList in CList)
//--- (одна строка - одна сделка, столбцы - объекты свойств сделки)
int total=HistoryDealsTotal();
for(int i=0;i<total;i++)
{
ulong ticket=HistoryDealGetTicket(i);
if(ticket==0)
continue;
//--- Добавляем к списку сделок новую строку свойств очередной сделки
CList *row=DataListCreator::AddNewRowToDataList(&rows_data);
if(row==NULL)
continue;
//--- Создаём "ячейки" с параметрами сделки и
//--- добавляем их к созданной строке свойств сделки
string symbol=HistoryDealGetString(ticket,DEAL_SYMBOL);
int digits=(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS);
//--- Время совершения сделки (столбец 0)
param.type=TYPE_DATETIME;
param.integer_value=HistoryDealGetInteger(ticket,DEAL_TIME);
param.double_value=(TIME_DATE|TIME_MINUTES|TIME_SECONDS);
DataListCreator::AddNewCellParamToRow(row,param);
//--- Имя символа (столбец 1)
param.type=TYPE_STRING;
param.string_value=symbol;
DataListCreator::AddNewCellParamToRow(row,param);
//--- Тикет сделки (столбец 2)
param.type=TYPE_LONG;
param.integer_value=(long)ticket;
DataListCreator::AddNewCellParamToRow(row,param);
//--- Ордер, на основание которого выполнена сделка (столбец 3)
param.type=TYPE_LONG;
param.integer_value=HistoryDealGetInteger(ticket,DEAL_ORDER);
DataListCreator::AddNewCellParamToRow(row,param);
//--- Идентификатор позиции (столбец 4)
param.type=TYPE_LONG;
param.integer_value=HistoryDealGetInteger(ticket,DEAL_POSITION_ID);
DataListCreator::AddNewCellParamToRow(row,param);
//--- Тип сделки (столбец 5)
param.type=TYPE_STRING;
ENUM_DEAL_TYPE deal_type=(ENUM_DEAL_TYPE)HistoryDealGetInteger(ticket,DEAL_TYPE);
param.integer_value=deal_type;
string type="";
switch(deal_type)
{
case DEAL_TYPE_BUY : type="Buy"; break;
case DEAL_TYPE_SELL : type="Sell"; break;
case DEAL_TYPE_BALANCE : type="Balance"; break;
case DEAL_TYPE_CREDIT : type="Credit"; break;
case DEAL_TYPE_CHARGE : type="Charge"; break;
case DEAL_TYPE_CORRECTION : type="Correction"; break;
case DEAL_TYPE_BONUS : type="Bonus"; break;
case DEAL_TYPE_COMMISSION : type="Commission"; break;
case DEAL_TYPE_COMMISSION_DAILY : type="Commission daily"; break;
case DEAL_TYPE_COMMISSION_MONTHLY : type="Commission monthly"; break;
case DEAL_TYPE_COMMISSION_AGENT_DAILY : type="Commission agent daily"; break;
case DEAL_TYPE_COMMISSION_AGENT_MONTHLY: type="Commission agent monthly"; break;
case DEAL_TYPE_INTEREST : type="Interest"; break;
case DEAL_TYPE_BUY_CANCELED : type="Buy canceled"; break;
case DEAL_TYPE_SELL_CANCELED : type="Sell canceled"; break;
case DEAL_DIVIDEND : type="Dividend"; break;
case DEAL_DIVIDEND_FRANKED : type="Dividend franked"; break;
case DEAL_TAX : type="Tax"; break;
default : break;
}
param.string_value=type;
DataListCreator::AddNewCellParamToRow(row,param);
//--- Направление сделки (столбец 6)
param.type=TYPE_STRING;
ENUM_DEAL_ENTRY deal_entry=(ENUM_DEAL_ENTRY)HistoryDealGetInteger(ticket,DEAL_ENTRY);
param.integer_value=deal_entry;
string entry="";
switch(deal_entry)
{
case DEAL_ENTRY_IN : entry="In"; break;
case DEAL_ENTRY_OUT : entry="Out"; break;
case DEAL_ENTRY_INOUT : entry="InOut"; break;
case DEAL_ENTRY_OUT_BY : entry="OutBy"; break;
default : break;
}
param.string_value=entry;
DataListCreator::AddNewCellParamToRow(row,param);
//--- Объем сделки (столбец 7)
param.type=TYPE_DOUBLE;
param.double_value=HistoryDealGetDouble(ticket,DEAL_VOLUME);
param.integer_value=2;
DataListCreator::AddNewCellParamToRow(row,param);
//--- Цена сделки (столбец 8)
param.type=TYPE_DOUBLE;
param.double_value=HistoryDealGetDouble(ticket,DEAL_PRICE);
param.integer_value=(param.double_value>0 ? digits : 1);
DataListCreator::AddNewCellParamToRow(row,param);
//--- Уровень Stop Loss (столбец 9)
param.type=TYPE_DOUBLE;
param.double_value=HistoryDealGetDouble(ticket,DEAL_SL);
param.integer_value=(param.double_value>0 ? digits : 1);
DataListCreator::AddNewCellParamToRow(row,param);
//--- Уровень Take Profit (столбец 10)
param.type=TYPE_DOUBLE;
param.double_value=HistoryDealGetDouble(ticket,DEAL_TP);
param.integer_value=(param.double_value>0 ? digits : 1);
DataListCreator::AddNewCellParamToRow(row,param);
//--- Финансовый результат сделки (столбец 11)
param.type=TYPE_DOUBLE;
param.double_value=HistoryDealGetDouble(ticket,DEAL_PROFIT);
param.integer_value=(param.double_value!=0 ? 2 : 1);
DataListCreator::AddNewCellParamToRow(row,param);
//--- Magic number для сделки (столбец 12)
param.type=TYPE_LONG;
param.integer_value=HistoryDealGetInteger(ticket,DEAL_MAGIC);
DataListCreator::AddNewCellParamToRow(row,param);
//--- Причина или источник проведения сделки (столбец 13)
param.type=TYPE_STRING;
ENUM_DEAL_REASON deal_reason=(ENUM_DEAL_REASON)HistoryDealGetInteger(ticket,DEAL_REASON);
param.integer_value=deal_reason;
string reason="";
switch(deal_reason)
{
case DEAL_REASON_CLIENT : reason="Client"; break;
case DEAL_REASON_MOBILE : reason="Mobile"; break;
case DEAL_REASON_WEB : reason="Web"; break;
case DEAL_REASON_EXPERT : reason="Expert"; break;
case DEAL_REASON_SL : reason="SL"; break;
case DEAL_REASON_TP : reason="TP"; break;
case DEAL_REASON_SO : reason="StopOut"; break;
case DEAL_REASON_ROLLOVER : reason="Rollover"; break;
case DEAL_REASON_VMARGIN : reason="VMargin"; break;
case DEAL_REASON_SPLIT : reason="Split"; break;
case DEAL_REASON_CORPORATE_ACTION: reason="Corporate action"; break;
default : break;
}
param.string_value=reason;
DataListCreator::AddNewCellParamToRow(row,param);
//--- Комментарий к сделке (столбец 14)
param.type=TYPE_STRING;
param.string_value=HistoryDealGetString(ticket,DEAL_COMMENT);
DataListCreator::AddNewCellParamToRow(row,param);
}
//--- Объявляем и инициализируем заголовок таблицы
string headers[]={"Time","Symbol","Ticket","Order","Position","Type","Entry","Volume","Price","SL","TP","Profit","Magic","Reason","Comment"};
//--- Создаём таблицу на основе созданного списка параметров и массива заголовков
CTableByParam *table=new CTableByParam(rows_data,headers);
if(table==NULL)
return;
//--- Распечатываем таблицу в журнале и удаляем созданный объект
table.Print();
delete table;
}
/*
Результат:
Table By Param: Rows total: 797, Columns total: 15:
| n/n | Time | Symbol | Ticket | Order | Position | Type | Entry | Volume | Price | SL | TP | Profit | Magic | Reason | Comment |
| 0 |2025.01.01 10:20:10 | | 3152565660 | 0 | 0 | Balance | In | 0.00 | 0.0 | 0.0 | 0.0 | 100000.00 | 0 | Client | |
| 1 |2025.01.02 00:01:31 | GBPAUD | 3152603334 | 3191672408 | 3191672408 | Sell | In | 0.25 | 2.02111 | 0.0 | 0.0 | 0.0 | 112 | Expert | |
| 2 |2025.01.02 02:50:31 | GBPAUD | 3152749152 | 3191820118 | 3191672408 | Buy | Out | 0.25 | 2.02001 | 0.0 | 2.02001 | 17.04 | 112 | TP | [tp 2.02001] |
| 3 |2025.01.02 04:43:43 | GBPUSD | 3152949278 | 3191671491 | 3191671491 | Sell | In | 0.10 | 1.25270 | 0.0 | 1.24970 | 0.0 | 12 | Expert | |
...
...
| 793 |2025.04.18 03:22:11 | EURCAD | 3602552747 | 3652159095 | 3652048415 | Sell | Out | 0.25 | 1.57503 | 0.0 | 1.57503 | 12.64 | 112 | TP | [tp 1.57503] |
| 794 |2025.04.18 04:06:52 | GBPAUD | 3602588574 | 3652200103 | 3645122489 | Sell | Out | 0.25 | 2.07977 | 0.0 | 2.07977 | 3.35 | 112 | TP | [tp 2.07977] |
| 795 |2025.04.18 04:06:52 | GBPAUD | 3602588575 | 3652200104 | 3652048983 | Sell | Out | 0.25 | 2.07977 | 0.0 | 2.07977 | 12.93 | 112 | TP | [tp 2.07977] |
| 796 |2025.04.18 05:57:48 | AUDJPY | 3602664574 | 3652277665 | 3652048316 | Buy | Out | 0.25 | 90.672 | 0.0 | 90.672 | 19.15 | 112 | TP | [tp 90.672] |
*/
//+------------------------------------------------------------------+