diff --git a/Classes/x-saherelm.x5.provider.class.mq5 b/Classes/x-saherelm.x5.provider.class.mq5 index c2ad0c5a..6fbe8ccb 100644 --- a/Classes/x-saherelm.x5.provider.class.mq5 +++ b/Classes/x-saherelm.x5.provider.class.mq5 @@ -255,6 +255,58 @@ public: } }; +// +// XSC5MarketConditionDataCollector ... +class XSC5MarketConditionDataCollector +{ + // + // Public ... +public: + // + // Constructor ... + void XSC5MarketConditionDataCollector() + { + // + XSCDataCollector mBase; + mBase.Clear(); + } + + // + // Cleaning Store ... + void Clear() + { + // + XSCDataCollector mBase; + + // + mBase.Clear(); + } + + // + // Add String Content ... + bool Add(string content) + { + // + bool result = false; + + // + XSCDataCollector mBase; + + // + result = mBase.Add(content); + + // + return result; + } + + // + // Protected ... +protected: + // + // Private ... +private: +}; + // // X5 Provider Market Conditions ... class X5MarketConditions : public XSCBaseProviderMarketConditions @@ -700,15 +752,277 @@ public: // Generate Summary ... virtual string GenerateSummary( const double multiplier = 1, // Score Multiplier + const string separator = "\n", // Separator const bool ignoreFalseConditions = true // Ignore False Conditions ) { // string result = NULL; + // + // Common ... + string commonStr = + // + "Commons: " + separator + + "-----------------------------" + + "Time: " + ToString(TimeCurrent()) + separator + + // + // TODO: Add Scores Later ... + "" + // + ; + + // + // XOBD ... + string obdStr = + // + ToString("isXOBDSwingLow", isXOBDSwingLow, ignoreFalseConditions) + + ToString("isXOBDSwingHigh", isXOBDSwingHigh, ignoreFalseConditions) + + "" + // + ; + + // + // ToString("", , ignoreFalseConditions) + + + // + // XFI ... + string fiStr = + // + ToString("isXFIPeak", isXFIPeak, ignoreFalseConditions) + + ToString("isXFIVale", isXFIVale, ignoreFalseConditions) + + ToString("isXFICrossedOverZero", isXFICrossedOverZero, ignoreFalseConditions) + + ToString("isXFIOverZero", isXFIOverZero, ignoreFalseConditions) + + ToString("isXFICrossedUnderZero", isXFICrossedUnderZero, ignoreFalseConditions) + + ToString("isXFIUnderZero", isXFIUnderZero, ignoreFalseConditions) + + "" + // + ; + + // + // XRSI ... + string rsiStr = + // + ToString("isXRSIPeak", isXRSIPeak, ignoreFalseConditions) + + ToString("isXRSIVale", isXRSIVale, ignoreFalseConditions) + + ToString("isXRSICrossedOverLongExit", isXRSICrossedOverLongExit, ignoreFalseConditions) + + ToString("isXRSICrossedOverLongEntry", isXRSICrossedOverLongEntry, ignoreFalseConditions) + + ToString("isXRSICrossedUnderShortExit", isXRSICrossedUnderShortExit, ignoreFalseConditions) + + ToString("isXRSICrossedUnderShortEntry", isXRSICrossedUnderShortEntry, ignoreFalseConditions) + + "" + // + ; + + // + // XTM ... + string tmStr = + // + ToString("isXTMPeak", isXTMPeak, ignoreFalseConditions) + + ToString("isXTMVale", isXTMVale, ignoreFalseConditions) + + ToString("isXTMBullish", isXTMBullish, ignoreFalseConditions) + + ToString("isXTMBearish", isXTMBearish, ignoreFalseConditions) + + ToString("isXTMNeutural", isXTMNeutural, ignoreFalseConditions) + + ToString("isXTMEndBullish", isXTMEndBullish, ignoreFalseConditions) + + ToString("isXTMEndBearish", isXTMEndBearish, ignoreFalseConditions) + + ToString("isXTMStartBullish", isXTMStartBullish, ignoreFalseConditions) + + ToString("isXTMStartBearish", isXTMStartBearish, ignoreFalseConditions) + + ToString("isXTMEndBullishByNeutural", isXTMEndBullishByNeutural, ignoreFalseConditions) + + ToString("isXTMEndBearishByNeutural", isXTMEndBearishByNeutural, ignoreFalseConditions) + + ToString("isXTMStartBullishAfterNeutural", isXTMStartBullishAfterNeutural, ignoreFalseConditions) + + ToString("isXTMStartBearishAfterNeutural", isXTMStartBearishAfterNeutural, ignoreFalseConditions) + + + "" + // + ; + + // + // XAMA ... + string amaStr = + // + ToString("isXAMAPeak", isXAMAPeak, ignoreFalseConditions) + + ToString("isXAMAVale", isXAMAVale, ignoreFalseConditions) + + ToString("isXAMABullish", isXAMABullish, ignoreFalseConditions) + + ToString("isXAMABearish", isXAMABearish, ignoreFalseConditions) + + ToString("isXAMANeutural", isXAMANeutural, ignoreFalseConditions) + + ToString("isXAMAEndBullish", isXAMAEndBullish, ignoreFalseConditions) + + ToString("isXAMAEndBearish", isXAMAEndBearish, ignoreFalseConditions) + + ToString("isXAMAStartBullish", isXAMAStartBullish, ignoreFalseConditions) + + ToString("isXAMAStartBearish", isXAMAStartBearish, ignoreFalseConditions) + + ToString("isXAMAEndBullishByNeutural", isXAMAEndBullishByNeutural, ignoreFalseConditions) + + ToString("isXAMAEndBearishByNeutural", isXAMAEndBearishByNeutural, ignoreFalseConditions) + + ToString("isXAMAStartBullishAfterNeutural", isXAMAStartBullishAfterNeutural, ignoreFalseConditions) + + ToString("isXAMAStartBearishAfterNeutural", isXAMAStartBearishAfterNeutural, ignoreFalseConditions) + + "" + // + ; + + // + // XLH ... + string lhStr = + // + ToString("isXLHHHIncreased", isXLHHHIncreased, ignoreFalseConditions) + + ToString("isXLHHHDecreased", isXLHHHDecreased, ignoreFalseConditions) + + ToString("isXLHLLIncreased", isXLHLLIncreased, ignoreFalseConditions) + + ToString("isXLHLLDecreased", isXLHLLDecreased, ignoreFalseConditions) + + ToString("isXLHLowAttachedLL", isXLHLowAttachedLL, ignoreFalseConditions) + + ToString("isXLHHighAttachedHH", isXLHHighAttachedHH, ignoreFalseConditions) + + ToString("isXLHHHSameInLength", isXLHHHSameInLength, ignoreFalseConditions) + + ToString("isXLHLLSameInLength", isXLHLLSameInLength, ignoreFalseConditions) + + ToString("isXLHPriceOverSignal", isXLHPriceOverSignal, ignoreFalseConditions) + + ToString("isXLHPriceUnderSignal", isXLHPriceUnderSignal, ignoreFalseConditions) + + ToString("isXLHPriceInSignalRange", isXLHPriceInSignalRange, ignoreFalseConditions) + + ToString("isXLHPriceCrossedOverSignal", isXLHPriceCrossedOverSignal, ignoreFalseConditions) + + ToString("isXLHPriceCrossedUnderSignal", isXLHPriceCrossedUnderSignal, ignoreFalseConditions) + + "" + // + ; + + // + // XTD ... + string tdStr = + // + ToString("isXTDSignalPeak", isXTDSignalPeak, ignoreFalseConditions) + + ToString("isXTDSignalVale", isXTDSignalVale, ignoreFalseConditions) + + ToString("isXTDBullishPeak", isXTDBullishPeak, ignoreFalseConditions) + + ToString("isXTDBullishVale", isXTDBullishVale, ignoreFalseConditions) + + ToString("isXTDBearishPeak", isXTDBearishPeak, ignoreFalseConditions) + + ToString("isXTDBearishVale", isXTDBearishVale, ignoreFalseConditions) + + ToString("isXTDBullOverBear", isXTDBullOverBear, ignoreFalseConditions) + + ToString("isXTDBullUnderBear", isXTDBullUnderBear, ignoreFalseConditions) + + ToString("isXTDSignalOverBear", isXTDSignalOverBear, ignoreFalseConditions) + + ToString("isXTDSignalUnderBear", isXTDSignalUnderBear, ignoreFalseConditions) + + ToString("isXTDBullCrossedOverBear", isXTDBullCrossedOverBear, ignoreFalseConditions) + + ToString("isXTDBullCrossedUnderBear", isXTDBullCrossedUnderBear, ignoreFalseConditions) + + ToString("isXTDSignalCrossedOverBear", isXTDSignalCrossedOverBear, ignoreFalseConditions) + + ToString("isXTDSignalCrossedUnderBear", isXTDSignalCrossedUnderBear, ignoreFalseConditions) + + "" + // + ; + + // + // XTS ... + string tsStr = + // + ToString("isXTSAllSame", isXTSAllSame, ignoreFalseConditions) + + ToString("isXTSCurrentMin", isXTSCurrentMin, ignoreFalseConditions) + + ToString("isXTSCurrentMax", isXTSCurrentMax, ignoreFalseConditions) + + ToString("isXTSCurrentOverFarest", isXTSCurrentOverFarest, ignoreFalseConditions) + + ToString("isXTSCurrentOverNearest", isXTSCurrentOverNearest, ignoreFalseConditions) + + ToString("isXTSCurrentOverMediest", isXTSCurrentOverMediest, ignoreFalseConditions) + + ToString("isXTSCurrentUnderFarest", isXTSCurrentUnderFarest, ignoreFalseConditions) + + ToString("isXTSCurrentUnderNearest", isXTSCurrentUnderNearest, ignoreFalseConditions) + + ToString("isXTSCurrentUnderMediest", isXTSCurrentUnderMediest, ignoreFalseConditions) + + ToString("isXTSCurrentCrossedOverFarest", isXTSCurrentCrossedOverFarest, ignoreFalseConditions) + + ToString("isXTSCurrentCrossedOverNearest", isXTSCurrentCrossedOverNearest, ignoreFalseConditions) + + ToString("isXTSCurrentCrossedOverMediest", isXTSCurrentCrossedOverMediest, ignoreFalseConditions) + + ToString("isXTSCurrentCrossedUnderFarest", isXTSCurrentCrossedUnderFarest, ignoreFalseConditions) + + ToString("isXTSCurrentCrossedUnderNearest", isXTSCurrentCrossedUnderNearest, ignoreFalseConditions) + + ToString("isXTSCurrentCrossedUnderMediest", isXTSCurrentCrossedUnderMediest, ignoreFalseConditions) + + "" + // + ; + + // + // XCHLH ... + string chlhStr = + // + ToString("isXCHLHSameHHs", isXCHLHSameHHs, ignoreFalseConditions) + + ToString("isXCHLHSameLLs", isXCHLHSameLLs, ignoreFalseConditions) + + ToString("isXCHLHSCMCHHSame", isXCHLHSCMCHHSame, ignoreFalseConditions) + + ToString("isXCHLHSCMCLLSame", isXCHLHSCMCLLSame, ignoreFalseConditions) + + ToString("isXCHLHSCLCHHSame", isXCHLHSCLCHHSame, ignoreFalseConditions) + + ToString("isXCHLHSCLCLLSame", isXCHLHSCLCLLSame, ignoreFalseConditions) + + ToString("isXCHLHMCLCHHSame", isXCHLHMCLCHHSame, ignoreFalseConditions) + + ToString("isXCHLHMCLCLLSame", isXCHLHMCLCLLSame, ignoreFalseConditions) + + ToString("isXCHLHMCOnTopOfLC", isXCHLHMCOnTopOfLC, ignoreFalseConditions) + + ToString("isXCHLHMCInBottomOfLC", isXCHLHMCInBottomOfLC, ignoreFalseConditions) + + "" + // + ; + + // + // XCHMA ... + string chmaStr = + // + ToString("isXCHMASCOverMax", isXCHMASCOverMax, ignoreFalseConditions) + + ToString("isXCHMASCOverMin", isXCHMASCOverMin, ignoreFalseConditions) + + ToString("isXCHMASCUnderMax", isXCHMASCUnderMax, ignoreFalseConditions) + + ToString("isXCHMASCUnderMin", isXCHMASCUnderMin, ignoreFalseConditions) + + ToString("isXCHMASCCrossedOverMax", isXCHMASCCrossedOverMax, ignoreFalseConditions) + + ToString("isXCHMASCCrossedUnderMax", isXCHMASCCrossedUnderMax, ignoreFalseConditions) + + ToString("isXCHMASCCrossedOverMin", isXCHMASCCrossedOverMin, ignoreFalseConditions) + + ToString("isXCHMASCCrossedUnderMin", isXCHMASCCrossedUnderMin, ignoreFalseConditions) + + ToString("isXCHMASCPeak", isXCHMASCPeak, ignoreFalseConditions) + + ToString("isXCHMASCVale", isXCHMASCVale, ignoreFalseConditions) + + ToString("isXCHMASCTrendsUp", isXCHMASCTrendsUp, ignoreFalseConditions) + + ToString("isXCHMASCTrendsDown", isXCHMASCTrendsDown, ignoreFalseConditions) + + ToString("isXCHMASCFastOverSlow", isXCHMASCFastOverSlow, ignoreFalseConditions) + + ToString("isXCHMASCFastUnderSlow", isXCHMASCFastUnderSlow, ignoreFalseConditions) + + ToString("isXCHMASCFastCrossedOverSlow", isXCHMASCFastCrossedOverSlow, ignoreFalseConditions) + + ToString("isXCHMASCFastCrossedUnderSlow", isXCHMASCFastCrossedUnderSlow, ignoreFalseConditions) + + ToString("isXCHMAMCPeak", isXCHMAMCPeak, ignoreFalseConditions) + + ToString("isXCHMAMCVale", isXCHMAMCVale, ignoreFalseConditions) + + ToString("isXCHMAMCTrendsUp", isXCHMAMCTrendsUp, ignoreFalseConditions) + + ToString("isXCHMAMCTrendsDown", isXCHMAMCTrendsDown, ignoreFalseConditions) + + ToString("isXCHMAMCFastOverSlow", isXCHMAMCFastOverSlow, ignoreFalseConditions) + + ToString("isXCHMAMCFastUnderSlow", isXCHMAMCFastUnderSlow, ignoreFalseConditions) + + ToString("isXCHMAMCFastCrossedOverSlow", isXCHMAMCFastCrossedOverSlow, ignoreFalseConditions) + + ToString("isXCHMAMCFastCrossedUnderSlow", isXCHMAMCFastCrossedUnderSlow, ignoreFalseConditions) + + ToString("isXCHMALCPeak", isXCHMALCPeak, ignoreFalseConditions) + + ToString("isXCHMALCVale", isXCHMALCVale, ignoreFalseConditions) + + ToString("isXCHMALCTrendsUp", isXCHMALCTrendsUp, ignoreFalseConditions) + + ToString("isXCHMALCTrendsDown", isXCHMALCTrendsDown, ignoreFalseConditions) + + ToString("isXCHMALCFastOverSlow", isXCHMALCFastOverSlow, ignoreFalseConditions) + + ToString("isXCHMALCFastUnderSlow", isXCHMALCFastUnderSlow, ignoreFalseConditions) + + ToString("isXCHMALCFastCrossedOverSlow", isXCHMALCFastCrossedOverSlow, ignoreFalseConditions) + + ToString("isXCHMALCFastCrossedUnderSlow", isXCHMALCFastCrossedUnderSlow, ignoreFalseConditions) + + "" + // + ; + + // + // Generating Full Result by Combining parts ... + result = + // + "[" + GetToken() + "]" + separator + + "----------------------" + separator + + commonStr + + obdStr + + fiStr + + rsiStr + + tmStr + + amaStr + + lhStr + + tdStr + + tsStr + + chlhStr + + chmaStr + + "" + // + ; + // return result; } + + // + // For Data Collector ... + bool IsModelValid() + { + return false; + } + string ToModelString() + { + return NULL; + } + bool ParseModel(string content) + { + return false; + } + int FindIndex(X5MarketConditions &items[]) + { + return -1; + } }; // @@ -1267,10 +1581,13 @@ public: GetMarketConditions(mConditions, barIndex); // - // if (result) - // { - // Print(GetToken() + ", " + GetTag() + ", Salam"); - // } + if (result) + { + // + string mConditionsStr = mConditions.GenerateSummary(); + mConditionsCollector.Add(mConditionsStr); + Print("Conditions: " + "\n" + mConditionsStr); + } // return result; @@ -1287,6 +1604,12 @@ protected: private: // // Props ... + + // + // Prepare an Instance of Data Collector for MarketConditions ... + XSC5MarketConditionDataCollector mConditionsCollector; + + // int mNumberOfItems; // Number of Buffer Ites Read in Conditions ... // diff --git a/Classes/x-saherelm.xdata-collector.class.mq5 b/Classes/x-saherelm.xdata-collector.class.mq5 index 2fa76542..81608659 100644 --- a/Classes/x-saherelm.xdata-collector.class.mq5 +++ b/Classes/x-saherelm.xdata-collector.class.mq5 @@ -191,7 +191,7 @@ public: // T iItem; - bool isValid = iItem.Parse(content); + bool isValid = iItem.ParseModel(content); if (isValid) { // @@ -224,14 +224,51 @@ public: bool result = false; // - result = item.IsValid(); + result = item.IsModelValid(); if (!result) { return result; } // - string content = item.ToString(); + string content = item.ToModelString(); + result = IsValid(content); + if (!result) + { + return result; + } + + // + string storePath = GetStorePath(); + int mFileHandler = FileOpen( + storePath, + FILE_READ | FILE_WRITE | FILE_TXT); + result = mFileHandler != INVALID_HANDLE; + if (!result) + { + return result; + } + + // + FileSeek(mFileHandler, 0, SEEK_END); + FileWrite(mFileHandler, content); + FileFlush(mFileHandler); + FileClose(mFileHandler); + + // + return result; + } + + // + // Add Item ... + bool Add( + string content // Content + ) + { + // + bool result = false; + + // result = IsValid(content); if (!result) { @@ -282,7 +319,7 @@ public: T iItem = items[i]; // - if (!iItem.IsValid()) + if (!iItem.IsModelValid()) { continue; } @@ -309,7 +346,7 @@ public: bool result = false; // - result = item.IsValid(); + result = item.IsModelValid(); if (!result) { return result; diff --git a/Classes/x-saherelm.xprovider.class.mq5 b/Classes/x-saherelm.xprovider.class.mq5 index 5f0bc3f6..a4bca13a 100644 --- a/Classes/x-saherelm.xprovider.class.mq5 +++ b/Classes/x-saherelm.xprovider.class.mq5 @@ -81,6 +81,7 @@ public: // Generate Summary ... virtual string GenerateSummary( const double multiplier = 1, // Score Multiplier + const string separator = "\n", // Separator const bool ignoreFalseConditions = true // Ignore False Conditions ); }; diff --git a/Libraries/x-saherelm.common.lib.mq5 b/Libraries/x-saherelm.common.lib.mq5 index f660e5e4..18ede460 100644 --- a/Libraries/x-saherelm.common.lib.mq5 +++ b/Libraries/x-saherelm.common.lib.mq5 @@ -3418,7 +3418,7 @@ MqlDateTime GetBarTimeStruct( // template bool IsSame( - T &buffer[], // Search Buffer + T &buffer[], // Search Buffer int count = 5 // Number of Searchs ) { @@ -3428,28 +3428,33 @@ bool IsSame( // int bufferSize = ArraySize(buffer); result = bufferSize > 0; - if (!result) { + if (!result) + { return result; } // // Validate Count ... result = count < bufferSize; - if (!result) { + if (!result) + { return result; } // T iTem = buffer[0]; - for (int i = 0; i < count; i++) { + for (int i = 0; i < count; i++) + { // - if (iTem != buffer[i]) { + if (iTem != buffer[i]) + { result = false; break; } // - if (!result) { + if (!result) + { result = true; } } @@ -3665,21 +3670,24 @@ bool IsDecreasing( // bool IsTrendingUp( const double &buffer1[], // First Buffer - const double &buffer2[] // Seccend Buffer -) { + const double &buffer2[] // Seccend Buffer +) +{ // bool result = false; // int buffer1Count = ArraySize(buffer1); int buffer2Count = ArraySize(buffer2); - if (buffer1Count <= 0 || buffer2Count <= 0) { + if (buffer1Count <= 0 || buffer2Count <= 0) + { return result; } // int count = MathMin(buffer1Count, buffer2Count); - if (count <= 1) { + if (count <= 1) + { return result; } @@ -3687,17 +3695,20 @@ bool IsTrendingUp( int upCounts = 0; int downCounts = 0; double value = MathAbs(buffer1[0] - buffer2[0]); - for (int i = 1; i < count; i++) { + for (int i = 1; i < count; i++) + { // double iValue = MathAbs(buffer1[i] - buffer2[i]); // - if (value > iValue) { + if (value > iValue) + { upCounts++; } // - if (value < iValue) { + if (value < iValue) + { downCounts++; } } @@ -3712,21 +3723,24 @@ bool IsTrendingUp( // bool IsTrendingDown( const double &buffer1[], // First Buffer - const double &buffer2[] // Seccend Buffer -) { + const double &buffer2[] // Seccend Buffer +) +{ // bool result = false; // int buffer1Count = ArraySize(buffer1); int buffer2Count = ArraySize(buffer2); - if (buffer1Count <= 0 || buffer2Count <= 0) { + if (buffer1Count <= 0 || buffer2Count <= 0) + { return result; } // int count = MathMin(buffer1Count, buffer2Count); - if (count <= 1) { + if (count <= 1) + { return result; } @@ -3734,17 +3748,20 @@ bool IsTrendingDown( int upCounts = 0; int downCounts = 0; double value = MathAbs(buffer1[0] - buffer2[0]); - for (int i = 1; i < count; i++) { + for (int i = 1; i < count; i++) + { // double iValue = MathAbs(buffer1[i] - buffer2[i]); // - if (value > iValue) { + if (value > iValue) + { upCounts++; } // - if (value < iValue) { + if (value < iValue) + { downCounts++; } } @@ -4822,6 +4839,31 @@ string ToString(T value) return (string)value; } +// +// Used In Report or Summary Generators ... +string ToString( + string prefix, // Title + bool value, // Value + bool ignoreFalseConditions = true, // Ignore False Conditions + string prefixSeparator = ":", // Title Separator + string lineSeparator = "\n" // Line Separator +) +{ + // + string result = NULL; + + // + result = (value || !ignoreFalseConditions) + ? prefix + + prefixSeparator + " " + + ToString(value) + + lineSeparator + : ""; + + // + return result; +} + // // Converts a Buffer to String Representation ... template diff --git a/Libraries/x-saherelm.xtrade.lib.mq5 b/Libraries/x-saherelm.xtrade.lib.mq5 index 602c30de..2d90d697 100644 --- a/Libraries/x-saherelm.xtrade.lib.mq5 +++ b/Libraries/x-saherelm.xtrade.lib.mq5 @@ -856,9 +856,15 @@ struct XSignal return GetToken(this); } + // + bool IsModelValid() + { + return IsValid(); + } + // // To String Representation ... - string ToString() + string ToModelString() { // string result = NULL; @@ -940,7 +946,7 @@ struct XSignal // // Parse String Model and Fill Available // Items ... - bool Parse(string value) + bool ParseModel(string value) { // bool result = false; @@ -2709,9 +2715,15 @@ struct XPositionInfo return GetToken(this); } + // + bool IsModelValid() + { + return IsValid(); + } + // // Convert to String Representation - string ToString() + string ToModelString() { // string result = NULL; @@ -2753,7 +2765,7 @@ struct XPositionInfo // // Parse and Fill from Given String Representation - bool Parse(string value) + bool ParseModel(string value) { // bool result = false;