diff --git a/.vscode/vscode-kanban.json b/.vscode/vscode-kanban.json index 309ab281..5fba3284 100644 --- a/.vscode/vscode-kanban.json +++ b/.vscode/vscode-kanban.json @@ -43,157 +43,8 @@ "title": "Signal Executing On Breakouts" } ], - "in-progress": [ - { - "assignedTo": { - "name": "Hadi Khazaee Asl" - }, - "creation_time": "2024-06-05T00:10:14.895Z", - "details": { - "content": "- [] Check Last Time trade for Provider;\n- [] Open Trade only when it's new or Previous in Profit;\n- [] Open Only 2 trade in each Direction at same time;\n- [] Close All Open Trades at Specific Time;\n- [] Enable/Disable Robot time Daily;\n- [] Close Long age Trades;\n- [] Trail or Risk Free Same In Profit Trades when Open New One;", - "mime": "text/markdown" - }, - "id": "74", - "references": [], - "title": "add support for:" - }, - { - "assignedTo": { - "name": "Hadi Khazaee Asl" - }, - "creation_time": "2024-06-05T00:17:33.324Z", - "description": { - "content": "from Provider classes and trader class.\nput them into XEA ...\nans Signallers ...", - "mime": "text/markdown" - }, - "id": "75", - "references": [], - "title": "Cleanup all allow long, short, minProfit per trade and drawdown factors variables" - }, - { - "assignedTo": { - "name": "Hadi Khazaee Asl" - }, - "creation_time": "2024-06-05T00:18:44.371Z", - "id": "76", - "references": [], - "title": "Enable Comment Score and Summary on each Tick ..." - }, - { - "assignedTo": { - "name": "Hadi Khazaee Asl" - }, - "category": "XMQL", - "creation_time": "2024-05-30T22:34:15.388Z", - "description": { - "content": "- [x] in this way all class can Has his own Alerts ...\n- [] preare Alert Prefix for Each Separated Once ...", - "mime": "text/markdown" - }, - "id": "69", - "references": [], - "title": "make provider and ea classes to instance XSCBaseAlert class" - }, - { - "assignedTo": { - "name": "Hadi Khazaee Asl" - }, - "category": "XMQL", - "creation_time": "2024-06-01T00:58:06.730Z", - "id": "73", - "references": [], - "title": "R&D about indicator Class implementation ..." - }, - { - "assignedTo": { - "name": "Hadi Khazaee Asl" - }, - "category": "XMQL", - "creation_time": "2024-06-01T00:57:10.458Z", - "description": { - "content": "do r&d about Volume Profiling and Implement it inside X121 Market Cycle;", - "mime": "text/markdown" - }, - "id": "72", - "references": [], - "title": "R&D about Volume Profiling" - }, - { - "assignedTo": { - "name": "Hadi Khazaee Asl" - }, - "creation_time": "2024-06-05T07:28:47.379Z", - "id": "77", - "references": [], - "title": "Apply fix on Zero TP SL for X110 Signller" - } - ], - "testing": [ - { - "assignedTo": { - "name": "Hadi Khazaee Asl" - }, - "creation_time": "2024-06-01T00:56:22.059Z", - "description": { - "content": "Indicators:\n- [x] XHULL;\n- [x] XSSL;\n- [x] XAMA;\n- [x] XTM;\n\nfor each indicator:\n- [x] Buffers;\n- [x] Conditions;\n- [x] Clean;\n- [x] Score;\n- [x] Summary;\n\nignore XAMA and XTM ...", - "mime": "text/markdown" - }, - "id": "71", - "references": [], - "title": "add XHULL/XSSLC/XAMA/XTM Indicators also to X121MarketCycle Calss" - }, - { - "assignedTo": { - "name": "Hadi Khazaee Asl" - }, - "category": "X121 Market Conditions", - "creation_time": "2024-05-30T21:38:04.455Z", - "description": { - "content": "- [x] Remove all Unused Indicators and Helpers;\n-- [x] XCHLH;\n-- [x] XCHMA;\n-- [x] XFI;\n-- [x] XTS;\n-- [x] XRSI;\n-- [x] XOBD;\n-- [x] XLH;\n- [x] resolve side affects;\n- [x] Cleanup Market Conditions;\n- [x] Merge reading Required Data to XMarket Conditions;", - "mime": "text/markdown" - }, - "id": "62", - "references": [], - "title": "Cleanup all Old Indicator" - }, - { - "assignedTo": { - "name": "Hadi Khazaee Asl" - }, - "category": "XTrade", - "creation_time": "2024-05-30T22:23:48.918Z", - "id": "68", - "references": [], - "title": "fix cc and ct indicator issues ..." - }, - { - "assignedTo": { - "name": "Hadi Khazaee Asl" - }, - "category": "X121 Provider", - "creation_time": "2024-05-30T21:40:26.010Z", - "description": { - "content": "- [x] implement a Signaller Struct to Describe a Signaller state;\n- [x] use it in X121ProviderDescriptor;\n- [x] inside X121Provider use this Struct to Handle Signaller's State;", - "mime": "text/markdown" - }, - "id": "63", - "references": [], - "title": "Implement a Signaller Struct" - }, - { - "assignedTo": { - "name": "Hadi Khazaee Asl" - }, - "category": "X121 Provider", - "creation_time": "2024-05-30T21:41:50.930Z", - "description": { - "content": "Each Market must have their own Pivot Points;\n\n- [x] Remove Current Support and Resistance;\n- [x] add Support and Resistance and also Score Generating in each Market;\n- [x] create a General Common Function to Access Support and Resistances;", - "mime": "text/markdown" - }, - "id": "64", - "references": [], - "title": "Move Support and Resistance Pivots Finders inside X121Market Class" - } - ], + "in-progress": [], + "testing": [], "done": [ { "assignedTo": { @@ -380,6 +231,19 @@ "references": [], "title": "add Support for XSupport and InDirectional Support Signals" }, + { + "assignedTo": { + "name": "Hadi Khazaee Asl" + }, + "creation_time": "2024-06-05T00:10:14.895Z", + "details": { + "content": "- [] Check Last Time trade for Provider;\n- [] Open Trade only when it's new or Previous in Profit;\n- [] Open Only 2 trade in each Direction at same time;\n- [] Close All Open Trades at Specific Time;\n- [] Enable/Disable Robot time Daily;\n- [] Close Long age Trades;\n- [] Trail or Risk Free Same In Profit Trades when Open New One;", + "mime": "text/markdown" + }, + "id": "74", + "references": [], + "title": "add support for:" + }, { "assignedTo": { "name": "Hadi Khazaee Asl" @@ -393,6 +257,28 @@ "references": [], "title": "add supports to plot trend arrow in tdma indicator" }, + { + "assignedTo": { + "name": "Hadi Khazaee Asl" + }, + "creation_time": "2024-06-01T00:56:22.059Z", + "description": { + "content": "Indicators:\n- [x] XHULL;\n- [x] XSSL;\n- [x] XAMA;\n- [x] XTM;\n\nfor each indicator:\n- [x] Buffers;\n- [x] Conditions;\n- [x] Clean;\n- [x] Score;\n- [x] Summary;\n\nignore XAMA and XTM ...", + "mime": "text/markdown" + }, + "id": "71", + "references": [], + "title": "add XHULL/XSSLC/XAMA/XTM Indicators also to X121MarketCycle Calss" + }, + { + "assignedTo": { + "name": "Hadi Khazaee Asl" + }, + "creation_time": "2024-06-05T07:28:47.379Z", + "id": "77", + "references": [], + "title": "Apply fix on Zero TP SL for X110 Signller" + }, { "assignedTo": { "name": "Hadi Khazaee Asl" @@ -421,6 +307,33 @@ "references": [], "title": "Check Partial Closing" }, + { + "assignedTo": { + "name": "Hadi Khazaee Asl" + }, + "creation_time": "2024-06-05T00:17:33.324Z", + "description": { + "content": "from Provider classes and trader class.\nput them into XEA ...\nans Signallers ...", + "mime": "text/markdown" + }, + "id": "75", + "references": [], + "title": "Cleanup all allow long, short, minProfit per trade and drawdown factors variables" + }, + { + "assignedTo": { + "name": "Hadi Khazaee Asl" + }, + "category": "X121 Market Conditions", + "creation_time": "2024-05-30T21:38:04.455Z", + "description": { + "content": "- [x] Remove all Unused Indicators and Helpers;\n-- [x] XCHLH;\n-- [x] XCHMA;\n-- [x] XFI;\n-- [x] XTS;\n-- [x] XRSI;\n-- [x] XOBD;\n-- [x] XLH;\n- [x] resolve side affects;\n- [x] Cleanup Market Conditions;\n- [x] Merge reading Required Data to XMarket Conditions;", + "mime": "text/markdown" + }, + "id": "62", + "references": [], + "title": "Cleanup all Old Indicator" + }, { "assignedTo": { "name": "Hadi Khazaee Asl" @@ -704,6 +617,15 @@ "references": [], "title": "Do a Refactor On Long Signals" }, + { + "assignedTo": { + "name": "Hadi Khazaee Asl" + }, + "creation_time": "2024-06-05T00:18:44.371Z", + "id": "76", + "references": [], + "title": "Enable Comment Score and Summary on each Tick ..." + }, { "assignedTo": { "name": "Hadi Khazaee Asl" @@ -714,6 +636,16 @@ "references": [], "title": "extends new section based indicators" }, + { + "assignedTo": { + "name": "Hadi Khazaee Asl" + }, + "category": "XTrade", + "creation_time": "2024-05-30T22:23:48.918Z", + "id": "68", + "references": [], + "title": "fix cc and ct indicator issues ..." + }, { "assignedTo": { "name": "Hadi Khazaee Asl" @@ -742,6 +674,20 @@ "references": [], "title": "IMP Works TODO:" }, + { + "assignedTo": { + "name": "Hadi Khazaee Asl" + }, + "category": "X121 Provider", + "creation_time": "2024-05-30T21:40:26.010Z", + "description": { + "content": "- [x] implement a Signaller Struct to Describe a Signaller state;\n- [x] use it in X121ProviderDescriptor;\n- [x] inside X121Provider use this Struct to Handle Signaller's State;", + "mime": "text/markdown" + }, + "id": "63", + "references": [], + "title": "Implement a Signaller Struct" + }, { "assignedTo": { "name": "Hadi Khazaee Asl" @@ -765,6 +711,20 @@ "references": [], "title": "increase min balance for trading based on account balance ..." }, + { + "assignedTo": { + "name": "Hadi Khazaee Asl" + }, + "category": "XMQL", + "creation_time": "2024-05-30T22:34:15.388Z", + "description": { + "content": "- [x] in this way all class can Has his own Alerts ...\n- [] preare Alert Prefix for Each Separated Once ...", + "mime": "text/markdown" + }, + "id": "69", + "references": [], + "title": "make provider and ea classes to instance XSCBaseAlert class" + }, { "assignedTo": { "name": "Hadi Khazaee Asl" @@ -775,6 +735,20 @@ "references": [], "title": "make settings input related to Indicators and Oscillators hidden or private" }, + { + "assignedTo": { + "name": "Hadi Khazaee Asl" + }, + "category": "X121 Provider", + "creation_time": "2024-05-30T21:41:50.930Z", + "description": { + "content": "Each Market must have their own Pivot Points;\n\n- [x] Remove Current Support and Resistance;\n- [x] add Support and Resistance and also Score Generating in each Market;\n- [x] create a General Common Function to Access Support and Resistances;", + "mime": "text/markdown" + }, + "id": "64", + "references": [], + "title": "Move Support and Resistance Pivots Finders inside X121Market Class" + }, { "assignedTo": { "name": "Hadi Khazaee Asl" @@ -788,6 +762,16 @@ "references": [], "title": "R&D about Exists Examples" }, + { + "assignedTo": { + "name": "Hadi Khazaee Asl" + }, + "category": "XMQL", + "creation_time": "2024-06-01T00:58:06.730Z", + "id": "73", + "references": [], + "title": "R&D about indicator Class implementation ..." + }, { "assignedTo": { "name": "Hadi Khazaee Asl" @@ -960,6 +944,20 @@ "content": "do a refactor on all brokers, higgh priority criterias ...", "mime": "text/markdown" } + }, + { + "assignedTo": { + "name": "Hadi Khazaee Asl" + }, + "category": "XMQL", + "creation_time": "2024-06-01T00:57:10.458Z", + "description": { + "content": "do r&d about Volume Profiling and Implement it inside X121 Market Cycle;", + "mime": "text/markdown" + }, + "id": "72", + "references": [], + "title": "R&D about Volume Profiling" } ] } \ No newline at end of file diff --git a/Classes/x-saherelm.x121.setup.class.mq5 b/Classes/x-saherelm.x121.setup.class.mq5 index 1504a52b..52494d36 100644 --- a/Classes/x-saherelm.x121.setup.class.mq5 +++ b/Classes/x-saherelm.x121.setup.class.mq5 @@ -1879,7 +1879,9 @@ struct X121SignalGenerator bool _allowShort, // Allow Short Signals double _volume = 0.01, // Volume double _slPoint = 0, // SL Point - double _tpPoint = 30 // TP Point + bool _ignoreSL = false, // Ignore Calculated SL + double _tpPoint = 30, // TP Point + bool _ignoreTP = false // Ignore Calculated TP ) { // @@ -1970,8 +1972,12 @@ struct X121SignalGenerator X_ORDER_MODE_MARKET, mEntry, _volume, - 0, // mSL, - mTP // + _ignoreSL + ? 0 + : mSL, + _ignoreTP + ? 0 + : mTP // ); if (!result) { diff --git a/Classes/x-saherelm.x121.setup.xea.mq5 b/Classes/x-saherelm.x121.setup.xea.mq5 index 6433a9ab..5d79a9ef 100644 --- a/Classes/x-saherelm.x121.setup.xea.mq5 +++ b/Classes/x-saherelm.x121.setup.xea.mq5 @@ -636,6 +636,49 @@ public: mSLPoint = value; } + // + bool IgnoreTP() + { + return mIgnoreTP; + } + + // + void IgnoreTP(bool value) + { + mIgnoreTP = value; + } + + // + bool IgnoreSL() + { + return mIgnoreSL; + } + + // + void IgnoreSL(bool value) + { + mIgnoreSL = value; + } + + // + int ReuiredSignalVerifications() + { + return mReuiredSignalVerifications; + } + + // + void ReuiredSignalVerifications(int value) + { + // + if (value < 1) + { + value = 1; + } + + // + mReuiredSignalVerifications = value; + } + // bool IsEnable() { @@ -744,13 +787,33 @@ public: for (int i = 0; i < count; i++) { // - // Cleanup Signals ... + cPusher = 0; + sPusher = 0; + mPusher = 0; + lPusher = 0; + hPusher = 0; + + // + cProvider = NULL; + sProvider = NULL; + mProvider = NULL; + lProvider = NULL; + hProvider = NULL; + + // cSignal.Clean(); sSignal.Clean(); mSignal.Clean(); lSignal.Clean(); hSignal.Clean(); + // + cConditions.Clean(); + sConditions.Clean(); + mConditions.Clean(); + lConditions.Clean(); + hConditions.Clean(); + // // Current ... bool canProcess = mSetups[i] @@ -799,7 +862,9 @@ public: mAllowShort, mVolume, mSLPoint, - mTPPoint // + mIgnoreSL, + mTPPoint, + mIgnoreTP // ); // @@ -856,7 +921,9 @@ public: mAllowShort, mVolume, mSLPoint, - mTPPoint // + mIgnoreSL, + mTPPoint, + mIgnoreTP // ); // @@ -913,7 +980,9 @@ public: mAllowShort, mVolume, mSLPoint, - mTPPoint // + mIgnoreSL, + mTPPoint, + mIgnoreTP // ); // @@ -970,7 +1039,9 @@ public: mAllowShort, mVolume, mSLPoint, - mTPPoint // + mIgnoreSL, + mTPPoint, + mIgnoreTP // ); // @@ -1027,7 +1098,9 @@ public: mAllowShort, mVolume, mSLPoint, - mTPPoint // + mIgnoreSL, + mTPPoint, + mIgnoreTP // ); // @@ -1039,111 +1112,109 @@ public: ); } } - } - - // - // Parse Signals and Add them for Executing ... - // Here we can Save Signal and it's Conditions to - // Specified Collector then Update them on SL and TP ... - - // - // Current Signals ... - if (cPusher > 0 && cSignal.IsValid()) - { - // - AddRef( - cSignal, - signals // - ); // - AddNewSignal( - cPusher, - cSignal, - mBullishScore, - mBearishScore, - cConditions // - ); - } - - // - // Short Signals ... - if (sPusher > 0 && sSignal.IsValid()) - { - // - AddRef( - sSignal, - signals // - ); + // Parse Signals and Add them for Executing ... // - AddNewSignal( - sPusher, - sSignal, - mBullishScore, - mBearishScore, - sConditions // - ); - } + // Current Signals ... + if (cPusher > mReuiredSignalVerifications && cSignal.IsValid()) + { + // + AddRef( + cSignal, + signals // + ); - // - // Medium Signals ... - if (mPusher > 0 && mSignal.IsValid()) - { - // - AddRef( - mSignal, - signals // - ); + // + AddNewSignal( + cPusher, + cSignal, + mBullishScore, + mBearishScore, + cConditions // + ); + } // - AddNewSignal( - mPusher, - mSignal, - mBullishScore, - mBearishScore, - mConditions // - ); - } + // Short Signals ... + if (sPusher > mReuiredSignalVerifications && sSignal.IsValid()) + { + // + AddRef( + sSignal, + signals // + ); - // - // Long Signals ... - if (lPusher > 0 && lSignal.IsValid()) - { - // - AddRef( - lSignal, - signals // - ); + // + AddNewSignal( + sPusher, + sSignal, + mBullishScore, + mBearishScore, + sConditions // + ); + } // - AddNewSignal( - lPusher, - lSignal, - mBullishScore, - mBearishScore, - lConditions // - ); - } + // Medium Signals ... + if (mPusher > mReuiredSignalVerifications && mSignal.IsValid()) + { + // + AddRef( + mSignal, + signals // + ); - // - // Hind Signals ... - if (hPusher > 0 && hSignal.IsValid()) - { - // - AddRef( - hSignal, - signals // - ); + // + AddNewSignal( + mPusher, + mSignal, + mBullishScore, + mBearishScore, + mConditions // + ); + } // - AddNewSignal( - hPusher, - hSignal, - mBullishScore, - mBearishScore, - hConditions // - ); + // Long Signals ... + if (lPusher > mReuiredSignalVerifications && lSignal.IsValid()) + { + // + AddRef( + lSignal, + signals // + ); + + // + AddNewSignal( + lPusher, + lSignal, + mBullishScore, + mBearishScore, + lConditions // + ); + } + + // + // Hind Signals ... + if (hPusher > mReuiredSignalVerifications && hSignal.IsValid()) + { + // + AddRef( + hSignal, + signals // + ); + + // + AddNewSignal( + hPusher, + hSignal, + mBullishScore, + mBearishScore, + hConditions // + ); + } } // @@ -1230,24 +1301,49 @@ public: // const bool result = false; - // - // Here we Implement Account Protector ... - HandleAccountProtect(); - // // Do all State Management here ... + // // + // // Check State Interval ... + // static datetime lastStateManaged = NULL; + + // // + // datetime cTime = TimeCurrent(); + // int interval = PeriodSeconds(PERIOD_M3); + + // // + // bool canManageState = + // // + // !IsValid(lastStateManaged) + // ? true + // : (int)cTime >= (int)lastStateManaged + interval; + // // + // ; + // if (!canManageState) + // { + // return result; + // } + + // // + // lastStateManaged = cTime; + + // // + // // Retrieve Account Profit ... + // double profit = mTrader.Profit(); + + // // + // // Check EQM Orders and Handle Hedging ... + // DoEQMHedge(); + // // if Returns true, Signal Execution failed ... return result; } - // - // Tools For Signal Info Collect ... - // // Used for Signal Info States ... - void OnDealsChangedHandler(int count) + void OnDealsChangedHandler(int count) override { // XDeal deal; @@ -1260,18 +1356,24 @@ public: } } + // + void OnGoingToProfit(XProfitTrack &track) override + { + // RemoveEQMOrders(); + } + + // + void OnGoingToDrawdown(XProfitTrack &track) override + { + // PlaceEQMOrders(); + } + // // Protected ... protected: // // Tools ... - // - // Do All Protection Senarios here ... - void HandleAccountProtect() - { - } - // // Private ... private: @@ -1279,11 +1381,14 @@ private: // Props ... // - bool mAllowLong; // Allow Long - bool mAllowShort; // Allow Short - double mVolume; // Volume - double mTPPoint; // TP Point - double mSLPoint; // SL Point + bool mAllowLong; // Allow Long + bool mAllowShort; // Allow Short + double mVolume; // Volume + double mTPPoint; // TP Point + double mSLPoint; // SL Point + bool mIgnoreTP; // Ignore Calculated TP + bool mIgnoreSL; // Ignore Calculated SL + int mReuiredSignalVerifications; // Required Verifications for Validate Signals // XSignalInfo mSignalInfos[]; @@ -1545,6 +1650,242 @@ private: // return result; } + + // + // EQM Functions ... + + // + // Check and Hedge ... + void DoEQMHedge() {} + + // + // Remove Untriggered EQM Orders ... + void RemoveEQMOrders() + { + // + RemoveDraws("XTRND"); + + // + XOrder supports[]; + int supportsCount = mTrader.GetOrders( + supports, + NULL, // All Symbols ... + XEQMSupportToken, // Only EQM Supports ... + NULL, // All Periods ... + X_POSITION_TYPE_ALL, // All Order Types ... + ORDER_STATE_PLACED, // Untriggered Orders ... + true // Filter by Magic ... + ); + if (!IsValidSize(supportsCount)) + { + return; + } + + // + int cancelled = mTrader.CancelOrders( + supports // + ); + + // + if (IsValidSize(cancelled)) + { + // + string message = XEQMSupportToken + " Cancel " + ToString(cancelled) + " Supports ..."; + + // + Alert(message); + } + } + + // + // Place EQM Orders ... + void PlaceEQMOrders() + { + // + int count = CountSetups(); + if (!IsValidSize(count)) + { + return; + } + + // + XSignal supports[]; + + // + for (int i = 0; i < count; i++) + { + // + string iSymbol = mSetups[i].GetSymbol(); + ENUM_TIMEFRAMES iPeriod = NULL; // All Periods ... + string iProvider = NULL; // All Providers ... + + // + XPosition iPositions[]; + int iPositionsCount = mTrader.GetPositions( + iPositions, + iSymbol, + iProvider, + iPeriod, + X_POSITION_TYPE_ALL // + ); + if (!IsValidSize(iPositionsCount)) + { + continue; + } + + // + int maxInDIDX = FindMaxDrawdownIndex( + iPositions // + ); + if (!IsValidIndex(maxInDIDX)) + { + continue; + } + + // + XPosition maxInDP = iPositions[maxInDIDX]; + bool isLong = IsLong(maxInDP.type); + + // + XOHCL iZBar; + bool isInited = iZBar.Init( + iSymbol, + iPeriod, + 0 // + ); + if (!isInited) + { + continue; + } + + // + double iSupport = 0; + double iResistance = 0; + bool isDrawn = DrawTrendState( + ChartID(), + "XTRND", + iZBar, + iSupport, + iResistance // + ); + if (isDrawn) + { + // + XSignal iSignal; + + // + double iSL = 0; + double iTP = 0; + double iEntry = 0; + ENUM_POSITION_TYPE iType; + ENUM_X_ORDER_MODES iMode; + double iVolume = maxInDP.volume * 3; + + // + if (iSupport > 0 && isLong && iSupport > maxInDP.sl && maxInDP.sl > 0) + { + // + // Add Short Support for Long ... + iEntry = iSupport; + iSL = maxInDP.tp; + iTP = maxInDP.sl; + iMode = X_ORDER_MODE_STOP; + iType = POSITION_TYPE_SELL; + + // + bool isPrepared = iSignal.Prepare( + iSymbol, + XEQMSupportToken, + iPeriod, + iType, + iMode, + iEntry, + iVolume, + iSL, + iTP // + ); + if (isPrepared) + { + // + iSignal.comment = GenerateSupportTag(maxInDP.ticket); + + // + AddRef( + iSignal, + supports /// + ); + + // + iSignal.Clean(); + } + } + + // + if (iResistance > 0 && !isLong && iResistance < maxInDP.sl && maxInDP.sl > 0) + { + // + // Add Long Support for Short ... + iEntry = iResistance; + iSL = maxInDP.tp; + iTP = maxInDP.sl; + iMode = X_ORDER_MODE_STOP; + iType = POSITION_TYPE_BUY; + + // + bool isPrepared = iSignal.Prepare( + iSymbol, + XEQMSupportToken, + iPeriod, + iType, + iMode, + iEntry, + iVolume, + iSL, + iTP // + ); + if (isPrepared) + { + // + iSignal.comment = GenerateSupportTag(maxInDP.ticket); + + // + AddRef( + iSignal, + supports /// + ); + + // + iSignal.Clean(); + } + } + } + } + + // + int supportsCount = ArraySize(supports); + if (!IsValidSize(supportsCount)) + { + return; + } + + // + ENUM_X_SIGNAL_EXECUTION_RESULT states[]; + int executeds = mTrader.ExecuteSignals( + supports, + states, + ORDER_TIME_GTC, + false, + false // Ignore Policies + ); + if (IsValidSize(executeds)) + { + // + string message = XEQMSupportToken + " Execute " + ToString(executeds) + " Supports ..."; + + // + Alert(message); + } + } }; // diff --git a/Classes/x-saherelm.xea.class.mq5 b/Classes/x-saherelm.xea.class.mq5 index 6feb0c5a..c1227520 100644 --- a/Classes/x-saherelm.xea.class.mq5 +++ b/Classes/x-saherelm.xea.class.mq5 @@ -3009,7 +3009,7 @@ protected: symbol, provider, period, - ToOrderType(type), + type, ORDER_STATE_PLACED, true // Filter by Magic ... // diff --git a/Classes/x-saherelm.xtrade.class.mq5 b/Classes/x-saherelm.xtrade.class.mq5 index 372532bc..cf701772 100644 --- a/Classes/x-saherelm.xtrade.class.mq5 +++ b/Classes/x-saherelm.xtrade.class.mq5 @@ -2523,14 +2523,14 @@ public: // // Retrieve All Orders ... int GetOrders( - XOrder &result[], // Hold's Result - string symbol = NULL, // Trading Symbol - string provider = NULL, // Signal Provider - ENUM_TIMEFRAMES period = NULL, // Trading Period - ENUM_ORDER_TYPE type = NULL, // Long (Buy) or Short (Sell) - ENUM_ORDER_STATE state = NULL, // Order State - bool filterByMagic = true, // Get Only Self Open Positions - bool forceClean = true // Clean Result Array + XOrder &result[], // Hold's Result + string symbol = NULL, // Trading Symbol + string provider = NULL, // Signal Provider + ENUM_TIMEFRAMES period = NULL, // Trading Period + ENUM_X_POSITION_TYPE type = NULL, // Long (Buy) or Short (Sell) + ENUM_ORDER_STATE state = NULL, // Order State + bool filterByMagic = true, // Get Only Self Open Positions + bool forceClean = true // Clean Result Array ) { // @@ -2605,16 +2605,16 @@ public: // // Retrieve Historical Orders ... int GetOrders( - XOrder &result[], // Hold's Result - string symbol = NULL, // Trading Symbol - string provider = NULL, // Signal Provider - ENUM_TIMEFRAMES period = NULL, // Trading Period - ENUM_ORDER_TYPE type = NULL, // Long (Buy) or Short (Sell) - ENUM_ORDER_STATE state = NULL, // Order State - datetime startDate = NULL, // Specify Start Date - datetime endDate = NULL, // Specify End Date - bool filterByMagic = true, // Get Only Self Open Positions - bool forceClean = true // Clean Result Array + XOrder &result[], // Hold's Result + string symbol = NULL, // Trading Symbol + string provider = NULL, // Signal Provider + ENUM_TIMEFRAMES period = NULL, // Trading Period + ENUM_X_POSITION_TYPE type = NULL, // Long (Buy) or Short (Sell) + ENUM_ORDER_STATE state = NULL, // Order State + datetime startDate = NULL, // Specify Start Date + datetime endDate = NULL, // Specify End Date + bool filterByMagic = true, // Get Only Self Open Positions + bool forceClean = true // Clean Result Array ) { // diff --git a/Documents/Templates/merge.signalfiles.script.txt b/Documents/Templates/merge.signalfiles.script.txt new file mode 100644 index 00000000..6db002cd --- /dev/null +++ b/Documents/Templates/merge.signalfiles.script.txt @@ -0,0 +1 @@ +type *.x121.log > Signals.x121.log \ No newline at end of file diff --git a/Experts/x-test-xxx.mq5 b/Experts/x-saherelm.x121.ea.mq5 similarity index 58% rename from Experts/x-test-xxx.mq5 rename to Experts/x-saherelm.x121.ea.mq5 index 147698d9..cefdebbc 100644 --- a/Experts/x-test-xxx.mq5 +++ b/Experts/x-saherelm.x121.ea.mq5 @@ -1,8 +1,8 @@ /////////////////////////////////////////////////////// // -// SaherElm IT Center XTESTXXX MQL5 Expert Advisor +// SaherElm IT Center X121EA MQL5 Expert Advisor // ------------------------------------------------- -// Name: XTESTXXX +// Name: X121EA // Description: an Exper Advisor which used RSI and MA // to Analyse Market ... // @@ -16,7 +16,7 @@ #property copyright "Copyright 2023, SaherElm IT Center" #property link "https://saherelm.ir" #property version "1.00" -#property description "SaherElm XTESTXXX" +#property description "SaherElm X121EA" #property strict // @@ -24,23 +24,41 @@ #include "../Classes/x-saherelm.x121.setup.xea.mq5" // -#define ShortName "XTESTXXX" +#define ShortName "X121EA" // // Inputs ... // -long eaMagicNumber = 78692110; // Magic Number -int eaSlippage = 10; // Slippgae +// Common ... +long x121EAMagicNumber = 78692110; // Magic Number +int x121EASlippage = 10; // Slippgae // -string eaSymbols = "EURUSDb"; // Symbols +// Trading Symbols ... +string x121EASymbols = "EURUSDb,GBPUSDb,XAUUSDb,USDCHFb"; // Symbols // -bool eaAllowLong = true; // Allow Long Trades -bool eaAllowShort = true; // Allow Short Trades -double eaVolume = 0.05; // Static Volume -int eaReuiredVerifications = 1; // Required Verifications for Signals +// Signals ... +bool x121EAAllowLong = true; // Allow Long Trades +bool x121EAAllowShort = true; // Allow Short Trades +int x121EAReuiredSignalVerifications = 2; // Required Verifications for Signals + +// +// Risk Management ... +double x121EAVolume = 0.01; // Static Volume +double x121EATPPoint = 30; // TP Point +double x121EASLPoint = 300; // SL Point +bool x121EAIgnoreSL = true; // Ignore Calculated SL +bool x121EAIgnoreTP = false; // Ignore Calculated TP + +// +// Alert ... +bool x121EAEnableAlerts = true; // Enable Alerts +bool x121EALogAlerts = true; // Log Alerts +bool x121EAMailAlerts = false; // Mail Alerts +bool x121EAPushAlerts = false; // Push Alerts +bool x121EATerminalAlerts = false; // Terminal Alerts // // Definitions ... @@ -49,7 +67,7 @@ int eaReuiredVerifications = 1; // Required Verifications for Signals // Local Variables ... // -XSCX121SetupEA *mEA; +XSCX121SetupEA *x121EA; // // Event Handlers ... @@ -90,14 +108,14 @@ void OnDeinit(const int reason) // // De Initialize XSampleEA Providers ... - delete mEA; + delete x121EA; } // // On Tick Handler ... void OnTick() { - mEA.OnTick(); + x121EA.OnTick(); } // @@ -113,7 +131,7 @@ bool InitialEA() TesterHideIndicators(true); // - result = IsValid(eaSymbols); + result = IsValid(x121EASymbols); if (!result) { return result; @@ -123,7 +141,7 @@ bool InitialEA() string symbols[]; int symbolsCount = SplitContent( symbols, - eaSymbols // + x121EASymbols // ); result = symbolsCount > 0; if (!result) @@ -132,21 +150,30 @@ bool InitialEA() } // - mEA = new XSCX121SetupEA( - eaSlippage, - eaMagicNumber // + x121EA = new XSCX121SetupEA( + x121EASlippage, + x121EAMagicNumber // ); // - // Allow Signals ... - mEA.AllowLong(true); - mEA.AllowShort(true); - mEA.Volume(0.01); - mEA.TPPoint(30); - mEA.SLPoint(0); + // Configure EA ... + x121EA.Volume(x121EAVolume); + x121EA.TPPoint(x121EATPPoint); + x121EA.SLPoint(x121EASLPoint); + x121EA.IgnoreSL(x121EAIgnoreSL); + x121EA.IgnoreTP(x121EAIgnoreTP); + x121EA.AllowLong(x121EAAllowLong); + x121EA.AllowShort(x121EAAllowShort); + x121EA.ReuiredSignalVerifications(x121EAReuiredSignalVerifications); // - mEA.SetAlertPrefix(ShortName); + // Configure Alert ... + x121EA.SetAlertPrefix(ShortName); + x121EA.SetAlertEnableAlerts(x121EAEnableAlerts); + x121EA.SetAlertLogAlerts(x121EALogAlerts); + x121EA.SetAlertMailAlerts(x121EAMailAlerts); + x121EA.SetAlertPushAlerts(x121EAPushAlerts); + x121EA.SetAlertTerminalAlerts(x121EATerminalAlerts); // X121SetupInputs setupInputsDefault; @@ -175,7 +202,7 @@ bool InitialEA() } // - result = mEA.AddSetup(iSetupCycle); + result = x121EA.AddSetup(iSetupCycle); if (!result) { break; diff --git a/Libraries/x-saherelm.common.lib.mq5 b/Libraries/x-saherelm.common.lib.mq5 index c2fe620f..4e2b8559 100644 --- a/Libraries/x-saherelm.common.lib.mq5 +++ b/Libraries/x-saherelm.common.lib.mq5 @@ -45,6 +45,127 @@ enum ENUM_X_SWING_TYPE X_SWING_LOW = -1, }; +// +ENUM_SERIESMODE ToSeriesMode(ENUM_X_SWING_TYPE value) +{ + // + ENUM_SERIESMODE result = MODE_HIGH; + + // + switch (value) + { + // + case X_SWING_HIGH: + result = MODE_HIGH; + break; + + // + case X_SWING_LOW: + result = MODE_LOW; + break; + } + + // + return result; +} + +// +// Find Swing Points ... +int FindSwing( + string mSymbol, // Trading Symbol ... + ENUM_TIMEFRAMES mPeriod, // Trading Period ... + ENUM_X_SWING_TYPE mode, // Swing Based On Price mode ... + int mLength, // Loopback ... + int bar_index // BarIndex ... +) +{ + // + int result = -1; + + // + if (StringLen(mSymbol) == 0 || (mode != X_SWING_HIGH && mode != X_SWING_LOW)) + { + return result; + } + + // + int current = bar_index; + int founded = FindNextSwing( + mSymbol, + mPeriod, + mode, + (mLength * 2) + 1, + current - mLength); + + // + while (founded != current) + { + // + current = FindNextSwing( + mSymbol, + mPeriod, + mode, + mLength, + current + 1); + + // + founded = FindNextSwing( + mSymbol, + mPeriod, + mode, + (mLength * 2) + 1, + current - mLength); + } + + // + result = current; + + // + return result; +} + +// +// Find Next Swing ... +int FindNextSwing( + string mSymbol, // Trading Symbol ... + ENUM_TIMEFRAMES mPeriod, // Trading Period ... + ENUM_X_SWING_TYPE mode, // Swing Based On Price mode ... + int mLength, // Loopback ... + int bar_index // BarIndex ... +) +{ + // + int result = -1; + + // + if (bar_index < 0) + { + mLength += bar_index; + bar_index = 0; + } + + // + ENUM_SERIESMODE mSeriesMode = ToSeriesMode(mode); + + // + result = mode == X_SWING_HIGH + ? iHighest( + mSymbol, + mPeriod, + mSeriesMode, + mLength, + bar_index) + : iLowest( + mSymbol, + mPeriod, + mSeriesMode, + mLength, + bar_index); + + // + return result; +} + // // XPERIOD Calculation Method ... enum ENUM_X_PERIOD_METHOD @@ -1399,108 +1520,6 @@ struct XOHCL return result; } - // - // Find Swings (Highs nd Lows) ... - int FindSwing( - ENUM_X_SWING_TYPE swing, // Swing Based On Price mode ... - int mLength // Loopback ... - ) - { - // - int result = -1; - - // - if (!IsValid() || - !IsValid(swing)) - { - return result; - } - - // - int current = Index(); - int founded = FindNextSwing( - swing, - (mLength * 2) + 1, - current - mLength - // - ); - - // - while (founded != current) - { - // - current = FindNextSwing( - swing, - mLength, - current + 1 - // - ); - - // - founded = FindNextSwing( - swing, - (mLength * 2) + 1, - current - mLength - // - ); - } - - // - result = current; - - // - return result; - } - - // - // Find Next Swing ... - int FindNextSwing( - ENUM_X_SWING_TYPE swing, // Swing Based On Price mode ... - int from, // from Bar Index - int mLength // Loopback ... - ) - { - // - int result = -1; - - // - if (!IsValid() || - !IsValid(swing)) - { - return result; - } - - // - if (from < 0) - { - mLength += from; - from = 0; - } - - // - ENUM_SERIESMODE mMode = swing == X_SWING_HIGH - ? MODE_HIGH - : MODE_LOW; - - // - result = swing == X_SWING_HIGH - ? iHighest( - symbol, - period, - mMode, - mLength, - from) - : iLowest( - symbol, - period, - mMode, - mLength, - from); - - // - return result; - } - // // Find Lowest Bar Index ... int FindHighestIndex( diff --git a/Libraries/x-saherelm.xtrade.lib.mq5 b/Libraries/x-saherelm.xtrade.lib.mq5 index c3b89412..9f645f74 100644 --- a/Libraries/x-saherelm.xtrade.lib.mq5 +++ b/Libraries/x-saherelm.xtrade.lib.mq5 @@ -1840,13 +1840,13 @@ struct XOrder // // 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_ORDER_TYPE mType = NULL, // Long (Buy), Short (Sell) - ENUM_ORDER_STATE mState = NULL, // Order State - ulong mMagic = NULL, // Magic Number - bool mFilterByMagic = true // Get Only Self Open Positions + string mSymbol = NULL, // Trading Symbol + string mProvider = NULL, // Signal Provider + ENUM_TIMEFRAMES mPeriod = NULL, // Trading Timeframe + ENUM_X_POSITION_TYPE mType = NULL, // Long (Buy), Short (Sell) + ENUM_ORDER_STATE mState = NULL, // Order State + ulong mMagic = NULL, // Magic Number + bool mFilterByMagic = true // Get Only Self Open Positions ) { // @@ -3374,8 +3374,8 @@ bool IsTypeFilterPassed( // bool result = type == NULL || type == X_POSITION_TYPE_ALL ? true - : ((type == X_POSITION_TYPE_LONG && item.type == POSITION_TYPE_BUY) || - (type == X_POSITION_TYPE_SHORT && item.type == POSITION_TYPE_SELL)); + : ((type == X_POSITION_TYPE_LONG && ((int)item.type == (int)POSITION_TYPE_BUY || (int)item.type == (int)ORDER_TYPE_BUY)) || + (type == X_POSITION_TYPE_SHORT && ((int)item.type == (int)POSITION_TYPE_SELL || (int)item.type == (int)ORDER_TYPE_SELL))); // return result; @@ -4319,4 +4319,225 @@ void CountPositions( shortVolumes = iPosition.volume; } } -} \ No newline at end of file +} + +// +// Custom Drawings ... +bool DrawTrendState( + long chartId, + string _prefix, + XOHCL &_bar, + double &support, + double &resistance, + int shoulders = 10, + int subWindow = 0, + color resistanceColor = clrRed, + color supportColor = clrGreen, + color swingHighColor = clrAqua, + color swingLowColor = clrMagenta // +) +{ + // + bool result = false; + + // + result = + // + IsValid(_prefix) && + _bar.IsValid() + // + ; + if (!result) + { + return result; + } + + // + // Find Low Swings ... + + // + int firstSwingLowIndex = FindSwing( + _bar.symbol, + _bar.period, + X_SWING_LOW, + shoulders, + _bar.Index() + 1 // + ); + XOHCL firstSwingLowBar; + result = firstSwingLowBar.Init( + _bar.symbol, + _bar.period, + firstSwingLowIndex // + ); + if (!result) + { + return result; + } + + // + int secondSwingLowIndex = FindSwing( + _bar.symbol, + _bar.period, + X_SWING_LOW, + shoulders, + firstSwingLowIndex + 1 // + ); + XOHCL secondSwingLowBar; + result = secondSwingLowBar.Init( + _bar.symbol, + _bar.period, + secondSwingLowIndex // + ); + if (!result) + { + return result; + } + + // + support = secondSwingLowBar.low; + + // + string lowSwingTrendLineName = _prefix + "_Low_Swing_Trend"; + + // + result = DrawTrendLine( + chartId, + lowSwingTrendLineName, + subWindow, + secondSwingLowBar.time, + secondSwingLowBar.low, + firstSwingLowBar.time, + firstSwingLowBar.low, + swingLowColor, + STYLE_SOLID, + 2, + false, + false, + true // Ray Right ... + ); + if (!result) + { + return result; + } + + // + string lowSwingSupportLineName = _prefix + "_Low_Swing_Support"; + + // + result = DrawTrendLine( + chartId, + lowSwingSupportLineName, + subWindow, + secondSwingLowBar.time, + secondSwingLowBar.low, + firstSwingLowBar.time, + secondSwingLowBar.low, + supportColor, + STYLE_SOLID, + 2, + false, + false, + true // Ray Right ... + ); + if (!result) + { + return result; + } + + // + // Find High Swings ... + + // + int firstSwingHighIndex = FindSwing( + _bar.symbol, + _bar.period, + X_SWING_HIGH, + shoulders, + _bar.Index() + 1 // + ); + XOHCL firstSwingHighBar; + result = firstSwingHighBar.Init( + _bar.symbol, + _bar.period, + firstSwingHighIndex // + ); + if (!result) + { + return result; + } + + // + int secondSwingHighIndex = FindSwing( + _bar.symbol, + _bar.period, + X_SWING_HIGH, + shoulders, + firstSwingHighIndex + 1 // + ); + XOHCL secondSwingHighBar; + result = secondSwingHighBar.Init( + _bar.symbol, + _bar.period, + secondSwingHighIndex // + ); + if (!result) + { + return result; + } + + // + resistance = secondSwingHighBar.high; + + // + string highSwingTrendLineName = _prefix + "_High_Swing_Trend"; + + // + result = DrawTrendLine( + chartId, + highSwingTrendLineName, + subWindow, + secondSwingHighBar.time, + secondSwingHighBar.high, + firstSwingHighBar.time, + firstSwingHighBar.high, + swingHighColor, + STYLE_SOLID, + 2, + false, + false, + true // Ray Right ... + ); + if (!result) + { + return result; + } + + // + string highSwingResistanceLineName = _prefix + "_High_Swing_Resistance"; + + // + result = DrawTrendLine( + chartId, + highSwingResistanceLineName, + subWindow, + secondSwingHighBar.time, + secondSwingHighBar.high, + firstSwingHighBar.time, + secondSwingHighBar.high, + resistanceColor, + STYLE_SOLID, + 2, + false, + false, + true // Ray Right ... + ); + if (!result) + { + return result; + } + + // + return result; +} + +// \ No newline at end of file diff --git a/Signallers/x-saherelm.x110.signaller.class.mq5 b/Signallers/x-saherelm.x110.signaller.class.mq5 deleted file mode 100644 index f3b9566a..00000000 --- a/Signallers/x-saherelm.x110.signaller.class.mq5 +++ /dev/null @@ -1,358 +0,0 @@ -/////////////////////////////////////////////////////// -// -// SaherElm IT Center MQL5 Class Library -// ---------------------------------------------- -// Name: X110Signaller -// Description: Signalling using X121 rules ... -// -// -// 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 "../Libraries/x-saherelm.xtrade.lib.mq5" -#include "../Classes/x-saherelm.x121.xmcycle.class.mq5" - -// -// Definitions ... - -// -// Class ... -class X110Signaller : public XSignallerDescriptor -{ - // - // Public ... -public: - // - // Props ... - - // - // Constructor(s) ... - void X110Signaller() - { - name = X110; - Default(); - } - - // - // Deconstructor ... - void ~X110Signaller() {} - - // - // Override(s) ... - - // - bool HasLongConditions( - X121MCycleConditions &conditions, // Market Conditions - double &sl, // Hold SL ... - double &tp // Hold TP ... - ) override - { - // - bool result = false; - - // - sl = 0; - tp = 0; - - // - result = allowLong; - if (!result) - { - return result; - } - - // - double bullishScore = 0; - double bearishScore = 0; - conditions.GenerateScore( - bullishScore, - bearishScore // - ); - - // - bool isCloseOverSenkouSpanA = conditions.bars[1].close > conditions.ichSenkouSpanAs[1]; - - // - bool isBaseBullish = isCloseOverSenkouSpanA && - conditions.isSenkouSpanAOverB && - conditions.isSenkouSpanAOverLast; - - // - bool isKijunSenOverSenkouSpanA = conditions.ichKijunSens[1] > conditions.ichSenkouSpanAs[1]; - - // - bool isCloseOverTenkanSen = conditions.bars[1].close > conditions.ichTenkanSens[1]; - - // - bool isPriceCloseCrossedUpTenkanSen = conditions.bars[2].close <= conditions.ichTenkanSens[2] && - conditions.bars[1].close > conditions.ichTenkanSens[1]; - - // - double cKumoUpper = MathMax(conditions.ichSenkouSpanAs[1], conditions.ichSenkouSpanBs[1]); - double pKumoUpper = MathMax(conditions.ichSenkouSpanAs[2], conditions.ichSenkouSpanBs[2]); - - // - double cKumoLower = MathMin(conditions.ichSenkouSpanAs[1], conditions.ichSenkouSpanBs[1]); - double pKumoLower = MathMin(conditions.ichSenkouSpanAs[2], conditions.ichSenkouSpanBs[2]); - - // - bool isTenkanSenOverKumo = conditions.ichTenkanSens[1] > cKumoUpper; - bool isTenkanSenOverKumoPrev = conditions.ichTenkanSens[2] > pKumoUpper; - - // - bool isTenkanSenUnderKumo = conditions.ichTenkanSens[1] < cKumoLower; - bool isTenkanSenUnderKumoPrev = conditions.ichTenkanSens[2] < pKumoLower; - - // - bool isTenkanSenCrossedOverKumo = isTenkanSenOverKumo && - !isTenkanSenOverKumoPrev; - - // - bool isTenkanSenCrossedUnderKumo = isTenkanSenUnderKumo && - !isTenkanSenUnderKumoPrev; - - // - bool condition1 = - isBaseBullish && - isCloseOverTenkanSen && - isKijunSenOverSenkouSpanA && - conditions.isTenkanSenCrossedOverKijunSen; - - // - bool condition2 = - isBaseBullish && - isCloseOverTenkanSen && - isKijunSenOverSenkouSpanA && - conditions.isTenkanSenOverKijunSen && - conditions.isSenkouSpanACrossedOverB; - - // - bool condition3 = - isBaseBullish && - isKijunSenOverSenkouSpanA && - isPriceCloseCrossedUpTenkanSen && - conditions.isTenkanSenOverKijunSen; - - // - bool condition4 = - isCloseOverTenkanSen && - isTenkanSenCrossedOverKumo && - conditions.isTenkanSenOverKijunSen && - conditions.isFutureSenkouSpanAOverB && - conditions.isFutureSenkouSpanAOverLast; - - // - result = - // - condition1 - // - || - // - condition2 - // - || - // - condition3 - // - || - // - condition4 - // - ; - - // - bool isOSCVerified = - // - (conditions.oscCcis[0] > 0 && - conditions.oscCcis[1] > 0) - // - || - // - (conditions.oscMacdMains[0] > 0 && - conditions.oscMacdMains[1] > 0) - // - ; - - // - if (result) - { - result = - isOSCVerified && - bullishScore > bearishScore * 1.5; - } - - // - if (result) - { - sl = conditions.ichSenkouSpanBs[1]; - } - - // - return result; - } - - // - bool HasShortConditions( - X121MCycleConditions &conditions, // Market Conditions - double &sl, // Hold SL ... - double &tp // Hold TP ... - ) override - { - // - bool result = false; - - // - sl = 0; - tp = 0; - - // - result = allowLong; - if (!result) - { - return result; - } - - // - double bullishScore = 0; - double bearishScore = 0; - conditions.GenerateScore( - bullishScore, - bearishScore // - ); - - // - bool isCloseUnderSenkouSpanB = conditions.bars[1].close < conditions.ichSenkouSpanBs[1]; - - // - bool isBaseBearish = isCloseUnderSenkouSpanB && - conditions.isSenkouSpanAUnderB && - conditions.isSenkouSpanAUnderLast; - - // - bool isKijunSenUnderSenkouSpanB = conditions.ichKijunSens[1] < conditions.ichSenkouSpanBs[1]; - - // - bool isCloseUnderTenkanSen = conditions.bars[1].close < conditions.ichTenkanSens[1]; - - // - bool isPriceCloseCrossedDownTenkanSen = conditions.bars[2].close >= conditions.ichTenkanSens[2] && - conditions.bars[1].close < conditions.ichTenkanSens[1]; - - // - double cKumoUpper = MathMax(conditions.ichSenkouSpanAs[1], conditions.ichSenkouSpanBs[1]); - double pKumoUpper = MathMax(conditions.ichSenkouSpanAs[2], conditions.ichSenkouSpanBs[2]); - - // - double cKumoLower = MathMin(conditions.ichSenkouSpanAs[1], conditions.ichSenkouSpanBs[1]); - double pKumoLower = MathMin(conditions.ichSenkouSpanAs[2], conditions.ichSenkouSpanBs[2]); - - // - bool isTenkanSenOverKumo = conditions.ichTenkanSens[1] > cKumoUpper; - bool isTenkanSenOverKumoPrev = conditions.ichTenkanSens[2] > pKumoUpper; - - // - bool isTenkanSenUnderKumo = conditions.ichTenkanSens[1] < cKumoLower; - bool isTenkanSenUnderKumoPrev = conditions.ichTenkanSens[2] < pKumoLower; - - // - bool isTenkanSenCrossedOverKumo = isTenkanSenOverKumo && - !isTenkanSenOverKumoPrev; - - // - bool isTenkanSenCrossedUnderKumo = isTenkanSenUnderKumo && - !isTenkanSenUnderKumoPrev; - - // - bool condition1 = - isBaseBearish && - isCloseUnderTenkanSen && - isKijunSenUnderSenkouSpanB && - conditions.isTenkanSenCrossedUnderKijunSen; - - // - bool condition2 = - isBaseBearish && - isCloseUnderTenkanSen && - isKijunSenUnderSenkouSpanB && - conditions.isTenkanSenUnderKijunSen && - conditions.isSenkouSpanACrossedUnderB; - - // - bool condition3 = - isBaseBearish && - isKijunSenUnderSenkouSpanB && - isPriceCloseCrossedDownTenkanSen && - conditions.isTenkanSenUnderKijunSen; - - // - bool condition4 = - isCloseUnderTenkanSen && - isTenkanSenCrossedUnderKumo && - conditions.isTenkanSenUnderKijunSen && - conditions.isFutureSenkouSpanAUnderB && - conditions.isFutureSenkouSpanAUnderLast; - - // - result = - // - condition1 - - || - // - condition2 - // - || - // - condition3 - // - || - // - condition4 - // - ; - - // - bool isOSCVerified = - // - (conditions.oscCcis[0] < 0 && - conditions.oscCcis[1] < 0) - // - || - // - (conditions.oscMacdMains[0] < 0 && - conditions.oscMacdMains[1] < 0) - // - ; - - // - if (result) - { - result = - isOSCVerified && - bearishScore > bullishScore * 1.5; - } - - // - if (result) - { - sl = conditions.ichSenkouSpanAs[1]; - } - - // - return result; - } -}; - -// \ No newline at end of file diff --git a/Signallers/x-saherelm.x121.signaller.class.mq5 b/Signallers/x-saherelm.x121.signaller.class.mq5 deleted file mode 100644 index 23526d8a..00000000 --- a/Signallers/x-saherelm.x121.signaller.class.mq5 +++ /dev/null @@ -1,231 +0,0 @@ -/////////////////////////////////////////////////////// -// -// SaherElm IT Center MQL5 Class Library -// ---------------------------------------------- -// Name: X121Signaller -// Description: Signalling using X121 rules ... -// -// -// 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 "../Libraries/x-saherelm.xtrade.lib.mq5" -#include "../Classes/x-saherelm.x121.xmcycle.class.mq5" - -// -// Definitions ... - -// -// Class ... -class X121Signaller : public XSignallerDescriptor -{ - // - // Public ... -public: - // - // Props ... - - // - // Constructor(s) ... - void X121Signaller() - { - name = X121; - Default(); - } - - // - // Deconstructor ... - void ~X121Signaller() {} - - // - // Override(s) ... - - // - bool HasLongConditions( - X121MCycleConditions &conditions, // Market Conditions - double &sl, // Hold SL ... - double &tp // Hold TP ... - ) override - { - // - bool result = false; - - // - sl = 0; - tp = 0; - - // - result = allowLong; - if (!result) - { - return result; - } - - // - double bullishScore = 0; - double bearishScore = 0; - conditions.GenerateScore( - bullishScore, - bearishScore // - ); - - // - result = - // - (conditions.isMRBFastCrossedOverSlow && - (conditions.isCHEBullish && - conditions.isTrendBullish && - conditions.isMCFastOverSlow)) - // - || - // - (conditions.isMRBSlowCrossedtOverVerifier && - (conditions.isCHEBullish && - conditions.isTrendBullish && - conditions.isMCFastOverSlow && - conditions.isMRBFastOverSlow)) - // - || - // - (conditions.isCHESwitchedToBullish && - (conditions.isTrendBullish && - conditions.isMCFastOverSlow && - conditions.isMRBFastOverSlow)) - // - ; - - // - bool isOSCVerified = - // - (conditions.oscCcis[0] > 0 && - conditions.oscCcis[1] > 0) - // - || - // - (conditions.oscMacdMains[0] > 0 && - conditions.oscMacdMains[1] > 0) - // - ; - - // - if (result) - { - // - result = - isOSCVerified && - bullishScore > bearishScore * 1.5; - } - - // - if (result) - { - sl = conditions.mrbSlows[1]; - } - - // - return result; - } - - // - bool HasShortConditions( - X121MCycleConditions &conditions, // Market Conditions - double &sl, // Hold SL ... - double &tp // Hold TP ... - ) override - { - // - bool result = false; - - // - sl = 0; - tp = 0; - - // - result = allowShort; - if (!result) - { - return result; - } - - // - double bullishScore = 0; - double bearishScore = 0; - conditions.GenerateScore( - bullishScore, - bearishScore // - ); - - // - result = - // - (conditions.isSMHKSwitchedToBearish && - (conditions.isTDBearish && - conditions.isCHEBearish && - conditions.isTrendBearish)) - // - || - // - (conditions.isTDSwitchedToBearish && - (conditions.isSMHKBearish && - conditions.isCHEBearish && - conditions.isTrendBearish)) - // - || - // - (conditions.isCHESwitchedToBearish && - (conditions.isTDBearish && - conditions.isSMHKBearish && - conditions.isTrendBearish)) - // - || - // - (conditions.isTrendSwitchedToBearish && - (conditions.isTDBearish && - conditions.isCHEBearish && - conditions.isSMHKBearish)) - // - ; - - // - bool isOSCVerified = - // - (conditions.oscCcis[0] < 0 && - conditions.oscCcis[1] < 0) - // - || - // - (conditions.oscMacdMains[0] < 0 && - conditions.oscMacdMains[1] < 0) - // - ; - - // - if (result) - { - result = - isOSCVerified && - bearishScore > bullishScore * 1.5; - } - - // - if (result) - { - sl = conditions.mrbFasts[1]; - } - - // - return result; - } -}; \ No newline at end of file diff --git a/Signallers/x-saherelm.x128.signaller.class.mq5 b/Signallers/x-saherelm.x128.signaller.class.mq5 deleted file mode 100644 index 14027422..00000000 --- a/Signallers/x-saherelm.x128.signaller.class.mq5 +++ /dev/null @@ -1,149 +0,0 @@ -/////////////////////////////////////////////////////// -// -// SaherElm IT Center MQL5 Class Library -// ---------------------------------------------- -// Name: X128Signaller -// Description: Signalling using X121 rules ... -// -// -// 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 "../Libraries/x-saherelm.xtrade.lib.mq5" -#include "../Classes/x-saherelm.x121.xmcycle.class.mq5" - -// -// Definitions ... - -// -// Class ... -class X128Signaller : public XSignallerDescriptor -{ - // - // Public ... -public: - // - // Props ... - - // - // Constructor(s) ... - void X128Signaller() - { - // - name = X128; - Default(); - } - - // - // Deconstructor ... - void ~X128Signaller() {} - - // - // Override(s) ... - - // - bool HasLongConditions( - X121MCycleConditions &conditions, // Market Conditions - double &sl, // Hold SL ... - double &tp // Hold TP ... - ) override - { - // - bool result = false; - - // - sl = 0; - tp = 0; - - // - result = allowLong; - if (!result) - { - return result; - } - - // - result = - // - false - // - ; - - // - if (result) - { - // - sl = 0; - } - - // - return result; - } - - // - bool HasShortConditions( - X121MCycleConditions &conditions, // Market Conditions - double &sl, // Hold SL ... - double &tp // Hold TP ... - ) override - { - // - bool result = false; - - // - sl = 0; - tp = 0; - - // - result = allowLong; - if (!result) - { - return result; - } - - // - result = - // - false - // - ; - - // - if (result) - { - // - sl = 0; - } - - // - return result; - } - - // - // Protected ... -protected: - // - // Props ... - - // - double lastPeakOnPeakTouched; - double lastValeOnPeakTouched; - datetime lastTouchedPeak; - - // - double lastPeakOnValeTouched; - double lastValeOnValeTouched; - datetime lastTouchedVale; -}; \ No newline at end of file diff --git a/Signallers/x-saherelm.x786.signaller.class.mq5 b/Signallers/x-saherelm.x786.signaller.class.mq5 deleted file mode 100644 index aaa4e4b6..00000000 --- a/Signallers/x-saherelm.x786.signaller.class.mq5 +++ /dev/null @@ -1,237 +0,0 @@ -/////////////////////////////////////////////////////// -// -// SaherElm IT Center MQL5 Class Library -// ---------------------------------------------- -// Name: X786Signaller -// Description: Signalling using X786 rules ... -// -// -// 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 "../Libraries/x-saherelm.xtrade.lib.mq5" -#include "../Classes/x-saherelm.x121.xmcycle.class.mq5" - -// -// Definitions ... - -// -// Class ... -class X786Signaller : public XSignallerDescriptor -{ - // - // Public ... -public: - // - // Props ... - - // - // Constructor(s) ... - void X786Signaller() - { - // - name = X786; - Default(); - } - - // - // Deconstructor ... - void ~X786Signaller() {} - - // - // Override(s) ... - - // - bool HasLongConditions( - X121MCycleConditions &conditions, // Market Conditions - double &sl, // Hold SL ... - double &tp // Hold TP ... - ) override - { - // - bool result = false; - - // - sl = 0; - tp = 0; - - // - result = allowLong; - if (!result) - { - return result; - } - - // - double bullishScore = 0; - double bearishScore = 0; - conditions.GenerateScore( - bullishScore, - bearishScore // - ); - - // - result = - // - (conditions.isSMHKSwitchedToBullish && - (conditions.isTDBullish && - conditions.isCHEBullish && - conditions.isTrendBullish)) - // - || - // - (conditions.isTDSwitchedToBullish && - (conditions.isSMHKBullish && - conditions.isCHEBullish && - conditions.isTrendBullish)) - // - || - // - (conditions.isCHESwitchedToBullish && - (conditions.isTDBullish && - conditions.isSMHKBullish && - conditions.isTrendBullish)) - // - || - // - (conditions.isTrendSwitchedToBullish && - (conditions.isTDBullish && - conditions.isCHEBullish && - conditions.isSMHKBullish)) - // - ; - - // - bool isOSCVerified = - // - (conditions.oscCcis[0] > 0 && - conditions.oscCcis[1] > 0) - // - || - // - (conditions.oscMacdMains[0] > 0 && - conditions.oscMacdMains[1] > 0) - // - ; - - // - if (result) - { - result = - isOSCVerified && - bullishScore > bearishScore * 1.5; - } - - // - if (result) - { - sl = conditions.donLowerHs[1]; - } - - // - return result; - } - - // - bool HasShortConditions( - X121MCycleConditions &conditions, // Market Conditions - double &sl, // Hold SL ... - double &tp // Hold TP ... - ) override - { - // - bool result = false; - - // - tp = 0; - sl = 0; - - // - result = allowShort; - if (!result) - { - return result; - } - - // - double bullishScore = 0; - double bearishScore = 0; - conditions.GenerateScore( - bullishScore, - bearishScore // - ); - - // - result = - // - (conditions.isSMHKSwitchedToBearish && - (conditions.isTDBearish && - conditions.isCHEBearish && - conditions.isTrendBearish)) - // - || - // - (conditions.isTDSwitchedToBearish && - (conditions.isSMHKBearish && - conditions.isCHEBearish && - conditions.isTrendBearish)) - // - || - // - (conditions.isCHESwitchedToBearish && - (conditions.isTDBearish && - conditions.isSMHKBearish && - conditions.isTrendBearish)) - // - || - // - (conditions.isTrendSwitchedToBearish && - (conditions.isTDBearish && - conditions.isCHEBearish && - conditions.isSMHKBearish)) - // - ; - - // - bool isOSCVerified = - // - (conditions.oscCcis[0] < 0 && - conditions.oscCcis[1] < 0) - // - || - // - (conditions.oscMacdMains[0] < 0 && - conditions.oscMacdMains[1] < 0) - // - ; - - // - if (result) - { - result = - isOSCVerified && - bearishScore > bullishScore * 1.5; - } - - // - if (result) - { - sl = conditions.donUpperLs[1]; - } - - // - return result; - } -}; \ No newline at end of file diff --git a/Signallers/x-saherelm.x92.signaller.class.mq5 b/Signallers/x-saherelm.x92.signaller.class.mq5 deleted file mode 100644 index 17aa432b..00000000 --- a/Signallers/x-saherelm.x92.signaller.class.mq5 +++ /dev/null @@ -1,425 +0,0 @@ -/////////////////////////////////////////////////////// -// -// SaherElm IT Center MQL5 Class Library -// ---------------------------------------------- -// Name: X92Signaller -// Description: Signalling using X121 rules ... -// -// -// 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 "../Libraries/x-saherelm.xtrade.lib.mq5" -#include "../Classes/x-saherelm.x121.xmcycle.class.mq5" - -// -// Definitions ... - -// -// Class ... -class X92Signaller : public XSignallerDescriptor -{ - // - // Public ... -public: - // - // Props ... - - // - // Constructor(s) ... - void X92Signaller() - { - // - name = X92; - Default(); - } - - // - // Deconstructor ... - void ~X92Signaller() {} - - // - void SetSymbol(string value) - { - this.symbol = value; - } - - // - void SetPeriod(ENUM_TIMEFRAMES value) - { - this.period = value; - } - - // - // Override(s) ... - - // - bool HasLongConditions( - X121MCycleConditions &conditions, // Market Conditions - double &sl, // Hold SL ... - double &tp // Hold TP ... - ) override - { - // - bool result = false; - - // - sl = 0; - tp = 0; - - // - result = allowLong; - if (!result) - { - return result; - } - - // - if (IsLookingForBoundary()) - { - // - FindBoundary(conditions); - - // - return result; - } - - // - double bullishScore = 0; - double bearishScore = 0; - conditions.GenerateScore( - bullishScore, - bearishScore // - ); - - // - bool isRejected = - // - (conditions.bars[1].low > lastLower && - conditions.bars[2].low > lastLower && - conditions.bars[3].low > lastLower && - conditions.bars[4].low > lastLower && - conditions.bars[5].low > lastLower) - // - || - // - conditions.bars[1].IsSupportRejected(lastLower) - // - ; - bool isBreaked = - // - (conditions.bars[1].low > lastUpper && - conditions.bars[2].low > lastUpper && - conditions.bars[3].low > lastUpper && - conditions.bars[4].low > lastUpper && - conditions.bars[5].low > lastUpper) - // - || - // - conditions.bars[1].IsResistanceBreaked(lastUpper) - // - ; - - // - result = - // - isBreaked - // - || - // - isRejected - // - ; - - // - bool isOSCVerified = - // - (conditions.oscCcis[0] > 0 && - conditions.oscCcis[1] > 0) - // - || - // - (conditions.oscMacdMains[0] > 0 && - conditions.oscMacdMains[1] > 0) - // - ; - - // - if (result) - { - result = - isOSCVerified && - bullishScore > bearishScore * 1.5; - } - - // - if (result) - { - // - sl = isBreaked - ? lastUpper - : lastLower; - } - - // - HandleResetBundary(); - - // - return result; - } - - // - bool HasShortConditions( - X121MCycleConditions &conditions, // Market Conditions - double &sl, // Hold SL ... - double &tp // Hold TP ... - ) override - { - // - bool result = false; - - // - sl = 0; - tp = 0; - - // - result = allowLong; - if (!result) - { - return result; - } - - // - if (IsLookingForBoundary()) - { - // - FindBoundary(conditions); - - // - return result; - } - - // - double bullishScore = 0; - double bearishScore = 0; - conditions.GenerateScore( - bullishScore, - bearishScore // - ); - - // - bool isRejected = - // - (conditions.bars[1].high < lastUpper && - conditions.bars[2].high < lastUpper && - conditions.bars[3].high < lastUpper && - conditions.bars[4].high < lastUpper && - conditions.bars[5].high < lastUpper) - // - || - // - conditions.bars[1].IsResistanceRejected(lastUpper) - // - ; - bool isBreaked = - // - (conditions.bars[1].high < lastLower && - conditions.bars[2].high < lastLower && - conditions.bars[3].high < lastLower && - conditions.bars[4].high < lastLower && - conditions.bars[5].high < lastLower) - // - || - // - conditions.bars[1].IsSupportBreaked(lastLower) - // - ; - - // - result = - // - isBreaked - // - || - // - isRejected - // - ; - - // - bool isOSCVerified = - // - (conditions.oscCcis[0] < 0 && - conditions.oscCcis[1] < 0) - // - || - // - (conditions.oscMacdMains[0] < 0 && - conditions.oscMacdMains[1] < 0) - // - ; - - // - if (result) - { - result = - isOSCVerified && - bearishScore > bullishScore * 1.5; - } - - // - if (result) - { - // - sl = isBreaked - ? lastLower - : lastUpper; - } - - // - HandleResetBundary(); - - // - return result; - } - - // - // Protected ... -protected: - // - // Props ... - double lastUpper; - double lastLower; - datetime lastTime; - - // - string symbol; - ENUM_TIMEFRAMES period; - - // - bool IsLookingForBoundary() - { - // - bool result = lastUpper == 0 && lastLower == 0; - return result; - } - - // - void FindBoundary(const X121MCycleConditions &conditions) - { - // - int zIndex = 0; - int cIndex = 1; - int pIndex = 2; - int ppIndex = 3; - - // - // Detect Inside Bar ... - if (conditions.bars[cIndex].IsInsideBar()) - { - // - lastUpper = conditions.bars[pIndex].high; - lastLower = conditions.bars[pIndex].low; - - // - lastTime = TimeCurrent(); - - // - DrawPivot(lastUpper, clrOrangeRed); - DrawPivot(lastLower, clrLimeGreen); - } - } - - // - void HandleResetBundary() - { - // - if (!IsSpecifiedValid(lastTime)) - { - return; - } - - // - int age = iBarShift( - symbol, - period, - lastTime, - false // - ); - - // - if (age < 7) - { - return; - } - - // - RemoveDraws("X92_"); - - // - lastLower = 0; - lastUpper = 0; - lastTime = NULL; - } - - // - void DrawPivot( - double price, - color clr // - ) - { - // - long chartID = ChartID(); - datetime time1 = iTime( - symbol, - period, - 2 // - ); - datetime time = iTime( - symbol, - period, - 0 // - ); - - // - string pPrefix = "X92_P_" + - ToString(price); - - // - if (IsDrawExists(pPrefix)) - { - return; - } - - // - DrawTrendLine( - chartID, - pPrefix, - 0, - time1, - price, - time, - price, - clr, - STYLE_SOLID, - 2, - false, - false, - true // - ); - } - - // -}; \ No newline at end of file diff --git a/Signallers/x-saherelm.xsp.signaller.class.mq5 b/Signallers/x-saherelm.xsp.signaller.class.mq5 deleted file mode 100644 index 48d3cd99..00000000 --- a/Signallers/x-saherelm.xsp.signaller.class.mq5 +++ /dev/null @@ -1,139 +0,0 @@ -/////////////////////////////////////////////////////// -// -// SaherElm IT Center MQL5 Class Library -// ---------------------------------------------- -// Name: XSPSignaller -// Description: Signalling using X121 rules ... -// -// -// 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 "../Libraries/x-saherelm.xtrade.lib.mq5" -#include "../Classes/x-saherelm.x121.xmcycle.class.mq5" - -// -// Definitions ... - -// -// Class ... -class XSPSignaller : public XSignallerDescriptor -{ - // - // Public ... -public: - // - // Props ... - - // - // Constructor(s) ... - void XSPSignaller() - { - // - name = XSP; - Default(); - } - - // - // Deconstructor ... - void ~XSPSignaller() {} - - // - // Override(s) ... - - // - bool HasLongConditions( - X121MCycleConditions &conditions, // Market Conditions - double &sl, // Hold SL ... - double &tp // Hold TP ... - ) override - { - // - bool result = false; - - // - sl = 0; - tp = 0; - - // - result = allowLong; - if (!result) - { - return result; - } - - // - result = - // - false - // - ; - - // - if (result) - { - // - sl = 0; - } - - // - return result; - } - - // - bool HasShortConditions( - X121MCycleConditions &conditions, // Market Conditions - double &sl, // Hold SL ... - double &tp // Hold TP ... - ) override - { - // - bool result = false; - - // - sl = 0; - tp = 0; - - // - result = allowLong; - if (!result) - { - return result; - } - - // - result = - // - false - // - ; - - // - if (result) - { - // - sl = 0; - } - - // - return result; - } - - // - // Protected ... -protected: - // - // Props ... -}; \ No newline at end of file