attach conditions to x121 conditions ...

This commit is contained in:
2024-12-08 11:44:32 +03:30
parent 95c7804be5
commit 7cef619800
9 changed files with 9050 additions and 3666 deletions
+830
View File
@@ -0,0 +1,830 @@
///////////////////////////////////////////////////////
//
// 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.x-expert.class.mq5"
#include "../../Classes/x-saherelm.x-poi.class.mq5"
// #include "../Classes/x-121.smc.xtradehandler.class.mq5"
//
// Definitions ...
string XC121SMCExpertToken = "XC121SMCEA";
//
// Implementation ...
class XC121SMCExpert : public XCBaseExpert
{
//
public:
//
//
// Signal Event Listener ...
TOnStopLoss OnPositionSLEventListener;
TOnTakeProfit OnPositionTPEventListener;
TOnPartialClose OnPositionPartialCloseEventListener;
TOnModify OnPositionModifiedEventListener;
TOnForceClose OnPositionForceCloseEventListener;
//
// Getter(s) / Setter(s) ...
/**
* Get Use Dynamic Volume State ...
*
* @return ( bool )
*/
bool UseDynamicVolume()
{
return mUseDynamicVolume;
}
/**
* Set Use Dynamic Volume State ...
*
* @param value: Boolean ...
*/
void UseDynamicVolume(bool value)
{
mUseDynamicVolume = value;
}
/**
* Get Increase Volume Step ...
*
* @return ( double )
*/
double DynamicVolumeStep()
{
return mDynamicVolumeStep;
}
/**
* Set Increase Volume Step ...
*
* @param value: Double ...
*/
void DynamicVolumeStep(double value)
{
//
if (value < 0.01)
{
value = 0.01;
}
//
mDynamicVolumeStep = value;
}
/**
* Get Balance Factor for Generate Dynamic Volume ...
*
* @return ( double )
*/
double DynamicVolumeBalanceFactor()
{
return mDynamicVolumeBalanceFactor;
}
/**
* Set Balance Factor for Generate Dynamic Volume ...
*
* @param value: Double ...
*/
void DynamicVolumeBalanceFactor(double value)
{
//
if (value < 0)
{
value = 0;
}
//
mDynamicVolumeBalanceFactor = value;
}
/**
* Get Static Volume ...
*
* @return ( double )
*/
double Volume()
{
return mVolume;
}
/**
* Set Static Volume ...
*
* @param value: Double ...
*/
void Volume(double value)
{
//
if (value < 0.01)
{
value = 0.01;
}
//
mVolume = value;
}
//
// Actions ...
//
// 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);
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);
//
// Volume Default Configurations ...
Volume(0.01);
UseDynamicVolume(false);
DynamicVolumeStep(0.01);
DynamicVolumeBalanceFactor(200);
}
/**
* 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";
}
//
// Checking Volume ...
bool isVolumeValid = true;
if (UseDynamicVolume())
{
//
isVolumeValid =
DynamicVolumeStep() > 0 &&
DynamicVolumeBalanceFactor() > 0;
if (!isVolumeValid)
{
errMessage += "Dynamic Volume configurations error;" + "\n";
}
}
isVolumeValid = isVolumeValid &&
Volume() > 0;
if (!isVolumeValid)
{
errMessage += "Static Volume configurations error;" + "\n";
}
//
result =
//
// Common ...
isCommonValid &&
//
// Volume Coniguration ...
isVolumeValid &&
//
// 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 ...
//
string symbol = GetSymbol();
ENUM_TIMEFRAMES period = GetPeriod();
//
mPOIDetector = new XCPOIDetector(
symbol,
period //
);
mPOIDetector.Init();
//
// Bar Timer ...
XCTInputs ctInputs;
ctInputs.Default(); // Default Configurations ...
mCTHelper = new XCXCTHelper();
result = mCTHelper.Init(
GetSymbol(),
GetPeriod(),
ctInputs //
);
if (!result)
{
return result;
}
//
// Bar Styles ...
XCCInputs ccInputs;
ccInputs.Default(); // Default Configurations ...
mCCHelper = new XCXCCHelper();
result = mCCHelper.Init(
GetSymbol(),
GetPeriod(),
ccInputs //
);
if (!result)
{
return result;
}
//
// Create Trader Instance and Configure it ...
mTrader = new XCTrade(
Slippage(),
MagicNumber() //
);
mTrader.AddOnStopLossEventHandler(OnPositionSLEventListener);
mTrader.AddOnTakeProfitEventHandler(OnPositionTPEventListener);
mTrader.AddOnModifyPositionEventHandler(OnPositionModifiedEventListener);
mTrader.AddOnForceClosePositionEventHandler(OnPositionForceCloseEventListener);
mTrader.AddOnPartialClosePositionEventHandler(OnPositionPartialCloseEventListener);
// //
// // Initialize Trade Handler ...
// mTradeHandler = new XC121SMCTradeHandler(mTrader);
// mTradeHandler.SaveTrades(true);
// mTradeHandler.SaveSignals(true);
// mTradeHandler.SaveConditions(true);
// //
// // Configure Alerts ...
// mTradeHandler.SetAlertPrefix(GetTag());
// mTradeHandler.SetAlertEnableAlerts(GetAlertEnableAlerts());
// mTradeHandler.SetAlertLogAlerts(GetAlertLogAlerts());
// mTradeHandler.SetAlertMailAlerts(GetAlertMailAlerts());
// mTradeHandler.SetAlertPushAlerts(GetAlertPushAlerts());
// mTradeHandler.SetAlertTerminalAlerts(GetAlertTerminalAlerts());
// //
// // TODO: Make This Configurable Later ...
// //
// mTradeHandler.DelayBarBetweenTwoSignal(3);
// mTradeHandler.MaxAllowedSLToPause(0);
// mTradeHandler.MaxAllowedSLReachedPauseDelay(HoursToSeconds(24));
// //
// // Configure Trade Management ...
// mTradeHandler.AllowLong(AllowLong());
// mTradeHandler.AllowShort(AllowShort());
// mTradeHandler.MaxAllowedLongs(0);
// mTradeHandler.MaxAllowedShorts(0);
// mTradeHandler.UseMaxAllowedTradesPerSymbol(true);
// mTradeHandler.MaxDrawdownPercentForOpenTrades(5);
// //
// // Configure Position Protector ...
// //
// mTradeHandler.UseForceMomentumsInProtection(true);
// mTradeHandler.DelayBarBetweenTwoSignal(2);
// //
// // Configure Hedging ...
// mTradeHandler.AllowHedge(false);
// mTradeHandler.HedgeMinVolumeStep(0.01);
// mTradeHandler.MinimumOpenPositionsForHEHedge(2);
// mTradeHandler.HedgeHEMinProfitPerVolumeStep(0.2);
// mTradeHandler.HedgeBEMinProfitPerVolumeStep(0.06);
// //
// // In Profit Position Protecting ...
// //
// // Trail ...
// mTradeHandler.AllowTrail(false);
// mTradeHandler.TrailStep(15);
// mTradeHandler.TrailStartDistance(30);
// mTradeHandler.OnlyTrailUnprotected(true);
// mTradeHandler.RemoveTPAfterTrailedLevel(4);
// //
// // Partial Close (In Profit) ...
// mTradeHandler.PartialCloseInProfitDistance(0);
// mTradeHandler.PartialCloseInProfitVolume(0);
// //
// // In Drawdown Positions Protecting ...
// //
// // Protect ...
// mTradeHandler.AllowProtect(false);
// mTradeHandler.ProtectionDelay(20);
// mTradeHandler.MaxAllowedProtection(0);
// mTradeHandler.UseEntryAsProtectionSL(true);
// mTradeHandler.ProtectOnConditions(true);
// mTradeHandler.AllowDirectionProtct(false);
// mTradeHandler.ProtectionStartDistance(50);
// mTradeHandler.ProtectionVolumeMultiplier(2);
// //
// // Partial Close (In Profit) ...
// mTradeHandler.PartialCloseInDrawdownDistance(0);
// mTradeHandler.PartialCloseInDrawdownVolume(0);
//
// Parsers ...
XSymbolParser _symbolParser;
//
// Single Symbol ...
if (!MultiSymbol())
{
//
// Register Strategy ...
//
// Create Class Instance ...
// XCX121SMCBaseStrategy *iX121SMCStrategy;
// iX121SMCStrategy = new XCX121SMCTestStrategy(
// _Symbol,
// _Period //
// );
// //
// iX121SMCStrategy.AddXSignalEventHandler(OnSignalEventListener);
// //
// ConfigureStrategy(iX121SMCStrategy);
// RegisterStrategy(iX121SMCStrategy);
}
//
// Multi Symbol ...
else
{
//
// Parse Symbols ...
string symbols[];
int symbolsCount = SplitContent(
symbols,
Symbols() //
);
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 XCX121SMCTestStrategy(
// iSymbol,
// _Period //
// );
// //
// iX121SMCStrategy.AddXSignalEventHandler(OnSignalEventListener);
// //
// // Register Strategy ...
// ConfigureStrategy(iX121SMCStrategy);
// RegisterStrategy(iX121SMCStrategy);
}
}
}
//
return result;
}
/**
* Destroy all Initialized EA Requirements ...
*/
void DestroyEA() override
{
//
delete mCTHelper;
delete mCCHelper;
// delete mTradeHandler;
//
// Clean(mStrategies);
}
/**
* Call all Registered Strategies On Tick ...
*/
void HandleStrategiesOnTick() override
{
//
ENUM_XPOI_EVENTS events[];
mPOIDetector.Update(events);
//
// int count = ArraySize(mStrategies);
// if (!IsValidSize(count))
// {
// return;
// }
// //
// for (int i = 0; i < count; i++)
// {
// //
// // Call Tick Handler Function ...
// mStrategies[i].HandleTick();
// }
}
//
// Event Handlers ...
/**
* Calls When a Position's SL Triggered ...
*
* @param deal: XDeal instance ...
*/
void HandleOnStopLossTriggered(const XDeal &deal) override
{
//
// Finish ...
// mTradeHandler.Finish(deal);
//
HandleReportBalance();
}
/**
* Calls When a Position's TP Triggered ...
*
* @param deal: XDeal instance ...
*/
void HandleOnTakeProfitTriggered(const XDeal &deal) override
{
//
// Finish ...
// mTradeHandler.Finish(deal);
//
HandleReportBalance();
}
/**
* Handle Force Close a Position ...
*
* @param ticket: Position Ticket ...
* @param position: XPosition ...
* @param comment: Closing Comment ...
*/
void HandleOnPositionForceClosed(
const ulong ticket,
const XPosition &position,
const string comment //
) override
{
//
// Finish ...
// mTradeHandler.Finish(
// ticket,
// position,
// comment //
// );
//
HandleReportBalance();
}
/**
* Reset All Paused Symbols on Each New Days ...
*/
void HandleOnNewDay() override
{
// mTradeHandler.ResumePausedSymbols();
}
/**
* 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 ...
//
datetime mLastSignalOn;
//
XCPOIDetector *mPOIDetector;
//
// XC121SMCTradeHandler *mTradeHandler; // Trade Handler ...
// XCX121SMCBaseStrategy *mStrategies[]; // Registere Strategies in EA ...
//
// Actions ...
/**
* Apply Volume Based On Configurations on Signal ...
*
* @param signal: XSignal instance
*/
void ApplyVolumeOnSignal(XSignal &signal)
{
//
// Prepare Signal Dynamic Volume
// if Provided ...
if (UseDynamicVolume() &&
DynamicVolumeStep() > 0 &&
DynamicVolumeBalanceFactor() > 0)
{
//
double dVolume = mTrader.GetDynamicVolume(
signal.symbol,
DynamicVolumeBalanceFactor(),
DynamicVolumeStep() //
);
//
if (dVolume > 0)
{
signal.volume = dVolume;
}
else
{
signal.volume = Volume();
}
}
else
{
signal.volume = Volume();
}
//
// mTradeHandler.UpdateSignal(signal);
}
/**
* 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.R2R(2);
// strategy.AllowLong(AllowLong());
// 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(mStrategies);
// if (!IsValidSize(count))
// {
// return;
// }
// //
// for (int i = 0; i < count; i++)
// {
// //
// ConfigureStrategy(mStrategies[i]);
// }
// }
//
private:
//
//
// Props ...
//
// Volume Management ...
bool mUseDynamicVolume; // Use Dynamic Volume ...
double mDynamicVolumeStep; // Increase Volume Step ...
double mDynamicVolumeBalanceFactor; // Balance Factor for Generate Dynamic Volume ...
double mVolume; // Static Volume ...
//
};
//
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff