Adwizard/Utils/ExpertHistory.mqh

212 lines
16 KiB
MQL5
Raw Permalink Normal View History

2025-04-11 13:28:40 +03:00
<EFBFBD><EFBFBD>//+------------------------------------------------------------------+
//| ExportHistory.mqh |
//| Copyright 2021-2024, Yuriy Bykov |
//| https://www.mql5.com/ru/users/antekov |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021-2024, Yuriy Bykov"
#property link "https://www.mql5.com/ru/users/antekov"
#property version "1.00"
#include "Macros.mqh"
//+------------------------------------------------------------------+
//| -:A?>@B 8AB>@88 A45;>: 2 D09; |
//+------------------------------------------------------------------+
class CExpertHistory {
private:
static string s_sep; // !8<2>;-@0745;8B5;L
static int s_file; // %5=4; D09;0 4;O 70?8A8
static string s_columnNames[]; // 0AA82 =0720=89 AB>;1F>2
// 0?8AL 8AB>@88 A45;>: 2 D09;
static void WriteDealsHistory();
// 0?8AL >4=>9 AB@>:8 8AB>@88 A45;>: 2 D09;
static void WriteDealsHistoryRow(const string &fields[]);
// >;CG5=85 40BK ?5@2>9 A45;:8
static datetime GetStartDate();
// $>@<8@>20=85 8<5=8 D09;0
static string GetHistoryFileName();
public:
// -:A?>@B 8AB>@88 A45;>:
static void Export(
string exportFileName = "", // <O D09;0 4;O M:A?>@B0. A;8 ?CAB>5, B> 8<O 1C45B A35=5@8@>20=>
int commonFlag = FILE_COMMON // !>E@0=OBL D09; 2 >1I59 ?0?:5 40==KE
);
};
// !B0B8G5A:85 ?5@5<5==K5 :;0AA0
string CExpertHistory::s_sep = ",";
int CExpertHistory::s_file;
string CExpertHistory::s_columnNames[] = {"DATE", "TICKET", "TYPE",
"SYMBOL", "VOLUME", "ENTRY", "PRICE",
"STOPLOSS", "TAKEPROFIT", "PROFIT",
"COMMISSION", "FEE", "SWAP",
"MAGIC", "COMMENT"
};
//+------------------------------------------------------------------+
//| -:A?>@B 8AB>@88 A45;>: |
//+------------------------------------------------------------------+
void CExpertHistory::Export(string exportFileName = "", int commonFlag = FILE_COMMON) {
// A;8 8<O D09;0 =5 7040=>, B> A35=5@8@C5< 53>
if(exportFileName == "") {
exportFileName = GetHistoryFileName();
}
// B:@K205< D09; =0 70?8AL 2 =C6=>9 ?0?:5 40==KE
s_file = FileOpen(exportFileName, commonFlag | FILE_WRITE | FILE_CSV | FILE_ANSI, s_sep);
// A;8 D09; >B:@KB, B>
if(s_file > 0) {
// 0?8AK205< 8AB>@8N A45;>:
WriteDealsHistory();
// 0:@K205< D09;
FileClose(s_file);
} else {
PrintFormat(__FUNCTION__" | ERROR: Can't open file [%s]. Last error: %d", exportFileName, GetLastError());
}
}
//+------------------------------------------------------------------+
//| 0?8AL 8AB>@88 A45;>: 2 D09; |
//+------------------------------------------------------------------+
void CExpertHistory::WriteDealsHistory() {
// 0?8AK205< 703>;>2>: A =0720=8O<8 AB>;1F>2
WriteDealsHistoryRow(s_columnNames);
// 5@5<5==K5 4;O A2>9AB2 :064>9 A45;:8
uint total;
ulong ticket = 0;
long entry;
double price;
double sl, tp;
double profit, commission, fee, swap;
double volume;
datetime time;
string symbol;
long type, magic;
string comment;
// 5@Q< 2AN 8AB>@8N
HistorySelect(0, TimeCurrent());
total = HistoryDealsTotal();
// ;O 2A5E A45;>:
for(uint i = 0; i < total; i++) {
// A;8 A45;:0 CA?5H=> 2K1@0=0, B>
if((ticket = HistoryDealGetTicket(i)) > 0) {
// >;CG05< 7=0G5=8O 5Q A2>9AB2
time = (datetime)HistoryDealGetInteger(ticket, DEAL_TIME);
type = HistoryDealGetInteger(ticket, DEAL_TYPE);
symbol = HistoryDealGetString(ticket, DEAL_SYMBOL);
volume = HistoryDealGetDouble(ticket, DEAL_VOLUME);
entry = HistoryDealGetInteger(ticket, DEAL_ENTRY);
price = HistoryDealGetDouble(ticket, DEAL_PRICE);
sl = HistoryDealGetDouble(ticket, DEAL_SL);
tp = HistoryDealGetDouble(ticket, DEAL_TP);
profit = HistoryDealGetDouble(ticket, DEAL_PROFIT);
commission = HistoryDealGetDouble(ticket, DEAL_COMMISSION);
fee = HistoryDealGetDouble(ticket, DEAL_FEE);
swap = HistoryDealGetDouble(ticket, DEAL_SWAP);
magic = HistoryDealGetInteger(ticket, DEAL_MAGIC);
comment = HistoryDealGetString(ticket, DEAL_COMMENT);
if(type == DEAL_TYPE_BUY || type == DEAL_TYPE_SELL || type == DEAL_TYPE_BALANCE) {
// 0<5=O5< 2 :><<5=B0@88 A8<2>;K-@0745;8B5;8 =0 ?@>15;
StringReplace(comment, s_sep, " ");
// $>@<8@C5< <0AA82 7=0G5=89 4;O 70?8A8 >4=>9 A45;:8 2 AB@>:C D09;0
string fields[] = {TimeToString(time, TIME_DATE | TIME_MINUTES | TIME_SECONDS),
IntegerToString(ticket), IntegerToString(type), symbol, DoubleToString(volume), IntegerToString(entry),
DoubleToString(price, 5), DoubleToString(sl, 5), DoubleToString(tp, 5), DoubleToString(profit),
DoubleToString(commission), DoubleToString(fee), DoubleToString(swap), IntegerToString(magic), comment
};
// 0?8AK205< 7=0G5=8O >4=>9 A45;:8 2 D09;
WriteDealsHistoryRow(fields);
}
}
}
}
//+------------------------------------------------------------------+
//| 0?8AL >4=>9 AB@>:8 8AB>@88 A45;>: 2 D09; |
//+------------------------------------------------------------------+
void CExpertHistory::WriteDealsHistoryRow(const string &fields[]) {
// !B@>:0 4;O 70?8A8
string row = "";
// !>548=O5< 2A5 7=0G5=8O <0AA820 2 >4=C AB@>:C G5@57 @0745;8B5;L
JOIN(fields, row, ",");
// 0?8AK205< AB@>:C 2 D09;
FileWrite(s_file, row);
}
//+------------------------------------------------------------------+
//| >;CG5=85 40BK ?5@2>9 A45;:8 |
//+------------------------------------------------------------------+
datetime CExpertHistory::GetStartDate() {
// 5@Q< 2AN 8AB>@8N
HistorySelect(0, TimeCurrent());
uint total = HistoryDealsTotal();
ulong ticket = 0;
// ;O 2A5E A45;>:
for(uint i = 0; i < total; i++) {
// A;8 A45;:0 CA?5H=> 2K1@0=0, B>
if((ticket = HistoryDealGetTicket(i)) > 0) {
// >72@0I05< 5Q 40BC
return (datetime)HistoryDealGetInteger(ticket, DEAL_TIME);
}
}
return 0;
}
//+------------------------------------------------------------------+
//| $>@<8@>20=85 8<5=8 D09;0 |
//+------------------------------------------------------------------+
string CExpertHistory::GetHistoryFileName() {
// 5@Q< =0720=85 A>25B=8:0
string fileName = MQLInfoString(MQL_PROGRAM_NAME);
// A;8 C:070=0 25@A8O, B> 4>102;O5< 5Q
#ifdef __VERSION__
fileName += "." + __VERSION__;
#endif
fileName += " ";
// >102;O5< 40BC =0G0;0 8 >:>=G0=8O 8AB>@88
fileName += "[" + TimeToString(GetStartDate(), TIME_DATE);
fileName += " - " + TimeToString(TimeCurrent(), TIME_DATE) + "]";
fileName += " ";
// >102;O5< =5A:>;L:> AB0B8AB8G5A:8E E0@0:B5@8AB8:
fileName += "[" + DoubleToString(TesterStatistics(STAT_INITIAL_DEPOSIT), 0);
fileName += ", " + DoubleToString(TesterStatistics(STAT_INITIAL_DEPOSIT) + TesterStatistics(STAT_PROFIT), 0);
fileName += ", " + DoubleToString(TesterStatistics(STAT_EQUITY_DD_RELATIVE), 0);
fileName += ", " + DoubleToString(TesterStatistics(STAT_SHARPE_RATIO), 2);
fileName += "]";
// A;8 8<O ?>;CG8;>AL A;8H:>< 4;8==K<, B> A>:@0I05< 53>
if(StringLen(fileName) > 255 - 13) {
fileName = StringSubstr(fileName, 0, 255 - 13);
}
// >102;O5< @0AH8@5=85
fileName += ".history.csv";
return fileName;
}
//+------------------------------------------------------------------+