481 lines
8.2 KiB
Plaintext
481 lines
8.2 KiB
Plaintext
///////////////////////////////////////////////////////
|
|
//
|
|
// SaherElm IT Center MQL5 Class Library
|
|
// ----------------------------------------------
|
|
// Name: XSCDataCollector
|
|
// Description: provides Data Collection Requirements ...
|
|
//
|
|
//
|
|
// Maintainer:
|
|
// ------------
|
|
// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com)
|
|
//
|
|
//////////////////////////////////////////////////////
|
|
//
|
|
// Global Properties ...
|
|
#property library
|
|
#property copyright "Copyright 2023, SaherElm IT Center"
|
|
#property link "https://www.saherelm.ir"
|
|
#property version "1.00"
|
|
#property strict
|
|
|
|
//
|
|
// Imports ...
|
|
#include "../Classes/x-saherelm.base.class.mq5"
|
|
|
|
//
|
|
template <typename T>
|
|
class XSCDataCollector : public XSCBase
|
|
{
|
|
//
|
|
// Public ...
|
|
public:
|
|
//
|
|
// Props ...
|
|
|
|
//
|
|
// Constructors ...
|
|
void XSCDataCollector(
|
|
string path = NULL, // Base Folder for Data Store
|
|
string fileName = NULL // File Name for Data Store
|
|
)
|
|
{
|
|
//
|
|
if (!IsValid(path))
|
|
{
|
|
path = GetType();
|
|
}
|
|
|
|
//
|
|
if (!IsValid(fileName))
|
|
{
|
|
fileName = GetType() + ".txt";
|
|
}
|
|
|
|
//
|
|
Path(path);
|
|
FileName(fileName);
|
|
}
|
|
|
|
//
|
|
// Deconstructor ...
|
|
void ~XSCDataCollector() {}
|
|
|
|
//
|
|
// Properties ...
|
|
|
|
//
|
|
bool Path(string value)
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
result = IsValid(value);
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
result = value != mPath;
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
mPath = value;
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
string Path()
|
|
{
|
|
return mPath;
|
|
}
|
|
|
|
//
|
|
bool FileName(string value)
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
result = IsValid(value);
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
result = value != mFileName;
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
mFileName = value;
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
string FileName()
|
|
{
|
|
return mFileName;
|
|
}
|
|
|
|
//
|
|
// Tools ...
|
|
|
|
//
|
|
// Clear Exists Collected Data ...
|
|
void Clear()
|
|
{
|
|
//
|
|
ResetLastError();
|
|
|
|
//
|
|
string dataStorePath = GetStorePath();
|
|
|
|
//
|
|
// Check Data Store Exists or not ...
|
|
bool isExists = FileIsExist(dataStorePath);
|
|
if (!isExists)
|
|
{
|
|
return;
|
|
}
|
|
|
|
//
|
|
FileDelete(dataStorePath);
|
|
}
|
|
|
|
//
|
|
// Collect All Stored Items ...
|
|
int Collect(
|
|
T &items[] // Hold Result
|
|
)
|
|
{
|
|
//
|
|
int result = 0;
|
|
|
|
//
|
|
Clean(items);
|
|
|
|
//
|
|
// Reading Store Whole Content ...
|
|
|
|
//
|
|
string storePath = GetStorePath();
|
|
int mFileHandler = FileOpen(
|
|
storePath,
|
|
FILE_READ | FILE_TXT);
|
|
result = mFileHandler != INVALID_HANDLE;
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Parse Store Content and Read Data ...
|
|
while (!FileIsEnding(mFileHandler))
|
|
{
|
|
//
|
|
// Each Line Represent One Model ...
|
|
string content = FileReadString(mFileHandler);
|
|
|
|
//
|
|
T iItem;
|
|
bool isValid = iItem.ParseModel(content);
|
|
if (isValid)
|
|
{
|
|
//
|
|
AddRef(
|
|
iItem,
|
|
items
|
|
//
|
|
);
|
|
}
|
|
}
|
|
|
|
//
|
|
// Close File ...
|
|
FileClose(mFileHandler);
|
|
|
|
//
|
|
result = ArraySize(items);
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Add Item ...
|
|
bool Add(
|
|
T &item // Item to Store
|
|
)
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
result = item.IsModelValid();
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
string content = item.ToModelString();
|
|
result = IsValid(content);
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
string storePath = GetStorePath();
|
|
int mFileHandler = FileOpen(
|
|
storePath,
|
|
FILE_READ | FILE_WRITE | FILE_TXT);
|
|
result = mFileHandler != INVALID_HANDLE;
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
FileSeek(mFileHandler, 0, SEEK_END);
|
|
FileWrite(mFileHandler, content);
|
|
FileFlush(mFileHandler);
|
|
FileClose(mFileHandler);
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Add Item ...
|
|
bool Add(
|
|
string content // Content
|
|
)
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
result = IsValid(content);
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
string storePath = GetStorePath();
|
|
int mFileHandler = FileOpen(
|
|
storePath,
|
|
FILE_READ | FILE_WRITE | FILE_TXT);
|
|
result = mFileHandler != INVALID_HANDLE;
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
FileSeek(mFileHandler, 0, SEEK_END);
|
|
FileWrite(mFileHandler, content);
|
|
FileFlush(mFileHandler);
|
|
FileClose(mFileHandler);
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Add Items ...
|
|
int Add(
|
|
T &items[] // Items to Add ...
|
|
)
|
|
{
|
|
//
|
|
int result = 0;
|
|
|
|
//
|
|
int itemsCount = ArraySize(items);
|
|
if (itemsCount <= 0)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
for (int i = 0; i < itemsCount; i++)
|
|
{
|
|
//
|
|
T iItem = items[i];
|
|
|
|
//
|
|
if (!iItem.IsModelValid())
|
|
{
|
|
continue;
|
|
}
|
|
|
|
//
|
|
bool isAdded = Add(iItem);
|
|
if (isAdded)
|
|
{
|
|
result++;
|
|
}
|
|
}
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Remove Item ...
|
|
bool Remove(
|
|
T &item // Item to Remove
|
|
)
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
result = item.IsModelValid();
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
T items[];
|
|
int itemsCount = Collect(items);
|
|
if (itemsCount <= 0)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
int itemIndex = item.FindIndex(items);
|
|
result = ArrayRemove(
|
|
items,
|
|
itemIndex,
|
|
1);
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
Clear();
|
|
|
|
//
|
|
int itemsAdded = Add(items);
|
|
|
|
//
|
|
result = itemsAdded == ArraySize(items);
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Protected ...
|
|
protected:
|
|
//
|
|
// Tools ...
|
|
|
|
//
|
|
// Retrieve Type of Class as String ...
|
|
string GetType()
|
|
{
|
|
//
|
|
string mType = (string) typename(T);
|
|
|
|
//
|
|
string result = mType;
|
|
|
|
//
|
|
string parts[];
|
|
int partsCount = SplitContent(
|
|
parts,
|
|
result,
|
|
" "
|
|
//
|
|
);
|
|
if (partsCount <= 0)
|
|
{
|
|
//
|
|
result = mType;
|
|
return result;
|
|
}
|
|
|
|
//
|
|
bool hasLastPart = GetLastItem(
|
|
result,
|
|
parts
|
|
//
|
|
);
|
|
if (!hasLastPart)
|
|
{
|
|
//
|
|
result = mType;
|
|
return result;
|
|
}
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Pricate ...
|
|
private:
|
|
//
|
|
// Props ...
|
|
|
|
//
|
|
string mPath; // Path
|
|
string mFileName; // Data Store File Name
|
|
|
|
//
|
|
// Tools ...
|
|
|
|
//
|
|
// Generate Full File Path ...
|
|
string GetFilePath(string fileName)
|
|
{
|
|
//
|
|
string result = "";
|
|
|
|
//
|
|
result =
|
|
//
|
|
Path() + "\\" + fileName
|
|
//
|
|
;
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Retrieve Data Store File Address ...
|
|
string GetStorePath()
|
|
{
|
|
//
|
|
string result = NULL;
|
|
|
|
//
|
|
result = GetFilePath(mFileName);
|
|
|
|
//
|
|
return result;
|
|
}
|
|
};
|
|
|
|
// |