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.xich.helper.mq5"
#include "../Helpers/x-saherelm.xmrb.helper.mq5" #include "../Helpers/x-saherelm.xmrb.helper.mq5"
#include "../Helpers/x-saherelm.xosc.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.xasct.helper.mq5"
#include "../Helpers/x-saherelm.xsslc.helper.mq5" #include "../Helpers/x-saherelm.xsslc.helper.mq5"
#include "../Helpers/x-saherelm.xhull.helper.mq5" #include "../Helpers/x-saherelm.xhull.helper.mq5"
@@ -67,6 +68,7 @@ enum ENUM_X121_SIGNAL_PROVIDER
PROVIDER_XSSLC = 14, PROVIDER_XSSLC = 14,
PROVIDER_XHULL = 15, PROVIDER_XHULL = 15,
PROVIDER_XASCT = 16, PROVIDER_XASCT = 16,
PROVIDER_XVLM = 17,
}; };
// //
@@ -210,6 +212,7 @@ struct X121SetupInputs
XSTRInputs strInputs; // XSTR Inputs XSTRInputs strInputs; // XSTR Inputs
XMRBInputs mrbInputs; // XMRB Inputs XMRBInputs mrbInputs; // XMRB Inputs
XOSCInputs oscInputs; // XOSC Inputs XOSCInputs oscInputs; // XOSC Inputs
XVLMInputs vlmInputs; // XVLM Inputs
XMATDInputs matdInputs; // XMATD Inputs XMATDInputs matdInputs; // XMATD Inputs
XASCTInputs asctInputs; // XASCT Inputs XASCTInputs asctInputs; // XASCT Inputs
XSSLCInputs sslcInputs; // XSSLC Inputs XSSLCInputs sslcInputs; // XSSLC Inputs
@@ -245,6 +248,7 @@ struct X121SetupInputs
XSTRInputs &_strInputs, // XSTR Inputs XSTRInputs &_strInputs, // XSTR Inputs
XMRBInputs &_mrbInputs, // XMRB Inputs XMRBInputs &_mrbInputs, // XMRB Inputs
XOSCInputs &_oscInputs, // XOSC Inputs XOSCInputs &_oscInputs, // XOSC Inputs
XVLMInputs &_vlmInputs, // XVLM Inputs
XMATDInputs &_matdInputs, // XMATD Inputs XMATDInputs &_matdInputs, // XMATD Inputs
XASCTInputs &_asctInputs, // XASCT Inputs XASCTInputs &_asctInputs, // XASCT Inputs
XSSLCInputs &_sslcInputs, // XSSLC Inputs XSSLCInputs &_sslcInputs, // XSSLC Inputs
@@ -265,6 +269,7 @@ struct X121SetupInputs
this.strInputs = _strInputs; this.strInputs = _strInputs;
this.mrbInputs = _mrbInputs; this.mrbInputs = _mrbInputs;
this.oscInputs = _oscInputs; this.oscInputs = _oscInputs;
this.vlmInputs = _vlmInputs;
this.matdInputs = _matdInputs; this.matdInputs = _matdInputs;
this.asctInputs = _asctInputs; this.asctInputs = _asctInputs;
this.sslcInputs = _sslcInputs; this.sslcInputs = _sslcInputs;
@@ -297,6 +302,7 @@ struct X121SetupInputs
strInputs.Clean(); strInputs.Clean();
mrbInputs.Clean(); mrbInputs.Clean();
oscInputs.Clean(); oscInputs.Clean();
vlmInputs.Clean();
matdInputs.Clean(); matdInputs.Clean();
asctInputs.Clean(); asctInputs.Clean();
sslcInputs.Clean(); sslcInputs.Clean();
@@ -316,6 +322,7 @@ struct X121SetupInputs
strInputs.Default(); strInputs.Default();
mrbInputs.Default(); mrbInputs.Default();
oscInputs.Default(); oscInputs.Default();
vlmInputs.Default();
matdInputs.Default(); matdInputs.Default();
asctInputs.Default(); asctInputs.Default();
sslcInputs.Default(); sslcInputs.Default();
@@ -349,66 +356,84 @@ struct X121SetupInputs
return result; return result;
} }
//
result = hkInputs.IsValid(); result = hkInputs.IsValid();
if (!result) if (!result)
{ {
return result; return result;
} }
//
result = cheInputs.IsValid(); result = cheInputs.IsValid();
if (!result) if (!result)
{ {
return result; return result;
} }
//
result = ichInputs.IsValid(); result = ichInputs.IsValid();
if (!result) if (!result)
{ {
return result; return result;
} }
//
result = strInputs.IsValid(); result = strInputs.IsValid();
if (!result) if (!result)
{ {
return result; return result;
} }
//
result = mrbInputs.IsValid(); result = mrbInputs.IsValid();
if (!result) if (!result)
{ {
return result; return result;
} }
//
result = oscInputs.IsValid(); result = oscInputs.IsValid();
if (!result) if (!result)
{ {
return result; return result;
} }
//
result = vlmInputs.IsValid();
if (!result)
{
return result;
}
//
result = matdInputs.IsValid(); result = matdInputs.IsValid();
if (!result) if (!result)
{ {
return result; return result;
} }
//
result = asctInputs.IsValid(); result = asctInputs.IsValid();
if (!result) if (!result)
{ {
return result; return result;
} }
//
result = sslcInputs.IsValid(); result = sslcInputs.IsValid();
if (!result) if (!result)
{ {
return result; return result;
} }
//
result = hullInputs.IsValid(); result = hullInputs.IsValid();
if (!result) if (!result)
{ {
return result; return result;
} }
//
result = adxtdInputs.IsValid(); result = adxtdInputs.IsValid();
if (!result) if (!result)
{ {
@@ -438,6 +463,7 @@ struct X121SetupConditions
XICHConditions ichConditions; XICHConditions ichConditions;
XSTRConditions strConditions; XSTRConditions strConditions;
XMRBConditions mrbConditions; XMRBConditions mrbConditions;
XVLMConditions vlmConditions;
XMATDConditions matdConditions; XMATDConditions matdConditions;
XASCTConditions asctConditions; XASCTConditions asctConditions;
XSSLCConditions sslcConditions; XSSLCConditions sslcConditions;
@@ -476,6 +502,7 @@ struct X121SetupConditions
ichConditions.Clean(); ichConditions.Clean();
strConditions.Clean(); strConditions.Clean();
mrbConditions.Clean(); mrbConditions.Clean();
vlmConditions.Clean();
matdConditions.Clean(); matdConditions.Clean();
asctConditions.Clean(); asctConditions.Clean();
sslcConditions.Clean(); sslcConditions.Clean();
@@ -569,6 +596,14 @@ struct X121SetupConditions
bullishScore += tempBullishScore; bullishScore += tempBullishScore;
bearishScore += tempBearishScore; bearishScore += tempBearishScore;
//
vlmConditions.GenerateScore(
tempBullishScore,
tempBearishScore //
);
bullishScore += tempBullishScore;
bearishScore += tempBearishScore;
// //
sslcConditions.GenerateScore( sslcConditions.GenerateScore(
tempBullishScore, tempBullishScore,
@@ -625,32 +660,34 @@ struct X121SetupConditions
); );
// //
string matdSummary = matdConditions.GenerateSummary(false, true, false, ignoreFalseConditions); string tdSummary = tdConditions.GenerateSummary(false, true, false, ignoreFalseConditions);
string adxtdSummary = adxtdConditions.GenerateSummary(false, true, false, ignoreFalseConditions); string hkSummary = hkConditions.GenerateSummary(false, true, false, ignoreFalseConditions);
string strSummary = strConditions.GenerateSummary(false, true, false, ignoreFalseConditions); string strSummary = strConditions.GenerateSummary(false, true, false, ignoreFalseConditions);
string cheSummary = cheConditions.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 ichSummary = ichConditions.GenerateSummary(false, true, false, ignoreFalseConditions);
string hkSummary = hkConditions.GenerateSummary(false, true, false, ignoreFalseConditions);
string mrbSummary = mrbConditions.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 sslcSummary = sslcConditions.GenerateSummary(false, true, false, ignoreFalseConditions);
string hullSummary = hullConditions.GenerateSummary(false, true, false, ignoreFalseConditions); string hullSummary = hullConditions.GenerateSummary(false, true, false, ignoreFalseConditions);
string adxtdSummary = adxtdConditions.GenerateSummary(false, true, false, ignoreFalseConditions);
// //
string conditionsStr = string conditionsStr =
// //
matdSummary + separator + tdSummary + separator +
adxtdSummary + separator + hkSummary + separator +
ichSummary + separator +
mrbSummary + separator +
vlmSummary + separator +
strSummary + separator + strSummary + separator +
cheSummary + separator + cheSummary + separator +
asctSummary + separator + asctSummary + separator +
tdSummary + separator +
ichSummary + separator +
hkSummary + separator +
mrbSummary + separator +
sslcSummary + separator + sslcSummary + separator +
hullSummary + separator + hullSummary + separator +
matdSummary + separator +
adxtdSummary + separator +
"" ""
// //
; ;
@@ -818,7 +855,8 @@ struct X121SignalGenerator
conditions.hkConditions.isSMHKBullish && conditions.hkConditions.isSMHKBullish &&
conditions.mrbConditions.isFastOverSlow && conditions.mrbConditions.isFastOverSlow &&
conditions.sslcConditions.isBullish && conditions.sslcConditions.isBullish &&
conditions.hullConditions.isBullish conditions.hullConditions.isBullish &&
conditions.vlmConditions.isVolumeBullish
// //
; ;
if (long1) if (long1)
@@ -846,7 +884,8 @@ struct X121SignalGenerator
conditions.hkConditions.isSMHKBullish && conditions.hkConditions.isSMHKBullish &&
conditions.mrbConditions.isFastOverSlow && conditions.mrbConditions.isFastOverSlow &&
conditions.sslcConditions.isBullish && conditions.sslcConditions.isBullish &&
conditions.hullConditions.isBullish conditions.hullConditions.isBullish &&
conditions.vlmConditions.isVolumeBullish
// //
; ;
if (long2) if (long2)
@@ -872,7 +911,8 @@ struct X121SignalGenerator
conditions.hkConditions.isSMHKBullish && conditions.hkConditions.isSMHKBullish &&
conditions.mrbConditions.isFastOverSlow && conditions.mrbConditions.isFastOverSlow &&
conditions.sslcConditions.isBullish && conditions.sslcConditions.isBullish &&
conditions.hullConditions.isBullish conditions.hullConditions.isBullish &&
conditions.vlmConditions.isVolumeBullish
// //
; ;
if (long3) if (long3)
@@ -899,7 +939,8 @@ struct X121SignalGenerator
conditions.hkConditions.isSMHKBullish && conditions.hkConditions.isSMHKBullish &&
conditions.mrbConditions.isFastOverSlow && conditions.mrbConditions.isFastOverSlow &&
conditions.sslcConditions.isBullish && conditions.sslcConditions.isBullish &&
conditions.hullConditions.isBullish conditions.hullConditions.isBullish &&
conditions.vlmConditions.isVolumeBullish
// //
; ;
if (long4) if (long4)
@@ -926,7 +967,8 @@ struct X121SignalGenerator
conditions.hkConditions.isSMHKBullish && conditions.hkConditions.isSMHKBullish &&
conditions.mrbConditions.isFastOverSlow && conditions.mrbConditions.isFastOverSlow &&
conditions.sslcConditions.isBullish && conditions.sslcConditions.isBullish &&
conditions.hullConditions.isBullish conditions.hullConditions.isBullish &&
conditions.vlmConditions.isVolumeBullish
// //
; ;
if (long5) if (long5)
@@ -953,7 +995,8 @@ struct X121SignalGenerator
conditions.hkConditions.isSMHKBullish && conditions.hkConditions.isSMHKBullish &&
conditions.mrbConditions.isFastOverSlow && conditions.mrbConditions.isFastOverSlow &&
conditions.sslcConditions.isBullish && conditions.sslcConditions.isBullish &&
conditions.hullConditions.isBullish conditions.hullConditions.isBullish &&
conditions.vlmConditions.isVolumeBullish
// //
; ;
if (long6) if (long6)
@@ -982,7 +1025,8 @@ struct X121SignalGenerator
conditions.hkConditions.isSMHKBullish && conditions.hkConditions.isSMHKBullish &&
conditions.mrbConditions.isFastOverSlow && conditions.mrbConditions.isFastOverSlow &&
conditions.sslcConditions.isBullish && conditions.sslcConditions.isBullish &&
conditions.hullConditions.isBullish conditions.hullConditions.isBullish &&
conditions.vlmConditions.isVolumeBullish
// //
; ;
if (long7) if (long7)
@@ -1011,7 +1055,8 @@ struct X121SignalGenerator
conditions.hkConditions.isSMHKBullish && conditions.hkConditions.isSMHKBullish &&
conditions.mrbConditions.isFastOverSlow && conditions.mrbConditions.isFastOverSlow &&
conditions.sslcConditions.isBullish && conditions.sslcConditions.isBullish &&
conditions.hullConditions.isBullish conditions.hullConditions.isBullish &&
conditions.vlmConditions.isVolumeBullish
// //
; ;
if (long8) if (long8)
@@ -1040,7 +1085,8 @@ struct X121SignalGenerator
conditions.hkConditions.isSMHKBullish && conditions.hkConditions.isSMHKBullish &&
conditions.mrbConditions.isFastOverSlow && conditions.mrbConditions.isFastOverSlow &&
conditions.sslcConditions.isBullish && conditions.sslcConditions.isBullish &&
conditions.hullConditions.isBullish conditions.hullConditions.isBullish &&
conditions.vlmConditions.isVolumeBullish
// //
; ;
if (long9) if (long9)
@@ -1068,7 +1114,8 @@ struct X121SignalGenerator
conditions.hkConditions.isSMHKBullish && conditions.hkConditions.isSMHKBullish &&
conditions.mrbConditions.isFastOverSlow && conditions.mrbConditions.isFastOverSlow &&
conditions.sslcConditions.isBullish && conditions.sslcConditions.isBullish &&
conditions.hullConditions.isBullish conditions.hullConditions.isBullish &&
conditions.vlmConditions.isVolumeBullish
// //
; ;
if (long10) if (long10)
@@ -1095,7 +1142,8 @@ struct X121SignalGenerator
conditions.hkConditions.isSMHKBullish && conditions.hkConditions.isSMHKBullish &&
conditions.mrbConditions.isFastOverSlow && conditions.mrbConditions.isFastOverSlow &&
conditions.sslcConditions.isBullish && conditions.sslcConditions.isBullish &&
conditions.hullConditions.isBullish conditions.hullConditions.isBullish &&
conditions.vlmConditions.isVolumeBullish
// //
; ;
if (long11) if (long11)
@@ -1122,7 +1170,8 @@ struct X121SignalGenerator
conditions.hkConditions.isHKBullish && conditions.hkConditions.isHKBullish &&
conditions.mrbConditions.isFastOverSlow && conditions.mrbConditions.isFastOverSlow &&
conditions.sslcConditions.isBullish && conditions.sslcConditions.isBullish &&
conditions.hullConditions.isBullish conditions.hullConditions.isBullish &&
conditions.vlmConditions.isVolumeBullish
// //
; ;
if (long12) if (long12)
@@ -1149,7 +1198,8 @@ struct X121SignalGenerator
conditions.hkConditions.isHKBullish && conditions.hkConditions.isHKBullish &&
conditions.hkConditions.isSMHKBullish && conditions.hkConditions.isSMHKBullish &&
conditions.sslcConditions.isBullish && conditions.sslcConditions.isBullish &&
conditions.hullConditions.isBullish conditions.hullConditions.isBullish &&
conditions.vlmConditions.isVolumeBullish
// //
; ;
if (long13) if (long13)
@@ -1176,7 +1226,8 @@ struct X121SignalGenerator
conditions.hkConditions.isHKBullish && conditions.hkConditions.isHKBullish &&
conditions.hkConditions.isSMHKBullish && conditions.hkConditions.isSMHKBullish &&
conditions.mrbConditions.isFastOverSlow && conditions.mrbConditions.isFastOverSlow &&
conditions.hullConditions.isBullish conditions.hullConditions.isBullish &&
conditions.vlmConditions.isVolumeBullish
// //
; ;
if (long14) if (long14)
@@ -1203,7 +1254,8 @@ struct X121SignalGenerator
conditions.hkConditions.isHKBullish && conditions.hkConditions.isHKBullish &&
conditions.hkConditions.isSMHKBullish && conditions.hkConditions.isSMHKBullish &&
conditions.mrbConditions.isFastOverSlow && conditions.mrbConditions.isFastOverSlow &&
conditions.sslcConditions.isBullish conditions.sslcConditions.isBullish &&
conditions.vlmConditions.isVolumeBullish
// //
; ;
if (long15) if (long15)
@@ -1231,7 +1283,8 @@ struct X121SignalGenerator
conditions.hkConditions.isSMHKBullish && conditions.hkConditions.isSMHKBullish &&
conditions.mrbConditions.isFastOverSlow && conditions.mrbConditions.isFastOverSlow &&
conditions.hullConditions.isBullish && conditions.hullConditions.isBullish &&
conditions.sslcConditions.isBullish conditions.sslcConditions.isBullish &&
conditions.vlmConditions.isVolumeBullish
// //
; ;
if (long16) if (long16)
@@ -1241,6 +1294,34 @@ struct X121SignalGenerator
provider = ToString(PROVIDER_XASCT); 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 = result =
// //
@@ -1311,6 +1392,10 @@ struct X121SignalGenerator
// //
long16 long16
// //
||
//
long17
//
) )
// //
; ;
@@ -1367,7 +1452,8 @@ struct X121SignalGenerator
conditions.hkConditions.isSMHKBearish && conditions.hkConditions.isSMHKBearish &&
conditions.mrbConditions.isFastUnderSlow && conditions.mrbConditions.isFastUnderSlow &&
conditions.sslcConditions.isBearish && conditions.sslcConditions.isBearish &&
conditions.hullConditions.isBearish conditions.hullConditions.isBearish &&
conditions.vlmConditions.isVolumeBearish
// //
; ;
if (short1) if (short1)
@@ -1395,7 +1481,8 @@ struct X121SignalGenerator
conditions.hkConditions.isSMHKBearish && conditions.hkConditions.isSMHKBearish &&
conditions.mrbConditions.isFastUnderSlow && conditions.mrbConditions.isFastUnderSlow &&
conditions.sslcConditions.isBearish && conditions.sslcConditions.isBearish &&
conditions.hullConditions.isBearish conditions.hullConditions.isBearish &&
conditions.vlmConditions.isVolumeBearish
// //
; ;
if (short2) if (short2)
@@ -1421,7 +1508,8 @@ struct X121SignalGenerator
conditions.hkConditions.isSMHKBearish && conditions.hkConditions.isSMHKBearish &&
conditions.mrbConditions.isFastUnderSlow && conditions.mrbConditions.isFastUnderSlow &&
conditions.sslcConditions.isBearish && conditions.sslcConditions.isBearish &&
conditions.hullConditions.isBearish conditions.hullConditions.isBearish &&
conditions.vlmConditions.isVolumeBearish
// //
; ;
if (short3) if (short3)
@@ -1448,7 +1536,8 @@ struct X121SignalGenerator
conditions.hkConditions.isSMHKBearish && conditions.hkConditions.isSMHKBearish &&
conditions.mrbConditions.isFastUnderSlow && conditions.mrbConditions.isFastUnderSlow &&
conditions.sslcConditions.isBearish && conditions.sslcConditions.isBearish &&
conditions.hullConditions.isBearish conditions.hullConditions.isBearish &&
conditions.vlmConditions.isVolumeBearish
// //
; ;
if (short4) if (short4)
@@ -1475,7 +1564,8 @@ struct X121SignalGenerator
conditions.hkConditions.isSMHKBearish && conditions.hkConditions.isSMHKBearish &&
conditions.mrbConditions.isFastUnderSlow && conditions.mrbConditions.isFastUnderSlow &&
conditions.sslcConditions.isBearish && conditions.sslcConditions.isBearish &&
conditions.hullConditions.isBearish conditions.hullConditions.isBearish &&
conditions.vlmConditions.isVolumeBearish
// //
; ;
if (short5) if (short5)
@@ -1502,7 +1592,8 @@ struct X121SignalGenerator
conditions.hkConditions.isSMHKBearish && conditions.hkConditions.isSMHKBearish &&
conditions.mrbConditions.isFastUnderSlow && conditions.mrbConditions.isFastUnderSlow &&
conditions.sslcConditions.isBearish && conditions.sslcConditions.isBearish &&
conditions.hullConditions.isBearish conditions.hullConditions.isBearish &&
conditions.vlmConditions.isVolumeBearish
// //
; ;
if (short6) if (short6)
@@ -1531,7 +1622,8 @@ struct X121SignalGenerator
conditions.hkConditions.isSMHKBearish && conditions.hkConditions.isSMHKBearish &&
conditions.mrbConditions.isFastUnderSlow && conditions.mrbConditions.isFastUnderSlow &&
conditions.sslcConditions.isBearish && conditions.sslcConditions.isBearish &&
conditions.hullConditions.isBearish conditions.hullConditions.isBearish &&
conditions.vlmConditions.isVolumeBearish
// //
; ;
if (short7) if (short7)
@@ -1560,7 +1652,8 @@ struct X121SignalGenerator
conditions.hkConditions.isSMHKBearish && conditions.hkConditions.isSMHKBearish &&
conditions.mrbConditions.isFastUnderSlow && conditions.mrbConditions.isFastUnderSlow &&
conditions.sslcConditions.isBearish && conditions.sslcConditions.isBearish &&
conditions.hullConditions.isBearish conditions.hullConditions.isBearish &&
conditions.vlmConditions.isVolumeBearish
// //
; ;
if (short8) if (short8)
@@ -1589,7 +1682,8 @@ struct X121SignalGenerator
conditions.hkConditions.isSMHKBearish && conditions.hkConditions.isSMHKBearish &&
conditions.mrbConditions.isFastUnderSlow && conditions.mrbConditions.isFastUnderSlow &&
conditions.sslcConditions.isBearish && conditions.sslcConditions.isBearish &&
conditions.hullConditions.isBearish conditions.hullConditions.isBearish &&
conditions.vlmConditions.isVolumeBearish
// //
; ;
if (short9) if (short9)
@@ -1617,7 +1711,8 @@ struct X121SignalGenerator
conditions.hkConditions.isSMHKBearish && conditions.hkConditions.isSMHKBearish &&
conditions.mrbConditions.isFastUnderSlow && conditions.mrbConditions.isFastUnderSlow &&
conditions.sslcConditions.isBearish && conditions.sslcConditions.isBearish &&
conditions.hullConditions.isBearish conditions.hullConditions.isBearish &&
conditions.vlmConditions.isVolumeBearish
// //
; ;
if (short10) if (short10)
@@ -1644,7 +1739,8 @@ struct X121SignalGenerator
conditions.hkConditions.isSMHKBearish && conditions.hkConditions.isSMHKBearish &&
conditions.mrbConditions.isFastUnderSlow && conditions.mrbConditions.isFastUnderSlow &&
conditions.sslcConditions.isBearish && conditions.sslcConditions.isBearish &&
conditions.hullConditions.isBearish conditions.hullConditions.isBearish &&
conditions.vlmConditions.isVolumeBearish
// //
; ;
if (short11) if (short11)
@@ -1671,7 +1767,8 @@ struct X121SignalGenerator
conditions.hkConditions.isHKBearish && conditions.hkConditions.isHKBearish &&
conditions.mrbConditions.isFastUnderSlow && conditions.mrbConditions.isFastUnderSlow &&
conditions.sslcConditions.isBearish && conditions.sslcConditions.isBearish &&
conditions.hullConditions.isBearish conditions.hullConditions.isBearish &&
conditions.vlmConditions.isVolumeBearish
// //
; ;
if (short12) if (short12)
@@ -1698,7 +1795,8 @@ struct X121SignalGenerator
conditions.hkConditions.isHKBearish && conditions.hkConditions.isHKBearish &&
conditions.hkConditions.isSMHKBearish && conditions.hkConditions.isSMHKBearish &&
conditions.sslcConditions.isBearish && conditions.sslcConditions.isBearish &&
conditions.hullConditions.isBearish conditions.hullConditions.isBearish &&
conditions.vlmConditions.isVolumeBearish
// //
; ;
if (short13) if (short13)
@@ -1725,7 +1823,8 @@ struct X121SignalGenerator
conditions.hkConditions.isHKBearish && conditions.hkConditions.isHKBearish &&
conditions.hkConditions.isSMHKBearish && conditions.hkConditions.isSMHKBearish &&
conditions.mrbConditions.isFastUnderSlow && conditions.mrbConditions.isFastUnderSlow &&
conditions.hullConditions.isBearish conditions.hullConditions.isBearish &&
conditions.vlmConditions.isVolumeBearish
// //
; ;
if (short14) if (short14)
@@ -1752,7 +1851,8 @@ struct X121SignalGenerator
conditions.hkConditions.isHKBearish && conditions.hkConditions.isHKBearish &&
conditions.hkConditions.isSMHKBearish && conditions.hkConditions.isSMHKBearish &&
conditions.mrbConditions.isFastUnderSlow && conditions.mrbConditions.isFastUnderSlow &&
conditions.sslcConditions.isBearish conditions.sslcConditions.isBearish &&
conditions.vlmConditions.isVolumeBearish
// //
; ;
if (short15) if (short15)
@@ -1780,16 +1880,45 @@ struct X121SignalGenerator
conditions.hkConditions.isSMHKBearish && conditions.hkConditions.isSMHKBearish &&
conditions.mrbConditions.isFastUnderSlow && conditions.mrbConditions.isFastUnderSlow &&
conditions.hullConditions.isBearish && conditions.hullConditions.isBearish &&
conditions.sslcConditions.isBearish conditions.sslcConditions.isBearish &&
conditions.vlmConditions.isVolumeBearish
// //
; ;
if (short15) if (short16)
{ {
// //
pusher++; pusher++;
provider = ToString(PROVIDER_XASCT); 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 = result =
// //
@@ -1860,6 +1989,10 @@ struct X121SignalGenerator
// //
short16 short16
// //
||
//
short17
//
) )
// //
; ;
@@ -1881,7 +2014,7 @@ struct X121SignalGenerator
// //
// TODO Filter ... // TODO Filter ...
result = true; result = provider == ToString(PROVIDER_XVLM);
// //
return result; return result;
@@ -1900,7 +2033,7 @@ struct X121SignalGenerator
// //
// TODO Filter ... // TODO Filter ...
result = true; result = provider == ToString(PROVIDER_XVLM);
// //
return result; return result;
@@ -1913,6 +2046,7 @@ struct X121SignalGenerator
XSignal &signal, // Signal if Exists XSignal &signal, // Signal if Exists
int &pusher, // Pushers int &pusher, // Pushers
string &provider, // Signal Provider Name string &provider, // Signal Provider Name
bool _useSupport, // Generate Support Signals
bool _allowLong, // Allow Long Signals bool _allowLong, // Allow Long Signals
bool _allowShort, // Allow Short Signals bool _allowShort, // Allow Short Signals
double _volume = 0.01, // Volume double _volume = 0.01, // Volume
@@ -2052,10 +2186,60 @@ struct X121SignalGenerator
return result; return result;
} }
//
// Generate Support Signals ...
if (_useSupport)
{
//
GenerateSupportSignals(
signal //
);
}
// //
return result; 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() string GetTag()
{ {
@@ -2079,6 +2263,7 @@ public:
XSCXSTRHelper *strHelper; XSCXSTRHelper *strHelper;
XSCXMRBHelper *mrbHelper; XSCXMRBHelper *mrbHelper;
XSCXOSCHelper *oscHelper; XSCXOSCHelper *oscHelper;
XSCXVLMHelper *vlmHelper;
XSCXMATDHelper *matdHelper; XSCXMATDHelper *matdHelper;
XSCXASCTHelper *asctHelper; XSCXASCTHelper *asctHelper;
XSCXSSLCHelper *sslcHelper; XSCXSSLCHelper *sslcHelper;
@@ -2101,6 +2286,7 @@ public:
delete strHelper; delete strHelper;
delete mrbHelper; delete mrbHelper;
delete oscHelper; delete oscHelper;
delete vlmHelper;
delete matdHelper; delete matdHelper;
delete asctHelper; delete asctHelper;
delete sslcHelper; delete sslcHelper;
@@ -2238,6 +2424,19 @@ public:
return result; return result;
} }
//
// XVLM ...
vlmHelper = new XSCXVLMHelper();
result = vlmHelper.Init(
inputs.symbol,
inputs.period,
inputs.vlmInputs //
);
if (!result)
{
return result;
}
// //
// XMATD ... // XMATD ...
matdHelper = new XSCXMATDHelper( matdHelper = new XSCXMATDHelper(
@@ -2429,6 +2628,17 @@ public:
return result; return result;
} }
//
result = vlmHelper.GetConditions(
conditions.vlmConditions,
barIndex,
loopback //
);
if (!result)
{
return result;
}
// //
result = sslcHelper.GetConditions( result = sslcHelper.GetConditions(
conditions.sslcConditions, conditions.sslcConditions,
+367 -65
View File
@@ -25,6 +25,7 @@
// //
#include "../Classes/x-saherelm.xea.class.mq5" #include "../Classes/x-saherelm.xea.class.mq5"
#include "../Classes/x-saherelm.xczone.class.mq5"
#include "../Classes/x-saherelm.x121.setup.cycle.class.mq5" #include "../Classes/x-saherelm.x121.setup.cycle.class.mq5"
// //
@@ -121,6 +122,7 @@ struct XSignalInfo
pushers = _pushers; pushers = _pushers;
symbol = _signal.symbol; symbol = _signal.symbol;
period = _signal.period; period = _signal.period;
volume = _signal.volume;
provider = _signal.provider; 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; mBullishScore = 0;
mBearishSigns = 0;
mBearishScore = 0; mBearishScore = 0;
// //
@@ -921,6 +957,9 @@ public:
mBullishScore += bullishScore; mBullishScore += bullishScore;
mBearishScore += bearishScore; mBearishScore += bearishScore;
//
mVolumeOSC += cConditions.vlmConditions.volume[1];
// //
// Parse Conditions for Signal ... // Parse Conditions for Signal ...
bool hasSignal = signalGenerator.HasSignal( bool hasSignal = signalGenerator.HasSignal(
@@ -928,6 +967,7 @@ public:
cSignal, cSignal,
cPusher, cPusher,
cProvider, cProvider,
mUseSupport,
mAllowLong, mAllowLong,
mAllowShort, mAllowShort,
mVolume, mVolume,
@@ -980,6 +1020,9 @@ public:
mBullishScore += bullishScore; mBullishScore += bullishScore;
mBearishScore += bearishScore; mBearishScore += bearishScore;
//
mVolumeOSC += sConditions.vlmConditions.volume[1];
// //
// Parse Conditions for Signal ... // Parse Conditions for Signal ...
bool hasSignal = signalGenerator.HasSignal( bool hasSignal = signalGenerator.HasSignal(
@@ -1039,6 +1082,9 @@ public:
mBullishScore += bullishScore; mBullishScore += bullishScore;
mBearishScore += bearishScore; mBearishScore += bearishScore;
//
mVolumeOSC += mConditions.vlmConditions.volume[1];
// //
// Parse Conditions for Signal ... // Parse Conditions for Signal ...
bool hasSignal = signalGenerator.HasSignal( bool hasSignal = signalGenerator.HasSignal(
@@ -1046,6 +1092,7 @@ public:
mSignal, mSignal,
mPusher, mPusher,
mProvider, mProvider,
mUseSupport,
mAllowLong, mAllowLong,
mAllowShort, mAllowShort,
mVolume, mVolume,
@@ -1098,6 +1145,9 @@ public:
mBullishScore += bullishScore; mBullishScore += bullishScore;
mBearishScore += bearishScore; mBearishScore += bearishScore;
//
mVolumeOSC += lConditions.vlmConditions.volume[1];
// //
// Parse Conditions for Signal ... // Parse Conditions for Signal ...
bool hasSignal = signalGenerator.HasSignal( bool hasSignal = signalGenerator.HasSignal(
@@ -1105,6 +1155,7 @@ public:
lSignal, lSignal,
lPusher, lPusher,
lProvider, lProvider,
mUseSupport,
mAllowLong, mAllowLong,
mAllowShort, mAllowShort,
mVolume, mVolume,
@@ -1157,6 +1208,9 @@ public:
mBullishScore += bullishScore; mBullishScore += bullishScore;
mBearishScore += bearishScore; mBearishScore += bearishScore;
//
mVolumeOSC += hConditions.vlmConditions.volume[1];
// //
// Parse Conditions for Signal ... // Parse Conditions for Signal ...
bool hasSignal = signalGenerator.HasSignal( bool hasSignal = signalGenerator.HasSignal(
@@ -1164,6 +1218,7 @@ public:
hSignal, hSignal,
hPusher, hPusher,
hProvider, hProvider,
mUseSupport,
mAllowLong, mAllowLong,
mAllowShort, mAllowShort,
mVolume, mVolume,
@@ -1188,113 +1243,276 @@ public:
// //
// Current Signals ... // Current Signals ...
if (cPusher >= mReuiredSignalVerifications && cSignal.IsValid()) if (cSignal.IsValid())
{ {
// //
AddRef( bool isLong = IsLong(cSignal.type);
cSignal, if (isLong)
signals // {
); mBullishSigns += cPusher;
}
else
{
mBearishSigns += cPusher;
}
// //
AddNewSignal( if (cPusher >= mReuiredSignalVerifications)
cPusher, {
cSignal, //
mBullishScore, // Check Final Bullish and Bearish Score ...
mBearishScore, bool isScorePassed =
cConditions // //
); IsLong(cSignal.type)
? mBullishScore > (mBearishScore * 2)
: mBearishScore > (mBullishScore * 2)
//
;
//
if (isScorePassed)
{
//
AddRef(
cSignal,
signals //
);
//
AddNewSignal(
cPusher,
cSignal,
mBullishScore,
mBearishScore,
cConditions //
);
}
}
} }
// //
// Short Signals ... // Short Signals ...
if (sPusher >= mReuiredSignalVerifications && sSignal.IsValid()) if (sSignal.IsValid())
{ {
// //
AddRef( bool isLong = IsLong(sSignal.type);
sSignal, if (isLong)
signals // {
); mBullishSigns += sPusher;
}
else
{
mBearishSigns += sPusher;
}
// //
AddNewSignal( if (sPusher >= mReuiredSignalVerifications)
sPusher, {
sSignal, //
mBullishScore, // Check Final Bullish and Bearish Score ...
mBearishScore, bool isScorePassed =
sConditions // //
); IsLong(cSignal.type)
? mBullishScore > (mBearishScore * 2)
: mBearishScore > (mBullishScore * 2)
//
;
//
if (isScorePassed)
{
//
AddRef(
sSignal,
signals //
);
//
AddNewSignal(
sPusher,
sSignal,
mBullishScore,
mBearishScore,
sConditions //
);
}
}
} }
// //
// Medium Signals ... // Medium Signals ...
if (mPusher >= mReuiredSignalVerifications && mSignal.IsValid()) if (mSignal.IsValid())
{ {
// //
AddRef( bool isLong = IsLong(mSignal.type);
mSignal, if (isLong)
signals // {
); mBullishSigns += mPusher;
}
else
{
mBearishSigns += mPusher;
}
// //
AddNewSignal( if (mPusher >= mReuiredSignalVerifications)
mPusher, {
mSignal, //
mBullishScore, // Check Final Bullish and Bearish Score ...
mBearishScore, bool isScorePassed =
mConditions // //
); IsLong(cSignal.type)
? mBullishScore > (mBearishScore * 2)
: mBearishScore > (mBullishScore * 2)
//
;
//
if (isScorePassed)
{
//
AddRef(
mSignal,
signals //
);
//
AddNewSignal(
mPusher,
mSignal,
mBullishScore,
mBearishScore,
mConditions //
);
}
}
} }
// //
// Long Signals ... // Long Signals ...
if (lPusher >= mReuiredSignalVerifications && lSignal.IsValid()) if (lSignal.IsValid())
{ {
// //
AddRef( bool isLong = IsLong(lSignal.type);
lSignal, if (isLong)
signals // {
); mBullishSigns += lPusher;
}
else
{
mBearishSigns += lPusher;
}
// //
AddNewSignal( if (lPusher >= mReuiredSignalVerifications)
lPusher, {
lSignal, //
mBullishScore, // Check Final Bullish and Bearish Score ...
mBearishScore, bool isScorePassed =
lConditions // //
); IsLong(cSignal.type)
? mBullishScore > (mBearishScore * 2)
: mBearishScore > (mBullishScore * 2)
//
;
//
if (isScorePassed)
{
//
AddRef(
lSignal,
signals //
);
//
AddNewSignal(
lPusher,
lSignal,
mBullishScore,
mBearishScore,
lConditions //
);
}
}
} }
// //
// Hind Signals ... // Hind Signals ...
if (hPusher >= mReuiredSignalVerifications && hSignal.IsValid()) if (hSignal.IsValid())
{ {
// //
AddRef( bool isLong = IsLong(hSignal.type);
hSignal, if (isLong)
signals // {
); mBullishSigns += hPusher;
}
else
{
mBearishSigns += hPusher;
}
// //
AddNewSignal( if (hPusher >= mReuiredSignalVerifications)
hPusher, {
hSignal, //
mBullishScore, // Check Final Bullish and Bearish Score ...
mBearishScore, bool isScorePassed =
hConditions // //
); 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 ... // Create Score Summary for Commenting on Chart ...
string scoreSummary = string scoreSummary =
// //
"Scores:" + separator +
"----------" + separator + "----------" + separator +
"Bullish: " + ToString(mBullishScore) + separator + "Bullish Score: " + ToString(mBullishScore) + separator +
"Bearish: " + ToString(mBearishScore) + 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 ... // // Check EQM Orders and Handle Hedging ...
// DoEQMHedge(); // DoEQMHedge();
//
// Handle Close All Positions on Specific Time ...
HandleEQMCloseOnSpecificTime();
// //
// if Returns true, Signal Execution failed ... // if Returns true, Signal Execution failed ...
return result; return result;
@@ -1495,6 +1717,40 @@ protected:
// //
// Tools ... // 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 ...
private: private:
@@ -1507,10 +1763,12 @@ private:
double mVolume; // Volume double mVolume; // Volume
double mTPPoint; // TP Point double mTPPoint; // TP Point
double mSLPoint; // SL Point double mSLPoint; // SL Point
bool mUseSupport; // Use Support Signals
bool mIgnoreTP; // Ignore Calculated TP bool mIgnoreTP; // Ignore Calculated TP
bool mIgnoreSL; // Ignore Calculated SL bool mIgnoreSL; // Ignore Calculated SL
int mMaxAllowedTrades; // Max Alloed Positions int mMaxAllowedTrades; // Max Alloed Positions
bool mCloseOnOpposit; // Close all Positions on Opposit bool mCloseOnOpposit; // Close all Positions on Opposit
int mCloseOnSpecificTime; // Close All Trades in Specific Time
int mReuiredSignalVerifications; // Required Verifications for Validate Signals int mReuiredSignalVerifications; // Required Verifications for Validate Signals
// //
@@ -1755,9 +2013,16 @@ private:
} }
// //
int mBullishSigns;
double mBullishScore; double mBullishScore;
//
int mBearishSigns;
double mBearishScore; double mBearishScore;
//
double mVolumeOSC;
// //
XSCX121SetupCycles *mSetups[]; // Number of Setups XSCX121SetupCycles *mSetups[]; // Number of Setups
@@ -2041,6 +2306,43 @@ private:
Alert(message); 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(); mIsInTestMode = IsRunningOnTestMode();
mStaticBalanceForCalculateDrawdown = 0; // Ignore ...
// //
// Set Event Handlers ... // Set Event Handlers ...
@@ -1834,6 +1835,12 @@ public:
); );
} }
//
double GetDrawdownPercent()
{
return mDrawdownPercent;
}
// //
// Overrides ... // Overrides ...
@@ -1868,6 +1875,17 @@ public:
// OnTick Handler ... // OnTick Handler ...
virtual void OnTick() 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 ...
Draw(); Draw();
@@ -2230,6 +2248,12 @@ protected:
// Check in Test Mode or not ... // Check in Test Mode or not ...
bool mIsInTestMode; bool mIsInTestMode;
//
// Save Max Drawdown ...
double mMaxDrawdown;
double mDrawdownPercent;
double mStaticBalanceForCalculateDrawdown;
// //
// Tools ... // Tools ...
+14 -9
View File
@@ -36,24 +36,26 @@ int x121EASlippage = 10; // Slippgae
// //
// Trading Symbols ... // Trading Symbols ...
string x121EASymbols = "EURUSDb"; // Symbols input string x121EASymbols = "EURUSDb"; // Symbols
// EURUSDb,GBPUSDb,XAUUSDb,USDCHFb,USDJPYb // EURUSDb,GBPUSDb,XAUUSDb,USDCHFb,USDJPYb
// //
// Signals ... // Signals ...
bool x121EAAllowLong = true; // Allow Long Trades bool x121EAAllowLong = true; // Allow Long Trades
bool x121EAAllowShort = true; // Allow Short Trades bool x121EAAllowShort = true; // Allow Short Trades
int x121EAReuiredSignalVerifications = 5; // Required Verifications for Signals int x121EAReuiredSignalVerifications = 4; // Required Verifications for Signals
// //
// Risk Management ... // Risk Management ...
double x121EAVolume = 0.01; // Static Volume double x121EAVolume = 0.01; // Static Volume
double x121EATPPoint = 50; // TP Point double x121EATPPoint = 100; // TP Point
double x121EASLPoint = 500; // SL Point double x121EASLPoint = 500; // SL Point
int x121EAMaxAllowedTrades = 1; // Max Allowed Positions int x121EAMaxAllowedTrades = 10; // Max Allowed Positions
bool x121EAIgnoreSL = false; // Ignore Calculated SL bool x121EAIgnoreSL = false; // Ignore Calculated SL
bool x121EAIgnoreTP = false; // Ignore Calculated TP bool x121EAIgnoreTP = false; // Ignore Calculated TP
bool x121EACloseOnOpposit = false; // Close all Positions on Opposit bool x121EAUseSupport = true; // Use Support Signals
int x121EACloseOnSpecificTime = -1; // Close All Trades in Specific Time
bool x121EACloseOnOpposit = false; // Close all Positions on Opposit
// //
// Alert ... // Alert ...
@@ -167,7 +169,10 @@ bool InitialEA()
x121EA.IgnoreTP(x121EAIgnoreTP); x121EA.IgnoreTP(x121EAIgnoreTP);
x121EA.AllowLong(x121EAAllowLong); x121EA.AllowLong(x121EAAllowLong);
x121EA.AllowShort(x121EAAllowShort); x121EA.AllowShort(x121EAAllowShort);
x121EA.UseSupport(x121EAUseSupport);
x121EA.CloseOnOpposit(x121EACloseOnOpposit); x121EA.CloseOnOpposit(x121EACloseOnOpposit);
x121EA.MaxAllowedTrades(x121EAMaxAllowedTrades);
x121EA.CloseOnSpecificTime(x121EACloseOnSpecificTime);
x121EA.ReuiredSignalVerifications(x121EAReuiredSignalVerifications); x121EA.ReuiredSignalVerifications(x121EAReuiredSignalVerifications);
// //
+263
View File
@@ -0,0 +1,263 @@
///////////////////////////////////////////////////////
//
// SaherElm IT Center XZoneTest MQL5 Expert Advisor
// -------------------------------------------------
// Name: XZoneTest
// Description: an Exper Advisor which used RSI and MA
// to Analyse Market ...
//
// Maintainer:
// ------------
// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com)
//
//////////////////////////////////////////////////////x
//
// Global Properties ...
#property copyright "Copyright 2023, SaherElm IT Center"
#property link "https://saherelm.ir"
#property version "1.00"
#property description "SaherElm XZoneTest"
#property strict
//
#include "../Classes/x-saherelm.xczone.class.mq5"
//
#define ShortName "XZoneTest"
//
// Inputs ...
input int zoneRange = 21;
input ENUM_TIMEFRAMES zonePeriod = PERIOD_M1;
//
// Variables ...
int barsTotal;
//
// Initialization ...
int OnInit()
{
//
if (!InitialEA())
{
return INIT_PARAMETERS_INCORRECT;
}
//
// Init Succeed ...
return INIT_SUCCEEDED;
}
//
// DeInitialization ...
void OnDeinit(const int reason)
{
//
// REASON_PROGRAM 0 The EA has stopped working calling the ExpertRemove() function
// REASON_REMOVE 1 Program removed from a chart
// REASON_RECOMPILE 2 Program recompiled
// REASON_CHARTCHANGE 3 A symbol or a chart period is changed
// REASON_CHARTCLOSE 4 Chart closed
// REASON_PARAMETERS 5 Inputs changed by a user
// REASON_ACCOUNT 6 Another account has been activated or reconnection to the trade server has occurred due to changes in the account settings
// REASON_TEMPLATE 7 Another chart template applied
// REASON_INITFAILED 8 The OnInit() handler returned a non-zero value
// REASON_CLOSE 9 Terminal closed
//
// De Initialize XSampleEA Providers ...
}
//
// On Tick Handler ...
void OnTick()
{
//
int bars = iBars(
_Symbol,
zonePeriod //
);
if (barsTotal == bars)
{
return;
}
//
barsTotal = bars;
//
datetime startTime = iTime(
_Symbol,
zonePeriod,
zoneRange + 1 //
);
datetime endTime = iTime(
_Symbol,
zonePeriod,
1 //
);
//
MqlTick ticks[];
CopyTicksRange(
_Symbol,
ticks,
COPY_TICKS_ALL,
startTime * 1000,
endTime * 1000 //
);
//
double highs[];
CopyHigh(
_Symbol,
zonePeriod,
startTime,
endTime,
highs //
);
double iHigh = highs[ArrayMaximum(highs)];
//
double lows[];
CopyLow(
_Symbol,
zonePeriod,
startTime,
endTime,
lows //
);
double iLow = lows[ArrayMinimum(lows)];
//
double iSize = iHigh - iLow;
//
CArrayObj zones;
int zCount = 10;
for (int i = 0; i < zCount; i++)
{
//
double iH = iHigh - iSize * i / zCount;
double iL = iHigh - iSize * (i + 1) / zCount;
//
XSCZone *iZone = new XSCZone();
iZone.high = iH;
iZone.low = iL;
//
zones.Add(iZone);
}
//
// Fill Ticks ...
for (int i = 0; i < ArraySize(ticks); i++)
{
//
MqlTick iTick = ticks[i];
//
for (int j = 0; j < zones.Total(); j++)
{
//
XSCZone *jZone = zones.At(j);
//
bool isInRange = iTick.bid >= jZone.low && iTick.bid <= jZone.high;
if (isInRange)
{
//
jZone.ticks++;
break;
}
}
}
//
// Sorting Zones ...
zones.Sort();
//
CArrayObj mChartObjects;
for (int i = 0; i < zones.Total(); i++)
{
//
XSCZone *iZone = zones.At(i);
//
string iZoneName = "Zone " + IntegerToString(i);
//
// Create Zone Rectangle ...
CChartObjectRectangle *iRect = new CChartObjectRectangle();
iRect.Create(
0,
iZoneName,
0,
startTime,
iZone.high,
endTime,
iZone.low //
);
iRect.Fill(true);
//
// Create Zone Label ...
CChartObjectLabel *iLabel = new CChartObjectLabel();
iLabel.Create(
0,
iZoneName + "_lbl",
0,
startTime,
iZone.high //
);
iLabel.Color(clrWhite);
//
// Calculate TickPercent ...
double iZoneTickPercent = (double)iZone.ticks / ArraySize(ticks) * 100;
iZoneTickPercent = NormalizeDouble(iZoneTickPercent, 2);
string iZoneTickPercentStr = (string)iZoneTickPercent + "%";
//
iLabel.Description(iZoneTickPercentStr);
//
if (iZone.ticks > ArraySize(ticks) * 0.15)
{
iRect.Color(clrOrangeRed);
}
else if (iZone.ticks > ArraySize(ticks) * 0.10)
{
iRect.Color(clrOrange);
}
else
{
iRect.Color(clrLightGray);
}
//
// mChartObjects.Add(iRect);
// mChartObjects.Add(iLabel);
}
}
//
//
//
bool InitialEA()
{
//
bool result = false;
//
result = true;
//
return result;
}
//
+551
View File
@@ -0,0 +1,551 @@
///////////////////////////////////////////////////////
//
// SaherElm IT Center MQL5 Helper Class Library
// ----------------------------------------------
// Name: XSCXVLMHelper
// Description: provides all Indicator
// Helper 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
//
#include "../Classes/x-saherelm.xhelper.class.mq5"
//
// Definitions ...
//
enum ENUM_XVLM_BUFFERS
{
XVLM_VOLUME_LINE = 0
};
//
// Input Models ...
struct XVLMInputs
{
//
// Props ...
//
int length; // Length
//
// Constructor(s) ...
XVLMInputs()
{
Clean();
}
//
// Tools ...
//
// Clean ...
void Clean()
{
length = 0;
}
//
// Default ...
void Default()
{
length = 14;
}
//
// Validate ...
bool IsValid()
{
//
bool result = false;
//
result =
//
length > 1
//
;
//
return result;
}
//
// Retrieve MAx Length ...
int Max()
{
//
int result = 0;
//
result = length;
//
return result;
}
};
//
// Define Conditions ...
struct XVLMConditions
{
//
// Common ...
string symbol;
ENUM_TIMEFRAMES period;
datetime time;
//
// Buffers ...
double volume[];
//
// Conditions ...
//
bool isVolumeBullish;
bool isVolumeBearish;
bool isVolumeOverLast;
bool isVolumeUnderLast;
bool isVolumeChangedToBullish;
bool isVolumeChangedToBearish;
//
void Clean()
{
//
Clean(volume);
//
ArraySetAsSeries(volume, true);
//
isVolumeBullish = false;
isVolumeBearish = false;
isVolumeOverLast = false;
isVolumeUnderLast = false;
isVolumeChangedToBullish = false;
isVolumeChangedToBearish = false;
}
//
void GenerateScore(
double &bullishScore,
double &bearishScore //
)
{
//
bullishScore = 0;
bearishScore = 0;
//
if (isVolumeBullish)
{
bullishScore++;
}
if (isVolumeOverLast)
{
bullishScore++;
}
if (isVolumeChangedToBullish)
{
bullishScore++;
}
//
if (isVolumeBearish)
{
bearishScore++;
}
if (isVolumeUnderLast)
{
bearishScore++;
}
if (isVolumeChangedToBearish)
{
bearishScore++;
}
}
//
string GenerateSummary(
bool onlyCommons = false,
bool onlyConditions = false,
bool includeScores = true,
bool ignoreFalseConditions = true,
string separator = "\n" //
)
{
//
string result = NULL;
//
double bullishScore = 0;
double bearishScore = 0;
GenerateScore(
bullishScore,
bearishScore //
);
//
string scoresStr =
//
"Scores: " + separator +
"---------------" + separator +
"Bullish: " + ToString(bullishScore) + separator +
"Bearish: " + ToString(bearishScore) + separator +
""
//
;
//
string commonStr = GenerateSpecifiedCommonSummary(
this,
separator,
includeScores //
);
//
string conditionsStr =
//
ToString("isVolumeBullish", isVolumeBullish, ignoreFalseConditions, separator) +
ToString("isVolumeBearish", isVolumeBearish, ignoreFalseConditions, separator) +
ToString("isVolumeOverLast", isVolumeOverLast, ignoreFalseConditions, separator) +
ToString("isVolumeUnderLast", isVolumeUnderLast, ignoreFalseConditions, separator) +
ToString("isVolumeChangedToBullish", isVolumeChangedToBullish, ignoreFalseConditions, separator) +
ToString("isVolumeChangedToBearish", isVolumeChangedToBearish, ignoreFalseConditions, separator) +
""
//
;
//
result =
//
"[" + GetTag() + "]" + separator +
(onlyConditions
? ""
: commonStr) +
(!includeScores
? ""
: scoresStr) +
" " + separator +
(onlyCommons
? ""
: conditionsStr) +
""
//
;
//
return result;
}
//
string GetTag()
{
return "XVLM";
}
};
//
// Class ...
class XSCXVLMHelper : public XSCBaseHelper
{
//
// Public ...
public:
//
// Props ...
//
// Constructors ...
XSCXVLMHelper() : XSCBaseHelper(_Symbol, _Period)
{
}
//
// Deconstructor ...
~XSCXVLMHelper() {}
//
// Tools ...
bool Init(
string symbol, // Trading Symbol
ENUM_TIMEFRAMES period, // Trading Period
XVLMInputs &inputs // Inputs
)
{
//
bool result = false;
//
mSymbol = symbol;
mPeriod = period;
//
result = inputs.IsValid();
if (!result)
{
return result;
}
//
mInputs = inputs;
//
ArraySetAsSeries(volumeBuffer, true);
//
mHandler = iCustom(
mSymbol,
mPeriod,
"x-saherelm.xvlm",
//
// Inputs ...
mInputs.length // Length
);
result = mHandler != INVALID_HANDLE;
if (!result)
{
return result;
}
//
return result;
}
//
// Inputs ...
//
XVLMInputs GetInputs()
{
return mInputs;
}
//
bool SetInputs(
XVLMInputs &inputs // Configs
)
{
//
return Init(
mSymbol,
mPeriod,
inputs);
}
//
// Buffers ...
//
// Volume ...
//
double GetVolume(
int barIndex // Bar Index
)
{
//
if (barIndex < 0)
{
barIndex = 0;
}
//
Calculate();
//
return volumeBuffer[barIndex];
}
//
// Copy Required Buffer ...
int CopyVolume(
int start, // Start
int count, // Number of Items for read
double &buffer[], // Dest Buffer
bool forceClean = true // Force To Clean buffer
)
{
//
// Update Calculations ...
Calculate();
//
// Copy Items ...
return Copy(
start,
count,
volumeBuffer,
buffer,
forceClean
//
);
}
//
// Tools ...
//
bool IsBullish(double volume)
{
//
bool result = false;
//
result =
//
volume > 0;
//
;
//
return result;
}
//
bool IsBearish(double volume)
{
//
bool result = false;
//
result =
//
volume < 0
//
;
//
return result;
}
//
bool GetConditions(
XVLMConditions &conditions, //
int barIndex = 0, //
int loopback = 4 //
)
{
//
bool result = true;
//
if (loopback < 4)
{
loopback = 4;
}
//
conditions.Clean();
//
conditions.symbol = mSymbol;
conditions.period = mPeriod;
conditions.time = TimeCurrent();
//
int zIndex = barIndex;
int cIndex = zIndex + 1;
int pIndex = cIndex + 1;
int ppIndex = pIndex + 1;
//
CopyVolume(
zIndex,
loopback,
conditions.volume //
);
//
// Calculate Conditions ...
//
bool isVolumeBullish = conditions.volume[cIndex] > 0;
bool isVolumeBullishPrev = conditions.volume[pIndex] > 0;
//
bool isVolumeBearish = conditions.volume[cIndex] < 0;
bool isVolumeBearishPrev = conditions.volume[pIndex] < 0;
//
bool isVolumeOverLast = conditions.volume[cIndex] > conditions.volume[pIndex];
bool isVolumeOverLastPrev = conditions.volume[pIndex] > conditions.volume[ppIndex];
//
bool isVolumeUnderLast = conditions.volume[cIndex] < conditions.volume[pIndex];
bool isVolumeUnderLastPrev = conditions.volume[pIndex] < conditions.volume[ppIndex];
//
bool isVolumeChangedToBullish = isVolumeBullish &&
!isVolumeBullishPrev;
bool isVolumeChangedToBearish = isVolumeBearish &&
!isVolumeBearishPrev;
//
conditions.isVolumeBullish = isVolumeBullish;
conditions.isVolumeBearish = isVolumeBearish;
conditions.isVolumeOverLast = isVolumeOverLast;
conditions.isVolumeUnderLast = isVolumeUnderLast;
conditions.isVolumeChangedToBullish = isVolumeChangedToBullish;
conditions.isVolumeChangedToBearish = isVolumeChangedToBearish;
//
return result;
}
//
// Protected ...
protected:
//
// Private ...
private:
//
// Props ...
XVLMInputs mInputs; // Inputs ...
//
// Buffers ...
double volumeBuffer[];
//
// Tools ...
//
// Calculate Values Until Now ...
void Calculate()
{
//
int totalBars = CountBars();
int calculatedBars = CountCalculatedBars();
//
// Trend ...
CopyBuffer(
mHandler,
XVLM_VOLUME_LINE,
0,
totalBars,
volumeBuffer
//
);
}
};
//
// Tools ...
+231
View File
@@ -0,0 +1,231 @@
//////////////////////////////////////////////////////
//
// SaherElm IT Center MQL5 Indicator
// ---------------------------------------------
// Name: XVLM
// Description: Volume Trend Indicator ...
//
//
// Maintainer:
// ------------
// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com)
//
//////////////////////////////////////////////////////
//
// Global Properties ...
#property copyright "Copyright 2023, SaherElm IT Center"
#property link "https://saherelm.ir"
#property version "1.00"
#property description "SaherElm XVLM Indicator"
#property strict
//
// Imports ...
#include <Math/Stat/Normal.mqh>
//
// Definitions ...
//
#define ShortName "XVLM"
//
// Inputs ...
//
input int length = 14; // Length
//
// Buffers ...
//
#property indicator_chart_window
//
#property indicator_buffers 2
#property indicator_plots 0
///
#define volumeBufferIndex 0
double volumeBuffer[];
//
#define volumeColorBufferIndex 1
double volumeColorBuffer[];
//
#property indicator_label1 "XVLM"
#property indicator_type1 DRAW_COLOR_HISTOGRAM
#property indicator_color1 clrLime, clrRed
//
#define bullishColorIndex 0
#define bearishColorIndex 1
//
// Variables ...
//
int maxLength;
//
double volumes[];
double distances[];
//
// Event Handlers ...
//
// Initialization ...
int OnInit()
{
//
// Validate Inputs ...
if (!ValidateInputs())
{
return INIT_PARAMETERS_INCORRECT;
}
//
// because in some cases we may have more than one input for
// calculation and we must prevent any calculation
// untill we pass the biggest input length, here we get max Input length
// and then wait until pass it ...
maxLength = ExtractMaxLengthOfInputs();
//
ArrayResize(volumes, maxLength, 0);
ArrayResize(distances, maxLength, 0);
//
// Define Index Buffers ...
DefineBuffers();
//
// Set Indicator ShortName ...
SetIndicatorName();
//
// Init Succeed ...
return INIT_SUCCEEDED;
}
//
// DeInitialization ...
void OnDeinit(const int reason)
{
//
// REASON_PROGRAM 0 The EA has stopped working calling the ExpertRemove() function
// REASON_REMOVE 1 Program removed from a chart
// REASON_RECOMPILE 2 Program recompiled
// REASON_CHARTCHANGE 3 A symbol or a chart period is changed
// REASON_CHARTCLOSE 4 Chart closed
// REASON_PARAMETERS 5 Inputs changed by a user
// REASON_ACCOUNT 6 Another account has been activated or reconnection to the trade server has occurred due to changes in the account settings
// REASON_TEMPLATE 7 Another chart template applied
// REASON_INITFAILED 8 The OnInit() handler returned a non-zero value
// REASON_CLOSE 9 Terminal closed
//
// Here we can handle De Initialization Reasons ...
}
//
// Calculating what we want ...
int OnCalculate(
const int rates_total, // Total Bars on Chart ...
const int prev_calculated, // Total Calculated Bars on Charts ...
const datetime &time[], // History of Open Time ...
const double &open[], // History of Open Price ...
const double &high[], // History of High Price ...
const double &low[], // History of Low Price ...
const double &close[], // History of Close Price ...
const long &tick_volume[], // History of Tick Volumes on Bar ...
const long &volume[], // History of Trade Volumes ...
const int &spread[] // History of Spread Price ...
)
{
//
static int i = maxLength * 2;
for (i; i < rates_total; i++)
{
//
for (int x = 0; x < length; x++)
{
//
volumes[x] = (double)tick_volume[i - x];
distances[x] =
(close[i - x] > open[i - x])
? high[i - x] - low[i - x]
: low[i - x] - high[i - x];
}
//
double iValue = MathMean(volumes) * MathMean(distances);
//
volumeBuffer[i] = iValue;
volumeColorBuffer[i] = iValue > 0
? bullishColorIndex
: bearishColorIndex;
}
//
i = rates_total - 1;
//
return rates_total;
}
//
// Custom Functions ...
//
// Validate Input Args for Initialization ...
bool ValidateInputs()
{
//
bool result = false;
//
// Validate Args ...
result =
//
length >= 2
//
;
//
return result;
}
//
// Retrieve all Exists Input Max Length ...
// use for Start Of Drawing ...
int ExtractMaxLengthOfInputs()
{
//
int result = 0;
//
result = length;
//
return result;
}
//
// Set Indicator Short Name and also we can define Buffers Labels ...
void SetIndicatorName()
{
IndicatorSetString(INDICATOR_SHORTNAME, ShortName);
}
//
// Define Indexes and Styles ...
void DefineBuffers()
{
//
SetIndexBuffer(volumeBufferIndex, volumeBuffer, INDICATOR_CALCULATIONS);
SetIndexBuffer(volumeColorBufferIndex, volumeColorBuffer, INDICATOR_CALCULATIONS);
}
+231
View File
@@ -0,0 +1,231 @@
//////////////////////////////////////////////////////
//
// SaherElm IT Center MQL5 Indicator
// ---------------------------------------------
// Name: XVLM
// Description: Volume Trend Indicator ...
//
//
// Maintainer:
// ------------
// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com)
//
//////////////////////////////////////////////////////
//
// Global Properties ...
#property copyright "Copyright 2023, SaherElm IT Center"
#property link "https://saherelm.ir"
#property version "1.00"
#property description "SaherElm XVLM Indicator"
#property strict
//
// Imports ...
#include <Math/Stat/Normal.mqh>
//
// Definitions ...
//
#define ShortName "XVLM"
//
// Inputs ...
//
input int length = 14; // Length
//
// Buffers ...
//
#property indicator_separate_window
//
#property indicator_buffers 2
#property indicator_plots 2
///
#define volumeBufferIndex 0
double volumeBuffer[];
//
#define volumeColorBufferIndex 1
double volumeColorBuffer[];
//
#property indicator_label1 "XVLM"
#property indicator_type1 DRAW_COLOR_HISTOGRAM
#property indicator_color1 clrLime, clrRed
//
#define bullishColorIndex 0
#define bearishColorIndex 1
//
// Variables ...
//
int maxLength;
//
double volumes[];
double distances[];
//
// Event Handlers ...
//
// Initialization ...
int OnInit()
{
//
// Validate Inputs ...
if (!ValidateInputs())
{
return INIT_PARAMETERS_INCORRECT;
}
//
// because in some cases we may have more than one input for
// calculation and we must prevent any calculation
// untill we pass the biggest input length, here we get max Input length
// and then wait until pass it ...
maxLength = ExtractMaxLengthOfInputs();
//
ArrayResize(volumes, maxLength, 0);
ArrayResize(distances, maxLength, 0);
//
// Define Index Buffers ...
DefineBuffers();
//
// Set Indicator ShortName ...
SetIndicatorName();
//
// Init Succeed ...
return INIT_SUCCEEDED;
}
//
// DeInitialization ...
void OnDeinit(const int reason)
{
//
// REASON_PROGRAM 0 The EA has stopped working calling the ExpertRemove() function
// REASON_REMOVE 1 Program removed from a chart
// REASON_RECOMPILE 2 Program recompiled
// REASON_CHARTCHANGE 3 A symbol or a chart period is changed
// REASON_CHARTCLOSE 4 Chart closed
// REASON_PARAMETERS 5 Inputs changed by a user
// REASON_ACCOUNT 6 Another account has been activated or reconnection to the trade server has occurred due to changes in the account settings
// REASON_TEMPLATE 7 Another chart template applied
// REASON_INITFAILED 8 The OnInit() handler returned a non-zero value
// REASON_CLOSE 9 Terminal closed
//
// Here we can handle De Initialization Reasons ...
}
//
// Calculating what we want ...
int OnCalculate(
const int rates_total, // Total Bars on Chart ...
const int prev_calculated, // Total Calculated Bars on Charts ...
const datetime &time[], // History of Open Time ...
const double &open[], // History of Open Price ...
const double &high[], // History of High Price ...
const double &low[], // History of Low Price ...
const double &close[], // History of Close Price ...
const long &tick_volume[], // History of Tick Volumes on Bar ...
const long &volume[], // History of Trade Volumes ...
const int &spread[] // History of Spread Price ...
)
{
//
static int i = maxLength * 2;
for (i; i < rates_total; i++)
{
//
for (int x = 0; x < length; x++)
{
//
volumes[x] = (double)tick_volume[i - x];
distances[x] =
(close[i - x] > open[i - x])
? high[i - x] - low[i - x]
: low[i - x] - high[i - x];
}
//
double iValue = MathMean(volumes) * MathMean(distances);
//
volumeBuffer[i] = iValue;
volumeColorBuffer[i] = iValue > 0
? bullishColorIndex
: bearishColorIndex;
}
//
i = rates_total - 1;
//
return rates_total;
}
//
// Custom Functions ...
//
// Validate Input Args for Initialization ...
bool ValidateInputs()
{
//
bool result = false;
//
// Validate Args ...
result =
//
length >= 2
//
;
//
return result;
}
//
// Retrieve all Exists Input Max Length ...
// use for Start Of Drawing ...
int ExtractMaxLengthOfInputs()
{
//
int result = 0;
//
result = length;
//
return result;
}
//
// Set Indicator Short Name and also we can define Buffers Labels ...
void SetIndicatorName()
{
IndicatorSetString(INDICATOR_SHORTNAME, ShortName);
}
//
// Define Indexes and Styles ...
void DefineBuffers()
{
//
SetIndexBuffer(volumeBufferIndex, volumeBuffer, INDICATOR_DATA);
SetIndexBuffer(volumeColorBufferIndex, volumeColorBuffer, INDICATOR_COLOR_INDEX);
}