last works ...
This commit is contained in:
@@ -3773,6 +3773,279 @@ private:
|
||||
}
|
||||
};
|
||||
|
||||
//
|
||||
// a Class For Read and Write Trade Info Data in Files ...
|
||||
class XTradeCollector
|
||||
{
|
||||
//
|
||||
// Public ...
|
||||
public:
|
||||
//
|
||||
// Props ...
|
||||
|
||||
//
|
||||
// Constructor(s) ...
|
||||
void XTradeCollector(
|
||||
string _path = NULL // Base Path
|
||||
)
|
||||
{
|
||||
//
|
||||
mAccount = new XSCAccount();
|
||||
|
||||
//
|
||||
if (IsValid(_path))
|
||||
{
|
||||
mPath = _path;
|
||||
}
|
||||
else
|
||||
{
|
||||
mPath = "XTradeData" + "\\" + mAccount.GetCompany();
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Deconstructor ...
|
||||
void ~XTradeCollector() {}
|
||||
|
||||
//
|
||||
bool IsExists(XTradeData &item)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
int mHandler = GetFileHandlerForRead(item);
|
||||
result = mHandler != INVALID_HANDLE;
|
||||
FileClose(mHandler);
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
bool Save(XTradeData &item)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
// Check info is Valid ...
|
||||
result = item.IsValid();
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
string content = item.ToString();
|
||||
result = IsValid(content);
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
int mHandler = GetFileHandlerForWrite(item);
|
||||
result = mHandler != INVALID_HANDLE;
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
FileWrite(mHandler, content);
|
||||
FileFlush(mHandler);
|
||||
FileClose(mHandler);
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
bool SaveSignal(XTradeData &item)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
string content = item.ToString(true);
|
||||
result = IsValid(content);
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
int mHandler = GetSignalFileHandlerForWrite(item);
|
||||
result = mHandler != INVALID_HANDLE;
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
FileWrite(mHandler, content);
|
||||
FileFlush(mHandler);
|
||||
FileClose(mHandler);
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Protected ...
|
||||
protected:
|
||||
//
|
||||
// Private ...
|
||||
private:
|
||||
//
|
||||
// Props ...
|
||||
|
||||
//
|
||||
string mPath; // Base Path ...
|
||||
|
||||
//
|
||||
XSCAccount *mAccount;
|
||||
|
||||
//
|
||||
string GetFilePath(XTradeData &item)
|
||||
{
|
||||
//
|
||||
string fileName = item.GetFileName();
|
||||
|
||||
//
|
||||
return GetFilePath(fileName);
|
||||
}
|
||||
string GetFilePath(string fileName)
|
||||
{
|
||||
//
|
||||
string result = "";
|
||||
|
||||
//
|
||||
result =
|
||||
//
|
||||
mPath + "\\" + "Trades" + "\\" + fileName + ".x121.log"
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
string GetSignalFilePath(XTradeData &item)
|
||||
{
|
||||
//
|
||||
string fileName = item.GetSignalFileName();
|
||||
|
||||
//
|
||||
return GetSignalFilePath(fileName);
|
||||
}
|
||||
string GetSignalFilePath(string fileName)
|
||||
{
|
||||
//
|
||||
string result = "";
|
||||
|
||||
//
|
||||
result =
|
||||
//
|
||||
mPath + "\\" + "Signals" + "\\" + fileName + ".x121.log"
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
int GetFileHandlerForRead(XTradeData &item)
|
||||
{
|
||||
//
|
||||
int result = INVALID_HANDLE;
|
||||
|
||||
//
|
||||
string filePath = GetFilePath(item);
|
||||
if (!IsValid(filePath))
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
result = FileOpen(
|
||||
filePath,
|
||||
FILE_READ | FILE_TXT //
|
||||
);
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
int GetFileHandlerForWrite(XTradeData &item)
|
||||
{
|
||||
//
|
||||
int result = INVALID_HANDLE;
|
||||
|
||||
//
|
||||
string filePath = GetFilePath(item);
|
||||
if (!IsValid(filePath))
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
result = FileOpen(
|
||||
filePath,
|
||||
FILE_READ | FILE_WRITE | FILE_TXT //
|
||||
);
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
int GetSignalFileHandlerForRead(XTradeData &item)
|
||||
{
|
||||
//
|
||||
int result = INVALID_HANDLE;
|
||||
|
||||
//
|
||||
string filePath = GetSignalFilePath(item);
|
||||
if (!IsValid(filePath))
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
result = FileOpen(
|
||||
filePath,
|
||||
FILE_READ | FILE_TXT //
|
||||
);
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
int GetSignalFileHandlerForWrite(XTradeData &item)
|
||||
{
|
||||
//
|
||||
int result = INVALID_HANDLE;
|
||||
|
||||
//
|
||||
string filePath = GetSignalFilePath(item);
|
||||
if (!IsValid(filePath))
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
result = FileOpen(
|
||||
filePath,
|
||||
FILE_READ | FILE_WRITE | FILE_TXT //
|
||||
);
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
};
|
||||
|
||||
//
|
||||
// Trade Handler Class ...
|
||||
class XSCXTradeHandler : public XSCBaseAlert
|
||||
@@ -3788,6 +4061,7 @@ public:
|
||||
{
|
||||
//
|
||||
mTrader = trader;
|
||||
mCollector = new XTradeCollector();
|
||||
}
|
||||
|
||||
//
|
||||
@@ -3796,8 +4070,39 @@ public:
|
||||
{
|
||||
//
|
||||
delete mTrader;
|
||||
delete mCollector;
|
||||
}
|
||||
|
||||
//
|
||||
// Getter(s) / Setter(s) ...
|
||||
|
||||
//
|
||||
bool SaveSignals()
|
||||
{
|
||||
return mSaveSignals;
|
||||
}
|
||||
|
||||
//
|
||||
void SaveSignals(bool value)
|
||||
{
|
||||
mSaveSignals = value;
|
||||
}
|
||||
|
||||
//
|
||||
bool SaveTrades()
|
||||
{
|
||||
return mSaveTrades;
|
||||
}
|
||||
|
||||
//
|
||||
void SaveTrades(bool value)
|
||||
{
|
||||
mSaveTrades = value;
|
||||
}
|
||||
|
||||
//
|
||||
// Tools ...
|
||||
|
||||
//
|
||||
// First Step of Trade Handling ...
|
||||
// Since Must Call when a Signal Executed ...
|
||||
@@ -3826,6 +4131,70 @@ public:
|
||||
|
||||
//
|
||||
Add(item);
|
||||
|
||||
//
|
||||
SaveSignal(item);
|
||||
}
|
||||
|
||||
//
|
||||
void Finish(const XDeal &deal)
|
||||
{
|
||||
//
|
||||
int idx = -1;
|
||||
bool hasItem = HasItem(
|
||||
deal.positionId,
|
||||
idx //
|
||||
);
|
||||
if (!hasItem)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
// Update Item Info ...
|
||||
mData[idx].swap = deal.swap;
|
||||
mData[idx].endTime = deal.time;
|
||||
mData[idx].profit = deal.profit;
|
||||
|
||||
//
|
||||
mData[idx].message =
|
||||
deal.reason == DEAL_REASON_TP
|
||||
? "TP"
|
||||
: "SL";
|
||||
|
||||
//
|
||||
Save(idx);
|
||||
}
|
||||
|
||||
//
|
||||
void Finish(
|
||||
const ulong ticket,
|
||||
const XPosition &position,
|
||||
const string comment //
|
||||
)
|
||||
{
|
||||
//
|
||||
int idx = -1;
|
||||
bool hasItem = HasItem(
|
||||
ticket,
|
||||
idx //
|
||||
);
|
||||
if (!hasItem)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
// Update Item Info ...
|
||||
mData[idx].swap = position.swap;
|
||||
mData[idx].endTime = TimeCurrent();
|
||||
mData[idx].profit = position.profit;
|
||||
|
||||
//
|
||||
mData[idx].message = comment;
|
||||
|
||||
//
|
||||
Save(idx);
|
||||
}
|
||||
|
||||
//
|
||||
@@ -3912,7 +4281,15 @@ public:
|
||||
// Protected ...
|
||||
protected:
|
||||
//
|
||||
XSCTrade *mTrader; // Instance of Trader Class
|
||||
// Props ...
|
||||
|
||||
//
|
||||
bool mSaveSignals; // Save Signals
|
||||
bool mSaveTrades; // Save Trades
|
||||
|
||||
//
|
||||
XSCTrade *mTrader; // Instance of Trader Class
|
||||
XTradeCollector *mCollector; // Instance of Trade Collector Class
|
||||
|
||||
//
|
||||
XTradeData mData[]; // Hold Trade Data
|
||||
@@ -4081,6 +4458,46 @@ private:
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
void Save(int index)
|
||||
{
|
||||
//
|
||||
int count = Count();
|
||||
if (!IsValidIndex(index) || index > count - 1)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
// Save Trade ...
|
||||
if (mSaveTrades)
|
||||
{
|
||||
mCollector.Save(mData[index]);
|
||||
}
|
||||
|
||||
//
|
||||
// Remove Item From List ...
|
||||
ArrayRemove(
|
||||
mData,
|
||||
index,
|
||||
1 //
|
||||
);
|
||||
}
|
||||
|
||||
//
|
||||
void SaveSignal(XTradeData &item)
|
||||
{
|
||||
//
|
||||
if (!mSaveSignals)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
// Save Signal ...
|
||||
mCollector.SaveSignal(item);
|
||||
}
|
||||
};
|
||||
|
||||
//
|
||||
Reference in New Issue
Block a user