- Create a Data Collector Class;
- Add Support for Save Logs in Alert Class; - Add Propper inputs for Handle Saving Logs in EA and Expert Class; - remove x-trade.manager Class Data Collector and use General Developed Data Collector; - Add Support for Reading Fles in Data Collector Class for Support Configuration Parsing; - Remove XCBaseAlert class and add Support for get XCAlert instance reference pointer as Dependency Injection in all used classed and Refactor all Changes; - Apply Fix some UnImplemented Event Handlers on Ea Expert Class of XCATBEA and also change Event Handler Binding to Collection Based Model; - Test all Functionalities ... - Apply Some Fixes on Prevent Double Saing Same Log Messages ...
This commit is contained in:
@@ -22,6 +22,7 @@
|
|||||||
//
|
//
|
||||||
// Imports ...
|
// Imports ...
|
||||||
#include "../Classes/x-saherelm.base.class.mq5"
|
#include "../Classes/x-saherelm.base.class.mq5"
|
||||||
|
#include "../Classes/x-saherelm.x-data.collector.class.mq5"
|
||||||
|
|
||||||
//
|
//
|
||||||
// Class Definition ...
|
// Class Definition ...
|
||||||
@@ -42,7 +43,8 @@ class XCAlert : public XCBase
|
|||||||
bool logAlerts = true, // Log Alerts
|
bool logAlerts = true, // Log Alerts
|
||||||
bool terminalAlerts = false, // Terminal Alerts
|
bool terminalAlerts = false, // Terminal Alerts
|
||||||
bool mailAlerts = false, // Mail Alerts
|
bool mailAlerts = false, // Mail Alerts
|
||||||
bool pushAlerts = false // Push Alerts
|
bool pushAlerts = false, // Push Alerts
|
||||||
|
bool saveAlerts = false // Save Alerts
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
//
|
//
|
||||||
@@ -50,6 +52,7 @@ class XCAlert : public XCBase
|
|||||||
mLogAlerts = logAlerts;
|
mLogAlerts = logAlerts;
|
||||||
mMailAlerts = mailAlerts;
|
mMailAlerts = mailAlerts;
|
||||||
mPushAlerts = pushAlerts;
|
mPushAlerts = pushAlerts;
|
||||||
|
mSaveAlerts = saveAlerts;
|
||||||
mEnableAlerts = enableAlerts;
|
mEnableAlerts = enableAlerts;
|
||||||
mTerminalAlerts = terminalAlerts;
|
mTerminalAlerts = terminalAlerts;
|
||||||
|
|
||||||
@@ -59,12 +62,21 @@ class XCAlert : public XCBase
|
|||||||
{
|
{
|
||||||
mPrefix = GetTag();
|
mPrefix = GetTag();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Initialize Collector ...
|
||||||
|
collector = new XCDataCollector();
|
||||||
|
collector.Path(mPrefix);
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Deconstructor ...
|
// Deconstructor ...
|
||||||
~XCAlert()
|
~XCAlert()
|
||||||
{
|
{
|
||||||
|
//
|
||||||
|
// Cleanup Resources ...
|
||||||
|
delete collector;
|
||||||
|
ZeroMemory(collector);
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -86,7 +98,9 @@ class XCAlert : public XCBase
|
|||||||
//
|
//
|
||||||
void SetPrefix(string value)
|
void SetPrefix(string value)
|
||||||
{
|
{
|
||||||
|
//
|
||||||
mPrefix = value;
|
mPrefix = value;
|
||||||
|
collector.Path(mPrefix);
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -113,6 +127,18 @@ class XCAlert : public XCBase
|
|||||||
mEnableAlerts = value;
|
mEnableAlerts = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
bool GetSaveAlerts()
|
||||||
|
{
|
||||||
|
return mSaveAlerts;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
void SetSaveAlerts(bool value)
|
||||||
|
{
|
||||||
|
mSaveAlerts = value;
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
bool GetPushAlerts()
|
bool GetPushAlerts()
|
||||||
{
|
{
|
||||||
@@ -166,8 +192,12 @@ class XCAlert : public XCBase
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
message = PrepareMessage(message);
|
||||||
|
|
||||||
//
|
//
|
||||||
Log(message);
|
Log(message);
|
||||||
|
Save(message);
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -187,6 +217,7 @@ class XCAlert : public XCBase
|
|||||||
|
|
||||||
// Send Terminal Alert ...
|
// Send Terminal Alert ...
|
||||||
Alert(message);
|
Alert(message);
|
||||||
|
Save(message);
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -203,6 +234,7 @@ class XCAlert : public XCBase
|
|||||||
//
|
//
|
||||||
// Send Mail Alert ...
|
// Send Mail Alert ...
|
||||||
SendMail(GetPrefix(), message);
|
SendMail(GetPrefix(), message);
|
||||||
|
Save(message);
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -223,6 +255,7 @@ class XCAlert : public XCBase
|
|||||||
//
|
//
|
||||||
// Send Push Notification Alert ...
|
// Send Push Notification Alert ...
|
||||||
SendNotification(message);
|
SendNotification(message);
|
||||||
|
Save(message);
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -1334,16 +1367,55 @@ class XCAlert : public XCBase
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
void Save(string message)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
if (!mSaveAlerts ||
|
||||||
|
!IsValid(message) ||
|
||||||
|
message == mLastSavedMessage ||
|
||||||
|
PrepareMessage(message) == mLastSavedMessage)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
string filePath = collector.GetFilePath("XLogs");
|
||||||
|
if (!IsValid(filePath))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Attach Time ...
|
||||||
|
string savedMessage = ToString(TimeCurrent()) + " " + message;
|
||||||
|
|
||||||
|
//
|
||||||
|
bool has = collector.Append(
|
||||||
|
filePath,
|
||||||
|
savedMessage //
|
||||||
|
);
|
||||||
|
if (has)
|
||||||
|
{
|
||||||
|
mLastSavedMessage = message;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
//
|
//
|
||||||
// Props ...
|
// Props ...
|
||||||
string mPrefix; // Alerts Prefixe
|
string mPrefix; // Alerts Prefixe
|
||||||
bool mEnableAlerts; // Enable Alerts
|
bool mEnableAlerts; // Enable Alerts
|
||||||
|
bool mSaveAlerts; // Save Alerts
|
||||||
bool mLogAlerts; // Log Alerts
|
bool mLogAlerts; // Log Alerts
|
||||||
bool mTerminalAlerts; // Terminal Alerts
|
bool mTerminalAlerts; // Terminal Alerts
|
||||||
bool mMailAlerts; // Mail Alerts
|
bool mMailAlerts; // Mail Alerts
|
||||||
bool mPushAlerts; // Push Alerts
|
bool mPushAlerts; // Push Alerts
|
||||||
|
|
||||||
|
//
|
||||||
|
string mLastSavedMessage; // For Prevent Multiple Saving Same Mesage ...
|
||||||
|
XCDataCollector *collector;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Tools ...
|
// Tools ...
|
||||||
|
|
||||||
@@ -1363,218 +1435,4 @@ class XCAlert : public XCBase
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
//
|
|
||||||
// a Base Class by Support Alert ...
|
|
||||||
class XCBaseAlert : public XCBase
|
|
||||||
{
|
|
||||||
//
|
|
||||||
// Public ...
|
|
||||||
public:
|
|
||||||
//
|
|
||||||
// Props ...
|
|
||||||
|
|
||||||
//
|
|
||||||
// Constructor(s) ...
|
|
||||||
void XCBaseAlert()
|
|
||||||
{
|
|
||||||
//
|
|
||||||
// Instance Alert ...
|
|
||||||
mAlert = new XCAlert();
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Deconstructors ...
|
|
||||||
void ~XCBaseAlert()
|
|
||||||
{
|
|
||||||
//
|
|
||||||
delete mAlert;
|
|
||||||
|
|
||||||
//
|
|
||||||
ZeroMemory(mAlert);
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Alert Handler Functions ...
|
|
||||||
|
|
||||||
//
|
|
||||||
// Alert Functions Getter(s) / Setters(s) ...
|
|
||||||
|
|
||||||
//
|
|
||||||
string GetAlertPrefix()
|
|
||||||
{
|
|
||||||
return mAlert.GetPrefix();
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
void SetAlertPrefix(string value)
|
|
||||||
{
|
|
||||||
mAlert.SetPrefix(value);
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
bool GetAlertLogAlerts()
|
|
||||||
{
|
|
||||||
return mAlert.GetLogAlerts();
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
void SetAlertLogAlerts(bool value)
|
|
||||||
{
|
|
||||||
mAlert.SetLogAlerts(value);
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
bool GetAlertEnableAlerts()
|
|
||||||
{
|
|
||||||
return mAlert.GetEnableAlerts();
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
void SetAlertEnableAlerts(bool value)
|
|
||||||
{
|
|
||||||
mAlert.SetEnableAlerts(value);
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
bool GetAlertPushAlerts()
|
|
||||||
{
|
|
||||||
return mAlert.GetPushAlerts();
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
void SetAlertPushAlerts(bool value)
|
|
||||||
{
|
|
||||||
mAlert.SetPushAlerts(value);
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
bool GetAlertMailAlerts()
|
|
||||||
{
|
|
||||||
return mAlert.GetMailAlerts();
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
void SetAlertMailAlerts(bool value)
|
|
||||||
{
|
|
||||||
mAlert.SetMailAlerts(value);
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
bool GetAlertTerminalAlerts()
|
|
||||||
{
|
|
||||||
return mAlert.GetTerminalAlerts();
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
void SetAlertTerminalAlerts(bool value)
|
|
||||||
{
|
|
||||||
mAlert.SetTerminalAlerts(value);
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Alert Actions ...
|
|
||||||
|
|
||||||
//
|
|
||||||
// Logging an Alert ...
|
|
||||||
void LogAlert(string message)
|
|
||||||
{
|
|
||||||
mAlert.LogAlert(message);
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Terminal Alert ...
|
|
||||||
void TerminalAlert(string message)
|
|
||||||
{
|
|
||||||
mAlert.TerminalAlert(message);
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Mail Alert ...
|
|
||||||
void MailAlert(string message)
|
|
||||||
{
|
|
||||||
mAlert.MailAlert(message);
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Send Push Notification ...
|
|
||||||
void PushAlert(string message)
|
|
||||||
{
|
|
||||||
mAlert.PushAlert(message);
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Send an Alert by Handling all Different Specified
|
|
||||||
// type's of Alert's if they are Enabled ...
|
|
||||||
void SendAlert(string message)
|
|
||||||
{
|
|
||||||
mAlert.SendAlert(message);
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Logs ...
|
|
||||||
|
|
||||||
//
|
|
||||||
// Log a Message ...
|
|
||||||
void Log(string message)
|
|
||||||
{
|
|
||||||
mAlert.Log(message);
|
|
||||||
}
|
|
||||||
void Log(string tag, string message)
|
|
||||||
{
|
|
||||||
mAlert.Log(tag, message);
|
|
||||||
}
|
|
||||||
void LogEmpty()
|
|
||||||
{
|
|
||||||
mAlert.LogEmpty();
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Log Specific Array ...
|
|
||||||
template <typename T>
|
|
||||||
void LogArray(
|
|
||||||
T &array[], // Array to Log
|
|
||||||
string label = NULL // Array Label
|
|
||||||
)
|
|
||||||
{
|
|
||||||
mAlert.LogArray(array, label);
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Error ...
|
|
||||||
|
|
||||||
//
|
|
||||||
// Log an Error ...
|
|
||||||
void LogError(
|
|
||||||
int error = -1 // Specific Error, if it's equal to -1, use Last Error ...
|
|
||||||
)
|
|
||||||
{
|
|
||||||
mAlert.LogError(error);
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Retrieve Specified Error Code Description ...
|
|
||||||
string GetErrorDescription(int err_code)
|
|
||||||
{
|
|
||||||
return mAlert.GetErrorDescription(err_code);
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Retrieve Specified Error Code Description ...
|
|
||||||
string GetTradeServerReturnCodeDescription(int return_code)
|
|
||||||
{
|
|
||||||
return mAlert.GetTradeServerReturnCodeDescription(return_code);
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Protected ...
|
|
||||||
protected:
|
|
||||||
//
|
|
||||||
// Alert ...
|
|
||||||
XCAlert *mAlert;
|
|
||||||
|
|
||||||
//
|
|
||||||
// Private ...
|
|
||||||
private:
|
|
||||||
};
|
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -0,0 +1,371 @@
|
|||||||
|
///////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// SaherElm IT Center MQL5 Indicator
|
||||||
|
// -------------------------------------------------
|
||||||
|
// Name: XCDataCollector ...
|
||||||
|
// Description: Class for Handling Data Read or Write ...
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// Maintainer:
|
||||||
|
// ------------
|
||||||
|
// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com)
|
||||||
|
//
|
||||||
|
//////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// Global Properties ...
|
||||||
|
#property library
|
||||||
|
#property copyright "Copyright 2023, SaherElm IT Center"
|
||||||
|
#property link "https://saherelm.ir"
|
||||||
|
#property version "1.00"
|
||||||
|
#property description "SaherElm Class for Handling Data Read or Write"
|
||||||
|
#property strict
|
||||||
|
|
||||||
|
//
|
||||||
|
// Imports ...
|
||||||
|
#include "../Classes/x-saherelm.base.class.mq5"
|
||||||
|
|
||||||
|
//
|
||||||
|
// Definitions ...
|
||||||
|
|
||||||
|
//
|
||||||
|
// Implementation ...
|
||||||
|
class XCDataCollector : public XCBase
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Public ...
|
||||||
|
public:
|
||||||
|
//
|
||||||
|
// Constructors ...
|
||||||
|
XCDataCollector()
|
||||||
|
{
|
||||||
|
mPath = "XDataCollector";
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Deconstructor ...
|
||||||
|
~XCDataCollector()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Properties ...
|
||||||
|
|
||||||
|
//
|
||||||
|
string Path()
|
||||||
|
{
|
||||||
|
return mPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
void Path(string value)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Normalizing Collector Path ...
|
||||||
|
if (IsValid(value))
|
||||||
|
{
|
||||||
|
mPath = value;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mPath = "XDataCollector";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Tools ...
|
||||||
|
|
||||||
|
//
|
||||||
|
string GetFilePath(string fileName)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
string result = "";
|
||||||
|
|
||||||
|
//
|
||||||
|
result =
|
||||||
|
//
|
||||||
|
mPath + "\\" + fileName + ".x121.log"
|
||||||
|
//
|
||||||
|
;
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
int GetFileHandlerForWrite(string filePath)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
int result = INVALID_HANDLE;
|
||||||
|
|
||||||
|
//
|
||||||
|
if (!IsValid(filePath))
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
result = FileOpen(
|
||||||
|
filePath,
|
||||||
|
FILE_READ | FILE_WRITE | FILE_TXT //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
int GetFileHandlerForRead(string filePath)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
int result = INVALID_HANDLE;
|
||||||
|
|
||||||
|
//
|
||||||
|
if (!IsValid(filePath))
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
result = FileOpen(
|
||||||
|
filePath,
|
||||||
|
FILE_READ | FILE_TXT //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Save Specified Content into Specified File Name ...
|
||||||
|
*
|
||||||
|
* @param fileName: string, file name ...
|
||||||
|
* @param content: string, content ...
|
||||||
|
*
|
||||||
|
* @return ( bool )
|
||||||
|
*/
|
||||||
|
bool Save(
|
||||||
|
string fileName,
|
||||||
|
string content //
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
result = IsValid(fileName) &&
|
||||||
|
IsValid(content);
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
int mHandler = GetFileHandlerForWrite(fileName);
|
||||||
|
result = mHandler != INVALID_HANDLE;
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
FileWrite(mHandler, content);
|
||||||
|
FileFlush(mHandler);
|
||||||
|
FileClose(mHandler);
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Append Specified Content into Specified File Name ...
|
||||||
|
*
|
||||||
|
* @param fileName: string, file name ...
|
||||||
|
* @param content: string, content ...
|
||||||
|
*
|
||||||
|
* @return ( bool )
|
||||||
|
*/
|
||||||
|
bool Append(
|
||||||
|
string fileName,
|
||||||
|
string content //
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
result = IsValid(fileName) &&
|
||||||
|
IsValid(content);
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
int mHandler = GetFileHandlerForWrite(fileName);
|
||||||
|
result = mHandler != INVALID_HANDLE;
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
FileSeek(mHandler, 0, SEEK_END);
|
||||||
|
FileWrite(mHandler, content);
|
||||||
|
FileFlush(mHandler);
|
||||||
|
FileClose(mHandler);
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Read Specified File Content ...
|
||||||
|
*
|
||||||
|
* @param fileName: string, file name ...
|
||||||
|
* @param content: string reference, hold's reading content ...
|
||||||
|
*
|
||||||
|
* @return ( bool )
|
||||||
|
*/
|
||||||
|
bool Read(
|
||||||
|
string fileName,
|
||||||
|
string &content //
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Normalize Args ...
|
||||||
|
content = NULL;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Validate Args ...
|
||||||
|
result = IsValid(fileName);
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
int mHandler = GetFileHandlerForRead(fileName);
|
||||||
|
result = mHandler != INVALID_HANDLE;
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Reading File ...
|
||||||
|
while (!FileIsEnding(mHandler))
|
||||||
|
{
|
||||||
|
//
|
||||||
|
string iLine = FileReadString(mHandler);
|
||||||
|
content += iLine;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Close File ...
|
||||||
|
FileClose(mHandler);
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Read Specified File Content ...
|
||||||
|
*
|
||||||
|
* @param fileName: string, file name ...
|
||||||
|
* @param content: string reference collection, hold's reading content lines ...
|
||||||
|
*
|
||||||
|
* @return ( bool )
|
||||||
|
*/
|
||||||
|
bool Read(
|
||||||
|
string fileName,
|
||||||
|
string &content[] //
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Normalize Args ...
|
||||||
|
Clean(content);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Validate Args ...
|
||||||
|
result = IsValid(fileName);
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
int mHandler = GetFileHandlerForRead(fileName);
|
||||||
|
result = mHandler != INVALID_HANDLE;
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Reading File ...
|
||||||
|
while (!FileIsEnding(mHandler))
|
||||||
|
{
|
||||||
|
//
|
||||||
|
string iLine = FileReadString(mHandler);
|
||||||
|
Add(
|
||||||
|
iLine,
|
||||||
|
content //
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Close File ...
|
||||||
|
FileClose(mHandler);
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check Specified File Exists or not ...
|
||||||
|
*
|
||||||
|
* @param fileName: string, Full Path of File to Check ...
|
||||||
|
*
|
||||||
|
* @return ( bool )
|
||||||
|
*/
|
||||||
|
bool IsExists(string fileName)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Validate Args ...
|
||||||
|
result = IsValid(fileName);
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Check File Exists or not ...
|
||||||
|
int mHandler = GetFileHandlerForRead(fileName);
|
||||||
|
result = mHandler != INVALID_HANDLE;
|
||||||
|
FileClose(mHandler);
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Protected ...
|
||||||
|
protected:
|
||||||
|
//
|
||||||
|
// Private ...
|
||||||
|
private:
|
||||||
|
//
|
||||||
|
// Props ...
|
||||||
|
|
||||||
|
//
|
||||||
|
string mPath; // Base Collector Path ...
|
||||||
|
};
|
||||||
@@ -213,7 +213,7 @@ int AddGuard(
|
|||||||
|
|
||||||
//
|
//
|
||||||
// Implementation ...
|
// Implementation ...
|
||||||
class XCGuard : public XCBaseAlert
|
class XCGuard : public XCBase
|
||||||
{
|
{
|
||||||
//
|
//
|
||||||
// public ...
|
// public ...
|
||||||
@@ -226,10 +226,12 @@ class XCGuard : public XCBaseAlert
|
|||||||
//
|
//
|
||||||
// Constructor(s) ...
|
// Constructor(s) ...
|
||||||
XCGuard(
|
XCGuard(
|
||||||
XCTrade *&_trader //
|
XCAlert *_alert,
|
||||||
|
XCTrade *_trader //
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
//
|
//
|
||||||
|
alert = _alert;
|
||||||
trader = _trader;
|
trader = _trader;
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -242,6 +244,7 @@ class XCGuard : public XCBaseAlert
|
|||||||
~XCGuard()
|
~XCGuard()
|
||||||
{
|
{
|
||||||
//
|
//
|
||||||
|
ZeroMemory(alert);
|
||||||
ZeroMemory(trader);
|
ZeroMemory(trader);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1005,7 +1008,7 @@ class XCGuard : public XCBaseAlert
|
|||||||
" Position (" + ToString(position.ticket) + ") Successfully ...";
|
" Position (" + ToString(position.ticket) + ") Successfully ...";
|
||||||
|
|
||||||
//
|
//
|
||||||
SendAlert(message);
|
alert.SendAlert(message);
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -1070,7 +1073,7 @@ class XCGuard : public XCBaseAlert
|
|||||||
" Positions Successfully ...";
|
" Positions Successfully ...";
|
||||||
|
|
||||||
//
|
//
|
||||||
SendAlert(message);
|
alert.SendAlert(message);
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -1135,7 +1138,7 @@ class XCGuard : public XCBaseAlert
|
|||||||
" In Lost Positions Successfully ...";
|
" In Lost Positions Successfully ...";
|
||||||
|
|
||||||
//
|
//
|
||||||
SendAlert(message);
|
alert.SendAlert(message);
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -1200,7 +1203,7 @@ class XCGuard : public XCBaseAlert
|
|||||||
" In Profit Positions Successfully ...";
|
" In Profit Positions Successfully ...";
|
||||||
|
|
||||||
//
|
//
|
||||||
SendAlert(message);
|
alert.SendAlert(message);
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -1265,7 +1268,7 @@ class XCGuard : public XCBaseAlert
|
|||||||
" Long Positions Successfully ...";
|
" Long Positions Successfully ...";
|
||||||
|
|
||||||
//
|
//
|
||||||
SendAlert(message);
|
alert.SendAlert(message);
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -1330,7 +1333,7 @@ class XCGuard : public XCBaseAlert
|
|||||||
" In Lost Longs Positions Successfully ...";
|
" In Lost Longs Positions Successfully ...";
|
||||||
|
|
||||||
//
|
//
|
||||||
SendAlert(message);
|
alert.SendAlert(message);
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -1395,7 +1398,7 @@ class XCGuard : public XCBaseAlert
|
|||||||
" In Profit Longs Positions Successfully ...";
|
" In Profit Longs Positions Successfully ...";
|
||||||
|
|
||||||
//
|
//
|
||||||
SendAlert(message);
|
alert.SendAlert(message);
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -1477,7 +1480,7 @@ class XCGuard : public XCBaseAlert
|
|||||||
" In Lost Shorts Positions Successfully ...";
|
" In Lost Shorts Positions Successfully ...";
|
||||||
|
|
||||||
//
|
//
|
||||||
SendAlert(message);
|
alert.SendAlert(message);
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -1542,7 +1545,7 @@ class XCGuard : public XCBaseAlert
|
|||||||
" In Profit Shorts Positions Successfully ...";
|
" In Profit Shorts Positions Successfully ...";
|
||||||
|
|
||||||
//
|
//
|
||||||
SendAlert(message);
|
alert.SendAlert(message);
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -1634,7 +1637,7 @@ class XCGuard : public XCBaseAlert
|
|||||||
" Position (" + ToString(position.ticket) + ") Successfully ...";
|
" Position (" + ToString(position.ticket) + ") Successfully ...";
|
||||||
|
|
||||||
//
|
//
|
||||||
SendAlert(message);
|
alert.SendAlert(message);
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -1743,7 +1746,7 @@ class XCGuard : public XCBaseAlert
|
|||||||
" Successfully ...";
|
" Successfully ...";
|
||||||
|
|
||||||
//
|
//
|
||||||
SendAlert(message);
|
alert.SendAlert(message);
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -1848,7 +1851,7 @@ class XCGuard : public XCBaseAlert
|
|||||||
" Successfully ...";
|
" Successfully ...";
|
||||||
|
|
||||||
//
|
//
|
||||||
SendAlert(message);
|
alert.SendAlert(message);
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -1983,7 +1986,7 @@ class XCGuard : public XCBaseAlert
|
|||||||
" Successfully ...";
|
" Successfully ...";
|
||||||
|
|
||||||
//
|
//
|
||||||
SendAlert(message);
|
alert.SendAlert(message);
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -1998,6 +2001,7 @@ class XCGuard : public XCBaseAlert
|
|||||||
private:
|
private:
|
||||||
//
|
//
|
||||||
XCTrade *trader;
|
XCTrade *trader;
|
||||||
|
XCAlert *alert;
|
||||||
|
|
||||||
//
|
//
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -0,0 +1,214 @@
|
|||||||
|
|
||||||
|
//
|
||||||
|
// a Base Class by Support Alert ...
|
||||||
|
class XCBaseAlert : public XCBase
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Public ...
|
||||||
|
public:
|
||||||
|
//
|
||||||
|
// Props ...
|
||||||
|
|
||||||
|
//
|
||||||
|
// Constructor(s) ...
|
||||||
|
void XCBaseAlert()
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Instance Alert ...
|
||||||
|
mAlert = new XCAlert();
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Deconstructors ...
|
||||||
|
void ~XCBaseAlert()
|
||||||
|
{
|
||||||
|
//
|
||||||
|
delete mAlert;
|
||||||
|
|
||||||
|
//
|
||||||
|
ZeroMemory(mAlert);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Alert Handler Functions ...
|
||||||
|
|
||||||
|
//
|
||||||
|
// Alert Functions Getter(s) / Setters(s) ...
|
||||||
|
|
||||||
|
//
|
||||||
|
string GetAlertPrefix()
|
||||||
|
{
|
||||||
|
return mAlert.GetPrefix();
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
void SetAlertPrefix(string value)
|
||||||
|
{
|
||||||
|
mAlert.SetPrefix(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
bool GetAlertLogAlerts()
|
||||||
|
{
|
||||||
|
return mAlert.GetLogAlerts();
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
void SetAlertLogAlerts(bool value)
|
||||||
|
{
|
||||||
|
mAlert.SetLogAlerts(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
bool GetAlertEnableAlerts()
|
||||||
|
{
|
||||||
|
return mAlert.GetEnableAlerts();
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
void SetAlertEnableAlerts(bool value)
|
||||||
|
{
|
||||||
|
mAlert.SetEnableAlerts(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
bool GetAlertPushAlerts()
|
||||||
|
{
|
||||||
|
return mAlert.GetPushAlerts();
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
void SetAlertPushAlerts(bool value)
|
||||||
|
{
|
||||||
|
mAlert.SetPushAlerts(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
bool GetAlertMailAlerts()
|
||||||
|
{
|
||||||
|
return mAlert.GetMailAlerts();
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
void SetAlertMailAlerts(bool value)
|
||||||
|
{
|
||||||
|
mAlert.SetMailAlerts(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
bool GetAlertTerminalAlerts()
|
||||||
|
{
|
||||||
|
return mAlert.GetTerminalAlerts();
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
void SetAlertTerminalAlerts(bool value)
|
||||||
|
{
|
||||||
|
mAlert.SetTerminalAlerts(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Alert Actions ...
|
||||||
|
|
||||||
|
//
|
||||||
|
// Logging an Alert ...
|
||||||
|
void LogAlert(string message)
|
||||||
|
{
|
||||||
|
mAlert.LogAlert(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Terminal Alert ...
|
||||||
|
void TerminalAlert(string message)
|
||||||
|
{
|
||||||
|
mAlert.TerminalAlert(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Mail Alert ...
|
||||||
|
void MailAlert(string message)
|
||||||
|
{
|
||||||
|
mAlert.MailAlert(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Send Push Notification ...
|
||||||
|
void PushAlert(string message)
|
||||||
|
{
|
||||||
|
mAlert.PushAlert(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Send an Alert by Handling all Different Specified
|
||||||
|
// type's of Alert's if they are Enabled ...
|
||||||
|
void SendAlert(string message)
|
||||||
|
{
|
||||||
|
mAlert.SendAlert(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Logs ...
|
||||||
|
|
||||||
|
//
|
||||||
|
// Log a Message ...
|
||||||
|
void Log(string message)
|
||||||
|
{
|
||||||
|
mAlert.Log(message);
|
||||||
|
}
|
||||||
|
void Log(string tag, string message)
|
||||||
|
{
|
||||||
|
mAlert.Log(tag, message);
|
||||||
|
}
|
||||||
|
void LogEmpty()
|
||||||
|
{
|
||||||
|
mAlert.LogEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Log Specific Array ...
|
||||||
|
template <typename T>
|
||||||
|
void LogArray(
|
||||||
|
T &array[], // Array to Log
|
||||||
|
string label = NULL // Array Label
|
||||||
|
)
|
||||||
|
{
|
||||||
|
mAlert.LogArray(array, label);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Error ...
|
||||||
|
|
||||||
|
//
|
||||||
|
// Log an Error ...
|
||||||
|
void LogError(
|
||||||
|
int error = -1 // Specific Error, if it's equal to -1, use Last Error ...
|
||||||
|
)
|
||||||
|
{
|
||||||
|
mAlert.LogError(error);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Retrieve Specified Error Code Description ...
|
||||||
|
string GetErrorDescription(int err_code)
|
||||||
|
{
|
||||||
|
return mAlert.GetErrorDescription(err_code);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Retrieve Specified Error Code Description ...
|
||||||
|
string GetTradeServerReturnCodeDescription(int return_code)
|
||||||
|
{
|
||||||
|
return mAlert.GetTradeServerReturnCodeDescription(return_code);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Protected ...
|
||||||
|
protected:
|
||||||
|
//
|
||||||
|
// Alert ...
|
||||||
|
XCAlert *mAlert;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Private ...
|
||||||
|
private:
|
||||||
|
};
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -143,6 +143,7 @@ input string eaCloseAllOpenTradesAt = "";
|
|||||||
// Configuring Alert Provider ...
|
// Configuring Alert Provider ...
|
||||||
input group "Alert";
|
input group "Alert";
|
||||||
input bool eaEnableAlerts = true; // Enable Alerts
|
input bool eaEnableAlerts = true; // Enable Alerts
|
||||||
|
input bool eaSaveAlerts = true; // Save Alerts
|
||||||
input bool eaLogAlerts = true; // Log Alerts
|
input bool eaLogAlerts = true; // Log Alerts
|
||||||
input bool eaMailAlerts = false; // Mail Alerts
|
input bool eaMailAlerts = false; // Mail Alerts
|
||||||
input bool eaPushAlerts = true; // Push Alerts
|
input bool eaPushAlerts = true; // Push Alerts
|
||||||
@@ -318,6 +319,7 @@ int OnInit()
|
|||||||
eaExpert.eaLogAlerts = eaLogAlerts;
|
eaExpert.eaLogAlerts = eaLogAlerts;
|
||||||
eaExpert.eaMailAlerts = eaMailAlerts;
|
eaExpert.eaMailAlerts = eaMailAlerts;
|
||||||
eaExpert.eaPushAlerts = eaPushAlerts;
|
eaExpert.eaPushAlerts = eaPushAlerts;
|
||||||
|
eaExpert.eaSaveAlerts = eaSaveAlerts;
|
||||||
eaExpert.eaEnableAlerts = eaEnableAlerts;
|
eaExpert.eaEnableAlerts = eaEnableAlerts;
|
||||||
eaExpert.eaTerminalAlerts = eaTerminalAlerts;
|
eaExpert.eaTerminalAlerts = eaTerminalAlerts;
|
||||||
|
|
||||||
@@ -343,15 +345,15 @@ int OnInit()
|
|||||||
|
|
||||||
//
|
//
|
||||||
// Attach Event Handlers ...
|
// Attach Event Handlers ...
|
||||||
eaExpert.OnModifyEventHandler = OnPositionModified;
|
eaExpert.AddOnDealsChangedEventHandler(OnDealsChanged);
|
||||||
eaExpert.OnDealsChangedEventHandler = OnDealsChanged;
|
eaExpert.AddOnStopLossEventHandler(OnStopLossTriggered);
|
||||||
eaExpert.OnStopLossEventHandler = OnStopLossTriggered;
|
eaExpert.AddOnOrdersChangedEventHandler(OnOrdersChanged);
|
||||||
eaExpert.OnOrdersChangedEventHandler = OnOrdersChanged;
|
eaExpert.AddOnTakeProfitEventHandler(OnTakeProfitTriggered);
|
||||||
eaExpert.OnForceCloseEventHandler = OnPositionForceClosed;
|
eaExpert.AddOnModifyPositionEventHandler(OnPositionModified);
|
||||||
eaExpert.OnTakeProfitEventHandler = OnTakeProfitTriggered;
|
eaExpert.AddOnPositionsChangedEventHandler(OnPositionsChanged);
|
||||||
eaExpert.OnPositionsChangedEventHandler = OnPositionsChanged;
|
eaExpert.AddOnTradeStateChangedEventHandler(OnTradeStateChanged);
|
||||||
eaExpert.OnPartialCloseEventHandler = OnPositionPartialClosed;
|
eaExpert.AddOnForceClosePositionEventHandler(OnPositionForceClosed);
|
||||||
eaExpert.OnTradeStateChangedEventHandler = OnTradeStateChanged;
|
eaExpert.AddOnPartialClosePositionEventHandler(OnPositionPartialClosed);
|
||||||
|
|
||||||
//
|
//
|
||||||
bool isInited = eaExpert.HandleOnInit();
|
bool isInited = eaExpert.HandleOnInit();
|
||||||
|
|||||||
@@ -107,12 +107,12 @@ class XCXCATBEAExpert : public XCBase
|
|||||||
bool eaAllowSignallingBasedOnTriggerBlocksInsideOther; // Signalling Based on Trigger Blocks Seccond inputs
|
bool eaAllowSignallingBasedOnTriggerBlocksInsideOther; // Signalling Based on Trigger Blocks Seccond inputs
|
||||||
bool eaSecondsTriggersSLUsingFirstTriggerBlock; // Use First Trigger Block for SL of Seconds Trigger Block Signalss
|
bool eaSecondsTriggersSLUsingFirstTriggerBlock; // Use First Trigger Block for SL of Seconds Trigger Block Signalss
|
||||||
bool eaApplyValidateAndFilterOnSelectInsideOthers; // Select Trigger Blocks by Applying Validations and Filterss
|
bool eaApplyValidateAndFilterOnSelectInsideOthers; // Select Trigger Blocks by Applying Validations and Filterss
|
||||||
bool eaAllowSignallingConditions1; // Allow Market Conditions Signaller to Using Sar Starter Signals
|
bool eaAllowSignallingConditions1; // Allow Market Conditions Signaller to Using Sar Starter Signals
|
||||||
bool eaAllowSignallingConditions2; // Allow Market Conditions Signaller to Using Trend Starter Signals
|
bool eaAllowSignallingConditions2; // Allow Market Conditions Signaller to Using Trend Starter Signals
|
||||||
bool eaAllowSignallingConditions3; // Allow Market Conditions Signaller to Using Delta Starter Signals
|
bool eaAllowSignallingConditions3; // Allow Market Conditions Signaller to Using Delta Starter Signals
|
||||||
bool eaAllowSignallingConditions4; // Allow Market Conditions Signaller to Using Volume Starter Signals
|
bool eaAllowSignallingConditions4; // Allow Market Conditions Signaller to Using Volume Starter Signals
|
||||||
bool eaAllowSignallingConditions5; // Allow Market Conditions Signaller to Using Signal Bar Starter Signals
|
bool eaAllowSignallingConditions5; // Allow Market Conditions Signaller to Using Signal Bar Starter Signals
|
||||||
bool eaAllowSignallingConditions6; // Allow Market Conditions Signaller to Using HK Signal Bar Starter Signals
|
bool eaAllowSignallingConditions6; // Allow Market Conditions Signaller to Using HK Signal Bar Starter Signals
|
||||||
|
|
||||||
//
|
//
|
||||||
// Volume ...
|
// Volume ...
|
||||||
@@ -144,6 +144,7 @@ class XCXCATBEAExpert : public XCBase
|
|||||||
//
|
//
|
||||||
// Alert ...
|
// Alert ...
|
||||||
bool eaEnableAlerts; // Enable Alerts
|
bool eaEnableAlerts; // Enable Alerts
|
||||||
|
bool eaSaveAlerts; // Save Alerts
|
||||||
bool eaLogAlerts; // Log Alerts
|
bool eaLogAlerts; // Log Alerts
|
||||||
bool eaMailAlerts; // Mail Alerts
|
bool eaMailAlerts; // Mail Alerts
|
||||||
bool eaPushAlerts; // Push Alerts
|
bool eaPushAlerts; // Push Alerts
|
||||||
@@ -169,18 +170,6 @@ class XCXCATBEAExpert : public XCBase
|
|||||||
bool eaSaveLosts; // Save Lost Conditions
|
bool eaSaveLosts; // Save Lost Conditions
|
||||||
bool eaSaveRestrictions; // Save Restriction Reports
|
bool eaSaveRestrictions; // Save Restriction Reports
|
||||||
|
|
||||||
//
|
|
||||||
// Trade Event Handlers ...
|
|
||||||
TOnModify OnModifyEventHandler;
|
|
||||||
TOnStopLoss OnStopLossEventHandler;
|
|
||||||
TOnForceClose OnForceCloseEventHandler;
|
|
||||||
TOnTakeProfit OnTakeProfitEventHandler;
|
|
||||||
TOnPartialClose OnPartialCloseEventHandler;
|
|
||||||
TOnDealsChanged OnDealsChangedEventHandler;
|
|
||||||
TOnOrdersChanged OnOrdersChangedEventHandler;
|
|
||||||
TOnPositionsChanged OnPositionsChangedEventHandler;
|
|
||||||
TOnTradeStateChanged OnTradeStateChangedEventHandler;
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Requirements ...
|
// Requirements ...
|
||||||
|
|
||||||
@@ -196,6 +185,162 @@ class XCXCATBEAExpert : public XCBase
|
|||||||
//
|
//
|
||||||
// Tools / Actions / Handlers ...
|
// Tools / Actions / Handlers ...
|
||||||
|
|
||||||
|
//
|
||||||
|
// Trade Event Handlers ...
|
||||||
|
|
||||||
|
//
|
||||||
|
void AddOnStopLossEventHandler(TOnStopLoss handler)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
if (handler == NULL)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
Add(
|
||||||
|
handler,
|
||||||
|
mStopLossEventHandlers
|
||||||
|
//
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
void AddOnTakeProfitEventHandler(TOnTakeProfit handler)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
if (handler == NULL)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
Add(
|
||||||
|
handler,
|
||||||
|
mTakeProfitEventHandlers
|
||||||
|
//
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
void AddOnDealsChangedEventHandler(TOnDealsChanged handler)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
if (handler == NULL)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
Add(
|
||||||
|
handler,
|
||||||
|
mDealsChangedEventHandlers
|
||||||
|
//
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
void AddOnOrdersChangedEventHandler(TOnOrdersChanged handler)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
if (handler == NULL)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
Add(
|
||||||
|
handler,
|
||||||
|
mOrdersChangedEventHandlers
|
||||||
|
//
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
void AddOnModifyPositionEventHandler(TOnModify handler)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
if (handler == NULL)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
Add(
|
||||||
|
handler,
|
||||||
|
mOnModifyEventHandlers
|
||||||
|
//
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
void AddOnPositionsChangedEventHandler(TOnPositionsChanged handler)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
if (handler == NULL)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
Add(
|
||||||
|
handler,
|
||||||
|
mPositionsChangedEventHandlers
|
||||||
|
//
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
void AddOnTradeStateChangedEventHandler(TOnTradeStateChanged handler)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
if (handler == NULL)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
Add(
|
||||||
|
handler,
|
||||||
|
mTradeStateChangedEventHandlers
|
||||||
|
//
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
void AddOnForceClosePositionEventHandler(TOnForceClose handler)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
if (handler == NULL)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
Add(
|
||||||
|
handler,
|
||||||
|
mOnForceCloseEventHandlers
|
||||||
|
//
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
void AddOnPartialClosePositionEventHandler(TOnPartialClose handler)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
if (handler == NULL)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
Add(
|
||||||
|
handler,
|
||||||
|
mOnPartialCloseEventHandlers
|
||||||
|
//
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Validators ...
|
// Validators ...
|
||||||
|
|
||||||
@@ -239,6 +384,10 @@ class XCXCATBEAExpert : public XCBase
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
bool has = false;
|
||||||
|
int count = -1;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Initialize Alert Handler ...
|
// Initialize Alert Handler ...
|
||||||
eaAlert = new XCAlert();
|
eaAlert = new XCAlert();
|
||||||
@@ -246,6 +395,7 @@ class XCXCATBEAExpert : public XCBase
|
|||||||
eaAlert.SetLogAlerts(eaLogAlerts);
|
eaAlert.SetLogAlerts(eaLogAlerts);
|
||||||
eaAlert.SetMailAlerts(eaMailAlerts);
|
eaAlert.SetMailAlerts(eaMailAlerts);
|
||||||
eaAlert.SetPushAlerts(eaPushAlerts);
|
eaAlert.SetPushAlerts(eaPushAlerts);
|
||||||
|
eaAlert.SetSaveAlerts(eaSaveAlerts);
|
||||||
eaAlert.SetEnableAlerts(eaEnableAlerts);
|
eaAlert.SetEnableAlerts(eaEnableAlerts);
|
||||||
eaAlert.SetTerminalAlerts(eaTerminalAlerts);
|
eaAlert.SetTerminalAlerts(eaTerminalAlerts);
|
||||||
|
|
||||||
@@ -275,44 +425,139 @@ class XCXCATBEAExpert : public XCBase
|
|||||||
eaMaxAllowedPositions,
|
eaMaxAllowedPositions,
|
||||||
eaMaxAllowedDrawdownFactor //
|
eaMaxAllowedDrawdownFactor //
|
||||||
);
|
);
|
||||||
eaTrade.AddOnStopLossEventHandler(OnStopLossEventHandler);
|
|
||||||
eaTrade.AddOnTakeProfitEventHandler(OnTakeProfitEventHandler);
|
//
|
||||||
eaTrade.AddOnModifyPositionEventHandler(OnModifyEventHandler);
|
// Trade Handler Attachments ...
|
||||||
eaTrade.AddOnDealsChangedEventHandler(OnDealsChangedEventHandler);
|
|
||||||
eaTrade.AddOnOrdersChangedEventHandler(OnOrdersChangedEventHandler);
|
//
|
||||||
eaTrade.AddOnForceClosePositionEventHandler(OnForceCloseEventHandler);
|
// Position Modifiy Event Handlers ...
|
||||||
eaTrade.AddOnPartialClosePositionEventHandler(OnPartialCloseEventHandler);
|
count = ArraySize(mOnModifyEventHandlers);
|
||||||
eaTrade.AddOnPositionsChangedEventHandler(OnPositionsChangedEventHandler);
|
has = IsValidSize(count);
|
||||||
eaTrade.AddOnTradeStateChangedEventHandler(OnTradeStateChangedEventHandler);
|
if (has)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
for (int i = 0; i < count; i++)
|
||||||
|
{
|
||||||
|
eaTrade.AddOnModifyPositionEventHandler(mOnModifyEventHandlers[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Position Stop Loss Event Handlers ...
|
||||||
|
if (has)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
count = ArraySize(mStopLossEventHandlers);
|
||||||
|
has = IsValidSize(count);
|
||||||
|
for (int i = 0; i < count; i++)
|
||||||
|
{
|
||||||
|
eaTrade.AddOnStopLossEventHandler(mStopLossEventHandlers[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Position Take Profit Event Handlers ...
|
||||||
|
count = ArraySize(mTakeProfitEventHandlers);
|
||||||
|
has = IsValidSize(count);
|
||||||
|
if (has)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
for (int i = 0; i < count; i++)
|
||||||
|
{
|
||||||
|
eaTrade.AddOnTakeProfitEventHandler(mTakeProfitEventHandlers[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Position Force Close Event Handlers ...
|
||||||
|
count = ArraySize(mOnForceCloseEventHandlers);
|
||||||
|
has = IsValidSize(count);
|
||||||
|
if (has)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
for (int i = 0; i < count; i++)
|
||||||
|
{
|
||||||
|
eaTrade.AddOnForceClosePositionEventHandler(mOnForceCloseEventHandlers[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Deals Changed Event Handlers ...
|
||||||
|
count = ArraySize(mDealsChangedEventHandlers);
|
||||||
|
has = IsValidSize(count);
|
||||||
|
if (has)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
for (int i = 0; i < count; i++)
|
||||||
|
{
|
||||||
|
eaTrade.AddOnDealsChangedEventHandler(mDealsChangedEventHandlers[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Orders Changed Event Handlers ...
|
||||||
|
count = ArraySize(mOrdersChangedEventHandlers);
|
||||||
|
has = IsValidSize(count);
|
||||||
|
if (has)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
for (int i = 0; i < count; i++)
|
||||||
|
{
|
||||||
|
eaTrade.AddOnOrdersChangedEventHandler(mOrdersChangedEventHandlers[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Positions Changed Event Handlers ...
|
||||||
|
count = ArraySize(mPositionsChangedEventHandlers);
|
||||||
|
has = IsValidSize(count);
|
||||||
|
if (has)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
for (int i = 0; i < count; i++)
|
||||||
|
{
|
||||||
|
eaTrade.AddOnPositionsChangedEventHandler(mPositionsChangedEventHandlers[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//
|
||||||
|
// Trade Changed Event Handlers ...
|
||||||
|
count = ArraySize(mTradeStateChangedEventHandlers);
|
||||||
|
has = IsValidSize(count);
|
||||||
|
if (has)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
for (int i = 0; i < count; i++)
|
||||||
|
{
|
||||||
|
eaTrade.AddOnTradeStateChangedEventHandler(mTradeStateChangedEventHandlers[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//
|
||||||
|
// Postion Partially Close Event Handlers ...
|
||||||
|
count = ArraySize(mOnPartialCloseEventHandlers);
|
||||||
|
has = IsValidSize(count);
|
||||||
|
if (has)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
for (int i = 0; i < count; i++)
|
||||||
|
{
|
||||||
|
eaTrade.AddOnPartialClosePositionEventHandler(mOnPartialCloseEventHandlers[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Initialize Guard Handler ...
|
// Initialize Guard Handler ...
|
||||||
eaGuard = new XCGuard(
|
eaGuard = new XCGuard(
|
||||||
|
eaAlert,
|
||||||
eaTrade //
|
eaTrade //
|
||||||
);
|
);
|
||||||
|
|
||||||
//
|
|
||||||
eaGuard.SetAlertPrefix(eaLogSuffix);
|
|
||||||
eaGuard.SetAlertLogAlerts(eaLogAlerts);
|
|
||||||
eaGuard.SetAlertMailAlerts(eaMailAlerts);
|
|
||||||
eaGuard.SetAlertPushAlerts(eaPushAlerts);
|
|
||||||
eaGuard.SetAlertEnableAlerts(eaEnableAlerts);
|
|
||||||
eaGuard.SetAlertTerminalAlerts(eaTerminalAlerts);
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Initialize Trae Manager ...
|
// Initialize Trae Manager ...
|
||||||
eaTradeManager = new XCXCATBEATradeManager(
|
eaTradeManager = new XCXCATBEATradeManager(
|
||||||
|
eaAlert,
|
||||||
eaTrade //
|
eaTrade //
|
||||||
);
|
);
|
||||||
|
|
||||||
//
|
|
||||||
eaTradeManager.SetAlertPrefix(eaLogSuffix);
|
|
||||||
eaTradeManager.SetAlertLogAlerts(eaLogAlerts);
|
|
||||||
eaTradeManager.SetAlertMailAlerts(eaMailAlerts);
|
|
||||||
eaTradeManager.SetAlertPushAlerts(eaPushAlerts);
|
|
||||||
eaTradeManager.SetAlertEnableAlerts(eaEnableAlerts);
|
|
||||||
eaTradeManager.SetAlertTerminalAlerts(eaTerminalAlerts);
|
|
||||||
|
|
||||||
//
|
//
|
||||||
eaTradeManager.SaveWins(eaSaveWins);
|
eaTradeManager.SaveWins(eaSaveWins);
|
||||||
eaTradeManager.SaveLosts(eaSaveLosts);
|
eaTradeManager.SaveLosts(eaSaveLosts);
|
||||||
@@ -804,6 +1049,7 @@ class XCXCATBEAExpert : public XCBase
|
|||||||
*/
|
*/
|
||||||
void HandleOnTrade()
|
void HandleOnTrade()
|
||||||
{
|
{
|
||||||
|
eaTrade.HandleOnTrade();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -840,6 +1086,7 @@ class XCXCATBEAExpert : public XCBase
|
|||||||
*/
|
*/
|
||||||
void HandleOnStopLossTriggered(const XDeal &deal)
|
void HandleOnStopLossTriggered(const XDeal &deal)
|
||||||
{
|
{
|
||||||
|
eaTradeManager.HandleSL(deal);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -849,6 +1096,7 @@ class XCXCATBEAExpert : public XCBase
|
|||||||
*/
|
*/
|
||||||
void HandleOnTakeProfitTriggered(const XDeal &deal)
|
void HandleOnTakeProfitTriggered(const XDeal &deal)
|
||||||
{
|
{
|
||||||
|
eaTradeManager.HandleTP(deal);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -864,21 +1112,7 @@ class XCXCATBEAExpert : public XCBase
|
|||||||
const string comment //
|
const string comment //
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
}
|
eaTradeManager.HandleForceClose(position);
|
||||||
|
|
||||||
/**
|
|
||||||
* Handle Position Modified Event ...
|
|
||||||
*
|
|
||||||
* @param ticket: ulong, triggered Positions ticket ...
|
|
||||||
* @param profit: double, Position Profit ...
|
|
||||||
* @param comment: string, Comment ...
|
|
||||||
*/
|
|
||||||
void HandleOnPositionModified(
|
|
||||||
const ulong ticket,
|
|
||||||
const double profit,
|
|
||||||
const string comment //
|
|
||||||
)
|
|
||||||
{
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -894,6 +1128,12 @@ class XCXCATBEAExpert : public XCBase
|
|||||||
const string comment //
|
const string comment //
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
|
//
|
||||||
|
eaTradeManager.HandlePartiallyClosed(
|
||||||
|
ticket,
|
||||||
|
profit,
|
||||||
|
comment //
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -929,6 +1169,21 @@ class XCXCATBEAExpert : public XCBase
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handle Position Modified Event ...
|
||||||
|
*
|
||||||
|
* @param ticket: ulong, triggered Positions ticket ...
|
||||||
|
* @param profit: double, Position Profit ...
|
||||||
|
* @param comment: string, Comment ...
|
||||||
|
*/
|
||||||
|
void HandleOnPositionModified(
|
||||||
|
const ulong ticket,
|
||||||
|
const double profit,
|
||||||
|
const string comment //
|
||||||
|
)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Handle all Trades States Changed Event ...
|
* Handle all Trades States Changed Event ...
|
||||||
*
|
*
|
||||||
@@ -1149,6 +1404,17 @@ class XCXCATBEAExpert : public XCBase
|
|||||||
private:
|
private:
|
||||||
//
|
//
|
||||||
|
|
||||||
|
//
|
||||||
|
TOnModify mOnModifyEventHandlers[];
|
||||||
|
TOnStopLoss mStopLossEventHandlers[];
|
||||||
|
TOnTakeProfit mTakeProfitEventHandlers[];
|
||||||
|
TOnForceClose mOnForceCloseEventHandlers[];
|
||||||
|
TOnDealsChanged mDealsChangedEventHandlers[];
|
||||||
|
TOnOrdersChanged mOrdersChangedEventHandlers[];
|
||||||
|
TOnPartialClose mOnPartialCloseEventHandlers[];
|
||||||
|
TOnPositionsChanged mPositionsChangedEventHandlers[];
|
||||||
|
TOnTradeStateChanged mTradeStateChangedEventHandlers[];
|
||||||
|
|
||||||
//
|
//
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -22,10 +22,10 @@
|
|||||||
//
|
//
|
||||||
// Imports ...
|
// Imports ...
|
||||||
#include "../../Classes/x-saherelm.x-alert.class.mq5"
|
#include "../../Classes/x-saherelm.x-alert.class.mq5"
|
||||||
|
#include "../../Classes/x-saherelm.x-data.collector.class.mq5"
|
||||||
#include "../../Classes/x-saherelm.x-poi.drawer.class.mq5"
|
#include "../../Classes/x-saherelm.x-poi.drawer.class.mq5"
|
||||||
#include "../../Classes/x-saherelm.x-trade.class.mq5"
|
#include "../../Classes/x-saherelm.x-trade.class.mq5"
|
||||||
#include "../../Libraries/x-saherelm.x-poi.lib.mq5"
|
#include "../../Libraries/x-saherelm.x-poi.lib.mq5"
|
||||||
#include "../Classes/xcatbea.x-data.collector.class.mq5"
|
|
||||||
#include "../Libraries/xcatbea.lib.mq5"
|
#include "../Libraries/xcatbea.lib.mq5"
|
||||||
#include "../Libraries/xcatbea.signaller.lib.mq5"
|
#include "../Libraries/xcatbea.signaller.lib.mq5"
|
||||||
|
|
||||||
@@ -1594,27 +1594,29 @@ struct XCATBEATrade
|
|||||||
|
|
||||||
//
|
//
|
||||||
// Implementations ...
|
// Implementations ...
|
||||||
class XCXCATBEATradeManager : public XCBaseAlert
|
class XCXCATBEATradeManager : public XCBase
|
||||||
{
|
{
|
||||||
//
|
//
|
||||||
// Public ...
|
// Public ...
|
||||||
public:
|
public:
|
||||||
//
|
//
|
||||||
// Props ...
|
// Props ...
|
||||||
|
XCAlert *alert;
|
||||||
XCTrade *trader;
|
XCTrade *trader;
|
||||||
bool drawSignal;
|
bool drawSignal;
|
||||||
XCPOIDrawer *drawer;
|
XCPOIDrawer *drawer;
|
||||||
XTimeTracker timeTracker;
|
XTimeTracker timeTracker;
|
||||||
XCXCATBEADataCollector *collector;
|
XCDataCollector *collector;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Constructors ...
|
// Constructors ...
|
||||||
XCXCATBEATradeManager(
|
XCXCATBEATradeManager(
|
||||||
XCTrade *&_trader,
|
XCAlert *_alert,
|
||||||
string _path = NULL // Base Path
|
XCTrade *_trader //
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
//
|
//
|
||||||
|
alert = _alert;
|
||||||
trader = _trader;
|
trader = _trader;
|
||||||
drawSignal = true;
|
drawSignal = true;
|
||||||
drawer = new XCPOIDrawer();
|
drawer = new XCPOIDrawer();
|
||||||
@@ -1644,15 +1646,12 @@ class XCXCATBEATradeManager : public XCBaseAlert
|
|||||||
SaveTrades(false);
|
SaveTrades(false);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Normalizing Collector Path ...
|
collector = new XCDataCollector();
|
||||||
if (!IsValid(_path))
|
|
||||||
{
|
|
||||||
_path = "X121XCATBEATradeManager" + "\\" + trader.mAccount.GetCompany();
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
//
|
||||||
collector = new XCXCATBEADataCollector();
|
// Setting Collector Path ...
|
||||||
collector.Path(_path);
|
string mPath = alert.GetPrefix() + "\\" + trader.mAccount.GetCompany();
|
||||||
|
collector.Path(mPath);
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -1666,8 +1665,15 @@ class XCXCATBEATradeManager : public XCBaseAlert
|
|||||||
timeTracker.Clean();
|
timeTracker.Clean();
|
||||||
|
|
||||||
//
|
//
|
||||||
|
ZeroMemory(alert);
|
||||||
ZeroMemory(trader);
|
ZeroMemory(trader);
|
||||||
|
|
||||||
|
//
|
||||||
|
delete drawer;
|
||||||
ZeroMemory(drawer);
|
ZeroMemory(drawer);
|
||||||
|
|
||||||
|
//
|
||||||
|
delete collector;
|
||||||
ZeroMemory(collector);
|
ZeroMemory(collector);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2283,7 +2289,7 @@ class XCXCATBEATradeManager : public XCBaseAlert
|
|||||||
{
|
{
|
||||||
//
|
//
|
||||||
string message = signal.GetMessage("Provided");
|
string message = signal.GetMessage("Provided");
|
||||||
SendAlert(message);
|
alert.SendAlert(message);
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -2474,7 +2480,7 @@ class XCXCATBEATradeManager : public XCBaseAlert
|
|||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
SendAlert(message);
|
alert.SendAlert(message);
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -3183,10 +3189,10 @@ class XCXCATBEATradeManager : public XCBaseAlert
|
|||||||
//
|
//
|
||||||
string message =
|
string message =
|
||||||
(IsValid(prefix)
|
(IsValid(prefix)
|
||||||
? prefix + "\n"
|
? prefix + " | "
|
||||||
: "") +
|
: "") +
|
||||||
"Account Balance: " + ToString(balance) + currency;
|
"Account Balance: " + ToString(balance) + currency;
|
||||||
SendAlert(message);
|
alert.SendAlert(message);
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -3199,7 +3205,7 @@ class XCXCATBEATradeManager : public XCBaseAlert
|
|||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
SendAlert(message);
|
alert.SendAlert(message);
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -3595,7 +3601,7 @@ class XCXCATBEATradeManager : public XCBaseAlert
|
|||||||
{
|
{
|
||||||
//
|
//
|
||||||
string message = iInfo.GetRestrictionDescription(restrictionsPeriod);
|
string message = iInfo.GetRestrictionDescription(restrictionsPeriod);
|
||||||
SendAlert(message);
|
alert.SendAlert(message);
|
||||||
}
|
}
|
||||||
SaveRestrictions(iInfo);
|
SaveRestrictions(iInfo);
|
||||||
|
|
||||||
|
|||||||
@@ -2678,617 +2678,6 @@ void ValidateTriggerBlockLiquidities(
|
|||||||
// TODO: Implement Liquidity Validation ...
|
// TODO: Implement Liquidity Validation ...
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
|
||||||
bool DetectSignalZone(
|
|
||||||
XCPOIDrawer *&drawer,
|
|
||||||
XCX121XCatbHelper *helper,
|
|
||||||
XCBarAnalyser *barAnalyser,
|
|
||||||
XBoxZone &signalZone,
|
|
||||||
X121XCatbConditions &conditions,
|
|
||||||
int barIndex = 0,
|
|
||||||
int loopback = 10 //
|
|
||||||
)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
bool result = false;
|
|
||||||
|
|
||||||
//
|
|
||||||
// Checking Conditions ...
|
|
||||||
|
|
||||||
//
|
|
||||||
// Normalize Args ...
|
|
||||||
signalZone.Clean();
|
|
||||||
conditions.Clean();
|
|
||||||
barIndex = NormalizeInt(barIndex, 0);
|
|
||||||
loopback = NormalizeInt(loopback, 0);
|
|
||||||
|
|
||||||
//
|
|
||||||
// Validate Args ...
|
|
||||||
result = helper != NULL &&
|
|
||||||
barAnalyser != NULL;
|
|
||||||
if (!result)
|
|
||||||
{
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Reading Market Conditions ...
|
|
||||||
result = helper.GetConditions(
|
|
||||||
conditions,
|
|
||||||
barIndex,
|
|
||||||
loopback //
|
|
||||||
);
|
|
||||||
if (!result)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
signalZone.Clean();
|
|
||||||
conditions.Clean();
|
|
||||||
|
|
||||||
//
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
int zIDX = 0;
|
|
||||||
int cIDX = zIDX + 1;
|
|
||||||
int pIDX = cIDX + 1;
|
|
||||||
int p2IDX = pIDX + 1;
|
|
||||||
int p3IDX = p2IDX + 1;
|
|
||||||
int p4IDX = p3IDX + 1;
|
|
||||||
|
|
||||||
//
|
|
||||||
double sl = 0;
|
|
||||||
double tp = 0;
|
|
||||||
double upper = 0;
|
|
||||||
double lower = 0;
|
|
||||||
datetime to = NULL;
|
|
||||||
datetime from = NULL;
|
|
||||||
string signalProvider = NULL;
|
|
||||||
|
|
||||||
//
|
|
||||||
// Checking Conditions ...
|
|
||||||
|
|
||||||
//
|
|
||||||
// Detect Bar Verifications ...
|
|
||||||
|
|
||||||
//
|
|
||||||
ENUM_X_DIRECTION iDir;
|
|
||||||
|
|
||||||
//
|
|
||||||
// Rejected ...
|
|
||||||
bool isRejected =
|
|
||||||
barAnalyser
|
|
||||||
.IsRejected(
|
|
||||||
conditions.bars[cIDX],
|
|
||||||
iDir //
|
|
||||||
);
|
|
||||||
bool isBullishRejected =
|
|
||||||
isRejected &&
|
|
||||||
IsBullish(iDir);
|
|
||||||
bool isBearishRejected =
|
|
||||||
isRejected &&
|
|
||||||
IsBearish(iDir);
|
|
||||||
|
|
||||||
//
|
|
||||||
// Engulfed ...
|
|
||||||
bool isEngulfed =
|
|
||||||
barAnalyser
|
|
||||||
.IsEngulfed(
|
|
||||||
conditions.bars[cIDX],
|
|
||||||
iDir //
|
|
||||||
);
|
|
||||||
bool isBullishEngulfed =
|
|
||||||
isEngulfed &&
|
|
||||||
IsBullish(iDir);
|
|
||||||
bool isBearishEngulfed =
|
|
||||||
isEngulfed &&
|
|
||||||
IsBearish(iDir);
|
|
||||||
|
|
||||||
//
|
|
||||||
// Momentum ...
|
|
||||||
bool isMomentum =
|
|
||||||
barAnalyser
|
|
||||||
.IsMomentum(
|
|
||||||
conditions.bars[cIDX],
|
|
||||||
iDir //
|
|
||||||
);
|
|
||||||
bool isBullishMomentum =
|
|
||||||
isMomentum &&
|
|
||||||
IsBullish(iDir);
|
|
||||||
bool isBearishMomentum =
|
|
||||||
isMomentum &&
|
|
||||||
IsBearish(iDir);
|
|
||||||
|
|
||||||
//
|
|
||||||
bool isBarBullishPressured =
|
|
||||||
isBullishRejected ||
|
|
||||||
isBullishEngulfed ||
|
|
||||||
isBullishMomentum;
|
|
||||||
|
|
||||||
//
|
|
||||||
bool isBarBearishPressured =
|
|
||||||
isBearishRejected ||
|
|
||||||
isBearishEngulfed ||
|
|
||||||
isBearishMomentum;
|
|
||||||
|
|
||||||
//
|
|
||||||
// Detect Indicator Base Start Directional Movement ...
|
|
||||||
|
|
||||||
//
|
|
||||||
// SAR ...
|
|
||||||
|
|
||||||
//
|
|
||||||
bool isSarBullishStart =
|
|
||||||
//
|
|
||||||
(
|
|
||||||
//
|
|
||||||
// Current SAR is Directional ...
|
|
||||||
conditions.isSarBullish &&
|
|
||||||
//
|
|
||||||
// Previous InDirectional Sar Exists ...
|
|
||||||
helper.lastSarBearish.IsValid() &&
|
|
||||||
//
|
|
||||||
// Current Close is Over previous Sar ...
|
|
||||||
conditions.bars[cIDX].close > helper.lastSarBearish.after &&
|
|
||||||
//
|
|
||||||
// Before Close is not Over previous Sar ...
|
|
||||||
conditions.bars[pIDX].close <= helper.lastSarBearish.after
|
|
||||||
//
|
|
||||||
)
|
|
||||||
//
|
|
||||||
;
|
|
||||||
|
|
||||||
//
|
|
||||||
bool isSarBearishStart =
|
|
||||||
//
|
|
||||||
(
|
|
||||||
//
|
|
||||||
// Current SAR is Directional ...
|
|
||||||
conditions.isSarBearish &&
|
|
||||||
//
|
|
||||||
// Previous InDirectional Sar Exists ...
|
|
||||||
helper.lastSarBullish.IsValid() &&
|
|
||||||
//
|
|
||||||
// Current Close is Under previous ...
|
|
||||||
conditions.bars[cIDX].close < helper.lastSarBullish.after &&
|
|
||||||
//
|
|
||||||
// Before Close is not Under previous ...
|
|
||||||
conditions.bars[pIDX].close >= helper.lastSarBullish.after
|
|
||||||
//
|
|
||||||
)
|
|
||||||
//
|
|
||||||
;
|
|
||||||
|
|
||||||
//
|
|
||||||
// TREND ...
|
|
||||||
|
|
||||||
//
|
|
||||||
bool isTrendBullishStart =
|
|
||||||
//
|
|
||||||
(
|
|
||||||
//
|
|
||||||
// Current Trend is Directional ...
|
|
||||||
conditions.isTrendBullish &&
|
|
||||||
//
|
|
||||||
// Previous InDirectiona; Trend Exists ...
|
|
||||||
helper.lastTrendBearish.IsValid() &&
|
|
||||||
//
|
|
||||||
// Current Close is Over previous ...
|
|
||||||
conditions.bars[cIDX].close > helper.lastTrendBearish.after &&
|
|
||||||
//
|
|
||||||
// Before close is not Over previous ...
|
|
||||||
conditions.bars[pIDX].close <= helper.lastTrendBearish.after
|
|
||||||
//
|
|
||||||
)
|
|
||||||
//
|
|
||||||
;
|
|
||||||
|
|
||||||
//
|
|
||||||
bool isTrendBearishStart =
|
|
||||||
//
|
|
||||||
(
|
|
||||||
//
|
|
||||||
// Current Trend is Directional ...
|
|
||||||
conditions.isTrendBearish &&
|
|
||||||
//
|
|
||||||
// Previous InDirectiona; Trend Exists ...
|
|
||||||
helper.lastTrendBullish.IsValid() &&
|
|
||||||
//
|
|
||||||
// Current Close is Under previous ...
|
|
||||||
conditions.bars[cIDX].close < helper.lastTrendBullish.after &&
|
|
||||||
//
|
|
||||||
// Before close is not Under previous ...
|
|
||||||
conditions.bars[pIDX].close >= helper.lastTrendBullish.after
|
|
||||||
//
|
|
||||||
)
|
|
||||||
//
|
|
||||||
;
|
|
||||||
|
|
||||||
//
|
|
||||||
// ADX ...
|
|
||||||
|
|
||||||
//
|
|
||||||
bool isADXBullishStart =
|
|
||||||
//
|
|
||||||
(
|
|
||||||
//
|
|
||||||
// ADX Value is Switched to Strong ...
|
|
||||||
conditions.adxBuffer[cIDX] > conditions.adxThreshold &&
|
|
||||||
conditions.adxBuffer[pIDX] <= conditions.adxThreshold &&
|
|
||||||
//
|
|
||||||
// ADX must Up ...
|
|
||||||
conditions.adxBuffer[cIDX] > conditions.adxBuffer[pIDX] &&
|
|
||||||
//
|
|
||||||
// ADX +DI is Bigger than -DI ...
|
|
||||||
conditions.adxpBuffer[cIDX] > conditions.adxnBuffer[cIDX] &&
|
|
||||||
//
|
|
||||||
// ADX +DI is Up ...
|
|
||||||
conditions.adxpBuffer[cIDX] > conditions.adxpBuffer[pIDX]
|
|
||||||
//
|
|
||||||
)
|
|
||||||
//
|
|
||||||
;
|
|
||||||
|
|
||||||
//
|
|
||||||
bool isADXBearishStart =
|
|
||||||
//
|
|
||||||
(
|
|
||||||
//
|
|
||||||
// ADX Value is Switched to Strong ...
|
|
||||||
conditions.adxBuffer[cIDX] > conditions.adxThreshold &&
|
|
||||||
conditions.adxBuffer[pIDX] <= conditions.adxThreshold &&
|
|
||||||
//
|
|
||||||
// ADX must Up ...
|
|
||||||
conditions.adxBuffer[cIDX] > conditions.adxBuffer[pIDX] &&
|
|
||||||
//
|
|
||||||
// ADX -DI is Bigger than +DI ...
|
|
||||||
conditions.adxnBuffer[cIDX] > conditions.adxpBuffer[cIDX] &&
|
|
||||||
//
|
|
||||||
// ADX -DI is Up ...
|
|
||||||
conditions.adxnBuffer[cIDX] > conditions.adxnBuffer[pIDX]
|
|
||||||
//
|
|
||||||
)
|
|
||||||
//
|
|
||||||
;
|
|
||||||
|
|
||||||
//
|
|
||||||
// DELTA ...
|
|
||||||
|
|
||||||
//
|
|
||||||
bool isDeltaBullishStart =
|
|
||||||
//
|
|
||||||
// Check State ...
|
|
||||||
(
|
|
||||||
//
|
|
||||||
// Delta is Up ...
|
|
||||||
conditions.deltaBuffer[cIDX] > conditions.deltaBuffer[pIDX] &&
|
|
||||||
//
|
|
||||||
// Delta Signal is Up ...
|
|
||||||
conditions.deltaSignalBuffer[cIDX] > conditions.deltaSignalBuffer[pIDX] &&
|
|
||||||
//
|
|
||||||
// Delta Crossed Over Delta Signal ...
|
|
||||||
conditions.deltaBuffer[cIDX] > conditions.deltaSignalBuffer[cIDX]
|
|
||||||
//
|
|
||||||
)
|
|
||||||
//
|
|
||||||
&&
|
|
||||||
//
|
|
||||||
// Check Last InDirectional Exists ...
|
|
||||||
helper.lastDeltaBearish.IsValid() &&
|
|
||||||
//
|
|
||||||
// Current Close is Over last ...
|
|
||||||
conditions.bars[cIDX].close > helper.lastDeltaBearish.after &&
|
|
||||||
//
|
|
||||||
// Before Close is not Over last ...
|
|
||||||
conditions.bars[pIDX].close <= helper.lastDeltaBearish.after
|
|
||||||
//
|
|
||||||
;
|
|
||||||
|
|
||||||
//
|
|
||||||
bool isDeltaBearishStart =
|
|
||||||
//
|
|
||||||
// Check State ...
|
|
||||||
(
|
|
||||||
//
|
|
||||||
// Delta is Down ...
|
|
||||||
conditions.deltaBuffer[cIDX] < conditions.deltaBuffer[pIDX] &&
|
|
||||||
//
|
|
||||||
// Delta Signal is Down ...
|
|
||||||
conditions.deltaSignalBuffer[cIDX] < conditions.deltaSignalBuffer[pIDX] &&
|
|
||||||
//
|
|
||||||
// Delta Crossed Under Delta Signal ...
|
|
||||||
conditions.deltaBuffer[cIDX] < conditions.deltaSignalBuffer[cIDX]
|
|
||||||
//
|
|
||||||
)
|
|
||||||
//
|
|
||||||
&&
|
|
||||||
//
|
|
||||||
// Check Last InDirectional Exists ...
|
|
||||||
helper.lastDeltaBullish.IsValid() &&
|
|
||||||
//
|
|
||||||
// Current Close is Under last ...
|
|
||||||
conditions.bars[cIDX].close < helper.lastDeltaBullish.after &&
|
|
||||||
//
|
|
||||||
// Before Close is not Under last ...
|
|
||||||
conditions.bars[pIDX].close >= helper.lastDeltaBullish.after
|
|
||||||
//
|
|
||||||
;
|
|
||||||
|
|
||||||
//
|
|
||||||
// VOLUME ...
|
|
||||||
|
|
||||||
//
|
|
||||||
bool isVolumeBullishStart =
|
|
||||||
//
|
|
||||||
(
|
|
||||||
//
|
|
||||||
//
|
|
||||||
// Volume is Up ...
|
|
||||||
conditions.bullishVolumeBuffer[1] > conditions.bullishVolumeBuffer[2] &&
|
|
||||||
//
|
|
||||||
// Volume Signal is Up ...
|
|
||||||
conditions.bullishVolumeSignalBuffer[1] > conditions.bullishVolumeSignalBuffer[2] &&
|
|
||||||
//
|
|
||||||
// Volume Signals Crossed Over ...
|
|
||||||
conditions.bullishVolumeSignalBuffer[1] > conditions.bearishVolumeSignalBuffer[1]
|
|
||||||
//
|
|
||||||
)
|
|
||||||
//
|
|
||||||
&&
|
|
||||||
//
|
|
||||||
// Check Last InDirectional Exists ...
|
|
||||||
helper.lastVolumeBearish.IsValid() &&
|
|
||||||
//
|
|
||||||
// Current Close is Over last ...
|
|
||||||
conditions.bars[cIDX].close > helper.lastVolumeBearish.after &&
|
|
||||||
//
|
|
||||||
// Before Close is not Over last ...
|
|
||||||
conditions.bars[pIDX].close <= helper.lastVolumeBearish.after
|
|
||||||
//
|
|
||||||
;
|
|
||||||
|
|
||||||
//
|
|
||||||
bool isVolumeBearishStart =
|
|
||||||
//
|
|
||||||
(
|
|
||||||
//
|
|
||||||
//
|
|
||||||
// Volume is Up ...
|
|
||||||
conditions.bearishVolumeBuffer[1] > conditions.bearishVolumeBuffer[2] &&
|
|
||||||
//
|
|
||||||
// Volume Signal is Up ...
|
|
||||||
conditions.bearishVolumeSignalBuffer[1] > conditions.bearishVolumeSignalBuffer[2] &&
|
|
||||||
//
|
|
||||||
// Volume Signals Crossed Over ...
|
|
||||||
conditions.bearishVolumeSignalBuffer[1] > conditions.bullishVolumeSignalBuffer[1]
|
|
||||||
//
|
|
||||||
)
|
|
||||||
//
|
|
||||||
&&
|
|
||||||
//
|
|
||||||
// Check Last InDirectional Exists ...
|
|
||||||
helper.lastVolumeBullish.IsValid() &&
|
|
||||||
//
|
|
||||||
// Current Close is Over last ...
|
|
||||||
conditions.bars[cIDX].close < helper.lastVolumeBullish.after &&
|
|
||||||
//
|
|
||||||
// Before Close is not Over last ...
|
|
||||||
conditions.bars[pIDX].close >= helper.lastVolumeBullish.after
|
|
||||||
//
|
|
||||||
;
|
|
||||||
|
|
||||||
//
|
|
||||||
// SIGNAL Bar ...
|
|
||||||
|
|
||||||
//
|
|
||||||
bool isSBarBullishStart =
|
|
||||||
//
|
|
||||||
(
|
|
||||||
//
|
|
||||||
// Check Direction ...
|
|
||||||
conditions.isSBarBullish &&
|
|
||||||
//
|
|
||||||
// Previous InDirectional Exists ...
|
|
||||||
helper.lastSignalBarBearish.IsValid() &&
|
|
||||||
//
|
|
||||||
// Current Signal Bar close over prev ...
|
|
||||||
conditions.sBarCloseBuffer[cIDX] > helper.lastSignalBarBearish.after &&
|
|
||||||
//
|
|
||||||
// Prev Signal Bar not close over prev ...
|
|
||||||
conditions.sBarCloseBuffer[pIDX] <= helper.lastSignalBarBearish.after
|
|
||||||
//
|
|
||||||
)
|
|
||||||
//
|
|
||||||
;
|
|
||||||
|
|
||||||
//
|
|
||||||
bool isSBarBearishStart =
|
|
||||||
//
|
|
||||||
(
|
|
||||||
//
|
|
||||||
// Check Direction ...
|
|
||||||
conditions.isSBarBearish &&
|
|
||||||
//
|
|
||||||
// Previous InDirectional Exists ...
|
|
||||||
helper.lastSignalBarBullish.IsValid() &&
|
|
||||||
//
|
|
||||||
// Current Signal Bar close over prev ...
|
|
||||||
conditions.sBarCloseBuffer[cIDX] < helper.lastSignalBarBullish.after &&
|
|
||||||
//
|
|
||||||
// Prev Signal Bar not close over prev ...
|
|
||||||
conditions.sBarCloseBuffer[pIDX] >= helper.lastSignalBarBullish.after
|
|
||||||
//
|
|
||||||
)
|
|
||||||
//
|
|
||||||
;
|
|
||||||
|
|
||||||
//
|
|
||||||
// HKSIGNAL Bar ...
|
|
||||||
|
|
||||||
//
|
|
||||||
bool isHKSBarBullishStart =
|
|
||||||
//
|
|
||||||
(
|
|
||||||
//
|
|
||||||
// Check Direction ...
|
|
||||||
conditions.isHKSBarBullish &&
|
|
||||||
//
|
|
||||||
// Previous InDirectional Exists ...
|
|
||||||
helper.lastHKSignalBarBearish.IsValid() &&
|
|
||||||
//
|
|
||||||
// Current Signal Bar close over prev ...
|
|
||||||
conditions.hkSBarCloseBuffer[cIDX] > helper.lastHKSignalBarBearish.after &&
|
|
||||||
//
|
|
||||||
// Prev Signal Bar not close over prev ...
|
|
||||||
conditions.hkSBarCloseBuffer[pIDX] <= helper.lastHKSignalBarBearish.after
|
|
||||||
//
|
|
||||||
)
|
|
||||||
//
|
|
||||||
;
|
|
||||||
|
|
||||||
//
|
|
||||||
bool isHKSBarBearishStart =
|
|
||||||
//
|
|
||||||
(
|
|
||||||
//
|
|
||||||
// Check Direction ...
|
|
||||||
conditions.isHKSBarBearish &&
|
|
||||||
//
|
|
||||||
// Previous InDirectional Exists ...
|
|
||||||
helper.lastHKSignalBarBullish.IsValid() &&
|
|
||||||
//
|
|
||||||
// Current Signal Bar close over prev ...
|
|
||||||
conditions.hkSBarCloseBuffer[cIDX] < helper.lastHKSignalBarBullish.after &&
|
|
||||||
//
|
|
||||||
// Prev Signal Bar not close over prev ...
|
|
||||||
conditions.hkSBarCloseBuffer[pIDX] >= helper.lastHKSignalBarBullish.after
|
|
||||||
//
|
|
||||||
)
|
|
||||||
//
|
|
||||||
;
|
|
||||||
|
|
||||||
//
|
|
||||||
// Check for Vale and Peak ...
|
|
||||||
|
|
||||||
//
|
|
||||||
bool isPeakOverLast =
|
|
||||||
//
|
|
||||||
(conditions.peakBuffer[cIDX] > conditions.peakBuffer[pIDX] &&
|
|
||||||
conditions.peakBuffer[pIDX] <= conditions.peakBuffer[p2IDX] &&
|
|
||||||
conditions.bars[cIDX].close > conditions.peakBuffer[pIDX])
|
|
||||||
//
|
|
||||||
;
|
|
||||||
|
|
||||||
//
|
|
||||||
bool isValeUnderLast =
|
|
||||||
//
|
|
||||||
(conditions.valeBuffer[cIDX] < conditions.valeBuffer[pIDX] &&
|
|
||||||
conditions.valeBuffer[pIDX] >= conditions.valeBuffer[p2IDX] &&
|
|
||||||
conditions.bars[cIDX].close < conditions.valeBuffer[pIDX])
|
|
||||||
//
|
|
||||||
;
|
|
||||||
|
|
||||||
//
|
|
||||||
// Start Different Conditions Implemntation ...
|
|
||||||
|
|
||||||
//
|
|
||||||
// Condition 1:
|
|
||||||
// ---------------------------
|
|
||||||
// Descriptions:
|
|
||||||
//
|
|
||||||
//
|
|
||||||
// ---------------------------
|
|
||||||
|
|
||||||
//
|
|
||||||
// Bullish ...
|
|
||||||
bool isCond1Bullish = false;
|
|
||||||
|
|
||||||
//
|
|
||||||
// Bearish ...
|
|
||||||
bool isCond1Bearish = false;
|
|
||||||
|
|
||||||
//
|
|
||||||
bool isCond1 =
|
|
||||||
isCond1Bullish ||
|
|
||||||
isCond1Bearish;
|
|
||||||
if (isCond1)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
// Prepare Cond1 Based Requirements ...
|
|
||||||
|
|
||||||
//
|
|
||||||
to = NULL;
|
|
||||||
upper = 0;
|
|
||||||
lower = 0;
|
|
||||||
from = NULL;
|
|
||||||
|
|
||||||
//
|
|
||||||
// Provider Definition ...
|
|
||||||
signalProvider = "Cond1";
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Try to Summarize Conditions ...
|
|
||||||
|
|
||||||
//
|
|
||||||
bool isBullish =
|
|
||||||
//
|
|
||||||
isCond1Bullish
|
|
||||||
//
|
|
||||||
;
|
|
||||||
|
|
||||||
//
|
|
||||||
bool isBearish =
|
|
||||||
//
|
|
||||||
isCond1Bearish
|
|
||||||
//
|
|
||||||
;
|
|
||||||
|
|
||||||
//
|
|
||||||
// Summarize Result ...
|
|
||||||
result =
|
|
||||||
isBullish ||
|
|
||||||
isBearish;
|
|
||||||
if (result)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
// Prepare Signal Zone ...
|
|
||||||
|
|
||||||
//
|
|
||||||
signalZone.to = to;
|
|
||||||
signalZone.from = from;
|
|
||||||
signalZone.upper = upper;
|
|
||||||
signalZone.lower = lower;
|
|
||||||
signalZone.type = signalProvider;
|
|
||||||
signalZone.symbol = conditions.symbol;
|
|
||||||
signalZone.period = conditions.period;
|
|
||||||
|
|
||||||
//
|
|
||||||
signalZone.dir =
|
|
||||||
isBullish
|
|
||||||
? X_DIRECTION_BULLISH
|
|
||||||
: X_DIRECTION_BEARISH;
|
|
||||||
|
|
||||||
//
|
|
||||||
// Validate Signal Zone ...
|
|
||||||
result = signalZone.IsValid();
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Cleanup Resources ...
|
|
||||||
|
|
||||||
//
|
|
||||||
if (!result)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
signalZone.Clean();
|
|
||||||
conditions.Clean();
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Draw Specific Trigger Block ...
|
// Draw Specific Trigger Block ...
|
||||||
bool DrawTriggerBlock(
|
bool DrawTriggerBlock(
|
||||||
|
|||||||
Reference in New Issue
Block a user