884 lines
15 KiB
Plaintext
884 lines
15 KiB
Plaintext
///////////////////////////////////////////////////////
|
|
//
|
|
// SaherElm IT Center MQL5 Class Library
|
|
// --------------------------------------
|
|
// Name: XCBaseExpert
|
|
// Description: provides all based classes for use ...
|
|
//
|
|
//
|
|
// 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.xalert.class.mq5"
|
|
#include "../Classes/x-saherelm.xtrade.class.mq5"
|
|
#include "../Helpers/x-saherelm.xcc.helper.mq5"
|
|
#include "../Helpers/x-saherelm.xct.helper.mq5"
|
|
|
|
//
|
|
// Definitions ...
|
|
string XCBaseExpertToken = "XCBaseEA";
|
|
|
|
//
|
|
// Inputs ...
|
|
|
|
//
|
|
// Implementations ...
|
|
class XCBaseExpert : public XSCBaseAlert
|
|
{
|
|
//
|
|
public:
|
|
//
|
|
|
|
//
|
|
XSCTrade *mTrader; // Trader of Expert Adviser ...
|
|
|
|
//
|
|
// Constructur(s) ...
|
|
void XCBaseExpert()
|
|
{
|
|
}
|
|
|
|
//
|
|
// Deconstructor ...
|
|
void ~XCBaseExpert()
|
|
{
|
|
}
|
|
|
|
//
|
|
// Getter(s) / Setter(s) ...
|
|
|
|
//
|
|
// Common ...
|
|
|
|
/**
|
|
* Get Magic Number ...
|
|
*
|
|
* @return ( long )
|
|
*/
|
|
long MagicNumber()
|
|
{
|
|
return mMagicNumber;
|
|
}
|
|
|
|
/**
|
|
* Set Magic Number ...
|
|
*
|
|
* @param value: Long ...
|
|
*/
|
|
void MagicNumber(long value)
|
|
{
|
|
mMagicNumber = value;
|
|
}
|
|
|
|
/**
|
|
* Get Slippage ...
|
|
*
|
|
* @return ( int )
|
|
*/
|
|
int Slippage()
|
|
{
|
|
return mSlippage;
|
|
}
|
|
|
|
/**
|
|
* Set Slippage ...
|
|
*
|
|
* @param value: Integer ...
|
|
*/
|
|
void Slippage(int value)
|
|
{
|
|
mSlippage = value;
|
|
}
|
|
|
|
/**
|
|
* Get Tag Prefix ...
|
|
*
|
|
* @return ( string )
|
|
*/
|
|
string TagPrefix()
|
|
{
|
|
return mTagPrefix;
|
|
}
|
|
|
|
/**
|
|
* Set Tag Prefix ...
|
|
*
|
|
* @param value: String ...
|
|
*/
|
|
void TagPrefix(string value)
|
|
{
|
|
mTagPrefix = value;
|
|
}
|
|
|
|
//
|
|
// Symbol ...
|
|
|
|
/**
|
|
* Get Period ...
|
|
*
|
|
* @return ( ENUM_TIMEFRAMES )
|
|
*/
|
|
ENUM_TIMEFRAMES GetPeriod()
|
|
{
|
|
return mPeriod;
|
|
}
|
|
|
|
/**
|
|
* Set Period ...
|
|
*
|
|
* @param value: ENUM_TIMEFRAMES member ...
|
|
*/
|
|
void SetPeriod(ENUM_TIMEFRAMES value)
|
|
{
|
|
mPeriod = value;
|
|
}
|
|
|
|
/**
|
|
* Get Symbol ...
|
|
*
|
|
* @return ( string )
|
|
*/
|
|
string GetSymbol()
|
|
{
|
|
return mSymbol;
|
|
}
|
|
|
|
/**
|
|
* Set Symbol ...
|
|
*
|
|
* @param value: String ...
|
|
*/
|
|
void SetSymbol(string value)
|
|
{
|
|
mSymbol = value;
|
|
}
|
|
|
|
/**
|
|
* Get Multi Symbol is Enable or Not ...
|
|
*
|
|
* @return ( bool )
|
|
*/
|
|
bool MultiSymbol()
|
|
{
|
|
return mMultiSymbol;
|
|
}
|
|
|
|
/**
|
|
* Set Multi Symbol is Enable or Not ...
|
|
*
|
|
* @param value: Boolean ...
|
|
*/
|
|
void MultiSymbol(bool value)
|
|
{
|
|
mMultiSymbol = value;
|
|
}
|
|
|
|
/**
|
|
* Get Multi Provided Symbols ...
|
|
*
|
|
* @return ( string )
|
|
*/
|
|
string Symbols()
|
|
{
|
|
return mSymbols;
|
|
}
|
|
|
|
/**
|
|
* Set Multi Provided Symbols ...
|
|
*
|
|
* @param value: String ...
|
|
*/
|
|
void Symbols(string value)
|
|
{
|
|
mSymbols = value;
|
|
}
|
|
|
|
//
|
|
// Signalling ...
|
|
|
|
/**
|
|
* Get Force Disable Signalling ...
|
|
*
|
|
* @return ( bool )
|
|
*/
|
|
bool Disabled()
|
|
{
|
|
return mDisabled;
|
|
}
|
|
|
|
/**
|
|
* Set Force Disable Signalling ...
|
|
*
|
|
* @param value: Boolean ...
|
|
*/
|
|
void Disabled(bool value)
|
|
{
|
|
mDisabled = value;
|
|
}
|
|
|
|
/**
|
|
* Get Allow Long Signals ...
|
|
*
|
|
* @return ( bool )
|
|
*/
|
|
bool AllowLong()
|
|
{
|
|
return mAllowLong;
|
|
}
|
|
|
|
/**
|
|
* Set Allow Long Signals ...
|
|
*
|
|
* @param value: Boolean ...
|
|
*/
|
|
void AllowLong(bool value)
|
|
{
|
|
mAllowLong = value;
|
|
}
|
|
|
|
/**
|
|
* Get Allow Short Signalling ...
|
|
*
|
|
* @return ( bool )
|
|
*/
|
|
bool AllowShort()
|
|
{
|
|
return mAllowShort;
|
|
}
|
|
|
|
/**
|
|
* Set Allow Short Signalling ...
|
|
*
|
|
* @param value: Boolean ...
|
|
*/
|
|
void AllowShort(bool value)
|
|
{
|
|
mAllowShort = value;
|
|
}
|
|
|
|
//
|
|
// Reports ...
|
|
|
|
/**
|
|
* Get Report New Month State ...
|
|
*
|
|
* @return ( bool )
|
|
*/
|
|
bool ReportNewMonths()
|
|
{
|
|
return mReportNewMonths;
|
|
}
|
|
|
|
/**
|
|
* Set Report New Month State ...
|
|
*
|
|
* @param value: Boolean ...
|
|
*/
|
|
void ReportNewMonths(bool value)
|
|
{
|
|
mReportNewMonths = value;
|
|
}
|
|
|
|
/**
|
|
* Get Report New Weeks State ...
|
|
*
|
|
* @return ( bool )
|
|
*/
|
|
bool ReportNewWeeks()
|
|
{
|
|
return mReportNewWeeks;
|
|
}
|
|
|
|
/**
|
|
* Set Report New Weeks State ...
|
|
*
|
|
* @param value: Boolean ...
|
|
*/
|
|
void ReportNewWeeks(bool value)
|
|
{
|
|
mReportNewWeeks = value;
|
|
}
|
|
|
|
/**
|
|
* Get Report New Days State ...
|
|
*
|
|
* @return ( bool )
|
|
*/
|
|
bool ReportNewDays()
|
|
{
|
|
return mReportNewDays;
|
|
}
|
|
|
|
/**
|
|
* Set Report New Days State ...
|
|
*
|
|
* @param value: Boolean ...
|
|
*/
|
|
void ReportNewDays(bool value)
|
|
{
|
|
mReportNewDays = value;
|
|
}
|
|
|
|
/**
|
|
* Get Report New Hours State ...
|
|
*
|
|
* @return ( bool )
|
|
*/
|
|
bool ReportNewHours()
|
|
{
|
|
return mReportNewHours;
|
|
}
|
|
|
|
/**
|
|
* Set Report New Hours State ...
|
|
*
|
|
* @param value: Boolean ...
|
|
*/
|
|
void ReportNewHours(bool value)
|
|
{
|
|
mReportNewHours = value;
|
|
}
|
|
|
|
//
|
|
// Actions ...
|
|
|
|
/**
|
|
* Handle Expert OnInit Event ...
|
|
*
|
|
* @return ( bool )
|
|
*/
|
|
bool HandleOnInit()
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
string message = "";
|
|
|
|
//
|
|
// Validate Input ...
|
|
result = ValidateInputs();
|
|
if (!result)
|
|
{
|
|
//
|
|
message = "Invalid Inputs ....";
|
|
|
|
//
|
|
Alert(message);
|
|
}
|
|
|
|
//
|
|
// Initial All Requirements ...
|
|
result = InitEA();
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Initial All GUI Requirements ...
|
|
result = InitGUI();
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
message = "Initialized Successfully ...";
|
|
Alert(message);
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* Handle Expert OnDeInit Event ...
|
|
*/
|
|
void HandleOnDeInit()
|
|
{
|
|
//
|
|
// Destroy all GUI Requirements ...
|
|
DestroyGUI();
|
|
|
|
//
|
|
// Alert De Initialization Succeeded ...
|
|
string msg = "De Initialized Successfully ...";
|
|
Alert(msg);
|
|
|
|
//
|
|
// Destroy all EA Requirements ...
|
|
DestroyEA();
|
|
}
|
|
|
|
/**
|
|
* Handle Expert OnTick Event ...
|
|
*/
|
|
void HandleOnTick()
|
|
{
|
|
//
|
|
UpdateGUI();
|
|
HandleReportTime();
|
|
HandleStrategiesOnTick();
|
|
}
|
|
|
|
/**
|
|
* Handle Expert OnTrade Event ...
|
|
*/
|
|
void HandleOnTrade()
|
|
{
|
|
mTrader.HandleOnTrade();
|
|
}
|
|
|
|
/**
|
|
* Handle Expert OnTimer Event ...
|
|
*/
|
|
void HandleOnTimer()
|
|
{
|
|
}
|
|
|
|
/**
|
|
* Handle Expert OnChart Event ...
|
|
*/
|
|
void HandleOnChartEvent(
|
|
const int id,
|
|
const long &lparam,
|
|
const double &dparam,
|
|
const string &sparam //
|
|
)
|
|
{
|
|
}
|
|
|
|
//
|
|
// Virtual Actions ...
|
|
|
|
/**
|
|
* Apply Default Configurations ...
|
|
*/
|
|
virtual void DefaultConfigure()
|
|
{
|
|
//
|
|
// Commons ...
|
|
Slippage(10);
|
|
TagPrefix("");
|
|
MagicNumber(1694056);
|
|
|
|
//
|
|
// Symbol ...
|
|
SetSymbol(_Symbol);
|
|
SetPeriod(_Period);
|
|
MultiSymbol(false);
|
|
Symbols("EURUSDb,GBPUSDb,USDJPYb,USDCHFb,DowJones30,XAUUSDb");
|
|
|
|
//
|
|
// Signalling ...
|
|
Disabled(false);
|
|
AllowLong(true);
|
|
AllowShort(true);
|
|
|
|
//
|
|
string tag = GetTag();
|
|
|
|
//
|
|
// Alert ...
|
|
SetAlertPrefix(tag);
|
|
SetAlertLogAlerts(true);
|
|
SetAlertPushAlerts(true);
|
|
SetAlertMailAlerts(false);
|
|
SetAlertEnableAlerts(true);
|
|
SetAlertTerminalAlerts(false);
|
|
|
|
//
|
|
// Reports ...
|
|
ReportNewDays(true);
|
|
ReportNewWeeks(false);
|
|
ReportNewHours(false);
|
|
ReportNewMonths(false);
|
|
}
|
|
|
|
/**
|
|
* Vaslidate Inputs ...
|
|
*
|
|
* @return ( virtual bool )
|
|
*/
|
|
virtual bool ValidateInputs()
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
string errMessage = "";
|
|
|
|
//
|
|
bool isCommonValid = (
|
|
//
|
|
mSlippage > 0 &&
|
|
mMagicNumber > 0
|
|
//
|
|
);
|
|
if (!isCommonValid)
|
|
{
|
|
//
|
|
errMessage += "common configurations error;" + "\n";
|
|
}
|
|
|
|
//
|
|
result =
|
|
//
|
|
// Common ...
|
|
isCommonValid &&
|
|
//
|
|
// Otere ...
|
|
true
|
|
//
|
|
;
|
|
|
|
//
|
|
if (!result)
|
|
{
|
|
//
|
|
// Since here Logger not Initiallized, we Use Raw Print Command ...
|
|
errMessage = " Errors: \n" + errMessage;
|
|
Alert(errMessage);
|
|
}
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Initializers and DeInitializers ...
|
|
|
|
/**
|
|
* Initial EA Requirements ...
|
|
*
|
|
* @return ( virtual bool )
|
|
*/
|
|
virtual bool InitEA()
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
// Initialize Indicator Helpers ...
|
|
|
|
//
|
|
// Bar Timer ...
|
|
XCTInputs ctInputs;
|
|
ctInputs.Default(); // Default Configurations ...
|
|
mCTHelper = new XSCXCTHelper();
|
|
result = mCTHelper.Init(
|
|
_Symbol,
|
|
_Period,
|
|
ctInputs //
|
|
);
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Bar Styles ...
|
|
XCCInputs ccInputs;
|
|
ccInputs.Default(); // Default Configurations ...
|
|
mCCHelper = new XSCXCCHelper();
|
|
result = mCCHelper.Init(
|
|
_Symbol,
|
|
_Period,
|
|
ccInputs //
|
|
);
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Create Trader Instance and Configure it ...
|
|
mTrader = new XSCTrade(
|
|
mSlippage,
|
|
mMagicNumber //
|
|
);
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* Destroy Initialized Requirements ...
|
|
*/
|
|
virtual void DestroyEA()
|
|
{
|
|
//
|
|
delete mCTHelper;
|
|
delete mCCHelper;
|
|
}
|
|
|
|
/**
|
|
* GUI Initialize if required ...
|
|
*
|
|
* @return ( virtual bool )
|
|
*/
|
|
virtual bool InitGUI()
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
result = true;
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* Update All GUI Contents ...
|
|
*/
|
|
virtual void UpdateGUI()
|
|
{
|
|
}
|
|
|
|
/**
|
|
* Destroy all Initialized GUi Elements ...
|
|
*/
|
|
virtual void DestroyGUI()
|
|
{
|
|
}
|
|
|
|
//
|
|
// Event Handlers ...
|
|
|
|
/**
|
|
* Calls When a Position's SL Triggered ...
|
|
*
|
|
* @param deal: XDeal instance ...
|
|
*/
|
|
virtual void HandleOnStopLossTriggered(const XDeal &deal)
|
|
{
|
|
HandleReportBalance();
|
|
}
|
|
|
|
/**
|
|
* Calls When a Position's TP Triggered ...
|
|
*
|
|
* @param deal: XDeal instance ...
|
|
*/
|
|
virtual void HandleOnTakeProfitTriggered(const XDeal &deal)
|
|
{
|
|
HandleReportBalance();
|
|
}
|
|
|
|
/**
|
|
* Handle Force Close a Position ...
|
|
*
|
|
* @param ticket: Position Ticket ...
|
|
* @param position: XPosition ...
|
|
* @param comment: Closing Comment ...
|
|
*/
|
|
virtual void HandleOnPositionForceClosed(
|
|
const ulong ticket,
|
|
const XPosition &position,
|
|
const string comment //
|
|
)
|
|
{
|
|
HandleReportBalance();
|
|
}
|
|
|
|
/**
|
|
* Handle Position Modified ...
|
|
*
|
|
* @param ticket: ULONG ...
|
|
* @param profit: Double ...
|
|
* @param comment: String ...
|
|
*/
|
|
virtual void HandleOnPositionModified(
|
|
const ulong ticket,
|
|
const double profit,
|
|
const string comment //
|
|
)
|
|
{
|
|
}
|
|
|
|
/**
|
|
* Handle Position Partially Closed ...
|
|
*
|
|
* @param ticket: ULONG ...
|
|
* @param profit: Double ...
|
|
* @param comment: String ...
|
|
*/
|
|
virtual void HandleOnPositionPartialClosed(
|
|
const ulong ticket,
|
|
const double profit,
|
|
const string comment //
|
|
)
|
|
{
|
|
}
|
|
|
|
/**
|
|
* Do All Signalling Processing Here ...
|
|
*/
|
|
virtual void HandleStrategiesOnTick()
|
|
{
|
|
}
|
|
|
|
/**
|
|
* Generate Identifier Tag ...
|
|
*
|
|
* @return ( virtual string )
|
|
*/
|
|
virtual string GetTag()
|
|
{
|
|
//
|
|
string result = NULL;
|
|
|
|
//
|
|
string tagPrefix = TagPrefix();
|
|
if (IsValid(tagPrefix))
|
|
{
|
|
result = tagPrefix;
|
|
}
|
|
else
|
|
{
|
|
result = "";
|
|
}
|
|
|
|
//
|
|
result =
|
|
XCBaseExpertToken + result;
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
protected:
|
|
//
|
|
|
|
//
|
|
// Props ...
|
|
|
|
//
|
|
XTimeTracker mTimeTracker; // Time Tracker for Providing Reports ...
|
|
XSCXCTHelper *mCTHelper; // Bar Timer Indicator Helper class ...
|
|
XSCXCCHelper *mCCHelper; // Chart Styler Indicator Helper Class ...
|
|
|
|
//
|
|
// Actions ...
|
|
|
|
/**
|
|
* Report Account Balance ...
|
|
*/
|
|
void HandleReportBalance()
|
|
{
|
|
//
|
|
if (!IsRunningOnTestMode())
|
|
{
|
|
return;
|
|
}
|
|
|
|
//
|
|
string msg = "Balance: " + ToString(mTrader.mAccount.GetBalance());
|
|
Log(msg);
|
|
}
|
|
|
|
/**
|
|
* Time Reporting based on Inputs ...
|
|
*/
|
|
void HandleReportTime()
|
|
{
|
|
//
|
|
// Monthly Report ....
|
|
if (mReportNewMonths &&
|
|
mTimeTracker.IsNewMonth())
|
|
{
|
|
//
|
|
string msg = "New Month ...";
|
|
|
|
//
|
|
Alert(msg);
|
|
}
|
|
|
|
//
|
|
// Weekly Report ....
|
|
if (mReportNewWeeks &&
|
|
mTimeTracker.IsNewWeek())
|
|
{
|
|
//
|
|
string msg = "New Week ...";
|
|
|
|
//
|
|
Alert(msg);
|
|
}
|
|
|
|
//
|
|
// Daily Report ....
|
|
if (mReportNewDays &&
|
|
mTimeTracker.IsNewDay())
|
|
{
|
|
//
|
|
string msg = "New Day ...";
|
|
|
|
//
|
|
Alert(msg);
|
|
}
|
|
|
|
//
|
|
// Hourly Report ....
|
|
if (mReportNewHours &&
|
|
mTimeTracker.IsNewHour())
|
|
{
|
|
//
|
|
string msg = "New Hour ...";
|
|
|
|
//
|
|
Alert(msg);
|
|
}
|
|
}
|
|
|
|
//
|
|
private:
|
|
//
|
|
|
|
//
|
|
// Props ...
|
|
|
|
//
|
|
// Common ...
|
|
long mMagicNumber; // Magic Number ...
|
|
int mSlippage; // Slippage ...
|
|
string mTagPrefix; // Tag Prefix ...
|
|
|
|
//
|
|
// Symbol ...
|
|
ENUM_TIMEFRAMES mPeriod; // Period ...
|
|
string mSymbol; // Symbol ...
|
|
bool mMultiSymbol; // Multi Symbol is Enable or Not ...
|
|
string mSymbols; // Multi Provided Symbols ...
|
|
|
|
//
|
|
// Signalling ...
|
|
bool mDisabled; // Force Disable Signalling ...
|
|
bool mAllowLong; // Allow Long Signals ...
|
|
bool mAllowShort; // Allow Short Signals ...
|
|
|
|
//
|
|
// Reports ...
|
|
bool mReportNewMonths; // Report New Month ...
|
|
bool mReportNewWeeks; // Report New Weeks ...
|
|
bool mReportNewDays; // Report New Days ...
|
|
bool mReportNewHours; // Report New Hours ...
|
|
|
|
//
|
|
};
|
|
|
|
// |