last works ...

This commit is contained in:
2024-06-14 00:44:37 +03:30
parent 0fa788d126
commit a525a2e2cd
9 changed files with 2579 additions and 120 deletions
+256 -46
View File
@@ -37,6 +37,7 @@
#include "../Helpers/x-saherelm.xich.helper.mq5"
#include "../Helpers/x-saherelm.xmrb.helper.mq5"
#include "../Helpers/x-saherelm.xosc.helper.mq5"
#include "../Helpers/x-saherelm.xvlm.helper.mq5"
#include "../Helpers/x-saherelm.xasct.helper.mq5"
#include "../Helpers/x-saherelm.xsslc.helper.mq5"
#include "../Helpers/x-saherelm.xhull.helper.mq5"
@@ -67,6 +68,7 @@ enum ENUM_X121_SIGNAL_PROVIDER
PROVIDER_XSSLC = 14,
PROVIDER_XHULL = 15,
PROVIDER_XASCT = 16,
PROVIDER_XVLM = 17,
};
//
@@ -210,6 +212,7 @@ struct X121SetupInputs
XSTRInputs strInputs; // XSTR Inputs
XMRBInputs mrbInputs; // XMRB Inputs
XOSCInputs oscInputs; // XOSC Inputs
XVLMInputs vlmInputs; // XVLM Inputs
XMATDInputs matdInputs; // XMATD Inputs
XASCTInputs asctInputs; // XASCT Inputs
XSSLCInputs sslcInputs; // XSSLC Inputs
@@ -245,6 +248,7 @@ struct X121SetupInputs
XSTRInputs &_strInputs, // XSTR Inputs
XMRBInputs &_mrbInputs, // XMRB Inputs
XOSCInputs &_oscInputs, // XOSC Inputs
XVLMInputs &_vlmInputs, // XVLM Inputs
XMATDInputs &_matdInputs, // XMATD Inputs
XASCTInputs &_asctInputs, // XASCT Inputs
XSSLCInputs &_sslcInputs, // XSSLC Inputs
@@ -265,6 +269,7 @@ struct X121SetupInputs
this.strInputs = _strInputs;
this.mrbInputs = _mrbInputs;
this.oscInputs = _oscInputs;
this.vlmInputs = _vlmInputs;
this.matdInputs = _matdInputs;
this.asctInputs = _asctInputs;
this.sslcInputs = _sslcInputs;
@@ -297,6 +302,7 @@ struct X121SetupInputs
strInputs.Clean();
mrbInputs.Clean();
oscInputs.Clean();
vlmInputs.Clean();
matdInputs.Clean();
asctInputs.Clean();
sslcInputs.Clean();
@@ -316,6 +322,7 @@ struct X121SetupInputs
strInputs.Default();
mrbInputs.Default();
oscInputs.Default();
vlmInputs.Default();
matdInputs.Default();
asctInputs.Default();
sslcInputs.Default();
@@ -349,66 +356,84 @@ struct X121SetupInputs
return result;
}
//
result = hkInputs.IsValid();
if (!result)
{
return result;
}
//
result = cheInputs.IsValid();
if (!result)
{
return result;
}
//
result = ichInputs.IsValid();
if (!result)
{
return result;
}
//
result = strInputs.IsValid();
if (!result)
{
return result;
}
//
result = mrbInputs.IsValid();
if (!result)
{
return result;
}
//
result = oscInputs.IsValid();
if (!result)
{
return result;
}
//
result = vlmInputs.IsValid();
if (!result)
{
return result;
}
//
result = matdInputs.IsValid();
if (!result)
{
return result;
}
//
result = asctInputs.IsValid();
if (!result)
{
return result;
}
//
result = sslcInputs.IsValid();
if (!result)
{
return result;
}
//
result = hullInputs.IsValid();
if (!result)
{
return result;
}
//
result = adxtdInputs.IsValid();
if (!result)
{
@@ -438,6 +463,7 @@ struct X121SetupConditions
XICHConditions ichConditions;
XSTRConditions strConditions;
XMRBConditions mrbConditions;
XVLMConditions vlmConditions;
XMATDConditions matdConditions;
XASCTConditions asctConditions;
XSSLCConditions sslcConditions;
@@ -476,6 +502,7 @@ struct X121SetupConditions
ichConditions.Clean();
strConditions.Clean();
mrbConditions.Clean();
vlmConditions.Clean();
matdConditions.Clean();
asctConditions.Clean();
sslcConditions.Clean();
@@ -569,6 +596,14 @@ struct X121SetupConditions
bullishScore += tempBullishScore;
bearishScore += tempBearishScore;
//
vlmConditions.GenerateScore(
tempBullishScore,
tempBearishScore //
);
bullishScore += tempBullishScore;
bearishScore += tempBearishScore;
//
sslcConditions.GenerateScore(
tempBullishScore,
@@ -625,32 +660,34 @@ struct X121SetupConditions
);
//
string matdSummary = matdConditions.GenerateSummary(false, true, false, ignoreFalseConditions);
string adxtdSummary = adxtdConditions.GenerateSummary(false, true, false, ignoreFalseConditions);
string tdSummary = tdConditions.GenerateSummary(false, true, false, ignoreFalseConditions);
string hkSummary = hkConditions.GenerateSummary(false, true, false, ignoreFalseConditions);
string strSummary = strConditions.GenerateSummary(false, true, false, ignoreFalseConditions);
string cheSummary = cheConditions.GenerateSummary(false, true, false, ignoreFalseConditions);
string asctSummary = asctConditions.GenerateSummary(false, true, false, ignoreFalseConditions);
string tdSummary = tdConditions.GenerateSummary(false, true, false, ignoreFalseConditions);
string ichSummary = ichConditions.GenerateSummary(false, true, false, ignoreFalseConditions);
string hkSummary = hkConditions.GenerateSummary(false, true, false, ignoreFalseConditions);
string mrbSummary = mrbConditions.GenerateSummary(false, true, false, ignoreFalseConditions);
string vlmSummary = vlmConditions.GenerateSummary(false, true, false, ignoreFalseConditions);
string matdSummary = matdConditions.GenerateSummary(false, true, false, ignoreFalseConditions);
string asctSummary = asctConditions.GenerateSummary(false, true, false, ignoreFalseConditions);
string sslcSummary = sslcConditions.GenerateSummary(false, true, false, ignoreFalseConditions);
string hullSummary = hullConditions.GenerateSummary(false, true, false, ignoreFalseConditions);
string adxtdSummary = adxtdConditions.GenerateSummary(false, true, false, ignoreFalseConditions);
//
string conditionsStr =
//
matdSummary + separator +
adxtdSummary + separator +
tdSummary + separator +
hkSummary + separator +
ichSummary + separator +
mrbSummary + separator +
vlmSummary + separator +
strSummary + separator +
cheSummary + separator +
asctSummary + separator +
tdSummary + separator +
ichSummary + separator +
hkSummary + separator +
mrbSummary + separator +
sslcSummary + separator +
hullSummary + separator +
matdSummary + separator +
adxtdSummary + separator +
""
//
;
@@ -818,7 +855,8 @@ struct X121SignalGenerator
conditions.hkConditions.isSMHKBullish &&
conditions.mrbConditions.isFastOverSlow &&
conditions.sslcConditions.isBullish &&
conditions.hullConditions.isBullish
conditions.hullConditions.isBullish &&
conditions.vlmConditions.isVolumeBullish
//
;
if (long1)
@@ -846,7 +884,8 @@ struct X121SignalGenerator
conditions.hkConditions.isSMHKBullish &&
conditions.mrbConditions.isFastOverSlow &&
conditions.sslcConditions.isBullish &&
conditions.hullConditions.isBullish
conditions.hullConditions.isBullish &&
conditions.vlmConditions.isVolumeBullish
//
;
if (long2)
@@ -872,7 +911,8 @@ struct X121SignalGenerator
conditions.hkConditions.isSMHKBullish &&
conditions.mrbConditions.isFastOverSlow &&
conditions.sslcConditions.isBullish &&
conditions.hullConditions.isBullish
conditions.hullConditions.isBullish &&
conditions.vlmConditions.isVolumeBullish
//
;
if (long3)
@@ -899,7 +939,8 @@ struct X121SignalGenerator
conditions.hkConditions.isSMHKBullish &&
conditions.mrbConditions.isFastOverSlow &&
conditions.sslcConditions.isBullish &&
conditions.hullConditions.isBullish
conditions.hullConditions.isBullish &&
conditions.vlmConditions.isVolumeBullish
//
;
if (long4)
@@ -926,7 +967,8 @@ struct X121SignalGenerator
conditions.hkConditions.isSMHKBullish &&
conditions.mrbConditions.isFastOverSlow &&
conditions.sslcConditions.isBullish &&
conditions.hullConditions.isBullish
conditions.hullConditions.isBullish &&
conditions.vlmConditions.isVolumeBullish
//
;
if (long5)
@@ -953,7 +995,8 @@ struct X121SignalGenerator
conditions.hkConditions.isSMHKBullish &&
conditions.mrbConditions.isFastOverSlow &&
conditions.sslcConditions.isBullish &&
conditions.hullConditions.isBullish
conditions.hullConditions.isBullish &&
conditions.vlmConditions.isVolumeBullish
//
;
if (long6)
@@ -982,7 +1025,8 @@ struct X121SignalGenerator
conditions.hkConditions.isSMHKBullish &&
conditions.mrbConditions.isFastOverSlow &&
conditions.sslcConditions.isBullish &&
conditions.hullConditions.isBullish
conditions.hullConditions.isBullish &&
conditions.vlmConditions.isVolumeBullish
//
;
if (long7)
@@ -1011,7 +1055,8 @@ struct X121SignalGenerator
conditions.hkConditions.isSMHKBullish &&
conditions.mrbConditions.isFastOverSlow &&
conditions.sslcConditions.isBullish &&
conditions.hullConditions.isBullish
conditions.hullConditions.isBullish &&
conditions.vlmConditions.isVolumeBullish
//
;
if (long8)
@@ -1040,7 +1085,8 @@ struct X121SignalGenerator
conditions.hkConditions.isSMHKBullish &&
conditions.mrbConditions.isFastOverSlow &&
conditions.sslcConditions.isBullish &&
conditions.hullConditions.isBullish
conditions.hullConditions.isBullish &&
conditions.vlmConditions.isVolumeBullish
//
;
if (long9)
@@ -1068,7 +1114,8 @@ struct X121SignalGenerator
conditions.hkConditions.isSMHKBullish &&
conditions.mrbConditions.isFastOverSlow &&
conditions.sslcConditions.isBullish &&
conditions.hullConditions.isBullish
conditions.hullConditions.isBullish &&
conditions.vlmConditions.isVolumeBullish
//
;
if (long10)
@@ -1095,7 +1142,8 @@ struct X121SignalGenerator
conditions.hkConditions.isSMHKBullish &&
conditions.mrbConditions.isFastOverSlow &&
conditions.sslcConditions.isBullish &&
conditions.hullConditions.isBullish
conditions.hullConditions.isBullish &&
conditions.vlmConditions.isVolumeBullish
//
;
if (long11)
@@ -1122,7 +1170,8 @@ struct X121SignalGenerator
conditions.hkConditions.isHKBullish &&
conditions.mrbConditions.isFastOverSlow &&
conditions.sslcConditions.isBullish &&
conditions.hullConditions.isBullish
conditions.hullConditions.isBullish &&
conditions.vlmConditions.isVolumeBullish
//
;
if (long12)
@@ -1149,7 +1198,8 @@ struct X121SignalGenerator
conditions.hkConditions.isHKBullish &&
conditions.hkConditions.isSMHKBullish &&
conditions.sslcConditions.isBullish &&
conditions.hullConditions.isBullish
conditions.hullConditions.isBullish &&
conditions.vlmConditions.isVolumeBullish
//
;
if (long13)
@@ -1176,7 +1226,8 @@ struct X121SignalGenerator
conditions.hkConditions.isHKBullish &&
conditions.hkConditions.isSMHKBullish &&
conditions.mrbConditions.isFastOverSlow &&
conditions.hullConditions.isBullish
conditions.hullConditions.isBullish &&
conditions.vlmConditions.isVolumeBullish
//
;
if (long14)
@@ -1203,7 +1254,8 @@ struct X121SignalGenerator
conditions.hkConditions.isHKBullish &&
conditions.hkConditions.isSMHKBullish &&
conditions.mrbConditions.isFastOverSlow &&
conditions.sslcConditions.isBullish
conditions.sslcConditions.isBullish &&
conditions.vlmConditions.isVolumeBullish
//
;
if (long15)
@@ -1231,7 +1283,8 @@ struct X121SignalGenerator
conditions.hkConditions.isSMHKBullish &&
conditions.mrbConditions.isFastOverSlow &&
conditions.hullConditions.isBullish &&
conditions.sslcConditions.isBullish
conditions.sslcConditions.isBullish &&
conditions.vlmConditions.isVolumeBullish
//
;
if (long16)
@@ -1241,6 +1294,34 @@ struct X121SignalGenerator
provider = ToString(PROVIDER_XASCT);
}
//
// XVLM ...
bool long17 =
//
// Starting Conditions ...
conditions.vlmConditions.isVolumeChangedToBullish &&
//
// Verifications ...
conditions.tdConditions.isBullish &&
conditions.matdConditions.isBullish &&
conditions.adxtdConditions.isStrong &&
conditions.adxtdConditions.isBullish &&
conditions.strConditions.isTrendBullish &&
conditions.cheConditions.isStrongBullish &&
conditions.hkConditions.isHKBullish &&
conditions.hkConditions.isSMHKBullish &&
conditions.mrbConditions.isFastOverSlow &&
conditions.hullConditions.isBullish &&
conditions.sslcConditions.isBullish
//
;
if (long17)
{
//
pusher++;
provider = ToString(PROVIDER_XVLM);
}
//
result =
//
@@ -1311,6 +1392,10 @@ struct X121SignalGenerator
//
long16
//
||
//
long17
//
)
//
;
@@ -1367,7 +1452,8 @@ struct X121SignalGenerator
conditions.hkConditions.isSMHKBearish &&
conditions.mrbConditions.isFastUnderSlow &&
conditions.sslcConditions.isBearish &&
conditions.hullConditions.isBearish
conditions.hullConditions.isBearish &&
conditions.vlmConditions.isVolumeBearish
//
;
if (short1)
@@ -1395,7 +1481,8 @@ struct X121SignalGenerator
conditions.hkConditions.isSMHKBearish &&
conditions.mrbConditions.isFastUnderSlow &&
conditions.sslcConditions.isBearish &&
conditions.hullConditions.isBearish
conditions.hullConditions.isBearish &&
conditions.vlmConditions.isVolumeBearish
//
;
if (short2)
@@ -1421,7 +1508,8 @@ struct X121SignalGenerator
conditions.hkConditions.isSMHKBearish &&
conditions.mrbConditions.isFastUnderSlow &&
conditions.sslcConditions.isBearish &&
conditions.hullConditions.isBearish
conditions.hullConditions.isBearish &&
conditions.vlmConditions.isVolumeBearish
//
;
if (short3)
@@ -1448,7 +1536,8 @@ struct X121SignalGenerator
conditions.hkConditions.isSMHKBearish &&
conditions.mrbConditions.isFastUnderSlow &&
conditions.sslcConditions.isBearish &&
conditions.hullConditions.isBearish
conditions.hullConditions.isBearish &&
conditions.vlmConditions.isVolumeBearish
//
;
if (short4)
@@ -1475,7 +1564,8 @@ struct X121SignalGenerator
conditions.hkConditions.isSMHKBearish &&
conditions.mrbConditions.isFastUnderSlow &&
conditions.sslcConditions.isBearish &&
conditions.hullConditions.isBearish
conditions.hullConditions.isBearish &&
conditions.vlmConditions.isVolumeBearish
//
;
if (short5)
@@ -1502,7 +1592,8 @@ struct X121SignalGenerator
conditions.hkConditions.isSMHKBearish &&
conditions.mrbConditions.isFastUnderSlow &&
conditions.sslcConditions.isBearish &&
conditions.hullConditions.isBearish
conditions.hullConditions.isBearish &&
conditions.vlmConditions.isVolumeBearish
//
;
if (short6)
@@ -1531,7 +1622,8 @@ struct X121SignalGenerator
conditions.hkConditions.isSMHKBearish &&
conditions.mrbConditions.isFastUnderSlow &&
conditions.sslcConditions.isBearish &&
conditions.hullConditions.isBearish
conditions.hullConditions.isBearish &&
conditions.vlmConditions.isVolumeBearish
//
;
if (short7)
@@ -1560,7 +1652,8 @@ struct X121SignalGenerator
conditions.hkConditions.isSMHKBearish &&
conditions.mrbConditions.isFastUnderSlow &&
conditions.sslcConditions.isBearish &&
conditions.hullConditions.isBearish
conditions.hullConditions.isBearish &&
conditions.vlmConditions.isVolumeBearish
//
;
if (short8)
@@ -1589,7 +1682,8 @@ struct X121SignalGenerator
conditions.hkConditions.isSMHKBearish &&
conditions.mrbConditions.isFastUnderSlow &&
conditions.sslcConditions.isBearish &&
conditions.hullConditions.isBearish
conditions.hullConditions.isBearish &&
conditions.vlmConditions.isVolumeBearish
//
;
if (short9)
@@ -1617,7 +1711,8 @@ struct X121SignalGenerator
conditions.hkConditions.isSMHKBearish &&
conditions.mrbConditions.isFastUnderSlow &&
conditions.sslcConditions.isBearish &&
conditions.hullConditions.isBearish
conditions.hullConditions.isBearish &&
conditions.vlmConditions.isVolumeBearish
//
;
if (short10)
@@ -1644,7 +1739,8 @@ struct X121SignalGenerator
conditions.hkConditions.isSMHKBearish &&
conditions.mrbConditions.isFastUnderSlow &&
conditions.sslcConditions.isBearish &&
conditions.hullConditions.isBearish
conditions.hullConditions.isBearish &&
conditions.vlmConditions.isVolumeBearish
//
;
if (short11)
@@ -1671,7 +1767,8 @@ struct X121SignalGenerator
conditions.hkConditions.isHKBearish &&
conditions.mrbConditions.isFastUnderSlow &&
conditions.sslcConditions.isBearish &&
conditions.hullConditions.isBearish
conditions.hullConditions.isBearish &&
conditions.vlmConditions.isVolumeBearish
//
;
if (short12)
@@ -1698,7 +1795,8 @@ struct X121SignalGenerator
conditions.hkConditions.isHKBearish &&
conditions.hkConditions.isSMHKBearish &&
conditions.sslcConditions.isBearish &&
conditions.hullConditions.isBearish
conditions.hullConditions.isBearish &&
conditions.vlmConditions.isVolumeBearish
//
;
if (short13)
@@ -1725,7 +1823,8 @@ struct X121SignalGenerator
conditions.hkConditions.isHKBearish &&
conditions.hkConditions.isSMHKBearish &&
conditions.mrbConditions.isFastUnderSlow &&
conditions.hullConditions.isBearish
conditions.hullConditions.isBearish &&
conditions.vlmConditions.isVolumeBearish
//
;
if (short14)
@@ -1752,7 +1851,8 @@ struct X121SignalGenerator
conditions.hkConditions.isHKBearish &&
conditions.hkConditions.isSMHKBearish &&
conditions.mrbConditions.isFastUnderSlow &&
conditions.sslcConditions.isBearish
conditions.sslcConditions.isBearish &&
conditions.vlmConditions.isVolumeBearish
//
;
if (short15)
@@ -1780,16 +1880,45 @@ struct X121SignalGenerator
conditions.hkConditions.isSMHKBearish &&
conditions.mrbConditions.isFastUnderSlow &&
conditions.hullConditions.isBearish &&
conditions.sslcConditions.isBearish
conditions.sslcConditions.isBearish &&
conditions.vlmConditions.isVolumeBearish
//
;
if (short15)
if (short16)
{
//
pusher++;
provider = ToString(PROVIDER_XASCT);
}
//
// XVLM ...
bool short17 =
//
// Starting Conditions ...
conditions.vlmConditions.isVolumeChangedToBearish &&
//
// Verifications ...
conditions.tdConditions.isBearish &&
conditions.matdConditions.isBearish &&
conditions.adxtdConditions.isStrong &&
conditions.adxtdConditions.isBearish &&
conditions.strConditions.isTrendBearish &&
conditions.cheConditions.isStrongBearish &&
conditions.hkConditions.isHKBearish &&
conditions.hkConditions.isSMHKBearish &&
conditions.mrbConditions.isFastUnderSlow &&
conditions.hullConditions.isBearish &&
conditions.sslcConditions.isBearish
//
;
if (short17)
{
//
pusher++;
provider = ToString(PROVIDER_XVLM);
}
//
result =
//
@@ -1860,6 +1989,10 @@ struct X121SignalGenerator
//
short16
//
||
//
short17
//
)
//
;
@@ -1881,7 +2014,7 @@ struct X121SignalGenerator
//
// TODO Filter ...
result = true;
result = provider == ToString(PROVIDER_XVLM);
//
return result;
@@ -1900,7 +2033,7 @@ struct X121SignalGenerator
//
// TODO Filter ...
result = true;
result = provider == ToString(PROVIDER_XVLM);
//
return result;
@@ -1913,6 +2046,7 @@ struct X121SignalGenerator
XSignal &signal, // Signal if Exists
int &pusher, // Pushers
string &provider, // Signal Provider Name
bool _useSupport, // Generate Support Signals
bool _allowLong, // Allow Long Signals
bool _allowShort, // Allow Short Signals
double _volume = 0.01, // Volume
@@ -2052,10 +2186,60 @@ struct X121SignalGenerator
return result;
}
//
// Generate Support Signals ...
if (_useSupport)
{
//
GenerateSupportSignals(
signal //
);
}
//
return result;
}
//
void GenerateSupportSignals(
XSignal &signal // Source Signal for Support Generating ...
) {
//
// Validate Signal ...
if (!signal.IsValid()) {
return;
}
//
// Check Signal Has TP and SL ...
if (signal.tp > 0 && signal.sl > 0) {
//
// Here we Can Provide Orders based on Signal TP and SL ...
//
// Retrieve Signal Direction ...
bool isLong = IsLong(signal.type);
//
// Calculate TP/Entry Distance ...
double tpDistance =
isLong
? signal.tp - signal.entry
: signal.entry - signal.tp;
//
// Calculate Recovery Zone Step ...
double slDistance =
isLong
? signal.entry - signal.sl
: signal.sl - signal.entry;
//
// Calculate Ticks Zone ...
}
}
//
string GetTag()
{
@@ -2079,6 +2263,7 @@ public:
XSCXSTRHelper *strHelper;
XSCXMRBHelper *mrbHelper;
XSCXOSCHelper *oscHelper;
XSCXVLMHelper *vlmHelper;
XSCXMATDHelper *matdHelper;
XSCXASCTHelper *asctHelper;
XSCXSSLCHelper *sslcHelper;
@@ -2101,6 +2286,7 @@ public:
delete strHelper;
delete mrbHelper;
delete oscHelper;
delete vlmHelper;
delete matdHelper;
delete asctHelper;
delete sslcHelper;
@@ -2238,6 +2424,19 @@ public:
return result;
}
//
// XVLM ...
vlmHelper = new XSCXVLMHelper();
result = vlmHelper.Init(
inputs.symbol,
inputs.period,
inputs.vlmInputs //
);
if (!result)
{
return result;
}
//
// XMATD ...
matdHelper = new XSCXMATDHelper(
@@ -2429,6 +2628,17 @@ public:
return result;
}
//
result = vlmHelper.GetConditions(
conditions.vlmConditions,
barIndex,
loopback //
);
if (!result)
{
return result;
}
//
result = sslcHelper.GetConditions(
conditions.sslcConditions,
+367 -65
View File
@@ -25,6 +25,7 @@
//
#include "../Classes/x-saherelm.xea.class.mq5"
#include "../Classes/x-saherelm.xczone.class.mq5"
#include "../Classes/x-saherelm.x121.setup.cycle.class.mq5"
//
@@ -121,6 +122,7 @@ struct XSignalInfo
pushers = _pushers;
symbol = _signal.symbol;
period = _signal.period;
volume = _signal.volume;
provider = _signal.provider;
//
@@ -750,9 +752,40 @@ public:
}
//
bool IsEnable()
int CloseOnSpecificTime()
{
return mAllowLong || mAllowShort;
return mCloseOnSpecificTime;
}
//
void CloseOnSpecificTime(int value)
{
//
if (value < 0)
{
value = -1;
}
//
if (value > 23)
{
value = 23;
}
//
mCloseOnSpecificTime = value;
}
//
bool UseSupport()
{
return mUseSupport;
}
//
void UseSupport(bool value)
{
mUseSupport = value;
}
//
@@ -907,7 +940,10 @@ public:
}
//
mVolumeOSC = 0;
mBullishSigns = 0;
mBullishScore = 0;
mBearishSigns = 0;
mBearishScore = 0;
//
@@ -921,6 +957,9 @@ public:
mBullishScore += bullishScore;
mBearishScore += bearishScore;
//
mVolumeOSC += cConditions.vlmConditions.volume[1];
//
// Parse Conditions for Signal ...
bool hasSignal = signalGenerator.HasSignal(
@@ -928,6 +967,7 @@ public:
cSignal,
cPusher,
cProvider,
mUseSupport,
mAllowLong,
mAllowShort,
mVolume,
@@ -980,6 +1020,9 @@ public:
mBullishScore += bullishScore;
mBearishScore += bearishScore;
//
mVolumeOSC += sConditions.vlmConditions.volume[1];
//
// Parse Conditions for Signal ...
bool hasSignal = signalGenerator.HasSignal(
@@ -1039,6 +1082,9 @@ public:
mBullishScore += bullishScore;
mBearishScore += bearishScore;
//
mVolumeOSC += mConditions.vlmConditions.volume[1];
//
// Parse Conditions for Signal ...
bool hasSignal = signalGenerator.HasSignal(
@@ -1046,6 +1092,7 @@ public:
mSignal,
mPusher,
mProvider,
mUseSupport,
mAllowLong,
mAllowShort,
mVolume,
@@ -1098,6 +1145,9 @@ public:
mBullishScore += bullishScore;
mBearishScore += bearishScore;
//
mVolumeOSC += lConditions.vlmConditions.volume[1];
//
// Parse Conditions for Signal ...
bool hasSignal = signalGenerator.HasSignal(
@@ -1105,6 +1155,7 @@ public:
lSignal,
lPusher,
lProvider,
mUseSupport,
mAllowLong,
mAllowShort,
mVolume,
@@ -1157,6 +1208,9 @@ public:
mBullishScore += bullishScore;
mBearishScore += bearishScore;
//
mVolumeOSC += hConditions.vlmConditions.volume[1];
//
// Parse Conditions for Signal ...
bool hasSignal = signalGenerator.HasSignal(
@@ -1164,6 +1218,7 @@ public:
hSignal,
hPusher,
hProvider,
mUseSupport,
mAllowLong,
mAllowShort,
mVolume,
@@ -1188,113 +1243,276 @@ public:
//
// Current Signals ...
if (cPusher >= mReuiredSignalVerifications && cSignal.IsValid())
if (cSignal.IsValid())
{
//
AddRef(
cSignal,
signals //
);
bool isLong = IsLong(cSignal.type);
if (isLong)
{
mBullishSigns += cPusher;
}
else
{
mBearishSigns += cPusher;
}
//
AddNewSignal(
cPusher,
cSignal,
mBullishScore,
mBearishScore,
cConditions //
);
if (cPusher >= mReuiredSignalVerifications)
{
//
// Check Final Bullish and Bearish Score ...
bool isScorePassed =
//
IsLong(cSignal.type)
? mBullishScore > (mBearishScore * 2)
: mBearishScore > (mBullishScore * 2)
//
;
//
if (isScorePassed)
{
//
AddRef(
cSignal,
signals //
);
//
AddNewSignal(
cPusher,
cSignal,
mBullishScore,
mBearishScore,
cConditions //
);
}
}
}
//
// Short Signals ...
if (sPusher >= mReuiredSignalVerifications && sSignal.IsValid())
if (sSignal.IsValid())
{
//
AddRef(
sSignal,
signals //
);
bool isLong = IsLong(sSignal.type);
if (isLong)
{
mBullishSigns += sPusher;
}
else
{
mBearishSigns += sPusher;
}
//
AddNewSignal(
sPusher,
sSignal,
mBullishScore,
mBearishScore,
sConditions //
);
if (sPusher >= mReuiredSignalVerifications)
{
//
// Check Final Bullish and Bearish Score ...
bool isScorePassed =
//
IsLong(cSignal.type)
? mBullishScore > (mBearishScore * 2)
: mBearishScore > (mBullishScore * 2)
//
;
//
if (isScorePassed)
{
//
AddRef(
sSignal,
signals //
);
//
AddNewSignal(
sPusher,
sSignal,
mBullishScore,
mBearishScore,
sConditions //
);
}
}
}
//
// Medium Signals ...
if (mPusher >= mReuiredSignalVerifications && mSignal.IsValid())
if (mSignal.IsValid())
{
//
AddRef(
mSignal,
signals //
);
bool isLong = IsLong(mSignal.type);
if (isLong)
{
mBullishSigns += mPusher;
}
else
{
mBearishSigns += mPusher;
}
//
AddNewSignal(
mPusher,
mSignal,
mBullishScore,
mBearishScore,
mConditions //
);
if (mPusher >= mReuiredSignalVerifications)
{
//
// Check Final Bullish and Bearish Score ...
bool isScorePassed =
//
IsLong(cSignal.type)
? mBullishScore > (mBearishScore * 2)
: mBearishScore > (mBullishScore * 2)
//
;
//
if (isScorePassed)
{
//
AddRef(
mSignal,
signals //
);
//
AddNewSignal(
mPusher,
mSignal,
mBullishScore,
mBearishScore,
mConditions //
);
}
}
}
//
// Long Signals ...
if (lPusher >= mReuiredSignalVerifications && lSignal.IsValid())
if (lSignal.IsValid())
{
//
AddRef(
lSignal,
signals //
);
bool isLong = IsLong(lSignal.type);
if (isLong)
{
mBullishSigns += lPusher;
}
else
{
mBearishSigns += lPusher;
}
//
AddNewSignal(
lPusher,
lSignal,
mBullishScore,
mBearishScore,
lConditions //
);
if (lPusher >= mReuiredSignalVerifications)
{
//
// Check Final Bullish and Bearish Score ...
bool isScorePassed =
//
IsLong(cSignal.type)
? mBullishScore > (mBearishScore * 2)
: mBearishScore > (mBullishScore * 2)
//
;
//
if (isScorePassed)
{
//
AddRef(
lSignal,
signals //
);
//
AddNewSignal(
lPusher,
lSignal,
mBullishScore,
mBearishScore,
lConditions //
);
}
}
}
//
// Hind Signals ...
if (hPusher >= mReuiredSignalVerifications && hSignal.IsValid())
if (hSignal.IsValid())
{
//
AddRef(
hSignal,
signals //
);
bool isLong = IsLong(hSignal.type);
if (isLong)
{
mBullishSigns += hPusher;
}
else
{
mBearishSigns += hPusher;
}
//
AddNewSignal(
hPusher,
hSignal,
mBullishScore,
mBearishScore,
hConditions //
);
if (hPusher >= mReuiredSignalVerifications)
{
//
// Check Final Bullish and Bearish Score ...
bool isScorePassed =
//
IsLong(cSignal.type)
? mBullishScore > (mBearishScore * 2)
: mBearishScore > (mBullishScore * 2)
//
;
//
if (isScorePassed)
{
//
AddRef(
hSignal,
signals //
);
//
AddNewSignal(
hPusher,
hSignal,
mBullishScore,
mBearishScore,
hConditions //
);
}
}
}
}
//
if (mBullishScore == mBearishScore ||
mBullishScore < 10 ||
mBullishScore == 0 ||
mBullishScore > 200 ||
mBearishScore < 10 ||
mBearishScore == 0 ||
mBearishScore > 200)
{
//
// Print("Custom Scores ...");
}
//
// Create Score Summary for Commenting on Chart ...
string scoreSummary =
//
"Scores:" + separator +
"----------" + separator +
"Bullish: " + ToString(mBullishScore) + separator +
"Bearish: " + ToString(mBearishScore) + separator +
"Bullish Score: " + ToString(mBullishScore) + separator +
"Bullish Signs: " + ToString(mBullishSigns) + separator +
"----------" + separator +
"Bearish Score: " + ToString(mBearishScore) + separator +
"Bearish Signs: " + ToString(mBearishSigns) + separator +
"----------" + separator +
"Volume: " + ToString(mVolumeOSC) + separator +
"DrawDown: " + ToString(GetDrawdownPercent()) + "%" +
""
//
;
@@ -1446,6 +1664,10 @@ public:
// // Check EQM Orders and Handle Hedging ...
// DoEQMHedge();
//
// Handle Close All Positions on Specific Time ...
HandleEQMCloseOnSpecificTime();
//
// if Returns true, Signal Execution failed ...
return result;
@@ -1495,6 +1717,40 @@ protected:
//
// Tools ...
//
bool IsEnable()
{
return mAllowLong || mAllowShort;
}
//
bool CanCloseOnTime()
{
//
bool result = false;
//
result = mCloseOnSpecificTime >= 0 && mCloseOnSpecificTime <= 23;
if (!result)
{
return result;
}
//
MqlDateTime timeStruct;
result = TimeCurrent(timeStruct);
if (!result)
{
return result;
}
//
result = timeStruct.hour == mCloseOnSpecificTime;
//
return result;
}
//
// Private ...
private:
@@ -1507,10 +1763,12 @@ private:
double mVolume; // Volume
double mTPPoint; // TP Point
double mSLPoint; // SL Point
bool mUseSupport; // Use Support Signals
bool mIgnoreTP; // Ignore Calculated TP
bool mIgnoreSL; // Ignore Calculated SL
int mMaxAllowedTrades; // Max Alloed Positions
bool mCloseOnOpposit; // Close all Positions on Opposit
int mCloseOnSpecificTime; // Close All Trades in Specific Time
int mReuiredSignalVerifications; // Required Verifications for Validate Signals
//
@@ -1755,9 +2013,16 @@ private:
}
//
int mBullishSigns;
double mBullishScore;
//
int mBearishSigns;
double mBearishScore;
//
double mVolumeOSC;
//
XSCX121SetupCycles *mSetups[]; // Number of Setups
@@ -2041,6 +2306,43 @@ private:
Alert(message);
}
}
//
// Handle Close Trades on Specific Time ...
void HandleEQMCloseOnSpecificTime()
{
//
bool canClose = CanCloseOnTime();
if (!canClose)
{
return;
}
//
XPosition positions[];
int positionsCount = mTrader.GetPositions(positions);
if (!IsValidSize(positionsCount))
{
return;
}
//
string comment = XEQMSupportToken + " Close On Specific Time ...";
//
int closed = Close(
positions,
comment //
);
if (IsValidSize(closed))
{
//
string message = XEQMSupportToken + " Closed " + ToString(closed) + " Positions on Specified Time ...";
//
Alert(message);
}
}
};
//
+642
View File
@@ -0,0 +1,642 @@
///////////////////////////////////////////////////////
//
// SaherElm IT Center MQL5 Class Library
// ----------------------------------------------
// Name: XSCZone
// Description: provides all Alerts requirements ...
//
//
// 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 <Arrays/ArrayObj.mqh>
#include <ChartObjects/ChartObjectsShapes.mqh>
#include "../Classes/x-saherelm.base.class.mq5"
#include <ChartObjects/ChartObjectsTxtControls.mqh>
//
// Definitions ...
#define defZoneBGColor clrLightGray
#define defZoneLBLColor clrWhite
//
// All Required Inputs ...
struct XSCZonesInput
{
//
int length; // Calculation Length
int numberOfZones; // Number of Zones
//
double levels[]; // Levels Percentage
color colors[]; // level Colors
//
// Constructor ...
void XSCZonesInput()
{
Clean();
}
//
// Tools ...
//
// Cleanup ...
void Clean()
{
//
length = 0;
numberOfZones = 0;
//
Clean(levels);
Clean(colors);
}
//
// Validate ...
bool IsValid()
{
//
bool result = false;
//
result =
//
length >= 5 &&
numberOfZones >= 2
//
;
//
return result;
}
//
// Add Specified Level/Color ...
void AddLevelColor(
double level,
color clr //
)
{
//
Add(
level,
levels);
//
Add(
clr,
colors //
);
}
//
// Retrieve Sort Indexed Levels Color ...
void RetrieveSortedLevels(
double &_levels[],
color &_colors[] //
)
{
//
Clean(_levels);
Clean(_colors);
//
int levelsCount = ArraySize(levels);
int colorsCount = ArraySize(colors);
//
bool hasChild = IsValidSize(levelsCount) &&
IsValidSize(colorsCount);
if (!hasChild)
{
return;
}
//
// Create Temp Levels ...
double tmpLevels[];
Copy(
levels,
tmpLevels //
);
ArraySort(tmpLevels);
//
// Size of Looping ...
int minSize = MathMin(levelsCount, colorsCount);
//
for (int i = 0; i < minSize; i++)
{
//
double iLevel = tmpLevels[i];
//
int iLevelIDX = FindIndex(
iLevel,
levels //
);
if (!IsValidIndex(iLevelIDX))
{
continue;
}
//
Add(
levels[iLevelIDX],
_levels //
);
//
Add(
colors[iLevelIDX],
_colors //
);
}
}
};
//
// Class ...
//
// Specific Zone ...
class XSCZone : public CObject
{
//
// Public ...
public:
//
// Props ...
double high;
double low;
int ticks;
//
// Compare Two Zone With Each Other ...
virtual int Compare(
const CObject *node,
const int mode = 0 //
) const
{
//
const XSCZone *other = (XSCZone *)node;
//
return other.ticks - ticks;
}
//
// Create Object ...
//
// Protected ...
protected:
//
// Private ...
private:
};
//
// Zones ...
//
class XSCZones : public XSCBase
{
//
// Public ...
public:
//
// Constructor(s) ...
void XSCZones(
string symbol,
ENUM_TIMEFRAMES period //
) : XSCBase()
{
//
this.mSymbol = symbol;
this.mPeriod = period;
}
//
void ~XSCZones()
{
//
mZones.Clear();
mChartObjects.Clear();
}
//
// Initialize Zones by Providing required
// Input Variables ...
bool Init(
XSCZonesInput &inputs // Inputs ...
)
{
//
bool result = false;
//
// Validate Inputs ...
result = inputs.IsValid();
if (!result)
{
return result;
}
//
// Set Inputs ...
mInputs = inputs;
//
// Do Calculatins ...
Calculate();
//
return result;
}
//
XSCZonesInput GetInputs()
{
return mInputs;
}
//
bool SetInputs(XSCZonesInput &inputs)
{
return Init(inputs);
}
//
void Calculate()
{
//
// Prevent Double Calculating ...
int bars = iBars(
mSymbol,
mPeriod //
);
if (mCalculatedBars == bars)
{
return;
}
//
mCalculatedBars = bars;
//
// Calculate Start and End Time ...
//
mStartTime = iTime(
mSymbol,
mPeriod,
mInputs.length + 1 //
);
//
mEndTime = iTime(
mSymbol,
mPeriod,
0 //
);
//
// Retrieve Ticks between Times ...
Clean(mTicks);
CopyTicksRange(
mSymbol,
mTicks,
COPY_TICKS_ALL,
mStartTime * 1000,
mEndTime * 1000 //
);
//
// Retrieve Highs ...
Clean(mHighs);
CopyHigh(
mSymbol,
mPeriod,
mStartTime,
mEndTime,
mHighs //
);
//
// Find Highest Value in Range ...
mRangeHigh = mHighs[ArrayMaximum(mHighs)];
//
// Retrieve Lows ...
Clean(mLows);
CopyLow(
mSymbol,
mPeriod,
mStartTime,
mEndTime,
mLows //
);
//
// Find Lowest Value in Range ...
mRangeLow = mLows[ArrayMaximum(mLows)];
//
double mRangeSize = GetRange();
//
// Prepare Zones Array ...
mZones.Clear();
//
// Create Zones ...
for (int i = 0; i < mInputs.numberOfZones; i++)
{
//
// Instance a New Zone ...
XSCZone *iZone = new XSCZone();
//
// Calculate Each Zones High / Low based on Range ...
double iH = mRangeHigh - mRangeSize * i / mInputs.numberOfZones;
double iL = mRangeHigh - mRangeSize * (i + 1) / mInputs.numberOfZones;
//
// Set Zone High Low Properties ...
iZone.low = iL;
iZone.high = iH;
//
// Add Zone to Zone Array Objects ...
mZones.Add(iZone);
}
//
// Calculate Each Zone Ticks ...
int mTicksCount = CountTicks();
for (int i = 0; i < mTicksCount; i++)
{
//
// Retrieve i Index Tick Object ...
MqlTick iTick = mTicks[i];
//
// Loop Through Zones ...
for (int j = 0; j < mZones.Total(); j++)
{
//
// Retrieve j Index Zone Object ...
XSCZone *jZone = mZones.At(j);
//
bool isInRange = IsTickInZoneRange(
iTick,
jZone //
);
if (isInRange)
{
//
jZone.ticks++;
break;
}
}
}
//
mZones.Sort();
}
//
XSCZone *GetZone(int index)
{
return mZones.At(index);
}
//
double CalculateZoneTickPercent(
XSCZone *zone,
int normalizationDigits = 2 //
)
{
//
double result = 0;
//
if (normalizationDigits < 2 || normalizationDigits > 5)
{
normalizationDigits = 2;
}
//
result = (double)zone.ticks / CountTicks() * 100;
result = NormalizeDouble(result, normalizationDigits);
//
return result;
}
//
bool DrawZones(
long chartId = 0,
string prefix = "XSCZone",
int subWindow = 0,
bool redraw = false //
)
{
//
bool result = false;
//
if (redraw)
{
mChartObjects.Clear();
}
//
if (StringLen(prefix) <= 0)
{
prefix = "XSCZone";
}
//
int zonesCount = mZones.Total();
result = IsValidSize(zonesCount);
if (!result)
{
return result;
}
//
double levels[];
color colors[];
mInputs.RetrieveSortedLevels(
levels,
colors);
int levelsCount = ArraySize(levels);
int colorsCount = ArraySize(colors);
bool canSetLevels = IsValidSize(levelsCount) &&
IsValidSize(colorsCount) &&
levelsCount == colorsCount;
//
// Loop Through Zones ...
for (int i = 0; i < zonesCount; i++)
{
//
XSCZone *iZone = mZones.At(i);
//
// Generate Chart Object Names ...
string iRectName = prefix + ToString(i);
string iLabelName = iRectName + "_lbl";
//
// Creating Rectangles ...
CChartObjectRectangle *iRect = new CChartObjectRectangle();
result = iRect.Create(
chartId,
iRectName,
subWindow,
mStartTime,
iZone.high,
mEndTime,
iZone.low //
);
if (!result)
{
break;
}
//
// Set Default Rectangle Color ...
iRect.Color(defZoneBGColor);
iRect.Fill(true);
//
// Create Label ...
CChartObjectLabel *iLabel = new CChartObjectLabel();
result = iLabel.Create(
chartId,
iLabelName,
subWindow,
mStartTime,
iZone.high //
);
if (!result)
{
break;
}
//
iLabel.Color(defZoneLBLColor);
//
double iPercentage = CalculateZoneTickPercent(iZone);
iLabel.Description(ToString(iPercentage) + "%");
//
// Set Levels and Colors if Provided ...
if (canSetLevels) {
}
//
mChartObjects.Add(iRect);
mChartObjects.Add(iLabel);
}
//
return result;
}
//
// Protected ...
protected:
//
// Props ...
//
datetime mStartTime;
datetime mEndTime;
//
MqlTick mTicks[];
double mHighs[];
double mLows[];
double mRangeHigh;
double mRangeLow;
//
CArrayObj mZones;
CArrayObj mChartObjects;
//
// Tools ...
//
int CountTicks()
{
return ArraySize(mTicks);
}
//
double GetRange()
{
return mRangeHigh - mRangeLow;
}
//
// Check a Tick is in a Zone rage or not ...
bool IsTickInZoneRange(
MqlTick &tick, // Tick For Checking
XSCZone *zone // Zone For Checking
)
{
//
bool result = false;
//
result =
//
tick.bid >= zone.low &&
tick.bid <= zone.high
//
;
//
return result;
}
//
// Private ...
private:
//
// Props ...
//
string mSymbol; // Analyzing Symbol
ENUM_TIMEFRAMES mPeriod; // Analyzing Period
//
XSCZonesInput mInputs; // Configurations
//
int mCalculatedBars; // Calculated Bars ...
};
+24
View File
@@ -1724,6 +1724,7 @@ public:
//
mIsInTestMode = IsRunningOnTestMode();
mStaticBalanceForCalculateDrawdown = 0; // Ignore ...
//
// Set Event Handlers ...
@@ -1834,6 +1835,12 @@ public:
);
}
//
double GetDrawdownPercent()
{
return mDrawdownPercent;
}
//
// Overrides ...
@@ -1868,6 +1875,17 @@ public:
// OnTick Handler ...
virtual void OnTick()
{
//
double mEquity = mTrader.mAccount.GetEquity();
if (mEquity > mMaxDrawdown)
{
mMaxDrawdown = mEquity;
}
//
mDrawdownPercent = (mMaxDrawdown - mEquity) / (mStaticBalanceForCalculateDrawdown > 0 ? mStaticBalanceForCalculateDrawdown : mMaxDrawdown) * 100;
mDrawdownPercent = NormalizeDouble(mDrawdownPercent, 3);
//
// Draw ...
Draw();
@@ -2230,6 +2248,12 @@ protected:
// Check in Test Mode or not ...
bool mIsInTestMode;
//
// Save Max Drawdown ...
double mMaxDrawdown;
double mDrawdownPercent;
double mStaticBalanceForCalculateDrawdown;
//
// Tools ...