111 lines
3.8 KiB
Plaintext
111 lines
3.8 KiB
Plaintext
|
|
//+------------------------------------------------------------------+
|
||
|
|
//| FileSave.mqh |
|
||
|
|
//| Copyright 2023, MetaQuotes Ltd. |
|
||
|
|
//| https://www.mql5.com |
|
||
|
|
//+------------------------------------------------------------------+
|
||
|
|
#property copyright "Copyright 2023, MetaQuotes Ltd."
|
||
|
|
#property link "https://www.mql5.com"
|
||
|
|
|
||
|
|
class CFileSaving
|
||
|
|
{
|
||
|
|
private:
|
||
|
|
MqlDateTime m_date;
|
||
|
|
string m_mqlName;
|
||
|
|
string m_path;
|
||
|
|
string m_expertRunLogPath;
|
||
|
|
public:
|
||
|
|
CFileSaving(void);
|
||
|
|
~CFileSaving(void);
|
||
|
|
|
||
|
|
void IniFileSave(string errortxt, bool symbol);
|
||
|
|
void IniFileSaveRun(string errortxt, bool symbol);
|
||
|
|
string IniFileName();
|
||
|
|
bool Save(const int file_handle, string errortxt, bool symbol);
|
||
|
|
virtual string DirectoryLogFile() {return (m_mqlName + " EA" + "\\" + AccountInfoString(ACCOUNT_COMPANY) + "\\"+IntegerToString(GenerateMagicNumbers())+ "\\Log\\Log.txt");}
|
||
|
|
|
||
|
|
};
|
||
|
|
|
||
|
|
CFileSaving::CFileSaving(void)
|
||
|
|
{
|
||
|
|
// FileDelete(m_mqlName + " EA" + "\\" + AccountInfoString(ACCOUNT_COMPANY) + "\\Log\\Log.txt");
|
||
|
|
m_mqlName = MQLInfoString(MQL_PROGRAM_NAME);
|
||
|
|
TimeToStruct(TimeCurrent(), m_date);
|
||
|
|
string logFile = StringFormat("%04d%02d%02d", m_date.year, m_date.mon, m_date.day) + ".txt";
|
||
|
|
m_path = m_mqlName + " EA" + "\\" + AccountInfoString(ACCOUNT_COMPANY) + "\\" + IntegerToString(GenerateMagicNumbers())+ "\\Log\\" + logFile;
|
||
|
|
m_expertRunLogPath = m_mqlName + " EA" + "\\" + AccountInfoString(ACCOUNT_COMPANY) + "\\"+ IntegerToString(GenerateMagicNumbers())+ "\\Log\\Log.txt";
|
||
|
|
}
|
||
|
|
|
||
|
|
CFileSaving::~CFileSaving(void)
|
||
|
|
{
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
void CFileSaving::IniFileSave(string errortxt, bool symbol)
|
||
|
|
{
|
||
|
|
string filename=m_path;
|
||
|
|
int handle=FileOpen(filename,FILE_READ|FILE_WRITE|FILE_CSV);
|
||
|
|
if(handle!=INVALID_HANDLE)
|
||
|
|
{
|
||
|
|
Save(handle,errortxt,symbol);
|
||
|
|
FileClose(handle);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
void CFileSaving::IniFileSaveRun(string errortxt, bool symbol)
|
||
|
|
{
|
||
|
|
string filename=m_expertRunLogPath;
|
||
|
|
int handle=FileOpen(filename,FILE_READ|FILE_WRITE|FILE_CSV);
|
||
|
|
if(handle!=INVALID_HANDLE)
|
||
|
|
{
|
||
|
|
Save(handle,errortxt,symbol);
|
||
|
|
FileClose(handle);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
string CFileSaving::IniFileName()
|
||
|
|
{
|
||
|
|
string name;
|
||
|
|
|
||
|
|
name=m_mqlName;
|
||
|
|
name+="_Log";
|
||
|
|
name+="_Ini.txt";
|
||
|
|
|
||
|
|
return(name);
|
||
|
|
}
|
||
|
|
|
||
|
|
bool CFileSaving::Save(const int file_handle, string errortxt, bool symbol)
|
||
|
|
{
|
||
|
|
datetime currentTime = TimeCurrent();
|
||
|
|
string dateTimeStr = TimeToString(currentTime, TIME_DATE | TIME_MINUTES);
|
||
|
|
string str = symbol ? " " + Symbol() : " " ;
|
||
|
|
|
||
|
|
FileSeek(file_handle,0,SEEK_END);
|
||
|
|
bool success = FileWriteString(file_handle,dateTimeStr + str + errortxt + "\n");
|
||
|
|
return success;
|
||
|
|
}
|
||
|
|
|
||
|
|
long GenerateMagicNumbers()
|
||
|
|
{
|
||
|
|
string expNames = MQLInfoString(MQL_PROGRAM_NAME);
|
||
|
|
string symbol = Symbol(); // Get the current symbol (e.g., "EURUSD")
|
||
|
|
// string expName = MQLInfoString(MQL_PROGRAM_NAME); // Get the expert name
|
||
|
|
int baseMagicNumber = 10000; // Base magic number
|
||
|
|
|
||
|
|
// Calculate a unique number for the symbol
|
||
|
|
int symbolCode = 0;
|
||
|
|
for (int i = 0; i < StringLen(symbol); i++)
|
||
|
|
{
|
||
|
|
symbolCode += StringGetCharacter(symbol, i); // Sum the ASCII values of the symbol's characters
|
||
|
|
}
|
||
|
|
|
||
|
|
// Calculate a unique number for the expert name
|
||
|
|
int expNameCode = 0;
|
||
|
|
for (int i = 0; i < StringLen(expNames); i++)
|
||
|
|
{
|
||
|
|
expNameCode += StringGetCharacter(expNames, i); // Sum the ASCII values of the expert name's characters
|
||
|
|
}
|
||
|
|
|
||
|
|
// Combine base magic number, symbol code, and expert name code
|
||
|
|
return baseMagicNumber + symbolCode + expNameCode;
|
||
|
|
}
|