diff --git a/Classes/x-saherelm.x121.setup.class.mq5 b/Classes/x-saherelm.x121.setup.class.mq5 index c9dc5d3c..1504a52b 100644 --- a/Classes/x-saherelm.x121.setup.class.mq5 +++ b/Classes/x-saherelm.x121.setup.class.mq5 @@ -46,6 +46,152 @@ // // Definitions ... +// +enum ENUM_X121_SIGNAL_PROVIDER +{ + // + PROVIDER_UNKNOWN = 0, + PROVIDER_XMATD = 1, + PROVIDER_XSARD = 2, + PROVIDER_XADXTD = 3, + PROVIDER_XSTR = 4, + PROVIDER_XCHE = 5, + PROVIDER_XTD = 6, + PROVIDER_XSI = 7, + PROVIDER_XCI = 8, + PROVIDER_XMCD = 9, + PROVIDER_XICH = 10, + PROVIDER_XHK = 11, + PROVIDER_XSMHK = 12, + PROVIDER_XMRB = 13, + PROVIDER_XSSLC = 14, + PROVIDER_XHULL = 15, + PROVIDER_XASCT = 16, +}; + +// +string ToString(ENUM_X121_SIGNAL_PROVIDER value) +{ + // + string result = NULL; + + // + string vStr = EnumToString(value); + if (!IsValid(vStr)) + { + return result; + } + + // + string parts[]; + int partsCount = SplitContent( + parts, + vStr, + "_" + // + ); + if (partsCount <= 0) + { + return result; + } + + // + bool hasLastPart = GetLastItem( + result, + parts + // + ); + if (!hasLastPart) + { + return result; + } + + // + return result; +} + +// +ENUM_X121_SIGNAL_PROVIDER FromString(string value) +{ + // + ENUM_X121_SIGNAL_PROVIDER result = PROVIDER_UNKNOWN; + + // + if (!IsValid(value)) + { + return result; + } + + // + if (Contains(value, (EnumToString(PROVIDER_XMATD)))) + { + result = PROVIDER_XMATD; + } + else if (Contains(value, (EnumToString(PROVIDER_XSARD)))) + { + result = PROVIDER_XSARD; + } + else if (Contains(value, (EnumToString(PROVIDER_XADXTD)))) + { + result = PROVIDER_XADXTD; + } + else if (Contains(value, (EnumToString(PROVIDER_XSTR)))) + { + result = PROVIDER_XSTR; + } + else if (Contains(value, (EnumToString(PROVIDER_XCHE)))) + { + result = PROVIDER_XCHE; + } + else if (Contains(value, (EnumToString(PROVIDER_XTD)))) + { + result = PROVIDER_XTD; + } + else if (Contains(value, (EnumToString(PROVIDER_XSI)))) + { + result = PROVIDER_XSI; + } + else if (Contains(value, (EnumToString(PROVIDER_XCI)))) + { + result = PROVIDER_XCI; + } + else if (Contains(value, (EnumToString(PROVIDER_XMCD)))) + { + result = PROVIDER_XMCD; + } + else if (Contains(value, (EnumToString(PROVIDER_XICH)))) + { + result = PROVIDER_XICH; + } + else if (Contains(value, (EnumToString(PROVIDER_XHK)))) + { + result = PROVIDER_XHK; + } + else if (Contains(value, (EnumToString(PROVIDER_XSMHK)))) + { + result = PROVIDER_XSMHK; + } + else if (Contains(value, (EnumToString(PROVIDER_XMRB)))) + { + result = PROVIDER_XMRB; + } + else if (Contains(value, (EnumToString(PROVIDER_XSSLC)))) + { + result = PROVIDER_XSSLC; + } + else if (Contains(value, (EnumToString(PROVIDER_XHULL)))) + { + result = PROVIDER_XHULL; + } + else if (Contains(value, (EnumToString(PROVIDER_XASCT)))) + { + result = PROVIDER_XASCT; + } + + // + return result; +} + // // Inputs ... struct X121SetupInputs @@ -479,17 +625,17 @@ struct X121SetupConditions ); // - string matdSummary = matdConditions.GenerateSummary(false, true, false); - string adxtdSummary = adxtdConditions.GenerateSummary(false, true, false); - string strSummary = strConditions.GenerateSummary(false, true, false); - string cheSummary = cheConditions.GenerateSummary(false, true, false); - string asctSummary = asctConditions.GenerateSummary(false, true, false); - string tdSummary = tdConditions.GenerateSummary(false, true, false); - string ichSummary = ichConditions.GenerateSummary(false, true, false); - string hkSummary = hkConditions.GenerateSummary(false, true, false); - string mrbSummary = mrbConditions.GenerateSummary(false, true, false); - string sslcSummary = sslcConditions.GenerateSummary(false, true, false); - string hullSummary = hullConditions.GenerateSummary(false, true, false); + string matdSummary = matdConditions.GenerateSummary(false, true, false, ignoreFalseConditions); + string adxtdSummary = adxtdConditions.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 sslcSummary = sslcConditions.GenerateSummary(false, true, false, ignoreFalseConditions); + string hullSummary = hullConditions.GenerateSummary(false, true, false, ignoreFalseConditions); // string conditionsStr = @@ -628,7 +774,8 @@ struct X121SignalGenerator // Check Market Conditions for Long Signals ... bool HasLongConditions( X121SetupConditions &conditions, // Conditions - int &pusher // Pushers + int &pusher, // Pushers + string &provider // Provider ) { // @@ -654,6 +801,7 @@ struct X121SignalGenerator ); // + // XMATD ... bool long1 = // // Starting Conditions ... @@ -675,10 +823,13 @@ struct X121SignalGenerator ; if (long1) { + // pusher++; + provider = ToString(PROVIDER_XMATD); } // + // XSARD ... bool long2 = // // Starting Conditions ... @@ -700,10 +851,13 @@ struct X121SignalGenerator ; if (long2) { + // pusher++; + provider = ToString(PROVIDER_XSARD); } // + // XADXTD ... bool long3 = // // Starting Conditions ... @@ -723,10 +877,13 @@ struct X121SignalGenerator ; if (long3) { + // pusher++; + provider = ToString(PROVIDER_XADXTD); } // + // XSTR ... bool long4 = // // Starting Conditions ... @@ -747,10 +904,13 @@ struct X121SignalGenerator ; if (long4) { + // pusher++; + provider = ToString(PROVIDER_XSTR); } // + // XCHE ... bool long5 = // // Starting Conditions ... @@ -771,10 +931,13 @@ struct X121SignalGenerator ; if (long5) { + // pusher++; + provider = ToString(PROVIDER_XCHE); } // + // XTD ... bool long6 = // // Starting Conditions ... @@ -795,10 +958,13 @@ struct X121SignalGenerator ; if (long6) { + // pusher++; + provider = ToString(PROVIDER_XTD); } // + // XSI ... bool long7 = // // Starting Conditions ... @@ -821,10 +987,13 @@ struct X121SignalGenerator ; if (long7) { + // pusher++; + provider = ToString(PROVIDER_XSI); } // + // XCI ... bool long8 = // // Starting Conditions ... @@ -847,10 +1016,13 @@ struct X121SignalGenerator ; if (long8) { + // pusher++; + provider = ToString(PROVIDER_XCI); } // + // XMCD ... bool long9 = // // Starting Conditions ... @@ -873,10 +1045,13 @@ struct X121SignalGenerator ; if (long9) { + // pusher++; + provider = ToString(PROVIDER_XMCD); } // + // XICH ... bool long10 = // // Starting Conditions ... @@ -898,10 +1073,13 @@ struct X121SignalGenerator ; if (long10) { + // pusher++; + provider = ToString(PROVIDER_XICH); } // + // XHK ... bool long11 = // // Starting Conditions ... @@ -922,10 +1100,13 @@ struct X121SignalGenerator ; if (long11) { + // pusher++; + provider = ToString(PROVIDER_XHK); } // + // XSMHK ... bool long12 = // // Starting Conditions ... @@ -946,10 +1127,13 @@ struct X121SignalGenerator ; if (long12) { + // pusher++; + provider = ToString(PROVIDER_XSMHK); } // + // XMRB ... bool long13 = // // Starting Conditions ... @@ -970,10 +1154,13 @@ struct X121SignalGenerator ; if (long13) { + // pusher++; + provider = ToString(PROVIDER_XMRB); } // + // XSSLC ... bool long14 = // // Starting Conditions ... @@ -994,10 +1181,13 @@ struct X121SignalGenerator ; if (long14) { + // pusher++; + provider = ToString(PROVIDER_XSSLC); } // + // XHULL ... bool long15 = // // Starting Conditions ... @@ -1018,7 +1208,37 @@ struct X121SignalGenerator ; if (long15) { + // pusher++; + provider = ToString(PROVIDER_XHULL); + } + + // + // XASCT ... + bool long16 = + // + // Starting Conditions ... + conditions.asctConditions.isLongSignal && + // + // 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 (long16) + { + // + pusher++; + provider = ToString(PROVIDER_XASCT); } // @@ -1026,7 +1246,6 @@ struct X121SignalGenerator // pusher >= 1 && !isOSCShortVerified && - conditions.asctConditions.isLongSignal && bullishScore > bearishScore * 2 && ( // @@ -1088,6 +1307,10 @@ struct X121SignalGenerator // long15 // + || + // + long16 + // ) // ; @@ -1100,7 +1323,8 @@ struct X121SignalGenerator // Check Market Conditions for Short Signals ... bool HasShortConditions( X121SetupConditions &conditions, // Conditions - int &pusher // Pushers + int &pusher, // Pushers + string &provider // Provider ) { // @@ -1126,6 +1350,7 @@ struct X121SignalGenerator ); // + // XMATD ... bool short1 = // // Starting Conditions ... @@ -1147,10 +1372,13 @@ struct X121SignalGenerator ; if (short1) { + // pusher++; + provider = ToString(PROVIDER_XMATD); } // + // XSARD ... bool short2 = // // Starting Conditions ... @@ -1172,10 +1400,13 @@ struct X121SignalGenerator ; if (short2) { + // pusher++; + provider = ToString(PROVIDER_XSARD); } // + // XADXTD ... bool short3 = // // Starting Conditions ... @@ -1195,10 +1426,13 @@ struct X121SignalGenerator ; if (short3) { + // pusher++; + provider = ToString(PROVIDER_XADXTD); } // + // XSTR ... bool short4 = // // Starting Conditions ... @@ -1219,10 +1453,13 @@ struct X121SignalGenerator ; if (short4) { + // pusher++; + provider = ToString(PROVIDER_XSTR); } // + // XCHE ... bool short5 = // // Starting Conditions ... @@ -1243,10 +1480,13 @@ struct X121SignalGenerator ; if (short5) { + // pusher++; + provider = ToString(PROVIDER_XCHE); } // + // XTD ... bool short6 = // // Starting Conditions ... @@ -1267,10 +1507,13 @@ struct X121SignalGenerator ; if (short6) { + // pusher++; + provider = ToString(PROVIDER_XTD); } // + // XSI ... bool short7 = // // Starting Conditions ... @@ -1293,10 +1536,13 @@ struct X121SignalGenerator ; if (short7) { + // pusher++; + provider = ToString(PROVIDER_XSI); } // + // XCI ... bool short8 = // // Starting Conditions ... @@ -1319,10 +1565,13 @@ struct X121SignalGenerator ; if (short8) { + // pusher++; + provider = ToString(PROVIDER_XCI); } // + // XMCD ... bool short9 = // // Starting Conditions ... @@ -1345,10 +1594,13 @@ struct X121SignalGenerator ; if (short9) { + // pusher++; + provider = ToString(PROVIDER_XMCD); } // + // XICH ... bool short10 = // // Starting Conditions ... @@ -1370,10 +1622,13 @@ struct X121SignalGenerator ; if (short10) { + // pusher++; + provider = ToString(PROVIDER_XICH); } // + // XHK ... bool short11 = // // Starting Conditions ... @@ -1394,10 +1649,13 @@ struct X121SignalGenerator ; if (short11) { + // pusher++; + provider = ToString(PROVIDER_XHK); } // + // XSMHK ... bool short12 = // // Starting Conditions ... @@ -1418,10 +1676,13 @@ struct X121SignalGenerator ; if (short12) { + // pusher++; + provider = ToString(PROVIDER_XSMHK); } // + // XMRB ... bool short13 = // // Starting Conditions ... @@ -1438,15 +1699,17 @@ struct X121SignalGenerator conditions.hkConditions.isSMHKBearish && conditions.sslcConditions.isBearish && conditions.hullConditions.isBearish - // ; if (short13) { + // pusher++; + provider = ToString(PROVIDER_XMRB); } // + // XSSLC ... bool short14 = // // Starting Conditions ... @@ -1463,15 +1726,17 @@ struct X121SignalGenerator conditions.hkConditions.isSMHKBearish && conditions.mrbConditions.isFastUnderSlow && conditions.hullConditions.isBearish - // ; if (short14) { + // pusher++; + provider = ToString(PROVIDER_XSSLC); } // + // XHULL ... bool short15 = // // Starting Conditions ... @@ -1488,12 +1753,41 @@ struct X121SignalGenerator conditions.hkConditions.isSMHKBearish && conditions.mrbConditions.isFastUnderSlow && conditions.sslcConditions.isBearish - // ; if (short15) { + // pusher++; + provider = ToString(PROVIDER_XHULL); + } + + // + // XASCT ... + bool short16 = + // + // Starting Conditions ... + conditions.asctConditions.isShortSignal && + // + // 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 (short15) + { + // + pusher++; + provider = ToString(PROVIDER_XASCT); } // @@ -1501,7 +1795,6 @@ struct X121SignalGenerator // pusher >= 1 && !isOSCLongVerified && - conditions.asctConditions.isShortSignal && bearishScore > bullishScore * 2 && ( // @@ -1563,6 +1856,10 @@ struct X121SignalGenerator // short15 // + || + // + short16 + // ) // ; @@ -1577,6 +1874,7 @@ struct X121SignalGenerator X121SetupConditions &conditions, // Conditions XSignal &signal, // Signal if Exists int &pusher, // Pushers + string &provider, // Signal Provider Name bool _allowLong, // Allow Long Signals bool _allowShort, // Allow Short Signals double _volume = 0.01, // Volume @@ -1603,7 +1901,8 @@ struct X121SignalGenerator ? false : HasLongConditions( conditions, - pusher // + pusher, + provider // ); // @@ -1612,7 +1911,8 @@ struct X121SignalGenerator ? false : HasShortConditions( conditions, - pusher // + pusher, + provider // ); // @@ -1622,6 +1922,12 @@ struct X121SignalGenerator return result; } + // + string mProvider = + IsValid(provider) + ? provider + : GetTag(); + // // Prepare Signals ... ENUM_POSITION_TYPE mType = @@ -1658,7 +1964,7 @@ struct X121SignalGenerator // result = signal.Prepare( conditions.symbol, - GetTag() + ToString(pusher), + mProvider, conditions.period, mType, X_ORDER_MODE_MARKET, diff --git a/Classes/x-saherelm.x121.setup.xea.mq5 b/Classes/x-saherelm.x121.setup.xea.mq5 index 557f5155..6433a9ab 100644 --- a/Classes/x-saherelm.x121.setup.xea.mq5 +++ b/Classes/x-saherelm.x121.setup.xea.mq5 @@ -42,9 +42,12 @@ struct XSignalInfo datetime time; // Issue Time (Open Position) // - double profit; // Profit on Close - datetime endTime; // End Time - string message; // Close Reason + double profit; // Profit on Close + double commission; // Commission + double swap; // Swap + double volume; // Volume + datetime endTime; // End Time + string message; // Close Reason // double bullishScore; // Bullish Score On Signal Time @@ -72,8 +75,13 @@ struct XSignalInfo ticket = 0; symbol = NULL; period = NULL; + provider = NULL; + pushers = 0; time = NULL; profit = 0; + commission = 0; + swap = 0; + volume = 0; endTime = NULL; message = NULL; bullishScore = 0; @@ -86,6 +94,8 @@ struct XSignalInfo bool Fill( int _pushers, XSignal &_signal, + double _bullishScore, + double _bearishScore, X121SetupConditions &_conditions // ) { @@ -117,6 +127,10 @@ struct XSignalInfo signal = _signal; conditions = _conditions; + // + bullishScore = _bullishScore; + bearishScore = _bearishScore; + // return result; } @@ -186,6 +200,44 @@ struct XSignalInfo return result; } + // + int GetAge() + { + // + int result = -1; + + // + if (!IsValid(symbol) || + !IsValid(time) || + !IsValid(endTime) || + !IsValid(period)) + { + return result; + } + + // + int startIndex = iBarShift( + symbol, + period, + time, + false // + ); + + // + int endIndex = iBarShift( + symbol, + period, + endTime, + false // + ); + + // + result = MathAbs(startIndex - endIndex); + + // + return result; + } + // string GetFileName() { @@ -205,7 +257,7 @@ struct XSignalInfo provider + "_" + ToString(ticket) + "_" + ToString(period) + "_" + - ToString(time) + ToFormatString(time) // ; @@ -214,7 +266,7 @@ struct XSignalInfo } // - string ToModelString() + string ToString() { // string result = NULL; @@ -225,24 +277,34 @@ struct XSignalInfo false, // Only Commons ... true, // Only Conditions ... false, // Include Score ... - false // Include False Conditions ...ّ + false // Include False Conditions ... ); + // + int age = GetAge(); + // result = // ToString("Ticket", ticket) + ToString("Symbol", symbol) + ToString("Period", period) + + ToString("Pushers", pushers) + + ToString("Provider", provider) + ToString("Time", time) + ToString("BullishScore", bullishScore) + ToString("BearishScore", bearishScore) + + ToString("Volume", volume) + ToString("Profit", profit) + + ToString("Commission", commission) + + ToString("Swap", swap) + ToString("End Time", endTime) + + ToString("Age", age) + ToString("Message", message) + "-------------" + "\n" + - ToString("Signal", signal.ToModelString()) + - ToString("Conditions", conditionsStr) + + ToString("Signal", "\n" + signal.ToString()) + + "-------------" + "\n" + + ToString("Conditions", "\n" + conditionsStr) + // "" // @@ -315,7 +377,7 @@ public: } // - string content = item.ToModelString(); + string content = item.ToString(); result = IsValid(content); if (!result) { @@ -368,7 +430,7 @@ private: // result = // - mPath + "\\" + fileName + mPath + "\\" + fileName + ".x121.log" // ; @@ -517,6 +579,63 @@ public: mAllowShort = value; } + // + double Volume() + { + return mVolume; + } + + // + void Volume(double value) + { + // + if (value < 0.01) + { + value = 0.01; + } + + // + mVolume = value; + } + + // + double TPPoint() + { + return mTPPoint; + } + + // + void TPPoint(double value) + { + // + if (value < 0) + { + value = 0; + } + + // + mTPPoint = value; + } + + // + double SLPoint() + { + return mSLPoint; + } + + // + void SLPoint(double value) + { + // + if (value < 0) + { + value = 0; + } + + // + mSLPoint = value; + } + // bool IsEnable() { @@ -584,25 +703,39 @@ public: string separator = "\n"; // - X121SetupConditions cConditions; - X121SetupConditions sConditions; - X121SetupConditions mConditions; - X121SetupConditions lConditions; - X121SetupConditions hConditions; - - // + // Current ... XSignal cSignal; - XSignal sSignal; - XSignal mSignal; - XSignal lSignal; - XSignal hSignal; + int cPusher = 0; + string cProvider = NULL; + X121SetupConditions cConditions; // - int cPusher = 0; + // Short ... + XSignal sSignal; int sPusher = 0; + string sProvider = NULL; + X121SetupConditions sConditions; + + // + // Medium ... + XSignal mSignal; int mPusher = 0; + string mProvider = NULL; + X121SetupConditions mConditions; + + // + // Long ... + XSignal lSignal; int lPusher = 0; + string lProvider = NULL; + X121SetupConditions lConditions; + + // + // Hind ... + XSignal hSignal; int hPusher = 0; + string hProvider = NULL; + X121SetupConditions hConditions; // X121SignalGenerator signalGenerator; @@ -661,8 +794,12 @@ public: cConditions, cSignal, cPusher, + cProvider, mAllowLong, - mAllowShort // + mAllowShort, + mVolume, + mSLPoint, + mTPPoint // ); // @@ -714,8 +851,12 @@ public: sConditions, sSignal, sPusher, + sProvider, mAllowLong, - mAllowShort // + mAllowShort, + mVolume, + mSLPoint, + mTPPoint // ); // @@ -767,8 +908,12 @@ public: mConditions, mSignal, mPusher, + mProvider, mAllowLong, - mAllowShort // + mAllowShort, + mVolume, + mSLPoint, + mTPPoint // ); // @@ -820,8 +965,12 @@ public: lConditions, lSignal, lPusher, + lProvider, mAllowLong, - mAllowShort // + mAllowShort, + mVolume, + mSLPoint, + mTPPoint // ); // @@ -873,8 +1022,12 @@ public: hConditions, hSignal, hPusher, + hProvider, mAllowLong, - mAllowShort // + mAllowShort, + mVolume, + mSLPoint, + mTPPoint // ); // @@ -907,6 +1060,8 @@ public: AddNewSignal( cPusher, cSignal, + mBullishScore, + mBearishScore, cConditions // ); } @@ -925,6 +1080,8 @@ public: AddNewSignal( sPusher, sSignal, + mBullishScore, + mBearishScore, sConditions // ); } @@ -943,6 +1100,8 @@ public: AddNewSignal( mPusher, mSignal, + mBullishScore, + mBearishScore, mConditions // ); } @@ -961,6 +1120,8 @@ public: AddNewSignal( lPusher, lSignal, + mBullishScore, + mBearishScore, lConditions // ); } @@ -979,6 +1140,8 @@ public: AddNewSignal( hPusher, hSignal, + mBullishScore, + mBearishScore, hConditions // ); } @@ -1083,6 +1246,7 @@ public: // Tools For Signal Info Collect ... // + // Used for Signal Info States ... void OnDealsChangedHandler(int count) { // @@ -1090,6 +1254,8 @@ public: bool hasDeal = mTrader.GetLastDeal(deal); if (hasDeal) { + // + // Update Signal Info State ... UpdateSignalState(deal); } } @@ -1115,10 +1281,9 @@ private: // bool mAllowLong; // Allow Long bool mAllowShort; // Allow Short - - // - // TODO: - // Add Volume and TP SL Points as Properties here ... + double mVolume; // Volume + double mTPPoint; // TP Point + double mSLPoint; // SL Point // XSignalInfo mSignalInfos[]; @@ -1242,6 +1407,8 @@ private: void AddNewSignal( int pusher, XSignal &signal, + double bullishScore, + double bearishScore, X121SetupConditions &conditions // ) { @@ -1250,6 +1417,8 @@ private: bool isFilled = info.Fill( pusher, signal, + bullishScore, + bearishScore, conditions // ); @@ -1286,11 +1455,42 @@ private: // mSignalInfos[infoIDX].time = deal.time; mSignalInfos[infoIDX].ticket = deal.positionId; - Print("Open Position: " + ToString(deal.positionId)); + mSignalInfos[infoIDX].commission = deal.commission; + mSignalInfos[infoIDX].signal.positionId = deal.positionId; } else if (deal.entry == DEAL_ENTRY_OUT) { - Print("Close Position: " + ToString(deal.positionId)); + // + mSignalInfos[infoIDX].swap = deal.swap; + mSignalInfos[infoIDX].endTime = deal.time; + mSignalInfos[infoIDX].profit = deal.profit; + + // + string message = + // + deal.reason == DEAL_REASON_TP + ? "TP" + : deal.reason == DEAL_REASON_SL + ? "SL" + : IsValid(deal.comment) + ? deal.comment + : "Force Close ..." + // + ; + mSignalInfos[infoIDX].message = message; + + // + // Now we can Save Signal Info and Remove it from mSignal Infos ... + bool isSaved = mSignalCollector.Save(mSignalInfos[infoIDX]); + if (isSaved) + { + // + ArrayRemove( + mSignalInfos, + infoIDX, + 1 // + ); + } } } diff --git a/Experts/x-test-xxx.mq5 b/Experts/x-test-xxx.mq5 index 19f0df26..147698d9 100644 --- a/Experts/x-test-xxx.mq5 +++ b/Experts/x-test-xxx.mq5 @@ -141,6 +141,9 @@ bool InitialEA() // Allow Signals ... mEA.AllowLong(true); mEA.AllowShort(true); + mEA.Volume(0.01); + mEA.TPPoint(30); + mEA.SLPoint(0); // mEA.SetAlertPrefix(ShortName); diff --git a/Libraries/x-saherelm.common.lib.mq5 b/Libraries/x-saherelm.common.lib.mq5 index 871e95c1..c2fe620f 100644 --- a/Libraries/x-saherelm.common.lib.mq5 +++ b/Libraries/x-saherelm.common.lib.mq5 @@ -3812,6 +3812,42 @@ ENUM_ORDER_TYPE GetOpposit(ENUM_ORDER_TYPE type) return result; } +// +string ToString(ENUM_POSITION_TYPE value) +{ + // + string result = NULL; + + // + result = + // + IsLong(value) + ? "Long" + : "Short" + // + ; + + // + return result; +} +string ToString(ENUM_ORDER_TYPE value) +{ + // + string result = NULL; + + // + result = + // + IsLong(value) + ? "Long" + : "Short" + // + ; + + // + return result; +} + // // Check Expert Running in Testing Mode or not ... bool IsRunningOnTestMode() @@ -5051,6 +5087,85 @@ ulong GetCurrentTimeAsMilliSeconds() return result; } +// +// Converts a Date time to File Format ... +string ToFormatString( + datetime mTime, + string separator = "_" // +) +{ + // + string result = NULL; + + // + if (!IsValid(mTime)) + { + return result; + } + + // + MqlDateTime timeStruct; + bool isConverts = TimeToStruct( + mTime, + timeStruct // + ); + if (!isConverts) + { + return result; + } + + // + string year = ToString(timeStruct.year); + string month = ToString(timeStruct.mon); + string day = ToString(timeStruct.day); + string hour = ToString(timeStruct.hour); + string minute = ToString(timeStruct.min); + string second = ToString(timeStruct.sec); + + // + result = + // + // Year ... + year + separator + + // + // Month ... + (StringLen(month) == 1 + ? "0" + month + : month) + + separator + + // + // Day ... + (StringLen(day) == 1 + ? "0" + day + : day) + + separator + + // + // Hour ... + (StringLen(hour) == 1 + ? "0" + hour + : hour) + + separator + + // + // Minute ... + (StringLen(minute) == 1 + ? "0" + minute + : minute) + + separator + + // + // Seconds ... + (StringLen(second) == 1 + ? "0" + second + : second) + + separator + + // + "" + // + ; + + // + return result; +} + // // Bar Times ... diff --git a/Libraries/x-saherelm.xtrade.lib.mq5 b/Libraries/x-saherelm.xtrade.lib.mq5 index 1d7e85c2..c3b89412 100644 --- a/Libraries/x-saherelm.xtrade.lib.mq5 +++ b/Libraries/x-saherelm.xtrade.lib.mq5 @@ -70,6 +70,40 @@ enum ENUM_X_ORDER_MODES X_ORDER_MODE_STOP_LIMIT, // Pending Stop Limit Order }; +// +string ToString(ENUM_X_ORDER_MODES value) +{ + // + string result = NULL; + + // + switch (value) + { + // + case X_ORDER_MODE_MARKET: + result = "Market"; + break; + + // + case X_ORDER_MODE_LIMIT: + result = "Limit"; + break; + + // + case X_ORDER_MODE_STOP: + result = "Stop"; + break; + + // + case X_ORDER_MODE_STOP_LIMIT: + result = "StopLimit"; + break; + } + + // + return result; +} + // // Select Positions Type ... enum ENUM_X_POSITION_SELECT_METHODS @@ -1282,250 +1316,6 @@ struct XSignal return result; } - // - // Data Collecotr ... - - // - // Check this instance is Same os Given instance or not ... - bool IsSameAs( - const XSignal &value // instance for Compare - ) - { - // - bool result = false; - - // - result = - // - type == value.type && - mode == value.mode && - entry == value.entry && - period == value.period && - symbol == value.symbol && - provider == value.provider && - positionId == value.positionId - // - ; - - // - return result; - } - - // - // Find index in a Collection ... - int FindIndex( - const XSignal &values[] // Collection to Find - ) - { - // - return FindIndex( - this, - values - // - ); - } - - // - // Check Items Passed Specific Filters or not ... - bool IsFiltersPassed( - string mSymbol = NULL, // Trading Symbol - string mProvider = NULL, // Signal Provider - ENUM_TIMEFRAMES mPeriod = NULL, // Trading Timeframe - ENUM_POSITION_TYPE mType = NULL, // Long (Buy), Short (Sell) - ENUM_X_ORDER_MODES mMode = NULL // Execution Mode - ) - { - // - bool result = false; - - // - result = - // - // Symbol Filter ... - IsSymbolFilterPassed( - mSymbol, - this - // - ) - // - && - // - // Provider Filter ... - IsProviderFilterPassed( - mProvider, - this - // - ) - // - && - // - // Period Filter ... - IsPeriodFilterPassed( - mPeriod, - this - // - ) - // - && - // - // Type Filter ... - IsTypeFilterPassed( - mType, - this - // - ) - // - && - // - // Mode Filter ... - IsModeFilterPassed( - mMode, - this - // - ) - // - ; - - // - return result; - } - - // - string GetToken() - { - return GetToken(this); - } - - // - bool IsModelValid() - { - return IsValid(); - } - - // - // To String Representation ... - string ToModelString() - { - // - string result = NULL; - - // - if (!IsValid()) - { - return result; - } - - // - // For Modeling a Signal we Only Used: - // - Period; - // - Provider; - // - Type; - // - Mode; - // - Symbol; - // - PositionID; - // - Entry; - // - Volume; - // - TPS; - // - SLS; - // - Issue Time; - - // - int iPeriodInt = (int)period; - - // - string tpsStr = Surround(XTPToken, tp); - string slsStr = Surround(XSLToken, sl); - string typeStr = Surround(XTypeToken, type); - string modeStr = Surround(XModeToken, mode); - string timeStr = Surround(XTimeToken, time); - string entryStr = Surround(XEntryToken, entry); - string SymbolStr = Surround(XSymbolToken, symbol); - string volumeStr = Surround(XVolumeToken, volume); - string positionIdStr = Surround(XIDToken, positionId); - string periodStr = Surround(XPeriodToken, iPeriodInt); - string providerStr = Surround(XProviderToken, provider); - - // - result = - // - GetToken() + - "[" + - // - periodStr + - providerStr + - typeStr + - modeStr + - SymbolStr + - positionIdStr + - entryStr + - volumeStr + - tpsStr + - slsStr + - timeStr + - // - "]" - // - ; - - // - return result; - } - - // - // Parse String Model and Fill Available - // Items ... - bool ParseModel(string value) - { - // - bool result = false; - - // - Clean(); - - // - if (!IsValid(value)) - { - return false; - } - - // - // For Modeling a Signal we Only Used: - // - Period; - // - Provider; - // - Type; - // - Mode; - // - Symbol; - // - PositionID; - // - Entry; - // - Volume; - // - TP; - // - SL; - // - Issue Time; - - // - tp = ParseDoubleSurrounded(value, XTPToken); - sl = ParseDoubleSurrounded(value, XSLToken); - positionId = ParseLongSurrounded(value, XIDToken); - entry = ParseDoubleSurrounded(value, XEntryToken); - volume = ParseDoubleSurrounded(value, XVolumeToken); - - // - time = ParseTimeSurrounded(value, XTimeToken); - symbol = ParseStringSurrounded(value, XSymbolToken); - provider = ParseStringSurrounded(value, XProviderToken); - type = ((ENUM_POSITION_TYPE)ParseIntSurrounded(value, XTypeToken)); - mode = ((ENUM_X_ORDER_MODES)ParseIntSurrounded(value, XModeToken)); - period = ((ENUM_TIMEFRAMES)ParseIntSurrounded(value, XPeriodToken)); - - // - // Validate ... - result = IsValid(); - ; - - // - return result; - } - // // Draw Signal on Chart ... bool Draw( @@ -1681,6 +1471,36 @@ struct XSignal // return result; } + + // + // Retrieve String Representation of Signal ... + string ToString() + { + // + string result = NULL; + + // + result = + // + ToString("Symbol", symbol) + + ToString("Period", period) + + ToString("Provider", provider) + + ToString("Type", type) + + ToString("Mode", mode) + + ToString("Volume", volume) + + ToString("Entry", entry) + + ToString("TP", tp) + + ToString("SL", sl) + + ToString("Time", time) + + ToString("Comment", comment) + + // + "" + // + ; + + // + return result; + } }; //