last ...
This commit is contained in:
@@ -0,0 +1,854 @@
|
|||||||
|
///////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// 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 AllowLomg()
|
||||||
|
{
|
||||||
|
return mAllowLomg;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Allow Long Signals ...
|
||||||
|
*
|
||||||
|
* @param value: Boolean ...
|
||||||
|
*/
|
||||||
|
void AllowLomg(bool value)
|
||||||
|
{
|
||||||
|
mAllowLomg = 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);
|
||||||
|
AllowLomg(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();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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 mAllowLomg; // 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 ...
|
||||||
|
|
||||||
|
//
|
||||||
|
};
|
||||||
|
|
||||||
|
//
|
||||||
@@ -0,0 +1,422 @@
|
|||||||
|
///////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// SaherElm IT Center MQL5 Class Library
|
||||||
|
// --------------------------------------
|
||||||
|
// Name: XC121SMCExpert
|
||||||
|
// 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.xexpert.class.mq5"
|
||||||
|
#include "../Strategy/x-121.smc.ob.strategy.class.mq5"
|
||||||
|
#include "../Strategy/x-121.smc.supdem.strategy.class.mq5"
|
||||||
|
|
||||||
|
//
|
||||||
|
// Definitions ...
|
||||||
|
string XC121SMCExpertToken = "XC121SMCEA";
|
||||||
|
|
||||||
|
//
|
||||||
|
// Implementation ...
|
||||||
|
|
||||||
|
class XC121SMCExpert : public XCBaseExpert
|
||||||
|
{
|
||||||
|
//
|
||||||
|
public:
|
||||||
|
//
|
||||||
|
|
||||||
|
//
|
||||||
|
// Override Actions ...
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Apply Default Configurations ...
|
||||||
|
*/
|
||||||
|
void DefaultConfigure() override
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Commons ...
|
||||||
|
Slippage(10);
|
||||||
|
TagPrefix("");
|
||||||
|
MagicNumber(1694056);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Symbol ...
|
||||||
|
SetSymbol(_Symbol);
|
||||||
|
SetPeriod(_Period);
|
||||||
|
MultiSymbol(false);
|
||||||
|
Symbols("EURUSDb,GBPUSDb,USDJPYb,USDCHFb,DowJones30,XAUUSDb");
|
||||||
|
|
||||||
|
//
|
||||||
|
// Signalling ...
|
||||||
|
Disabled(false);
|
||||||
|
AllowLomg(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 ( bool )
|
||||||
|
*/
|
||||||
|
bool ValidateInputs() override
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
string errMessage = "";
|
||||||
|
|
||||||
|
//
|
||||||
|
bool isCommonValid = (
|
||||||
|
//
|
||||||
|
Slippage() > 0 &&
|
||||||
|
MagicNumber() > 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 ( bool )
|
||||||
|
*/
|
||||||
|
bool InitEA() override
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Initialize Indicator Helpers ...
|
||||||
|
|
||||||
|
//
|
||||||
|
// Bar Timer ...
|
||||||
|
XCTInputs ctInputs;
|
||||||
|
ctInputs.Default(); // Default Configurations ...
|
||||||
|
mCTHelper = new XSCXCTHelper();
|
||||||
|
result = mCTHelper.Init(
|
||||||
|
GetSymbol(),
|
||||||
|
GetPeriod(),
|
||||||
|
ctInputs //
|
||||||
|
);
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Bar Styles ...
|
||||||
|
XCCInputs ccInputs;
|
||||||
|
ccInputs.Default(); // Default Configurations ...
|
||||||
|
mCCHelper = new XSCXCCHelper();
|
||||||
|
result = mCCHelper.Init(
|
||||||
|
GetSymbol(),
|
||||||
|
GetPeriod(),
|
||||||
|
ccInputs //
|
||||||
|
);
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Create Trader Instance and Configure it ...
|
||||||
|
mTrader = new XSCTrade(
|
||||||
|
Slippage(),
|
||||||
|
MagicNumber() //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Parsers ...
|
||||||
|
XSymbolParser _symbolParser;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Single Symbol ...
|
||||||
|
if (!MultiSymbol())
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Register Strategy ...
|
||||||
|
|
||||||
|
//
|
||||||
|
// Create Class Instance ...
|
||||||
|
XCX121SMCBaseStrategy *iX121SMCStrategy;
|
||||||
|
iX121SMCStrategy = new XCX121SMCOBStrategy(
|
||||||
|
_Symbol,
|
||||||
|
_Period //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
iX121SMCStrategy.AddXSignalEventHandler(OnSignalRecieved);
|
||||||
|
|
||||||
|
//
|
||||||
|
ConfigureStrategy(iX121SMCStrategy);
|
||||||
|
RegisterStrategy(iX121SMCStrategy);
|
||||||
|
}
|
||||||
|
//
|
||||||
|
// Multi Symbol ...
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Parse Symbols ...
|
||||||
|
string symbols[];
|
||||||
|
int symbolsCount = SplitContent(
|
||||||
|
symbols,
|
||||||
|
eaSymbols //
|
||||||
|
);
|
||||||
|
result = IsValidSize(symbolsCount);
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
for (int i = 0; i < symbolsCount; i++)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Select Symbol ...
|
||||||
|
string iSymbol = symbols[i];
|
||||||
|
|
||||||
|
//
|
||||||
|
// Register Strategy Based On Symbol ...
|
||||||
|
|
||||||
|
//
|
||||||
|
// Parse Symbol ...
|
||||||
|
bool isEURUSD = _symbolParser.IsEURUSD(_Symbol);
|
||||||
|
bool isGBPUSD = _symbolParser.IsGBPUSD(_Symbol);
|
||||||
|
bool isEURGBP = _symbolParser.IsEURGBP(_Symbol);
|
||||||
|
bool isUSDCHF = _symbolParser.IsUSDCHF(_Symbol);
|
||||||
|
bool isEURCHF = _symbolParser.IsEURCHF(_Symbol);
|
||||||
|
bool isUSDJPY = _symbolParser.IsUSDJPY(_Symbol);
|
||||||
|
bool isEURJPY = _symbolParser.IsEURJPY(_Symbol);
|
||||||
|
bool isUSDCAD = _symbolParser.IsUSDCAD(_Symbol);
|
||||||
|
bool isEURCAD = _symbolParser.IsEURCAD(_Symbol);
|
||||||
|
bool isAUDUSD = _symbolParser.IsAUDUSD(_Symbol);
|
||||||
|
bool isEURAUD = _symbolParser.IsEURAUD(_Symbol);
|
||||||
|
bool isNZDUSD = _symbolParser.IsNZDUSD(_Symbol);
|
||||||
|
bool isEURNZD = _symbolParser.IsEURNZD(_Symbol);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Check Symbol Can Register or not ...
|
||||||
|
bool canRegisterStrategy = true;
|
||||||
|
|
||||||
|
//
|
||||||
|
if (canRegisterStrategy)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Create Class Instance ...
|
||||||
|
XCX121SMCBaseStrategy *iX121SMCStrategy;
|
||||||
|
iX121SMCStrategy = new XCX121SMCOBStrategy(
|
||||||
|
iSymbol,
|
||||||
|
_Period //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
iX121SMCStrategy.AddXSignalEventHandler(OnSignalRecieved);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Register Strategy ...
|
||||||
|
ConfigureStrategy(iX121SMCStrategy);
|
||||||
|
RegisterStrategy(iX121SMCStrategy);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generate Identifier Tag ...
|
||||||
|
*
|
||||||
|
* @return ( string )
|
||||||
|
*/
|
||||||
|
string GetTag() override
|
||||||
|
{
|
||||||
|
//
|
||||||
|
string result = NULL;
|
||||||
|
|
||||||
|
//
|
||||||
|
string tagPrefix = TagPrefix();
|
||||||
|
if (IsValid(tagPrefix))
|
||||||
|
{
|
||||||
|
result = tagPrefix;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
result =
|
||||||
|
XCBaseExpertToken + result;
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
protected:
|
||||||
|
//
|
||||||
|
|
||||||
|
//
|
||||||
|
// Props ...
|
||||||
|
XCX121SMCBaseStrategy *mStrategies[]; // Registere Strategies in EA ...
|
||||||
|
|
||||||
|
//
|
||||||
|
// Actions ...
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Configure Startegy ...
|
||||||
|
*/
|
||||||
|
void ConfigureStrategy(XCX121SMCBaseStrategy *&strategy)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
if (strategy == NULL)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Configure Alerts ...
|
||||||
|
strategy.SetAlertPrefix(GetTag());
|
||||||
|
strategy.SetAlertLogAlerts(GetAlertLogAlerts());
|
||||||
|
strategy.SetAlertMailAlerts(GetAlertMailAlerts());
|
||||||
|
strategy.SetAlertPushAlerts(GetAlertPushAlerts());
|
||||||
|
strategy.SetAlertEnableAlerts(GetAlertEnableAlerts());
|
||||||
|
strategy.SetAlertTerminalAlerts(GetAlertTerminalAlerts());
|
||||||
|
|
||||||
|
//
|
||||||
|
// Confiugre Signalling ...
|
||||||
|
|
||||||
|
//
|
||||||
|
strategy.AllowLong(AllowLomg());
|
||||||
|
strategy.AllowShort(AllowShort());
|
||||||
|
|
||||||
|
//
|
||||||
|
if (Disabled())
|
||||||
|
{
|
||||||
|
strategy.Disable();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
strategy.Enable();
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Register an Strategy in EA ...
|
||||||
|
*
|
||||||
|
* @param strategy: XCX121SMCBaseStrategy instance ...
|
||||||
|
*/
|
||||||
|
void RegisterStrategy(XCX121SMCBaseStrategy *strategy)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
if (strategy == NULL)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
ArrayResize(
|
||||||
|
mStrategies,
|
||||||
|
ArraySize(mStrategies) + 1 //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
mStrategies[ArraySize(mStrategies) - 1] = strategy;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Re Configure All Registered Strategies ...
|
||||||
|
*/
|
||||||
|
void ReConfigureAllStrategies()
|
||||||
|
{
|
||||||
|
//
|
||||||
|
int count = ArraySize(eaStrategies);
|
||||||
|
if (!IsValidSize(count))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
for (int i = 0; i < count; i++)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
ConfigureStrategy(eaStrategies[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
private:
|
||||||
|
//
|
||||||
|
|
||||||
|
//
|
||||||
|
};
|
||||||
|
|
||||||
|
//
|
||||||
Reference in New Issue
Block a user