last works ...
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
//
|
||||
|
||||
@@ -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 ...
|
||||
};
|
||||
@@ -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 ...
|
||||
|
||||
|
||||
Reference in New Issue
Block a user