From d2dcdd1a64416100fd306ab7c4f1ccfa0136aeae Mon Sep 17 00:00:00 2001 From: Hadi Khazaee Asl Date: Sat, 11 May 2024 05:36:03 +0330 Subject: [PATCH] last ... --- .../x-saherelm.x121.condition.parser.lib.mq5 | 4056 +++++++++++++ .../Classes/x-saherelm.http.class.ex5 | Bin 0 -> 6202 bytes .../Classes/x-saherelm.http.class.mq5 | 385 ++ .../x-saherelm.x121.provider.class.mq5 | 1760 ++++++ .../Classes/x-saherelm.x121.xea.class.mq5 | 1864 ++++++ .../Classes/x-saherelm.xaccount.class.ex5 | Bin 0 -> 7074 bytes .../Classes/x-saherelm.xaccount.class.mq5 | 398 ++ .../14030222/Classes/x-saherelm.xea.class.ex5 | Bin 0 -> 14258 bytes .../14030222/Classes/x-saherelm.xea.class.mq5 | 2142 +++++++ .../Classes/x-saherelm.xhelper.class.ex5 | Bin 0 -> 6298 bytes .../Classes/x-saherelm.xhelper.class.mq5 | 209 + .../Classes/x-saherelm.xmd5.class.ex5 | Bin 0 -> 3966 bytes .../Classes/x-saherelm.xmd5.class.mq5 | 441 ++ .../Classes/x-saherelm.xprovider.class.ex5 | Bin 0 -> 7364 bytes .../Classes/x-saherelm.xprovider.class.mq5 | 319 + .../Classes/x-saherelm.xtrade.class.ex5 | Bin 0 -> 13122 bytes .../Classes/x-saherelm.xtrade.class.mq5 | 5012 ++++++++++++++++ .../BKPS/14030222/Documents/.gitkeep | 0 .../14030222/Documents/BKP/x-sample.ea.mq5 | 180 + .../Documents/JsModules/x-color.tools.js | 506 ++ .../Documents/JsModules/x-file.tools.js | 830 +++ .../Documents/JsModules/x-shell.tools.js | 219 + .../JsModules/x-type-detector.tools.js | 268 + .../Documents/JsModules/x-value.tools.js | 1528 +++++ .../Documents/Temp/multi.asset.configs.yml | 1 + .../BKPS/14030222/Experts/x-donchain.ea.ex5 | Bin 0 -> 27024 bytes .../BKPS/14030222/Experts/x-donchain.ea.mq5 | 558 ++ .../BKPS/14030222/Experts/x-rsima.ea.ex5 | Bin 0 -> 65108 bytes .../BKPS/14030222/Experts/x-rsima.ea.mq5 | 494 ++ .../BKPS/14030222/Experts/x-saherelm.xea.ex5 | Bin 0 -> 620306 bytes .../BKPS/14030222/Experts/x-saherelm.xea.mq5 | 377 ++ .../BKPS/14030222/Experts/x-sample.ea.ex5 | Bin 0 -> 160428 bytes .../BKPS/14030222/Experts/x-sample.ea.mq5 | 1329 +++++ .../x-saherelm.x121.xman.helper.class.ex5 | Bin 0 -> 10166 bytes .../x-saherelm.x121.xman.helper.class.mq5 | 1927 ++++++ .../Indicators/x-saherelm.x121.xdema.ex5 | Bin 0 -> 12298 bytes .../Indicators/x-saherelm.x121.xdema.mq5 | 348 ++ .../Indicators/x-saherelm.x121.xdsr.ex5 | Bin 0 -> 27272 bytes .../Indicators/x-saherelm.x121.xdsr.mq5 | 240 + .../Indicators/x-saherelm.x121.xich.ex5 | Bin 0 -> 19814 bytes .../Indicators/x-saherelm.x121.xich.mq5 | 836 +++ .../Indicators/x-saherelm.x121.xman.ex5 | Bin 0 -> 87386 bytes .../Indicators/x-saherelm.x121.xman.mq5 | 4631 ++++++++++++++ .../14030222/Indicators/x-saherelm.xchnl.ex5 | Bin 0 -> 25152 bytes .../14030222/Indicators/x-saherelm.xchnl.mq5 | 775 +++ .../14030222/Indicators/x-saherelm.xdon.ex5 | Bin 0 -> 10198 bytes .../14030222/Indicators/x-saherelm.xdon.mq5 | 365 ++ .../Libraries/x-saherelm.alert.lib.mq5 | 187 + .../Libraries/x-saherelm.common.lib.ex5 | Bin 0 -> 5834 bytes .../Libraries/x-saherelm.common.lib.mq5 | 5311 +++++++++++++++++ .../Libraries/x-saherelm.draw.lib.ex5 | Bin 0 -> 7670 bytes .../Libraries/x-saherelm.draw.lib.mq5 | 3586 +++++++++++ .../Libraries/x-saherelm.http.lib.ex5 | Bin 0 -> 4424 bytes .../Libraries/x-saherelm.http.lib.mq5 | 177 + .../14030222/Libraries/x-saherelm.log.lib.mq5 | 1088 ++++ .../Libraries/x-saherelm.models.lib.ex5 | Bin 0 -> 5280 bytes .../Libraries/x-saherelm.models.lib.mq5 | 303 + .../Libraries/x-saherelm.seriallizer.lib.mq5 | 1326 ++++ .../x-saherelm.x121.condition.parser.lib.mq5 | 3841 ++++++++++++ .../Libraries/x-saherelm.x121.draw.lib.ex5 | Bin 0 -> 7026 bytes .../Libraries/x-saherelm.x121.draw.lib.mq5 | 284 + .../Libraries/x-saherelm.x121.x786.lib.mq5 | 436 ++ .../Libraries/x-saherelm.x121.x92.lib.mq5 | 430 ++ .../Libraries/x-saherelm.x121.xtest.lib.mq5 | 354 ++ .../Libraries/x-saherelm.xman.parser.lib.ex5 | Bin 0 -> 9940 bytes .../Libraries/x-saherelm.xman.parser.lib.mq5 | 1674 ++++++ .../BKPS/BKP/eqm.support.management.mq5 | 459 ++ .../BKPS/Templates/old.candle.draw.mq5 | 976 +++ MQLTestWorkspace/BKPS/old.mq5 | 314 + ...aherelm.x121.condition.parser.lib copy.mq5 | 101 + .../BKPS/x-saherelm.x121.xea.class.mq5 | 1565 +++++ 71 files changed, 54410 insertions(+) create mode 100644 MQLTestWorkspace/BKPS/14030219/x-saherelm.x121.condition.parser.lib.mq5 create mode 100644 MQLTestWorkspace/BKPS/14030222/Classes/x-saherelm.http.class.ex5 create mode 100644 MQLTestWorkspace/BKPS/14030222/Classes/x-saherelm.http.class.mq5 create mode 100644 MQLTestWorkspace/BKPS/14030222/Classes/x-saherelm.x121.provider.class.mq5 create mode 100644 MQLTestWorkspace/BKPS/14030222/Classes/x-saherelm.x121.xea.class.mq5 create mode 100644 MQLTestWorkspace/BKPS/14030222/Classes/x-saherelm.xaccount.class.ex5 create mode 100644 MQLTestWorkspace/BKPS/14030222/Classes/x-saherelm.xaccount.class.mq5 create mode 100644 MQLTestWorkspace/BKPS/14030222/Classes/x-saherelm.xea.class.ex5 create mode 100644 MQLTestWorkspace/BKPS/14030222/Classes/x-saherelm.xea.class.mq5 create mode 100644 MQLTestWorkspace/BKPS/14030222/Classes/x-saherelm.xhelper.class.ex5 create mode 100644 MQLTestWorkspace/BKPS/14030222/Classes/x-saherelm.xhelper.class.mq5 create mode 100644 MQLTestWorkspace/BKPS/14030222/Classes/x-saherelm.xmd5.class.ex5 create mode 100644 MQLTestWorkspace/BKPS/14030222/Classes/x-saherelm.xmd5.class.mq5 create mode 100644 MQLTestWorkspace/BKPS/14030222/Classes/x-saherelm.xprovider.class.ex5 create mode 100644 MQLTestWorkspace/BKPS/14030222/Classes/x-saherelm.xprovider.class.mq5 create mode 100644 MQLTestWorkspace/BKPS/14030222/Classes/x-saherelm.xtrade.class.ex5 create mode 100644 MQLTestWorkspace/BKPS/14030222/Classes/x-saherelm.xtrade.class.mq5 create mode 100644 MQLTestWorkspace/BKPS/14030222/Documents/.gitkeep create mode 100644 MQLTestWorkspace/BKPS/14030222/Documents/BKP/x-sample.ea.mq5 create mode 100644 MQLTestWorkspace/BKPS/14030222/Documents/JsModules/x-color.tools.js create mode 100644 MQLTestWorkspace/BKPS/14030222/Documents/JsModules/x-file.tools.js create mode 100644 MQLTestWorkspace/BKPS/14030222/Documents/JsModules/x-shell.tools.js create mode 100644 MQLTestWorkspace/BKPS/14030222/Documents/JsModules/x-type-detector.tools.js create mode 100644 MQLTestWorkspace/BKPS/14030222/Documents/JsModules/x-value.tools.js create mode 100644 MQLTestWorkspace/BKPS/14030222/Documents/Temp/multi.asset.configs.yml create mode 100644 MQLTestWorkspace/BKPS/14030222/Experts/x-donchain.ea.ex5 create mode 100644 MQLTestWorkspace/BKPS/14030222/Experts/x-donchain.ea.mq5 create mode 100644 MQLTestWorkspace/BKPS/14030222/Experts/x-rsima.ea.ex5 create mode 100644 MQLTestWorkspace/BKPS/14030222/Experts/x-rsima.ea.mq5 create mode 100644 MQLTestWorkspace/BKPS/14030222/Experts/x-saherelm.xea.ex5 create mode 100644 MQLTestWorkspace/BKPS/14030222/Experts/x-saherelm.xea.mq5 create mode 100644 MQLTestWorkspace/BKPS/14030222/Experts/x-sample.ea.ex5 create mode 100644 MQLTestWorkspace/BKPS/14030222/Experts/x-sample.ea.mq5 create mode 100644 MQLTestWorkspace/BKPS/14030222/Helpers/x-saherelm.x121.xman.helper.class.ex5 create mode 100644 MQLTestWorkspace/BKPS/14030222/Helpers/x-saherelm.x121.xman.helper.class.mq5 create mode 100644 MQLTestWorkspace/BKPS/14030222/Indicators/x-saherelm.x121.xdema.ex5 create mode 100644 MQLTestWorkspace/BKPS/14030222/Indicators/x-saherelm.x121.xdema.mq5 create mode 100644 MQLTestWorkspace/BKPS/14030222/Indicators/x-saherelm.x121.xdsr.ex5 create mode 100644 MQLTestWorkspace/BKPS/14030222/Indicators/x-saherelm.x121.xdsr.mq5 create mode 100644 MQLTestWorkspace/BKPS/14030222/Indicators/x-saherelm.x121.xich.ex5 create mode 100644 MQLTestWorkspace/BKPS/14030222/Indicators/x-saherelm.x121.xich.mq5 create mode 100644 MQLTestWorkspace/BKPS/14030222/Indicators/x-saherelm.x121.xman.ex5 create mode 100644 MQLTestWorkspace/BKPS/14030222/Indicators/x-saherelm.x121.xman.mq5 create mode 100644 MQLTestWorkspace/BKPS/14030222/Indicators/x-saherelm.xchnl.ex5 create mode 100644 MQLTestWorkspace/BKPS/14030222/Indicators/x-saherelm.xchnl.mq5 create mode 100644 MQLTestWorkspace/BKPS/14030222/Indicators/x-saherelm.xdon.ex5 create mode 100644 MQLTestWorkspace/BKPS/14030222/Indicators/x-saherelm.xdon.mq5 create mode 100644 MQLTestWorkspace/BKPS/14030222/Libraries/x-saherelm.alert.lib.mq5 create mode 100644 MQLTestWorkspace/BKPS/14030222/Libraries/x-saherelm.common.lib.ex5 create mode 100644 MQLTestWorkspace/BKPS/14030222/Libraries/x-saherelm.common.lib.mq5 create mode 100644 MQLTestWorkspace/BKPS/14030222/Libraries/x-saherelm.draw.lib.ex5 create mode 100644 MQLTestWorkspace/BKPS/14030222/Libraries/x-saherelm.draw.lib.mq5 create mode 100644 MQLTestWorkspace/BKPS/14030222/Libraries/x-saherelm.http.lib.ex5 create mode 100644 MQLTestWorkspace/BKPS/14030222/Libraries/x-saherelm.http.lib.mq5 create mode 100644 MQLTestWorkspace/BKPS/14030222/Libraries/x-saherelm.log.lib.mq5 create mode 100644 MQLTestWorkspace/BKPS/14030222/Libraries/x-saherelm.models.lib.ex5 create mode 100644 MQLTestWorkspace/BKPS/14030222/Libraries/x-saherelm.models.lib.mq5 create mode 100644 MQLTestWorkspace/BKPS/14030222/Libraries/x-saherelm.seriallizer.lib.mq5 create mode 100644 MQLTestWorkspace/BKPS/14030222/Libraries/x-saherelm.x121.condition.parser.lib.mq5 create mode 100644 MQLTestWorkspace/BKPS/14030222/Libraries/x-saherelm.x121.draw.lib.ex5 create mode 100644 MQLTestWorkspace/BKPS/14030222/Libraries/x-saherelm.x121.draw.lib.mq5 create mode 100644 MQLTestWorkspace/BKPS/14030222/Libraries/x-saherelm.x121.x786.lib.mq5 create mode 100644 MQLTestWorkspace/BKPS/14030222/Libraries/x-saherelm.x121.x92.lib.mq5 create mode 100644 MQLTestWorkspace/BKPS/14030222/Libraries/x-saherelm.x121.xtest.lib.mq5 create mode 100644 MQLTestWorkspace/BKPS/14030222/Libraries/x-saherelm.xman.parser.lib.ex5 create mode 100644 MQLTestWorkspace/BKPS/14030222/Libraries/x-saherelm.xman.parser.lib.mq5 create mode 100644 MQLTestWorkspace/BKPS/BKP/eqm.support.management.mq5 create mode 100644 MQLTestWorkspace/BKPS/Templates/old.candle.draw.mq5 create mode 100644 MQLTestWorkspace/BKPS/old.mq5 create mode 100644 MQLTestWorkspace/BKPS/x-saherelm.x121.xea.class.mq5 diff --git a/MQLTestWorkspace/BKPS/14030219/x-saherelm.x121.condition.parser.lib.mq5 b/MQLTestWorkspace/BKPS/14030219/x-saherelm.x121.condition.parser.lib.mq5 new file mode 100644 index 0000000..482c4f5 --- /dev/null +++ b/MQLTestWorkspace/BKPS/14030219/x-saherelm.x121.condition.parser.lib.mq5 @@ -0,0 +1,4056 @@ +//////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 X12 Conditions Parser Library +// ----------------------------------------------------- +// Name: X121ConditionsParser +// Description: provides Market Conditions +// Parsing Requirements ... +// +// +// Maintainer: +// ------------ +// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) +// +////////////////////////////////////////////////////// +// +// Global Properties ... +#property library +#property copyright "Copyright 2023, SaherElm IT Center" +#property link "https://www.saherelm.ir" +#property version "1.00" +#property strict + +// +#include "../Libraries/x-saherelm.common.lib.mq5" +#include "../Libraries/x-saherelm.models.lib.mq5" +#include "../Classes/x-saherelm.x121.provider.class.mq5" + +// +// START Functions ... +// + +// +// PARSE STATES ... +// + +// +// SSLC ... +// + +// +bool IsSSLCBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + conditions.xmanInfo.sslcUps[index] > conditions.xmanInfo.sslcDowns[index] + // + ; + + // + return result; +} + +// +bool IsSSLCSwitchedToBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsSSLCBullish(conditions, index) && + !IsSSLCBullish(conditions, index + 1) + // + ; + + // + return result; +} + +// +bool IsSSLCBearish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + conditions.xmanInfo.sslcUps[index] < conditions.xmanInfo.sslcDowns[index] + // + ; + + // + return result; +} + +// +bool IsSSLCSwitchedToBearish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsSSLCBearish(conditions, index) && + !IsSSLCBearish(conditions, index + 1) + // + ; + + // + return result; +} + +// +// HULL ... +// + +// +bool IsHullBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsHullUpBullish(conditions, index) && + IsHullDownBullish(conditions, index) + // + ; + + // + return result; +} + +// +bool IsHullSwitchedBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsHullBullish(conditions, index) && + !IsHullBullish(conditions, index + 1) + // + ; + + // + return result; +} + +// +bool IsHullBearish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsHullUpBearish(conditions, index) && + IsHullDownBearish(conditions, index) + // + ; + + // + return result; +} + +// +bool IsHullSwitchedBearish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsHullBearish(conditions, index) && + !IsHullBearish(conditions, index + 1) + // + ; + + // + return result; +} + +// +// UP ... + +// +// BULLISH ... + +// +bool IsHullUpBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + conditions.xmanInfo.hullUps[index] > conditions.xmanInfo.hullUps[index + 1] + // + ; + + // + return result; +} + +// +bool IsHullUpSwitchedToBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsHullUpBullish(conditions, index) && + !IsHullUpBullish(conditions, index + 1) + // + ; + + // + return result; +} + +// +// BEARISH ... + +// +bool IsHullUpBearish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + conditions.xmanInfo.hullUps[index] < conditions.xmanInfo.hullUps[index + 1] + // + ; + + // + return result; +} + +// +bool IsHullUpSwitchedToBearish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsHullUpBearish(conditions, index) && + !IsHullUpBearish(conditions, index + 1) + // + ; + + // + return result; +} + +// +// DOWN ... + +// +// BULLISH ... + +// +bool IsHullDownBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + conditions.xmanInfo.hullDowns[index] > conditions.xmanInfo.hullDowns[index + 1] + // + ; + + // + return result; +} + +// +bool IsHullDownSwitchedToBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsHullDownBullish(conditions, index) && + !IsHullDownBullish(conditions, index + 1) + // + ; + + // + return result; +} + +// +// BEARISH ... + +// +bool IsHullDownBearish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + conditions.xmanInfo.hullDowns[index] < conditions.xmanInfo.hullDowns[index + 1] + // + ; + + // + return result; +} + +// +bool IsHullDownSwitchedToBearish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsHullDownBearish(conditions, index) && + !IsHullDownBearish(conditions, index + 1) + // + ; + + // + return result; +} + +// +// TREND ... +// + +// +// Check Trend Bullish ... +bool IsTrendBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + conditions.candles[index].low > conditions.xmanInfo.trends[index] + // + ; + + // + return result; +} + +// +// Check Trend Switched To Bullish ... +bool IsTrendSwitchedToBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsTrendBullish(conditions, index) && + !IsTrendBullish(conditions, index + 1) + // + ; + + // + return result; +} + +// +// Check Trend Bearish ... +bool IsTrendBearish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + conditions.candles[index].high < conditions.xmanInfo.trends[index] + // + ; + + // + return result; +} + +// +// Check Trend Switched To Bearish ... +bool IsTrendSwitchedToBearish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsTrendBearish(conditions, index) && + !IsTrendBearish(conditions, index + 1) + // + ; + + // + return result; +} + +// +// RIBBON ... +// + +// +double GetRibbonMax( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + double result = 0; + + // + result = MathMax(conditions.xmanInfo.ribbon1s[index], conditions.xmanInfo.ribbon2s[index]); + result = MathMax(result, conditions.xmanInfo.ribbon3s[index]); + result = MathMax(result, conditions.xmanInfo.ribbon4s[index]); + result = MathMax(result, conditions.xmanInfo.ribbon5s[index]); + result = MathMax(result, conditions.xmanInfo.ribbon6s[index]); + + // + return result; +} + +// +double GetRibbonMin( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + double result = 0; + + // + result = MathMin(conditions.xmanInfo.ribbon1s[index], conditions.xmanInfo.ribbon2s[index]); + result = MathMin(result, conditions.xmanInfo.ribbon3s[index]); + result = MathMin(result, conditions.xmanInfo.ribbon4s[index]); + result = MathMin(result, conditions.xmanInfo.ribbon5s[index]); + result = MathMin(result, conditions.xmanInfo.ribbon6s[index]); + + // + return result; +} + +// +// Check Ribbon States ... +// Working With Price and Ribbon Values ... +bool IsRibbonBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + conditions.candles[index].low > conditions.xmanInfo.ribbon1s[index] && + conditions.candles[index].low > conditions.xmanInfo.ribbon2s[index] && + conditions.candles[index].low > conditions.xmanInfo.ribbon3s[index] && + conditions.candles[index].low > conditions.xmanInfo.ribbon4s[index] && + conditions.candles[index].low > conditions.xmanInfo.ribbon5s[index] && + conditions.candles[index].low > conditions.xmanInfo.ribbon6s[index] + // + ; + + // + return result; +} + +// +// Check Ribbons Sequntial Statements ... +// Working with Price and Ribbon Values and also Ribbon Orders +bool IsRibbonOrderBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsRibbonBullish(conditions, index) + // + && + // + GetRibbonMax(conditions, index) == conditions.xmanInfo.ribbon1s[index] + // + && + // + GetRibbonMin(conditions, index) == conditions.xmanInfo.ribbon6s[index] + // + ; + + // + return result; +} + +// +bool IsRibbonSwitchedToBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsRibbonBullish(conditions, index) && + !IsRibbonBullish(conditions, index + 1) + // + ; + + // + return result; +} + +// +// Check Ribbons Sequntial Statements ... +bool IsRibbonOrderSwitchedToBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsRibbonOrderBullish(conditions, index) && + !IsRibbonOrderBullish(conditions, index + 1) + // + ; + + // + return result; +} + +// +// Check Ribbon States ... +// Working With Price and Ribbon Values ... +bool IsRibbonBearish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + conditions.candles[index].high < conditions.xmanInfo.ribbon1s[index] && + conditions.candles[index].high < conditions.xmanInfo.ribbon2s[index] && + conditions.candles[index].high < conditions.xmanInfo.ribbon3s[index] && + conditions.candles[index].high < conditions.xmanInfo.ribbon4s[index] && + conditions.candles[index].high < conditions.xmanInfo.ribbon5s[index] && + conditions.candles[index].high < conditions.xmanInfo.ribbon6s[index] + // + ; + + // + return result; +} + +// +// Check Ribbons Sequntial Statements ... +// Working with Price and Ribbon Values and also Ribbon Orders +bool IsRibbonOrderBearish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsRibbonBearish(conditions, index) + // + && + // + GetRibbonMax(conditions, index) == conditions.xmanInfo.ribbon1s[index] + // + && + // + GetRibbonMin(conditions, index) == conditions.xmanInfo.ribbon6s[index] + // + ; + + // + return result; +} + +// +bool IsRibbonSwitchedToBearish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsRibbonBearish(conditions, index) && + !IsRibbonBearish(conditions, index + 1) + // + ; + + // + return result; +} + +// +// Check Ribbons Sequntial Statements ... +bool IsRibbonOrderSwitchedToBearish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsRibbonOrderBearish(conditions, index) && + !IsRibbonOrderBearish(conditions, index + 1) + // + ; + + // + return result; +} + +// +// PEAKS and VALES and Levels ... +// + +// +// Check Peak Same as Last ... +bool IsPeakSameAs( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0, // Array Index + int length = 5 // Comparing Period +) +{ + // + bool result = false; + + // + if (length <= 0) + { + return result; + } + + // + double selected = conditions.xmanInfo.peaks[index]; + + // + int start = index + 1; + int end = start + length; + + // + int verified = 0; + for (int i = start; i < end; i++) + { + // + double iValue = conditions.xmanInfo.peaks[i]; + + // + if (iValue == selected) + { + verified++; + } + } + + // + result = verified == length; + + // + return result; +} + +// +// Check New Peaks Happens ... +bool IsNewPeak( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + conditions.xmanInfo.peaks[index] != EMPTY_VALUE && + conditions.xmanInfo.peaks[index] != conditions.xmanInfo.peaks[index + 1] + // + ; + + // + return result; +} + +// +// Check New Peaks Happens Over Last ... +bool IsNewPeakOverLast( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsNewPeak(conditions, index) && + conditions.xmanInfo.peaks[index] > conditions.xmanInfo.peaks[index + 1] + // + ; + + // + return result; +} + +// +// Check New Peaks Happens Under Last ... +bool IsNewPeakUnderLast( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsNewPeak(conditions, index) && + conditions.xmanInfo.peaks[index] < conditions.xmanInfo.peaks[index + 1] + // + ; + + // + return result; +} + +// +// Check Valse Same as Last ... +bool IsValeSameAs( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0, // Array Index + int length = 5 // Comparing Period +) +{ + // + bool result = false; + + // + if (length <= 0) + { + return result; + } + + // + double selected = conditions.xmanInfo.vales[index]; + + // + int start = index + 1; + int end = start + length; + + // + int verified = 0; + for (int i = start; i < end; i++) + { + // + double iValue = conditions.xmanInfo.vales[i]; + + // + if (iValue == selected) + { + verified++; + } + } + + // + result = verified == length; + + // + return result; +} + +// +// Check New Vales Happens ... +bool IsNewVale( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + conditions.xmanInfo.vales[index] != EMPTY_VALUE && + conditions.xmanInfo.vales[index] != conditions.xmanInfo.vales[index + 1] + // + ; + + // + return result; +} + +// +// Check New Vales Happens Over Last ... +bool IsNewValeOverLast( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsNewVale(conditions, index) && + conditions.xmanInfo.vales[index] > conditions.xmanInfo.vales[index + 1] + // + ; + + // + return result; +} + +// +// Check New Vales Happens Under Last ... +bool IsNewValeUnderLast( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsNewVale(conditions, index) && + conditions.xmanInfo.vales[index] < conditions.xmanInfo.vales[index + 1] + // + ; + + // + return result; +} + +// +// Check Finbonacci Increased ... +bool IsFiboIncreased( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + conditions.xmanInfo.fibLevel1s[index] > conditions.xmanInfo.fibLevel1s[index + 1] && + conditions.xmanInfo.fibLevel2s[index] > conditions.xmanInfo.fibLevel2s[index + 1] && + conditions.xmanInfo.fibLevel3s[index] > conditions.xmanInfo.fibLevel3s[index + 1] && + conditions.xmanInfo.fibLevel4s[index] > conditions.xmanInfo.fibLevel4s[index + 1] && + conditions.xmanInfo.fibLevel5s[index] > conditions.xmanInfo.fibLevel5s[index + 1] + // + ; + + // + return result; +} + +// +// Check Fibonacci Decreased ... +bool IsFiboDecreased( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + conditions.xmanInfo.fibLevel1s[index] < conditions.xmanInfo.fibLevel1s[index + 1] && + conditions.xmanInfo.fibLevel2s[index] < conditions.xmanInfo.fibLevel2s[index + 1] && + conditions.xmanInfo.fibLevel3s[index] < conditions.xmanInfo.fibLevel3s[index + 1] && + conditions.xmanInfo.fibLevel4s[index] < conditions.xmanInfo.fibLevel4s[index + 1] && + conditions.xmanInfo.fibLevel5s[index] < conditions.xmanInfo.fibLevel5s[index + 1] + // + ; + + // + return result; +} + +// +// Check Fibonacci Crossed ... +bool IsFiboCrossed( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + conditions.xmanInfo.fibLevel1s[index] == conditions.xmanInfo.fibLevel2s[index] || + conditions.xmanInfo.fibLevel1s[index] == conditions.xmanInfo.fibLevel3s[index] || + conditions.xmanInfo.fibLevel1s[index] == conditions.xmanInfo.fibLevel4s[index] || + conditions.xmanInfo.fibLevel1s[index] == conditions.xmanInfo.fibLevel5s[index] || + conditions.xmanInfo.fibLevel2s[index] == conditions.xmanInfo.fibLevel3s[index] || + conditions.xmanInfo.fibLevel2s[index] == conditions.xmanInfo.fibLevel4s[index] || + conditions.xmanInfo.fibLevel2s[index] == conditions.xmanInfo.fibLevel5s[index] || + conditions.xmanInfo.fibLevel3s[index] == conditions.xmanInfo.fibLevel4s[index] || + conditions.xmanInfo.fibLevel3s[index] == conditions.xmanInfo.fibLevel5s[index] || + conditions.xmanInfo.fibLevel4s[index] == conditions.xmanInfo.fibLevel5s[index] + // + ; + + // + return result; +} + +// +// Check Fibonacci Section Changes ... +bool IsFiboSectionChanged( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + (IsNewPeakUnderLast(conditions, index) && + IsFiboDecreased(conditions, index)) + // + || + // + (IsNewValeOverLast(conditions, index) && + IsFiboIncreased(conditions, index)) + // + ; + + // + return result; +} + +// +// Market Cycles ... + +// +// ALL Cycles ... + +// +bool IsCyclesBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsSCBullish(conditions, index) && + IsMCBullish(conditions, index) && + IsLCBullish(conditions, index) && + IsHCBullish(conditions, index) + // + ; + + // + return result; +} + +// +bool IsCyclesSwitchedToBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsCyclesBullish(conditions, index) && + !IsCyclesBullish(conditions, index + 1) + // + ; + + // + return result; +} + +// +bool IsCyclesBearish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsSCBearish(conditions, index) && + IsMCBearish(conditions, index) && + IsLCBearish(conditions, index) && + IsHCBearish(conditions, index) + // + ; + + // + return result; +} + +// +bool IsCyclesSwitchedToBearish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsCyclesBearish(conditions, index) && + !IsCyclesBearish(conditions, index + 1) + // + ; + + // + return result; +} + +// +bool IsCyclesLowBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsSCLowBullish(conditions, index) && + IsMCLowBullish(conditions, index) && + IsLCLowBullish(conditions, index) && + IsHCLowBullish(conditions, index) + // + ; + + // + return result; +} + +// +bool IsCyclesLowSwitchedToBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsCyclesLowBullish(conditions, index) && + !IsCyclesLowBullish(conditions, index + 1) + // + ; + + // + return result; +} + +// +bool IsCyclesLowBearish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsSCLowBearish(conditions, index) && + IsMCLowBearish(conditions, index) && + IsLCLowBearish(conditions, index) && + IsHCLowBearish(conditions, index) + // + ; + + // + return result; +} + +// +bool IsCyclesLowSwitchedToBearish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsCyclesLowBearish(conditions, index) && + !IsCyclesLowBearish(conditions, index + 1) + // + ; + + // + return result; +} + +// +bool IsCyclesHighBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsSCHighBullish(conditions, index) && + IsMCHighBullish(conditions, index) && + IsLCHighBullish(conditions, index) && + IsHCHighBullish(conditions, index) + // + ; + + // + return result; +} + +// +bool IsCyclesHighSwitchedToBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsCyclesHighBullish(conditions, index) && + !IsCyclesHighBullish(conditions, index + 1) + // + ; + + // + return result; +} + +// +bool IsCyclesHighBearish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsSCHighBearish(conditions, index) && + IsMCHighBearish(conditions, index) && + IsLCHighBearish(conditions, index) && + IsHCHighBearish(conditions, index) + // + ; + + // + return result; +} + +// +bool IsCyclesHighSwitchedToBearish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsCyclesHighBearish(conditions, index) && + !IsCyclesHighBearish(conditions, index + 1) + // + ; + + // + return result; +} + +// +// INHIND Cycles ... + +// +bool IsInHindCyclesBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsSCBullish(conditions, index) && + IsMCBullish(conditions, index) && + IsLCBullish(conditions, index) + // + ; + + // + return result; +} + +// +bool IsInHindCyclesSwitchedToBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsInHindCyclesBullish(conditions, index) && + !IsInHindCyclesBullish(conditions, index + 1) + // + ; + + // + return result; +} + +// +bool IsInHindCyclesBearish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsSCBearish(conditions, index) && + IsMCBearish(conditions, index) && + IsLCBearish(conditions, index) + // + ; + + // + return result; +} + +// +bool IsInHindCyclesSwitchedToBearish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsInHindCyclesBearish(conditions, index) && + !IsInHindCyclesBearish(conditions, index + 1) + // + ; + + // + return result; +} + +// +bool IsInHindCyclesLowBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsSCLowBullish(conditions, index) && + IsMCLowBullish(conditions, index) && + IsLCLowBullish(conditions, index) + // + ; + + // + return result; +} + +// +bool IsInHindCyclesLowSwitchedToBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsInHindCyclesLowBullish(conditions, index) && + !IsInHindCyclesLowBullish(conditions, index + 1) + // + ; + + // + return result; +} + +// +bool IsInHindCyclesHighBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsSCHighBullish(conditions, index) && + IsMCHighBullish(conditions, index) && + IsLCHighBullish(conditions, index) + // + ; + + // + return result; +} + +// +bool IsInHindCyclesHighSwitchedToBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsInHindCyclesHighBullish(conditions, index) && + !IsInHindCyclesHighBullish(conditions, index + 1) + // + ; + + // + return result; +} + +// +// INLONG Cycles ... + +// +bool IsInLongCyclesBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsSCBullish(conditions, index) && + IsMCBullish(conditions, index) + // + ; + + // + return result; +} + +// +bool IsInLongCyclesSwitchedToBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsInLongCyclesBullish(conditions, index) && + !IsInLongCyclesBullish(conditions, index + 1) + // + ; + + // + return result; +} + +// +bool IsInLongCyclesBearish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsSCBearish(conditions, index) && + IsMCBearish(conditions, index) + // + ; + + // + return result; +} + +// +bool IsInLongCyclesSwitchedToBearish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsInLongCyclesBearish(conditions, index) && + !IsInLongCyclesBearish(conditions, index + 1) + // + ; + + // + return result; +} + +// +// SHORT ... + +// +bool IsSCBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsSCHighBullish(conditions, index) && + IsSCLowBullish(conditions, index) + // + ; + + // + return result; +} + +// +bool IsSCSwitchedToBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsSCBullish(conditions, index) && + !IsSCBullish(conditions, index + 1) + // + ; + + // + return result; +} + +// +bool IsSCBearish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsSCHighBearish(conditions, index) && + IsSCLowBearish(conditions, index) + // + ; + + // + return result; +} + +// +bool IsSCSwitchedToBearish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsSCBearish(conditions, index) && + !IsSCBearish(conditions, index + 1) + // + ; + + // + return result; +} + +// +// SHORT HIGH ... + +// +bool IsSCHighBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + conditions.xmanInfo.sHHs[index] > conditions.xmanInfo.sHHs[index + 1] + // + ; + + // + return result; +} + +// +bool IsSCHighSwitchedBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsSCHighBullish(conditions, index) && + !IsSCHighBullish(conditions, index + 1) + // + ; + + // + return result; +} + +// +bool IsSCHighBearish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + conditions.xmanInfo.sHHs[index] < conditions.xmanInfo.sHHs[index + 1] + // + ; + + // + return result; +} + +// +bool IsSCHighSwitchedToBearish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsSCHighBearish(conditions, index) && + !IsSCHighBearish(conditions, index + 1) + // + ; + + // + return result; +} + +// +// SHORT LOW ... + +// +bool IsSCLowBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + conditions.xmanInfo.sLLs[index] > conditions.xmanInfo.sLLs[index + 1] + // + ; + + // + return result; +} + +// +bool IsSCLowSwitchedBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsSCLowBullish(conditions, index) && + !IsSCLowBullish(conditions, index + 1) + // + ; + + // + return result; +} + +// +bool IsSCLowBearish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + conditions.xmanInfo.sLLs[index] < conditions.xmanInfo.sLLs[index + 1] + // + ; + + // + return result; +} + +// +bool IsSCLowSwitchedToBearish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsSCLowBearish(conditions, index) && + !IsSCLowBearish(conditions, index + 1) + // + ; + + // + return result; +} + +// +// MEDIUM ... + +// +bool IsMCBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsMCHighBullish(conditions, index) && + IsMCLowBullish(conditions, index) + // + ; + + // + return result; +} + +// +bool IsMCSwitchedToBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsMCBullish(conditions, index) && + !IsMCBullish(conditions, index + 1) + // + ; + + // + return result; +} + +// +bool IsMCBearish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsMCHighBearish(conditions, index) && + IsMCLowBearish(conditions, index) + // + ; + + // + return result; +} + +// +bool IsMCSwitchedToBearish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsMCBearish(conditions, index) && + !IsMCBearish(conditions, index + 1) + // + ; + + // + return result; +} + +// +// MEDIUM HIGH ... + +// +bool IsMCHighBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + conditions.xmanInfo.mHHs[index] > conditions.xmanInfo.mHHs[index + 1] + // + ; + + // + return result; +} + +// +bool IsMCHighSwitchedBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsMCHighBullish(conditions, index) && + !IsMCHighBullish(conditions, index + 1) + // + ; + + // + return result; +} + +// +bool IsMCHighBearish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + conditions.xmanInfo.mHHs[index] < conditions.xmanInfo.mHHs[index + 1] + // + ; + + // + return result; +} + +// +bool IsMCHighSwitchedToBearish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsMCHighBearish(conditions, index) && + !IsMCHighBearish(conditions, index + 1) + // + ; + + // + return result; +} + +// +// MEDIUM LOW ... + +// +bool IsMCLowBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + conditions.xmanInfo.mLLs[index] > conditions.xmanInfo.mLLs[index + 1] + // + ; + + // + return result; +} + +// +bool IsMCLowSwitchedBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsMCLowBullish(conditions, index) && + !IsMCLowBullish(conditions, index + 1) + // + ; + + // + return result; +} + +// +bool IsMCLowBearish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + conditions.xmanInfo.mLLs[index] < conditions.xmanInfo.mLLs[index + 1] + // + ; + + // + return result; +} + +// +bool IsMCLowSwitchedToBearish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsMCLowBearish(conditions, index) && + !IsMCLowBearish(conditions, index + 1) + // + ; + + // + return result; +} + +// +// LONG ... + +// +bool IsLCBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsLCHighBullish(conditions, index) && + IsLCLowBullish(conditions, index) + // + ; + + // + return result; +} + +// +bool IsLCSwitchedToBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsLCBullish(conditions, index) && + !IsLCBullish(conditions, index + 1) + // + ; + + // + return result; +} + +// +bool IsLCBearish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsLCHighBearish(conditions, index) && + IsLCLowBearish(conditions, index) + // + ; + + // + return result; +} + +// +bool IsLCSwitchedToBearish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsLCBearish(conditions, index) && + !IsLCBearish(conditions, index + 1) + // + ; + + // + return result; +} + +// +// LONG HIGH ... + +// +bool IsLCHighBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + conditions.xmanInfo.lHHs[index] > conditions.xmanInfo.lHHs[index + 1] + // + ; + + // + return result; +} + +// +bool IsLCHighSwitchedBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsLCHighBullish(conditions, index) && + !IsLCHighBullish(conditions, index + 1) + // + ; + + // + return result; +} + +// +bool IsLCHighBearish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + conditions.xmanInfo.lHHs[index] < conditions.xmanInfo.lHHs[index + 1] + // + ; + + // + return result; +} + +// +bool IsLCHighSwitchedToBearish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsLCHighBearish(conditions, index) && + !IsLCHighBearish(conditions, index + 1) + // + ; + + // + return result; +} + +// +// LONG LOW ... + +// +bool IsLCLowBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + conditions.xmanInfo.lLLs[index] > conditions.xmanInfo.lLLs[index + 1] + // + ; + + // + return result; +} + +// +bool IsLCLowSwitchedBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsLCLowBullish(conditions, index) && + !IsLCLowBullish(conditions, index + 1) + // + ; + + // + return result; +} + +// +bool IsLCLowBearish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + conditions.xmanInfo.lLLs[index] < conditions.xmanInfo.lLLs[index + 1] + // + ; + + // + return result; +} + +// +bool IsLCLowSwitchedToBearish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsLCLowBearish(conditions, index) && + !IsLCLowBearish(conditions, index + 1) + // + ; + + // + return result; +} + +// +// HIND ... + +// +bool IsHCBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsHCHighBullish(conditions, index) && + IsHCLowBullish(conditions, index) + // + ; + + // + return result; +} + +// +bool IsHCSwitchedToBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsHCBullish(conditions, index) && + !IsHCBullish(conditions, index + 1) + // + ; + + // + return result; +} + +// +bool IsHCBearish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsHCHighBearish(conditions, index) && + IsHCLowBearish(conditions, index) + // + ; + + // + return result; +} + +// +bool IsHCSwitchedToBearish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsHCBearish(conditions, index) && + !IsHCBearish(conditions, index + 1) + // + ; + + // + return result; +} + +// +// HIND HIGH ... + +// +bool IsHCHighBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + conditions.xmanInfo.hHHs[index] > conditions.xmanInfo.hHHs[index + 1] + // + ; + + // + return result; +} + +// +bool IsHCHighSwitchedBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsHCHighBullish(conditions, index) && + !IsHCHighBullish(conditions, index + 1) + // + ; + + // + return result; +} + +// +bool IsHCHighBearish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + conditions.xmanInfo.hHHs[index] < conditions.xmanInfo.hHHs[index + 1] + // + ; + + // + return result; +} + +// +bool IsHCHighSwitchedToBearish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsHCHighBearish(conditions, index) && + !IsHCHighBearish(conditions, index + 1) + // + ; + + // + return result; +} + +// +// HIND LOW ... + +// +bool IsHCLowBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + conditions.xmanInfo.hLLs[index] > conditions.xmanInfo.hLLs[index + 1] + // + ; + + // + return result; +} + +// +bool IsHCLowSwitchedBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsHCLowBullish(conditions, index) && + !IsHCLowBullish(conditions, index + 1) + // + ; + + // + return result; +} + +// +bool IsHCLowBearish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + conditions.xmanInfo.hLLs[index] < conditions.xmanInfo.hLLs[index + 1] + // + ; + + // + return result; +} + +// +bool IsHCLowSwitchedToBearish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsHCLowBearish(conditions, index) && + !IsHCLowBearish(conditions, index + 1) + // + ; + + // + return result; +} + +// +// XHK XSMHK ... + +// +double GetHKMax( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0, // Array Index + bool ignoreShadows = false // Ignore Shaddows +) +{ + // + double result = 0; + + // + result = MathMax(conditions.xmanInfo.hkOpens[index], conditions.xmanInfo.hkCloses[index]); + if (!ignoreShadows) + { + // + double selectedShadow = MathMax(conditions.xmanInfo.hkHighs[index], conditions.xmanInfo.hkLows[index]); + + // + result = MathMax(result, selectedShadow); + } + + // + return result; +} + +// +double iHKHighest( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0, // Array Index + int count = 5, // Count + ENUM_X_PRICE appliedPrice = X_PRICE_HIGH // Price Type +) +{ + // + double result = 0; + + // + // Validate Args ... + if (index < 0 || + count <= 0) + { + return result; + } + + // + int idx = -1; + double tmpArray[]; + + // + switch (appliedPrice) + { + // + case X_PRICE_HIGH: + // + ArrayCopy( + tmpArray, + conditions.xmanInfo.hkHighs, + 0, + index, + count // + ); + break; + + // + case X_PRICE_OPEN: + // + ArrayCopy( + tmpArray, + conditions.xmanInfo.hkOpens, + 0, + index, + count // + ); + break; + + // + case X_PRICE_CLOSE: + // + ArrayCopy( + tmpArray, + conditions.xmanInfo.hkCloses, + 0, + index, + count // + ); + break; + + // + case X_PRICE_LOW: + // + ArrayCopy( + tmpArray, + conditions.xmanInfo.hkLows, + 0, + index, + count // + ); + break; + } + + // + idx = ArrayMaximum(tmpArray); + if (idx < 0) + { + return result; + } + + // + result = tmpArray[idx]; + + // + return result; +} + +// +double iHKLowest( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0, // Array Index + int count = 5, // Count + ENUM_X_PRICE appliedPrice = X_PRICE_LOW // Price Type +) +{ + // + double result = 0; + + // + // Validate Args ... + if (index < 0 || + count <= 0) + { + return result; + } + + // + int idx = -1; + double tmpArray[]; + + // + switch (appliedPrice) + { + // + case X_PRICE_HIGH: + // + ArrayCopy( + tmpArray, + conditions.xmanInfo.hkHighs, + 0, + index, + count // + ); + break; + + // + case X_PRICE_OPEN: + // + ArrayCopy( + tmpArray, + conditions.xmanInfo.hkOpens, + 0, + index, + count // + ); + break; + + // + case X_PRICE_CLOSE: + // + ArrayCopy( + tmpArray, + conditions.xmanInfo.hkCloses, + 0, + index, + count // + ); + break; + + // + case X_PRICE_LOW: + // + ArrayCopy( + tmpArray, + conditions.xmanInfo.hkLows, + 0, + index, + count // + ); + break; + } + + // + idx = ArrayMinimum(tmpArray); + if (idx < 0) + { + return result; + } + + // + result = tmpArray[idx]; + + // + return result; +} + +// +double GetHKMin( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0, // Array Index + bool ignoreShadows = false // Ignore Shaddows +) +{ + // + double result = 0; + + // + result = MathMin(conditions.xmanInfo.hkOpens[index], conditions.xmanInfo.hkCloses[index]); + if (!ignoreShadows) + { + // + double selectedShadow = MathMin(conditions.xmanInfo.hkHighs[index], conditions.xmanInfo.hkLows[index]); + + // + result = MathMin(result, selectedShadow); + } + + // + return result; +} + +// +double GetSMHKMax( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0, // Array Index + bool ignoreShadows = false // Ignore Shaddows +) +{ + // + double result = 0; + + // + result = MathMax(conditions.xmanInfo.smhkOpens[index], conditions.xmanInfo.smhkCloses[index]); + if (!ignoreShadows) + { + // + double selectedShadow = MathMax(conditions.xmanInfo.smhkHighs[index], conditions.xmanInfo.smhkLows[index]); + + // + result = MathMax(result, selectedShadow); + } + + // + return result; +} + +// +double GetSMHKMin( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0, // Array Index + bool ignoreShadows = false // Ignore Shaddows +) +{ + // + double result = 0; + + // + result = MathMin(conditions.xmanInfo.smhkOpens[index], conditions.xmanInfo.smhkCloses[index]); + if (!ignoreShadows) + { + // + double selectedShadow = MathMin(conditions.xmanInfo.smhkHighs[index], conditions.xmanInfo.smhkLows[index]); + + // + result = MathMin(result, selectedShadow); + } + + // + return result; +} + +// +double iSMHKHighest( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0, // Array Index + int count = 5, // Count + ENUM_X_PRICE appliedPrice = X_PRICE_HIGH // Price Type +) +{ + // + double result = 0; + + // + // Validate Args ... + if (index < 0 || + count <= 0) + { + return result; + } + + // + int idx = -1; + double tmpArray[]; + + // + switch (appliedPrice) + { + // + case X_PRICE_HIGH: + // + ArrayCopy( + tmpArray, + conditions.xmanInfo.smhkHighs, + 0, + index, + count // + ); + break; + + // + case X_PRICE_OPEN: + // + ArrayCopy( + tmpArray, + conditions.xmanInfo.smhkOpens, + 0, + index, + count // + ); + break; + + // + case X_PRICE_CLOSE: + // + ArrayCopy( + tmpArray, + conditions.xmanInfo.smhkCloses, + 0, + index, + count // + ); + break; + + // + case X_PRICE_LOW: + // + ArrayCopy( + tmpArray, + conditions.xmanInfo.smhkLows, + 0, + index, + count // + ); + break; + } + + // + idx = ArrayMaximum(tmpArray); + if (idx < 0) + { + return result; + } + + // + result = tmpArray[idx]; + + // + return result; +} + +// +double iSMHKLowest( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0, // Array Index + int count = 5, // Count + ENUM_X_PRICE appliedPrice = X_PRICE_LOW // Price Type +) +{ + // + double result = 0; + + // + // Validate Args ... + if (index < 0 || + count <= 0) + { + return result; + } + + // + int idx = -1; + double tmpArray[]; + + // + switch (appliedPrice) + { + // + case X_PRICE_HIGH: + // + ArrayCopy( + tmpArray, + conditions.xmanInfo.smhkHighs, + 0, + index, + count // + ); + break; + + // + case X_PRICE_OPEN: + // + ArrayCopy( + tmpArray, + conditions.xmanInfo.smhkOpens, + 0, + index, + count // + ); + break; + + // + case X_PRICE_CLOSE: + // + ArrayCopy( + tmpArray, + conditions.xmanInfo.smhkCloses, + 0, + index, + count // + ); + break; + + // + case X_PRICE_LOW: + // + ArrayCopy( + tmpArray, + conditions.xmanInfo.smhkLows, + 0, + index, + count // + ); + break; + } + + // + idx = ArrayMinimum(tmpArray); + if (idx < 0) + { + return result; + } + + // + result = tmpArray[idx]; + + // + return result; +} + +// +bool IsHKBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + conditions.xmanInfo.hkOpens[index] < conditions.xmanInfo.hkCloses[index] + // + ; + + // + return result; +} + +// +bool IsHKBearish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + conditions.xmanInfo.hkOpens[index] > conditions.xmanInfo.hkCloses[index] + // + ; + + // + return result; +} + +// +bool IsSMHKBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + conditions.xmanInfo.smhkOpens[index] < conditions.xmanInfo.smhkCloses[index] + // + ; + + // + return result; +} + +// +bool IsSMHKBullishAs( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0, // Array Index + int count = 5 // Count +) +{ + // + bool result = false; + + // + int verified = 0; + for (int i = index; i < index + count; i++) + { + // + bool isTrue = IsSMHKBullish(conditions, i); + if (isTrue) + { + verified++; + } + } + + // + result = verified >= count; + + // + return result; +} + +// +bool IsSMHKChangedIn( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0, // Array Index + int length = 5 // Length +) +{ + // + bool result = false; + + // + bool isCurrentBullish = IsSMHKBullish(conditions, index); + + // + int numberOfChanges = 0; + bool isLastBullish = isCurrentBullish; + for (int i = index + 1; i < index + length; i++) + { + // + bool isBullish = IsSMHKBullish(conditions, i); + bool isBearish = IsSMHKBearish(conditions, i); + + // + if ((isBullish && isLastBullish) || (!isBullish && !isLastBullish)) + { + continue; + } + else if ((isBullish && !isLastBullish) || (isBearish && isLastBullish)) + { + numberOfChanges++; + } + } + + // + result = numberOfChanges > 0; + + // + return result; +} + +// +bool IsSMHKBearish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + conditions.xmanInfo.smhkOpens[index] > conditions.xmanInfo.smhkCloses[index] + // + ; + + // + return result; +} + +// +bool IsSMHKBearishAs( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0, // Array Index + int count = 5 // Count +) +{ + // + bool result = false; + + // + int verified = 0; + for (int i = index; i < index + count; i++) + { + // + bool isTrue = IsSMHKBearish(conditions, i); + if (isTrue) + { + verified++; + } + } + + // + result = verified >= count; + + // + return result; +} + +// +// END Functions ... +// + +// +// START Combination .... +// + +// +bool IsMarketBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsHullBullish(conditions, index) && + IsSSLCBullish(conditions, index) && + IsTrendBullish(conditions, index) && + IsRibbonBullish(conditions, index) + // + ; + + // + return result; +} + +// +bool IsMarketBearish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsHullBearish(conditions, index) && + IsSSLCBearish(conditions, index) && + IsTrendBearish(conditions, index) && + IsRibbonBearish(conditions, index) + // + ; + + // + return result; +} + +// +// END Combination .... +// + +// +// START EQM Supports ... +// + +// +// Generate a Collection Of Fib Signals ... +int GenerateSeqentialSignals( + XSignal &signals[], // Hold Result ... + double &pivots[], // Required Values For Generate Signals ... + string symbol, // Trading Symbol ... + ENUM_TIMEFRAMES period, // Trading Time Frame ... + double price, // Current Price Execution ... + double volume, // Volume ... + bool placeSL = false, // Place SL for Signals ... + bool placeTP = false, // Place TP for Signals ... + bool useBoundaryForTPSL = false, // Use Boundary Max Min for TP SL ... + double staticTP = 0, // Static TP ... + bool staticTPAsPoint = false, // Detect Static TP as Point ... + double staticSL = 0, // Static SL ... + bool staticSLAsPoint = false, // Detect Static SL as Point ... + bool longSupport = true, // Generate Long Support Signals ... + bool shortSupport = true, // Generate Short Support Signals ... + bool forceCleanSignalsArray = false // Clean Result Array ... +) +{ + // + int result = 0; + + // + if (forceCleanSignalsArray) + { + Clean(signals); + } + int beforeSize = ArraySize(signals); + + // + // Validate Input States ... + int pivotsCount = ArraySize(pivots); + if ( + // + price <= 0 || + volume <= 0 || + pivotsCount <= 0 + // + ) + { + return result; + } + + // + if (pivotsCount == 1) + { + // + bool isValidSL = + !placeSL + ? true + : staticSL > 0 + ? true + : false; + + // + bool isValidTP = + !placeTP + ? true + : staticTP > 0 + ? true + : false; + + // + if (!isValidTP && !isValidSL) + { + return result; + } + } + else if ((placeSL || placeTP) && pivotsCount < 3) + { + return result; + } + + // + if (!longSupport && !shortSupport) + { + return result; + } + + // + double slValue = !placeSL + ? 0 + : staticSLAsPoint + ? PointToPrice( + symbol, + staticSL) + : staticSL + // + ; + + // + double tpValue = !placeTP + ? 0 + : staticTPAsPoint + ? PointToPrice( + symbol, + staticTP) + : staticTP + // + ; + + // + // Do Signal Generation ... + double tp = 0; + double sl = 0; + XSignal signal; + double entry = 0; + ENUM_X_ORDER_MODES mode = NULL; + ENUM_POSITION_TYPE type = NULL; + + // + double boundaryMax = pivots[ArrayMaximum(pivots)]; + double boundaryMin = pivots[ArrayMinimum(pivots)]; + + // + double tmp[]; + Copy( + pivots, + tmp); + ArraySort(tmp); + + // + double biggerThanPrice[]; + Copy( + pivots, + biggerThanPrice); + ArraySort(biggerThanPrice); + double lesserThanPrice[]; + + // + bool breaking = false; + while (!breaking) + { + // + double lesser = -1; + lesser = FindLesserThanValue( + price, + biggerThanPrice, + true); + if (lesser > -1) + { + // + Add( + lesser, + lesserThanPrice); + + // + Remove( + lesser, + biggerThanPrice); + } + + // + breaking = ArraySize(biggerThanPrice) == 0 || lesser == -1; + } + + // + // Here we have act based on Biggers and Lessers ... + // - Lessers sorted from Large to Small ... + // this means Lesser[0] is Biggest Lesser value ... + // - Biggers sort Ordered Small to Large ... + // this means Bigger[0] is Smallest Bigger Value ... + + // + int biggersCount = ArraySize(biggerThanPrice); + int lessersCount = ArraySize(lesserThanPrice); + + // + if (longSupport) + { + // + // Directional ... + if (biggersCount > 0) + { + // + for (int i = 0; i < biggersCount; i++) + { + // + double iVal = biggerThanPrice[i]; + + // + // We have to Filter Boundary Max ... + if (iVal == boundaryMax) + { + // + // TODO: + // Also we can Do Support based on Previus Support and Resistances ... + continue; + } + + // + // Now we Sure the iVal is not the Boundary Max ... + + // + entry = iVal; + + // + // TP ... + if (placeTP) + { + // + // this means Static TP Provided ... + if (tpValue > 0) + { + tp = entry + tpValue; + } + // + // Use Boundary Max for TP ... + else if (useBoundaryForTPSL) + { + tp = boundaryMax; + } + // + // Find Biggest then Entry Value and Set it as TP ... + else + { + // + tp = FindBiggerThanValue( + entry, + tmp, + true); + if (tp <= 0) + { + tp = 0; + } + } + } + else + { + tp = 0; + } + + // + // SL ... + if (placeSL) + { + // + // this means Static SL Provided ... + if (slValue > 0) + { + sl = entry - slValue; + } + // + // Use Boundary Min for SL ... + if (useBoundaryForTPSL) + { + sl = boundaryMin; + } + // + // Else Find Lesser Than Entry Value and Set it as SL ... + else + { + // + sl = FindLesserThanValue( + entry, + tmp, + true); + if (sl <= 0) + { + sl = 0; + } + } + } + else + { + sl = 0; + } + + // + // Prepare to Create Signal ... + mode = X_ORDER_MODE_STOP; + type = POSITION_TYPE_BUY; + + // + signal = CreateSignal( + symbol, + period, + type, + mode, + entry, + volume, + tp, + sl); + + // + Add( + signal, + signals); + + // + Clean(signal); + } + } + + // + // TODO Reversal ... + if (shortSupport) + { + } + } + + // + if (shortSupport) + { + // + // Directional ... + if (lessersCount > 0) + { + // + for (int i = 0; i < lessersCount; i++) + { + // + double iVal = lesserThanPrice[i]; + + // + // We Have to Filter Boundary Min ... + if (iVal == boundaryMin) + { + // + // TODO: + // Also we can Do Support based on Previus Support and Resistances ... + continue; + } + + // + // Now we sure the iVal is not the Boundary Min ... + + // + entry = iVal; + + // + // TP ... + if (placeTP) + { + // + // this means static tp provider ... + if (tpValue > 0) + { + tp = entry - tpValue; + } + // + // Use Boundary Min for TP ... + else if (useBoundaryForTPSL) + { + tp = boundaryMin; + } + // + // Find Lesser than Entry Vlue and Set it as TP ... + else + { + tp = FindLesserThanValue( + entry, + tmp, + true); + if (tp <= 0) + { + tp = 0; + } + } + } + else + { + tp = 0; + } + + // + // SL ... + if (placeSL) + { + // + // this means Static SL provided ... + if (slValue > 0) + { + sl = entry + slValue; + } + // + // Use Boundary Max for SL ... + if (useBoundaryForTPSL) + { + sl = boundaryMax; + } + // + // Find Bigger Than Entry Vakue and Set it as SL ... + else + { + // + sl = FindBiggerThanValue( + entry, + tmp, + true); + if (sl <= 0) + { + sl = 0; + } + } + } + else + { + sl = 0; + } + + // + // Prepare to Create Signal ... + mode = X_ORDER_MODE_STOP; + type = POSITION_TYPE_SELL; + + // + signal = CreateSignal( + symbol, + period, + type, + mode, + entry, + volume, + tp, + sl); + + // + Add( + signal, + signals); + + // + Clean(signal); + } + } + + // + // TODO: Reversal ... + if (longSupport) + { + } + } + + // + int afterSize = ArraySize(signals); + result = afterSize - beforeSize; + + // + return result; +} + +// +// Generate Support Signals based On Support and Resistance Pivot Points ... +int GenerateSupportAndResistanceEQMSupports( + const X121MarketConditions &conditions, // Specified Conditions + const XPosition &inDPosition, // Supported Position + XSignal &supports[], // Holds Support Signals + const double &pivots[], // Support and Resistance Pivots + const double volume, // Supported Volume + const bool placeSL = false, // Place SL for Supports + const bool placeTP = false // Place TP for Supports +) +{ + // + int result = 0; + + // + int beforeSize = ArraySize(supports); + + // + int afterSize = ArraySize(supports) - beforeSize; + result = afterSize - beforeSize; + + // + return result; +} + +// +int GenerateFiboEQMSupports( + const X121MarketConditions &conditions, // Specified Conditions + const XPosition &inDPosition, // Supported Position + XSignal &supports[], // Holds Support Signals + const double &pivots[], // Support and Resistance Pivots + const double volume, // Supported Volume + const bool placeSL = false, // Place SL for Supports + const bool placeTP = false // Place TP for Supports +) +{ + // + int result = 0; + + // + int beforeSize = ArraySize(supports); + + // + double fib1 = conditions.xmanInfo.fibLevel1s[0]; + double fib2 = conditions.xmanInfo.fibLevel2s[0]; + double fib3 = conditions.xmanInfo.fibLevel3s[0]; + double fib4 = conditions.xmanInfo.fibLevel4s[0]; + double fib5 = conditions.xmanInfo.fibLevel5s[0]; + + // + double peak = conditions.xmanInfo.peaks[0]; + double vale = conditions.xmanInfo.vales[0]; + + // + double fibos[] = { + peak, + fib1, + fib2, + fib3, + fib4, + fib5, + vale}; + + // + double entry = GetEntry( + inDPosition.symbol, + inDPosition.type); + double exit = GetExit( + inDPosition.symbol, + inDPosition.type); + + // + double price = entry; + // IsLong(inDPosition.type) + // ? exit + // : entry; + // entry + exit / 2; + + // + GenerateSeqentialSignals( + supports, + fibos, + conditions.symbol, + conditions.period, + price, + volume, + placeSL, + placeTP, + true // + ); + + // + result = ArraySize(supports) - beforeSize; + + // + return result; +} + +// +int GenerateTrendBaseEQMSupports( + const X121MarketConditions &conditions, // Specified Conditions + const XPosition &inDPosition, // Supported Position + XSignal &supports[], // Holds Support Signals + const double volume, // Supported Volume + const bool placeSL = false, // Place SL for Supports + const bool placeTP = false // Place TP for Supports +) +{ + // + int result = 0; + + // + int beforeSize = ArraySize(supports); + + // + result = ArraySize(supports) - beforeSize; + + // + return result; +} + +// +int GenerateSupportAndResistanceEQMSupports( + const X121MarketConditions &conditions, // Specified Conditions + const XPosition &inDPosition, // Supported Position + const XOHCLSupRes &supRes, // Provided Supports and Resistances + XSignal &supports[], // Holds Support Signals + const double volume, // Supported Volume + const bool placeSL = false, // Place SL for Supports + const bool placeTP = false // Place TP for Supports +) +{ + // + int result = 0; + + // + int beforeSize = ArraySize(supports); + + // + double peak = conditions.xmanInfo.peaks[0]; + double vale = conditions.xmanInfo.vales[0]; + + // + bool isInDLong = + IsLong(inDPosition.type); + bool isLongSupport = !isInDLong; + ENUM_POSITION_TYPE type = + isLongSupport + ? POSITION_TYPE_BUY + : POSITION_TYPE_SELL; + + // + double entry = GetEntry(conditions.symbol, type); + + // + ENUM_TIMEFRAMES period = conditions.period; + + // + XSignal signal; + Clean(signal); + + // + signal.volume = volume; + signal.mode = X_ORDER_MODE_STOP; + signal.symbol = inDPosition.symbol; + signal.period = inDPosition.period; + + // + // find a Support nearest to Entry ... + double entryNearestSupport = FindLesserThanValue( + entry - conditions.momentumStep, + supRes.sup); + if (entryNearestSupport > 0 && entryNearestSupport < entry) + { + // + // BUY ... + signal.type = POSITION_TYPE_BUY; + signal.mode = X_ORDER_MODE_LIMIT; + + // + signal.entry = entryNearestSupport; + + // + signal.sl = placeSL + ? supRes.sup[ArraySize(supRes.sup) - 1] + : 0; + + // + signal.tp = placeTP + ? supRes.res[ArraySize(supRes.res) - 1] + : 0; + + // + Add( + signal, + supports // + ); + + // + // SELL ... + signal.type = POSITION_TYPE_SELL; + signal.mode = X_ORDER_MODE_STOP; + + // + signal.entry = entryNearestSupport; + + // + signal.sl = placeSL + ? supRes.res[ArraySize(supRes.res) - 1] + : 0; + + // + signal.tp = placeTP + ? supRes.sup[ArraySize(supRes.sup) - 1] + : 0; + + // + Add( + signal, + supports // + ); + } + + // + // find a Resistance nearest to Entry ... + double entryNearestResistance = FindBiggerThanValue( + entry + conditions.momentumStep, + supRes.res); + if (entryNearestResistance > 0 && entryNearestResistance > entry) + { + // + // BUY ... + signal.type = POSITION_TYPE_BUY; + signal.mode = X_ORDER_MODE_STOP; + + // + signal.entry = entryNearestResistance; + + // + signal.sl = placeSL + ? supRes.sup[ArraySize(supRes.sup) - 1] + : 0; + + // + signal.tp = placeTP + ? supRes.res[ArraySize(supRes.res) - 1] + : 0; + + // + Add( + signal, + supports // + ); + + // + // SELL ... + signal.type = POSITION_TYPE_SELL; + signal.mode = X_ORDER_MODE_LIMIT; + + // + signal.entry = entryNearestResistance; + + // + signal.sl = placeSL + ? supRes.res[ArraySize(supRes.res) - 1] + : 0; + + // + signal.tp = placeTP + ? supRes.sup[ArraySize(supRes.sup) - 1] + : 0; + + // + Add( + signal, + supports // + ); + } + + // + // Add Peaks and Vales Support and Resistance ... + signal.sl = placeSL ? vale : 0; + signal.entry = peak; + signal.tp = placeTP ? 0 : 0; + + // + result = ArraySize(supports) - beforeSize; + + // + return result; +} +// +// END EQM Supports ... +// \ No newline at end of file diff --git a/MQLTestWorkspace/BKPS/14030222/Classes/x-saherelm.http.class.ex5 b/MQLTestWorkspace/BKPS/14030222/Classes/x-saherelm.http.class.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..03f82bbe38eedadbd5a631742b5f23f92c87d3fa GIT binary patch literal 6202 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 F{|o3js 0; + + // + return result; + } + + // + // END Provided Functions ... + // + + // + // Protected ... +protected: + // + // Destintion Folder Path ... + string mPath; + + // + // WEB Request Timeout Value ... + int mTimeout; + + // + // WEB Request's Response ... + string mResponse; + + // + // Error Value ... + int mError; + + // + // Private ... +private: + // + // Reset Errors State ... + void ResetState() + { + // + // Reset Errors ... + mError = -1; + mResponse = ""; + ResetLastError(); + } + + // + // Generate Full File Path ... + string GetFilePath(string fileName) + { + // + string result = ""; + + // + result = + // + Path() + "\\" + fileName + // + ; + + // + return result; + } +}; + +// +// START Usefull Functions ... +// + +// +// END Usefull Functions ... +// diff --git a/MQLTestWorkspace/BKPS/14030222/Classes/x-saherelm.x121.provider.class.mq5 b/MQLTestWorkspace/BKPS/14030222/Classes/x-saherelm.x121.provider.class.mq5 new file mode 100644 index 0000000..1a6c37e --- /dev/null +++ b/MQLTestWorkspace/BKPS/14030222/Classes/x-saherelm.x121.provider.class.mq5 @@ -0,0 +1,1760 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Class Library +// ---------------------------------------------- +// Name: XSCX121Provider +// Description: X121 Signal Provider ... +// +// +// 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 + +// +// START Definitions ... +// + +// +// START Import and Inclused requirements ... +// + +// +// Includes ... +#include "../Classes/x-saherelm.xprovider.class.mq5" +#include "../Helpers/x-saherelm.x121.xman.helper.class.mq5" + +// +// Library ... +#include "../Libraries/x-saherelm.seriallizer.lib.mq5" + +// +// END Import and Inclused requirements ... +// + +// +// Here we Have to Define an Input Structure Model +// for Provider Class to Handle Helpers Definitions ... +struct X121ProviderInputs +{ + // + // XMAN ... + XMANInputs xmanConfig; +}; + +// +// Model Market Sense based On Current Captured conditions ... +struct X121MarketConditions +{ + // + // Commonly Used Info ... + + // + // Symbol ... + string symbol; + + // + // Period ... + ENUM_TIMEFRAMES period; + + // + // Bar Time ... + datetime barTime; + + // + XCandleRemains barRemains; + + // + // Bar Index ... + int barIndex; + + // + // Check Current Market Condition has Signal or not ... + bool hasSignal; + + // + // If has any Signal, Models it's related info here ... + XSignal signal; + + // + // Support and Resistances ... + // if provides Signal ... + XOHCLSupRes supportResistances; + + // + // Change Price Steps ... + double momentumStep; + + // + XOHCL candles[]; + + // + // INDICATORS Market Sense ... + + // + // XMAN ... + XMANInfo xmanInfo; +}; + +// +#include "../Libraries/x-saherelm.x121.x92.lib.mq5" +#include "../Libraries/x-saherelm.x121.x786.lib.mq5" +#include "../Libraries/x-saherelm.x121.xtest.lib.mq5" +#include "../Libraries/x-saherelm.x121.condition.parser.lib.mq5" + +// +// Notified a Signal was Appears ... +typedef void (*TOnSignalConditions)( + X121MarketConditions &info); + +// +// All Available Signal Types ... +enum ENUM_X121_SIGNAL_PROVIDERS +{ + NONE, // NONE ... + XTEST, // TEST ... + X786, // Hadi Khazaee Asl ... + X92, // Hadi Khazaee Asl ... +}; + +// +// END Definitions ... +// + +// +// START Overrides ... +// + +// +// END Overrides ... +// + +// +// a Base Class for All of our EA's ... +class XSCX121Provider : public XSCEABaseProvider +{ + // + // Public ... +public: + // + // Props ... + X121ProviderInputs providedConfig; + X121ProviderInputs currentConfig; + X121ProviderInputs cleanConfig; + + // + // Indicator Helper Classes Instance ... + + // + // XMAN ... + XSCXMANHelper *mXManHelper; + + // + // Pivot Points ... + + // + // Hull and SSL Pivot Points ... + double upZonePivots[]; + double downZonePivots[]; + + // + // Peaks and Vales Verifications Number ... + double peakPivots[]; + double valePivots[]; + + // + double cyclesHHPivots[]; + double cyclesLLPivots[]; + + // + double fibPivots[]; + + // + int pivotsSequentialCount; + + // + // Constructor ... + void XSCX121Provider( + string symbol, // Trading Symbol ... + ENUM_TIMEFRAMES period, // Trading Time Frame ... + bool ignoreTicksAfterSignalTillNewCandle // Ignore Ticks after Recieved a Signal Till new Candle ... + ) : XSCEABaseProvider(symbol, period, ignoreTicksAfterSignalTillNewCandle) + { + // + mMinPivots = 200; + pivotsSequentialCount = 35; + + // + PrepareTag(); + } + + // + // Deconstructor ... + void ~XSCX121Provider() + { + // + // De construct Helpers ... + delete mXManHelper; + } + + // + virtual void PrepareTag() + { + mTag = "X121Provider((" + mSymbol + ")(" + ToString(mPeriod) + ")"; + } + + // + virtual bool Init() + { + // + bool result = false; + + // + // Instantiate all Indicators Helper Classes ... + + // + // XMAN ... + mXManHelper = new XSCXMANHelper( + mSymbol, + mPeriod); + result = mXManHelper.SetConfig(currentConfig.xmanConfig); + + // + return result; + } + + // + virtual int GetMaxLength() + { + // + int result = -1; + + // + result = MathMax(result, mXManHelper.GetMaxLength()); + + // + return result; + } + + // + virtual int GetCalculatedBars() + { + // + int result = -1; + + // + int mXManBars = mXManHelper.GetCalculatedBars(); + + // + int min = MathMin(1, mXManBars); + + // + int max = MathMax(1, mXManBars); + + // + result = min; + + // + return result; + } + + // + virtual void ProcessBuffers() + { + UpdatePivotPoints(); + } + + // + virtual bool ProcessTick(X121MarketConditions &conditions) + { + // + if (CanIgnoreTick()) + { + return false; + } + + // + return ProcessSignals(conditions); + } + + // + int GetMinPivots() + { + return mMinPivots; + } + + // + X121ProviderInputs GetConfig() + { + // + X121ProviderInputs result; + + // + result = currentConfig; + + // + return result; + } + + // + // Set Available Signallers ... + bool SetSignallers( + string &signallers[]) + { + // + bool result = false; + + // + result = ArraySize(signallers) > 0; + if (!result) + { + return result; + } + + // + Copy( + signallers, + mSignallers); + + // + return result; + } + + // + bool SetConfig(X121ProviderInputs &config) + { + // + bool result = false; + + // + PrepareConfig(config); + + // + result = Init(); + + // + return result; + } + + // + bool ResetDefaultConfig() + { + // + bool result = SetConfig(providedConfig); + + // + return result; + } + + // + bool ShowCleanConfig() + { + // + currentConfig = cleanConfig; + + // + bool result = Init(); + + // + return result; + } + + // + bool ShowDefaultConfig() + { + // + currentConfig = providedConfig; + + // + bool result = Init(); + + // + return result; + } + + // + bool IsAllowedSignaller( + ENUM_X121_SIGNAL_PROVIDERS provider // Signal Provider + ) + { + // + bool result = false; + + // + string providerStr = ToString(provider); + + // + result = Contains( + providerStr, + mSignallers); + + // + return result; + } + + // + // Generate Market Sense ... + X121MarketConditions GetMarketConditions( + int barIndex // Specified Bar Index + ) + { + // + X121MarketConditions result; + + // + // Fill Common Data ... + result.symbol = mSymbol; + result.period = mPeriod; + result.barIndex = barIndex; + + // + datetime barTime = GetCandleTime( + mSymbol, + mPeriod, + barIndex); + result.barTime = barTime; + + // + int remainedCandle = barIndex > 0 + ? barIndex - 1 + : barIndex; + GetCandleRemainsTime( + result.barRemains, + mSymbol, + mPeriod, + remainedCandle); + + // + // Attach Candles Info in XOHCL Model to Conditions ... + int mLoopBackBars = mXManHelper.Loopback(); + XOHCL candles[]; + GetCandles( + candles, + mSymbol, + mPeriod, + 0, + mLoopBackBars); + Copy( + candles, + result.candles); + Clean(candles); + + // + result.xmanInfo = mXManHelper.GetInfo(barIndex); + + // + return result; + } + + // + bool GuardCheck(XGuard &guards[]) + { + // + bool result = false; + + // + Clean(guards); + + // + // Implement Guards Check ... + X121MarketConditions mConditions = GetMarketConditions(1); + + // + // X786 ... + bool canCheckX786 = IsAllowedSignaller(X786); + if (canCheckX786) + { + // + // Check Stop Trailings ... + + // + // Longs ... + double longSL = 0; + bool canTrailLongStops = CanX786TrailLongsStop( + mConditions, + longSL); + // + // TODO: Remove this ... + canTrailLongStops = false; + if (canTrailLongStops) + { + // + XGuard guard; + + // + guard.symbol = mSymbol; + guard.period = mPeriod; + guard.provider = ToString(X786); + guard.type = POSITION_TYPE_BUY; + guard.action = X_GUARD_ACTION_TRAIL_STOP; + + // + guard.dblPayLoad = longSL; + + // + Add( + guard, + guards); + } + + // + // Shorts ... + double shortSL = 0; + bool canTrailShortStops = CanX786TrailShortsStop( + mConditions, + shortSL); + // + // TODO: Remove this ... + canTrailShortStops = false; + if (canTrailShortStops) + { + // + XGuard guard; + + // + guard.symbol = mSymbol; + guard.period = mPeriod; + guard.provider = ToString(X786); + guard.type = POSITION_TYPE_SELL; + guard.action = X_GUARD_ACTION_TRAIL_STOP; + + // + guard.dblPayLoad = shortSL; + + // + Add( + guard, + guards); + } + + // + // Check Force Close ... + bool canForceCloseLongs = CanX786ForceCloseLongs(mConditions); + canForceCloseLongs = false; + if (canForceCloseLongs) + { + // + XGuard guard; + + // + guard.symbol = mSymbol; + guard.period = mPeriod; + guard.provider = ToString(X786); + guard.type = POSITION_TYPE_BUY; + guard.action = X_GUARD_ACTION_FORCE_CLOSE; + + // + Add( + guard, + guards); + } + + // + // Check Hedghe ... + bool hedgeX786 = false; + if (hedgeX786) + { + // + XGuard guard; + + // + guard.type = NULL; + guard.symbol = mSymbol; + guard.period = mPeriod; + guard.provider = ToString(X786); + guard.action = X_GUARD_ACTION_HEDGE; + + // + Add( + guard, + guards); + } + } + + // + result = ArraySize(guards) > 0; + + // + return result; + } + + // + // Add Specific On SignalConditions Event Handler ... + int AddOnSignalConditionEventHandler(TOnSignalConditions handler) + { + // + ArrayResize( + mSignalConditionsEventHandlers, + ArraySize(mSignalConditionsEventHandlers) + 1); + + // + int result = ArraySize(mSignalConditionsEventHandlers) - 1; + mSignalConditionsEventHandlers[result] = handler; + + // + return result; + } + + // + // Remove All On Signal Event Handler ... + void ReoveOnSignalEventHandlers() + { + // + ArrayFree(mSignalConditionsEventHandlers); + } + + // + // Notify a Signal Found on all Event Listeners ... + void NotifyOnSignalConditionsEvent(X121MarketConditions &info) + { + // + int listenerCount = ArraySize(mSignalConditionsEventHandlers); + if (listenerCount <= 0) + { + return; + } + + // + // Loop Through Listeners ... + for (int i = 0; i < listenerCount; i++) + { + // + TOnSignalConditions listener = mSignalConditionsEventHandlers[i]; + + // + listener(info); + } + } + + // + // PIVOTS ... + + // + // Start Pivots Scanning on Instance Creation ... + void ProccessPivotPoints() + { + // + if (mStartPivotScan) + { + return; + } + + // + mStartPivotScan = true; + + // + int scanSize = iBars( + mSymbol, + mPeriod) - + 500; + + // + for (int i = 1; i < scanSize; i++) + { + // + UpdatePivotPoints(i); + + // + int pivotsCount = CountPivots(); + if (pivotsCount >= mMinPivots) + { + break; + } + } + } + + // + // Count Current Pivots ... + int CountPivots() + { + // + int pivotSizes[]; + + // + int upZoneCount = ArraySize(upZonePivots); + if (upZoneCount > 0) + { + // + Add( + upZoneCount, + pivotSizes); + } + + // + int downZoneCount = ArraySize(downZonePivots); + if (downZoneCount > 0) + { + // + Add( + downZoneCount, + pivotSizes); + } + + // + int peaksCount = ArraySize(peakPivots); + if (peaksCount > 0) + { + // + Add( + peaksCount, + pivotSizes); + } + + // + int valesCount = ArraySize(valePivots); + if (valesCount > 0) + { + // + Add( + valesCount, + pivotSizes); + } + + // + int fibsCount = ArraySize(fibPivots); + if (fibsCount > 0) + { + // + Add( + fibsCount, + pivotSizes); + } + + // + int cyclesHHsCount = ArraySize(cyclesHHPivots); + if (cyclesHHsCount > 0) + { + // + Add( + cyclesHHsCount, + pivotSizes); + } + + // + int cyclesLLsCount = ArraySize(cyclesLLPivots); + if (cyclesLLsCount > 0) + { + // + Add( + cyclesHHsCount, + pivotSizes); + } + + // + int result = ArraySize(pivotSizes) > 0 + ? pivotSizes[ArrayMaximum(pivotSizes)] + : 0; + + // + return result; + } + + // + // Fill Pivot Points ... + int FillPivotPoints( + double &result[] // Hold Result + ) + { + // + int mResult = 0; + + // + Clean(result); + + // + int pCount = CountPivots(); + if (pCount <= 0) + { + return mResult; + } + + // + AddsIfNotExists( + upZonePivots, + result); + + // + AddsIfNotExists( + downZonePivots, + result); + + // + AddsIfNotExists( + peakPivots, + result); + + // + AddsIfNotExists( + valePivots, + result); + + // + AddsIfNotExists( + fibPivots, + result); + + // + AddsIfNotExists( + cyclesHHPivots, + result); + + // + AddsIfNotExists( + cyclesLLPivots, + result); + + // + mResult = ArraySize(result); + + // + return mResult; + } + + // + // Generate Exists Support and Resistance based on Given Price ... + XOHCLSupRes GenerateSupportAndResistance( + double price, // Specified Price + int count = 10 // Number of Pivots in Each Side + ) + { + // + XOHCLSupRes result; + + // + UpdatePivotPoints(0); + + // + double pivots[]; + FillPivotPoints(pivots); + + // + // Generate Support and Resistances ... + result = ExtractSupportAndResistance( + price, + pivots, + count); + + // + return result; + } + + // + // Protected ... +protected: + // + // Private ... +private: + // + // CCandle Timer ... + int mCTimerHandler; + + // + // Signal Event Handlers ... + TOnSignalConditions mSignalConditionsEventHandlers[]; + + // + // Make Provided Config in Clean Style ... + void PrepareConfig(X121ProviderInputs &config) + { + // + cleanConfig = config; + + // + // XMAN ... + cleanConfig.xmanConfig.showCandleTimer = false; + cleanConfig.xmanConfig.showCandles = false; + cleanConfig.xmanConfig.showHKCandles = false; + cleanConfig.xmanConfig.showPeaksAndVales = false; + cleanConfig.xmanConfig.showTrends = false; + cleanConfig.xmanConfig.fillTrends = false; + cleanConfig.xmanConfig.showLevels = false; + cleanConfig.xmanConfig.showConsolidations = false; + cleanConfig.xmanConfig.showRibbons = false; + cleanConfig.xmanConfig.showHull = false; + cleanConfig.xmanConfig.showSSLChannel = false; + cleanConfig.xmanConfig.showFibo1Levels = false; + cleanConfig.xmanConfig.showFibo2Levels = false; + cleanConfig.xmanConfig.showFibo3Levels = false; + + // + providedConfig = config; + currentConfig = config; + } + + // + void Calculate(int barIndex) + { + // + mXManHelper.Calculate(barIndex); + } + + // + int mMinPivots; + bool mStartPivotScan; + double mLastMomentumStep; + + // + // Find Required Pivots for Support and Resistance ... + void UpdatePivotPoints( + int barIndex = 0 // Specified Candle ... + ) + { + // + Calculate(barIndex); + + // + // Detect Peask and Vales Pivots ... + + // + // Detect Hull Pivots ... + // find Hull Trend Changes ... + int idx = 0; + + // + // Retrieve XMan Info ... + // since it's the only one Indicator which provides Data here ... + XMANInfo info = mXManHelper.GetInfo(barIndex); + + // + // Define some Variable to count Verified Sequences ... + int fib1Verified = 0; + int fib2Verified = 0; + int fib3Verified = 0; + int peakVerified = 0; + int valeVerified = 0; + int scHHVerified = 0; + int scLLVerified = 0; + int mcHHVerified = 0; + int mcLLVerified = 0; + int lcHHVerified = 0; + int lcLLVerified = 0; + int hcHHVerified = 0; + int hcLLVerified = 0; + + // + // Here we have to select Points to verify their Sequential repeats ... + + // + // Slect Fibonacci Values ... + double selectedFib1 = info.fibLevel1s[idx]; + double selectedFib2 = info.fibLevel2s[idx]; + double selectedFib3 = info.fibLevel3s[idx]; + + // + // Select Peaks and Vales ... + double selectedPeak = info.peaks[idx]; + double selectedVale = info.vales[idx]; + + // + // Select Cycles Highest Highs ... + double selectedSCHH = info.sHHs[idx]; + double selectedMCHH = info.mHHs[idx]; + double selectedLCHH = info.lHHs[idx]; + double selectedHCHH = info.hHHs[idx]; + + // + // Select Cycles Lowest Lows ... + double selectedSCLL = info.sLLs[idx]; + double selectedMCLL = info.mLLs[idx]; + double selectedLCLL = info.lLLs[idx]; + double selectedHCLL = info.hLLs[idx]; + + // + // Now we Have to Loop Bars Until Fillup Required + // Pivots or END available Bars ... + int startIndex = idx; + int endIndex = pivotsSequentialCount + idx + 1; + for (int i = startIndex; i < endIndex; i++) + { + // + int idx = i - startIndex; + + // + // Now We Have to Compare each Selected Value with indexed value ... + + // + // Peaks ... + if (selectedPeak == info.peaks[i]) + { + peakVerified++; + } + else + { + peakVerified = 0; + } + + // + // Vales ... + if (selectedVale == info.vales[i]) + { + valeVerified++; + } + else + { + valeVerified = 0; + } + + // + // Fibo 1 ... + if (selectedFib1 == info.fibLevel1s[i]) + { + fib1Verified++; + } + else + { + fib1Verified = 0; + } + + // + // Fibo 2 ... + if (selectedFib2 == info.fibLevel2s[i]) + { + fib2Verified++; + } + else + { + fib2Verified = 0; + } + + // + // Fibo 3 ... + if (selectedFib3 == info.fibLevel3s[i]) + { + fib3Verified++; + } + else + { + fib3Verified = 0; + } + + // + // SCHH ... + if (selectedSCHH == info.sHHs[i]) + { + scHHVerified++; + } + else + { + scHHVerified = 0; + } + + // + // SCLL ... + if (selectedSCLL == info.sLLs[i]) + { + scLLVerified++; + } + else + { + scLLVerified = 0; + } + + // + // MCHH ... + if (selectedMCHH == info.mHHs[i]) + { + mcHHVerified++; + } + else + { + mcHHVerified = 0; + } + + // + // MCLL ... + if (selectedMCLL == info.mLLs[i]) + { + mcLLVerified++; + } + else + { + mcLLVerified = 0; + } + + // + // LCHH ... + if (selectedLCHH == info.lHHs[i]) + { + lcHHVerified++; + } + else + { + lcHHVerified = 0; + } + + // + // LCLL ... + if (selectedLCLL == info.lLLs[i]) + { + lcLLVerified++; + } + else + { + lcLLVerified = 0; + } + + // + // HCHH ... + if (selectedHCHH == info.hHHs[i]) + { + hcHHVerified++; + } + else + { + hcHHVerified = 0; + } + + // + // HCLL ... + if (selectedHCLL == info.hLLs[i]) + { + hcLLVerified++; + } + else + { + hcLLVerified = 0; + } + } + + // + // Now we Have to check Verifications of each + // Selected Values and if their Passed Sequential Count + // we add them as Pivot Points ... + + // + // Peaks ... + if (peakVerified >= pivotsSequentialCount) + { + // + AddIfNotExists( + selectedPeak, + peakPivots); + } + + // + // Vales ... + if (valeVerified >= pivotsSequentialCount) + { + // + AddIfNotExists( + selectedVale, + valePivots); + } + + // + // Fib 1 ... + if (fib1Verified >= pivotsSequentialCount) + { + // + AddIfNotExists( + selectedFib1, + fibPivots); + } + + // + // Fib 2 ... + if (fib2Verified >= pivotsSequentialCount) + { + // + AddIfNotExists( + selectedFib2, + fibPivots); + } + + // + // Fib 3 ... + if (fib3Verified >= pivotsSequentialCount) + { + // + AddIfNotExists( + selectedFib3, + fibPivots); + } + + // + // SCHH ... + if (scHHVerified >= pivotsSequentialCount) + { + // + AddIfNotExists( + selectedSCHH, + cyclesHHPivots); + } + + // + // SCLL ... + if (scLLVerified >= pivotsSequentialCount) + { + // + AddIfNotExists( + selectedSCLL, + cyclesLLPivots); + } + + // + // MCHH ... + if (mcHHVerified >= pivotsSequentialCount) + { + // + AddIfNotExists( + selectedMCHH, + cyclesHHPivots); + } + + // + // MCLL ... + if (mcLLVerified >= pivotsSequentialCount) + { + // + AddIfNotExists( + selectedMCLL, + cyclesLLPivots); + } + + // + // LCHH ... + if (lcHHVerified >= pivotsSequentialCount) + { + // + AddIfNotExists( + selectedLCHH, + cyclesHHPivots); + } + + // + // LCLL ... + if (lcLLVerified >= pivotsSequentialCount) + { + // + AddIfNotExists( + selectedLCLL, + cyclesLLPivots); + } + + // + // HCHH ... + if (hcHHVerified >= pivotsSequentialCount) + { + // + AddIfNotExists( + selectedHCHH, + cyclesHHPivots); + } + + // + // HCLL ... + if (hcLLVerified >= pivotsSequentialCount) + { + // + AddIfNotExists( + selectedHCLL, + cyclesLLPivots); + } + } + + // + // Available Signallers ... + string mSignallers[]; + + // + // Here we are Capture Conditions and Check Signals ... + // The Signals Must be Unique for each providers ... + bool ProcessSignals(X121MarketConditions &conditions) + { + // + X121MarketConditions mConditions = GetMarketConditions(1); + + // + // BUY ... + + // + Clean(mConditions.signal); + bool hasLongSignal = HasLongSignal(mConditions); + if (hasLongSignal) + { + // + NotifyOnSignalEvent( + mConditions.signal); + NotifyOnSignalConditionsEvent(mConditions); + mWaitUntilNewCandle = true; + + // + conditions = mConditions; + return true; + } + + // + // SELL ... + + // + Clean(mConditions.signal); + bool hasShortignal = HasShortSignal(mConditions); + if (hasShortignal) + { + // + NotifyOnSignalEvent( + mConditions.signal); + NotifyOnSignalConditionsEvent(mConditions); + mWaitUntilNewCandle = true; + + // + conditions = mConditions; + return true; + } + + // + return false; + } + + // + // Check has Long Signal on Each Strategies ... + bool HasLongSignal(X121MarketConditions &conditions) + { + // + bool result = false; + + // + ENUM_POSITION_TYPE type = POSITION_TYPE_BUY; + + // + // Retrieve Pivot Points ... + double entry = GetEntry( + conditions.symbol, + type); + + double pivots[]; + FillPivotPoints(pivots); + XOHCLSupRes supRes = ExtractSupportAndResistance( + entry, + pivots, + 15); + + // + // Cleaning Market Conditions Signal Structure ... + Clean(conditions.signal); + conditions.hasSignal = false; + + // + // XTEST ... + bool xTestHasSignal = false; + bool canCheckXTest = IsAllowedSignaller(XTEST); + if (canCheckXTest) + { + // + xTestHasSignal = + // + GenerateXTESTSignal( + conditions, + supRes, + type) + // + ; + } + + // + // X786 ... + bool x786HasSignal = false; + bool canCheckX786 = IsAllowedSignaller(X786); + if (canCheckX786) + { + // + x786HasSignal = + // + GenerateX786Signal( + conditions, + supRes, + type) + // + ; + } + + // + // X92 ... + bool x92HasSignal = false; + bool canCheckX92 = IsAllowedSignaller(X92); + if (canCheckX92) + { + // + x92HasSignal = + // + GenerateX92Signal( + conditions, + supRes, + type) + // + ; + } + + // + result = + // + xTestHasSignal + // + || + // + x786HasSignal + // + || + // + x92HasSignal + // + ; + + // + if (result) + { + // + conditions.supportResistances = supRes; + conditions.momentumStep = mLastMomentumStep; + } + + // + return result; + } + + // + // Check has Short Signal on Each Strategies ... + bool HasShortSignal(X121MarketConditions &conditions) + { + // + bool result = false; + + // + ENUM_POSITION_TYPE type = POSITION_TYPE_SELL; + + // + // Retrieve Pivot Points ... + double entry = GetEntry( + conditions.symbol, + type); + + double pivots[]; + FillPivotPoints(pivots); + XOHCLSupRes supRes = ExtractSupportAndResistance( + entry, + pivots, + 15); + + // + // Cleaning Market Conditions Signal Structure ... + Clean(conditions.signal); + conditions.hasSignal = false; + + // + // XTEST ... + bool xTestHasSignal = false; + bool canCheckXTest = IsAllowedSignaller(XTEST); + if (canCheckXTest) + { + // + xTestHasSignal = + // + GenerateXTESTSignal( + conditions, + supRes, + type) + // + ; + } + + // + // X786 ... + bool x786HasSignal = false; + bool canCheckX786 = IsAllowedSignaller(X786); + if (canCheckX786) + { + // + x786HasSignal = + // + GenerateX786Signal( + conditions, + supRes, + type) + // + ; + } + + // + // x92 ... + bool x92HasSignal = false; + bool canCheckX92 = IsAllowedSignaller(X92); + if (canCheckX92) + { + // + x92HasSignal = + // + GenerateX92Signal( + conditions, + supRes, + type) + // + ; + } + + // + result = + // + xTestHasSignal + // + || + // + x786HasSignal + // + || + // + x92HasSignal + // + ; + + // + if (result) + { + // + conditions.supportResistances = supRes; + conditions.momentumStep = mLastMomentumStep; + } + + // + return result; + } +}; + +// +// START Definitions ... +// + +// +// Model Signal Providers Definitions ... +struct X121SignalProvider +{ + // + // Provider use Which Symbol ... + string symbol; + + // + // Allowed Providers ... + string providers[]; + + // + // Provider use Which Time Frame ... + ENUM_TIMEFRAMES period; + + // + // Risk Amount Per Trades Related to Time Frames ... + // Percent of Available Balance ... + double riskAmount; + + // + // Use Provided Risk Amount as Static Volume ... + bool useRiskAmountAsStaticVolume; + + // + // Provider ... + XSCX121Provider *provider; +}; + +// +// END Definitions ... +// + +// +// START Usefull Functions ... +// + +// +// Add Specific Provider to List ... +void Add( + X121SignalProvider &item, // item want to add + X121SignalProvider &buffer[] // Destination buffer +) +{ + // + ArrayResize( + buffer, + ArraySize(buffer) + 1); + + // + buffer[ArraySize(buffer) - 1] = item; +} + +// +// Generate Identifier Tag ... +string GenerateTag(X121SignalProvider &descriptor) +{ + // + string result = ""; + + // + result = descriptor.symbol + "," + ToString(descriptor.period); + + // + return result; +} + +// +// Converts a Signal provider to String ... +string ToString(ENUM_X121_SIGNAL_PROVIDERS provider) +{ + return EnumToString(provider); +} + +// +// convert an String to Signal provider ... +ENUM_X121_SIGNAL_PROVIDERS ToProvider(string provider) +{ + // + ENUM_X121_SIGNAL_PROVIDERS result = NONE; + + // + if (ToString(NONE) == provider) + { + result = NONE; + } + else if (ToString(XTEST) == provider) + { + result = XTEST; + } + else if (ToString(X786) == provider) + { + result = X786; + } + else if (ToString(X92) == provider) + { + result = X92; + } + // else if (ToString(X110) == provider) + // { + // result = X110; + // } + // else if (ToString(X121) == provider) + // { + // result = X121; + // } + // else if (ToString(X128) == provider) + // { + // result = X128; + // } + + // + return result; +} + +// +// Extract Provider Type from Signal Commnet ... +ENUM_X121_SIGNAL_PROVIDERS ExtractPositionProvider(XPosition &position) +{ + // + ENUM_X121_SIGNAL_PROVIDERS result = NONE; + + // + string providerStr = + ExtractString( + position.comment, + XProviderToken + "(", + ")"); + if (StringLen(providerStr) <= 0) + { + return result; + } + + // + result = ToProvider(providerStr); + + // + return result; +} + +// +// List All Available Providers ... +void GetAllProviders( + ENUM_X121_SIGNAL_PROVIDERS &result[] // Hold Result ... +) +{ + // + Clean(result); + + // + // XTEST ... + ArrayResize( + result, + ArraySize(result) + 1); + result[ArraySize(result) - 1] = XTEST; + + // + // X786 ... + ArrayResize( + result, + ArraySize(result) + 1); + result[ArraySize(result) - 1] = X786; + + // + // X92 ... + ArrayResize( + result, + ArraySize(result) + 1); + result[ArraySize(result) - 1] = X92; + + // // + // // X110 ... + // ArrayResize( + // result, + // ArraySize(result) + 1); + // result[ArraySize(result) - 1] = X110; + + // // + // // X121 ... + // ArrayResize( + // result, + // ArraySize(result) + 1); + // result[ArraySize(result) - 1] = X121; + + // // + // // X128 ... + // ArrayResize( + // result, + // ArraySize(result) + 1); + // result[ArraySize(result) - 1] = X128; +} + +// +// Lis All Available Providers ... +void GetAllProviders( + string &result[] // Hold Result ... +) +{ + // + Clean(result); + + // + ENUM_X121_SIGNAL_PROVIDERS providers[]; + GetAllProviders(providers); + int providersCount = ArraySize(providers); + if (providersCount <= 0) + { + return; + } + + // + for (int i = 0; i < providersCount; i++) + { + // + ENUM_X121_SIGNAL_PROVIDERS iProvider = providers[i]; + + // + Add( + ToString(iProvider), + result); + } +} + +// +// END Usefull Functions ... +// diff --git a/MQLTestWorkspace/BKPS/14030222/Classes/x-saherelm.x121.xea.class.mq5 b/MQLTestWorkspace/BKPS/14030222/Classes/x-saherelm.x121.xea.class.mq5 new file mode 100644 index 0000000..bc8c9ec --- /dev/null +++ b/MQLTestWorkspace/BKPS/14030222/Classes/x-saherelm.x121.xea.class.mq5 @@ -0,0 +1,1864 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Class Library +// ---------------------------------------------- +// Name: XSCX121EA +// Description: an Expert Class which +// used X121 Setup ... +// +// +// 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 + +// +// START Import and Inclused requirements ... +// + +// +// Includes ... +#include "../Classes/x-saherelm.xea.class.mq5" +#include "../Libraries/x-saherelm.x121.draw.lib.mq5" +#include "../Classes/x-saherelm.x121.provider.class.mq5" + +// +// END Import and Inclused requirements ... +// + +// +// START Definitions ... +// + +// +// END Definitions ... +// + +// +// START Overrides ... +// + +// +// END Overrides ... +// + +// +// an Expert Advisor Class by X121Provider ... +class XSCX121EA : public XSCBaseEA +{ + // + // Public ... +public: + // + // Props ... + + // + // Constructor ... + void XSCX121EA( + string symbol, // Trading Symbol + ENUM_TIMEFRAMES period, // Trading Time Frame + ulong magic, // Magic Number + int slippage, // Slippgae + double maxAllowedSpread = 0, // Max Allowed Spread to Execute Signal + int maxAllowedPositions = 0, // Maximum Allowed Same Time Position + double minProfitPerTrade = 0, // Min Profit Per Trade based On Volume Factor (Hedge) + double minProfitPerVolumeFactor = 0, // Min Volume Factor for Calculating Profit (Hedge) + double maxAllowedDrawDownFactor = 0, // Max Allowed Drawdown factor for Open New Positions + TOnStopLoss onStopLossTriggered = NULL, // On StopLoass Triggered Event Handler + TOnTakeProfit onTakeProfitTriggered = NULL, // On TakeProfit Triggered Event Handler + TOnDealsChanged onDealsChangedHandler = NULL, // On Deals Changed Event Handler + TOnOrdersChanged onOrdersChangedHandler = NULL, // On Orders Changed Event Handler + TOnPositionsChanged onPositionsChangedHandler = NULL, // On Positions Changed Event Handler + TOnTradeStateChanged onTradeStateChangedHandler = NULL, // On Trade State Changed Event Handler + // + int minAgeForDoSupport = 0, // Minimum Position Age for Do Supporting + int minAgeForUpdateSupports = 0, // Minimum Age for Update Untriggered Support Orders + TOnSignalConditions onSignalConditions = NULL // On SignalConditions Event Handler + ) : XSCBaseEA(symbol, + period, + magic, + slippage, + maxAllowedSpread, + maxAllowedPositions, + minProfitPerTrade, + minProfitPerVolumeFactor, + maxAllowedDrawDownFactor, + onStopLossTriggered, + onTakeProfitTriggered, + onDealsChangedHandler, + onOrdersChangedHandler, + onPositionsChangedHandler, + onTradeStateChangedHandler) + { + // + mOnSignalConditions = onSignalConditions; + mMinAgeForDoSupport = minAgeForDoSupport; + mMinAgeForUpdateSupports = minAgeForUpdateSupports; + } + + // + // DeConstructor ... + void ~XSCX121EA() + { + // + // Delete All Registered Providers ... + int providersCount = ArraySize(mProviders); + if (providersCount > 0) + { + // + for (int i = 0; i < providersCount; i++) + { + // + X121SignalProvider iProvider = mProviders[i]; + + // + delete iProvider.provider; + } + } + } + + // + // START Properties ... + // + + // + // Min Profit Per Trade ... + + // + bool MinProfitPerTrade(double value) + { + // + bool result = false; + + // + if (value <= 0) + { + return result; + } + + // + result = value > 0; + if (value == mMinProfitPerTrade) + { + return result; + } + + // + mMinProfitPerTrade = value; + + // + return result; + } + + // + double MinProfitPerTrade() + { + return mMinProfitPerTrade; + } + + // + // Min Profit Per Volume Factor ... + + // + bool MinProfitPerVolumeFactor(double value) + { + // + bool result = false; + + // + if (value <= 0) + { + return result; + } + + // + result = value > 0; + if (value == mMinProfitPerVolumeFactor) + { + return result; + } + + // + mMinProfitPerVolumeFactor = value; + + // + return result; + } + + // + double MinProfitPerVolumeFactor() + { + return mMinProfitPerVolumeFactor; + } + + // + // Add Provider ... + bool AddProvider( + X121SignalProvider &provider // Specific Provider ... + ) + { + // + bool result = false; + + // + // Validate Provider ... + if (provider.symbol == NULL || + provider.period == NULL || + provider.riskAmount <= 0 || + StringLen(provider.symbol) == 0 || + ArraySize(provider.providers) == 0) + { + return result; + } + + // + // Check Exists or not ... + int idx = GetProviderIndex( + provider.symbol, + provider.period); + if (idx >= 0) + { + return result; + } + + // + PrepareProviderConfig(); + + // + // Make Instance of X121Provider Class ... + provider.provider = new XSCX121Provider( + provider.symbol, + provider.period, + true // Ignore Ticks after Recieved a Signal Till new Candle ... + ); + + // + // Attach Event Listener ... + if (mOnSignalConditions != NULL) + { + // + // Attach Event Handlers ... + provider.provider.AddOnSignalConditionEventHandler(mOnSignalConditions); + } + + // + // Set Signallers to Provider Class ... + result = provider.provider.SetSignallers(provider.providers); + if (!result) + { + return result; + } + + // + // Initialize Provider ... + result = provider.provider.SetConfig(mProviderConfig); + + // + // Add Prepared Provider to Providers ... + Add( + provider, + mProviders); + + // + return result; + } + + // + // Add Providers ... + int AddProviders( + X121SignalProvider &providers[] // Specific Providers ... + ) + { + // + int result = 0; + + // + int providersCount = ArraySize(providers); + if (providersCount <= 0) + { + return result; + } + + // + for (int i = 0; i < providersCount; i++) + { + // + X121SignalProvider iProvider = providers[i]; + + // + bool isAdded = AddProvider(iProvider); + if (isAdded) + { + result++; + } + } + + // + return result; + } + + // + // END Properties ... + // + + // + // START Overrides ... + // + + // + void OnPositionsChangedHandler(int count) + { + } + + // + // Handle TakeProfit Event ... + void OnTakeProfitTriggered(const XDeal &deal) + { + // + // Since we Use Hedge in Min Profit ... + // Some times a Position Modified and SL Trails ... + // this Position closed through sl Event ... + // here we Must Close positions's Pack Orders ... + + // + // So We Have to Get Positions Pack ... + XPositionPack dealPack; + bool hasPack = mTrader.GetDealPack( + deal, + dealPack); + if (hasPack) + { + HandleClosePack(dealPack); + } + + // + CancelAllEQMOrders(); + } + + // + // Handle StopLoss Event ... + void OnStopLossTriggered(const XDeal &deal) + { + // + // Since we Use Hedge in Min Profit ... + // Some times a Position Modified and SL Trails ... + // this Position closed through sl Event ... + // here we Must Close positions's Pack Orders ... + + // + // So We Have to Get Positions Pack ... + XPositionPack dealPack; + bool hasPack = mTrader.GetDealPack( + deal, + dealPack); + if (hasPack) + { + HandleClosePack(dealPack); + } + + // + CancelAllEQMOrders(); + } + + // + // END Overrides ... + // + + // + // START Inheritance Functions ... + // + + // + void PrepareTag() + { + mTag = "X121EA:" + mSymbol + "," + ToString(mPeriod) + (string)mMagic; + } + + // + // Check Providers Guard States ... + bool CheckGuard(XGuard &guards[]) + { + // + bool result = false; + + // + Clean(guards); + + // + // Positions Management ... + // HandlePositionManagement(); + + // + int providersCount = ArraySize(mProviders); + if (providersCount <= 0) + { + return result; + } + + // + for (int i = 0; i < providersCount; i++) + { + // + X121SignalProvider iProvider = mProviders[i]; + + // + XGuard iGuards[]; + bool iHasGuard = iProvider.provider.GuardCheck(iGuards); + if (iHasGuard) + { + // + Copy( + iGuards, + guards, + false); + } + } + + // + // Here we Can Implement Custom Guards Senario ... + + // + // Do Management Equity ... + XSignal signals[]; + HandleEQM(signals); + + // + result = ArraySize(guards) > 0; + + // + return result; + } + + // + // Check Providers for Signals ... + bool SignalCheck(XSignal &signals[]) + { + // + bool result = false; + + // + Clean(signals); + + // + // Since We may have Custom Supporting Senarios for Positions + // if there is no Equity or Positions Count Passed ... + // we Clear Account Policies Check here and do it after + // recieveing Signals ... + + // + // Check Providers Count ... + int providersCount = ArraySize(mProviders); + if (providersCount <= 0) + { + return result; + } + + // + // Here we proccess all Exists Registered Providers and get + // probably signals and add them signals Array ... + + // + // Loop through Providers to Recieve Market Sence based on each them ... + for (int i = 0; i < providersCount; i++) + { + // + // Get provider Descriptor Struct ... + X121SignalProvider iProvider = mProviders[i]; + + // + // Check Provider Pivot Point Ready ... + int iFoundedPivots = iProvider.provider.CountPivots(); + int iReuiredPivots = iProvider.provider.GetMinPivots(); + if (iFoundedPivots < iReuiredPivots) + { + // + // Start Retrieveing Pivot Points ... + iProvider.provider.ProccessPivotPoints(); + + // + // ignore Calculating Signals since Pivot Points recieved ... + continue; + } + + // + // Retrieve Market Consitions from Specified Provider ... + X121MarketConditions iConditions; + bool iHasSignal = iProvider.provider.ProcessTick(iConditions); + + // + // Check there is Signal or not ... + if (iHasSignal && iConditions.hasSignal) + { + // + // Check Signalling is Enabled by Signal type ... + bool isiSignalLong = IsLong(iConditions.signal.type); + if ((isiSignalLong && !mEnableLongs) || + (!isiSignalLong && !mEnableShorts)) + { + continue; + } + + // + // Add Signal to Retrieved Signals Collection ... + Add( + iConditions.signal, + signals); + } + } + + // + // Check Signals Exists for Processing ... + result = ArraySize(signals) > 0; + + // + return result; + } + + // + // Before Base EA Class Execute Signals ... + // this Action Run to Implement Custom Management ... + void BeforeSignalExecution( + XSignal &signals[] // Base EA Checked Signals ... + ) + { + // + // Implement Custom Signal Executing Senario Here ... + HandleEQM(signals); + + // + // Here we force Signaller Signals must be in Profit ... + CheckSignalsProviderState(signals); + } + + // + // END Inheritance Functions ... + // + + // + // START Provided Actions ... + // + + // + // END Provided Actions ... + // + + // + // EQM Props ... + // + + // + int MinAgeForDoSupport() + { + return mMinAgeForDoSupport; + } + + // + void MinAgeForDoSupport(int value) + { + // + if (value <= 0) + { + value = 0; + } + + // + if (value == mMinAgeForDoSupport) + { + return; + } + + // + mMinAgeForDoSupport = value; + } + + // + int MinAgeForUpdateSupports() + { + return mMinAgeForUpdateSupports; + } + + // + void MinAgeForUpdateSupports(int value) + { + // + if (value <= 0) + { + value = 0; + } + + // + if (value == mMinAgeForUpdateSupports) + { + return; + } + + // + mMinAgeForUpdateSupports = value; + } + + // + // Protected ... +protected: + // + // Private ... +private: + // + // Props ... + X121SignalProvider mProviders[]; + X121ProviderInputs mProviderConfig; + TOnSignalConditions mOnSignalConditions; + + // + // Actions ... + + // + // EQM ... + // + + // + int mMinAgeForDoSupport; + int mMinAgeForUpdateSupports; + + // + bool ExecuteEQMSignal( + const XSignal &signal, // Source Signal ... + ENUM_X_SIGNAL_EXECUTION_FAILED &reason, // Provides Error Reason ... + bool checkPoliciese = true // Check Account Policies Before Execute Signal ... + ) + { + // + bool result = false; + reason = X_NOTHING; + + // + // Check Account Policies ... + if (checkPoliciese) + { + // + // First Check Equity ... + result = CheckEquityForTrade(); + if (!result) + { + // + reason = X_FAILED_REASON_EQUITY; + return result; + } + + // + // Check Positions Count ... + result = ChecPositionsForTrade(); + if (!result) + { + // + reason = X_FAILED_REASON_MAX_REACHED; + return result; + } + + // + // Check Spread ... + result = IsSpreadOkForSignalExecution(signal); + if (!result) + { + // + reason = X_FAILED_REASON_SPREAD; + return result; + } + } + + // + XSignal tmpSignal = signal; + PrepareSignal(tmpSignal); + + // + // Generate Provider Comment ... + string comment = GenerateXEQMSupportComment(); + + // + result = mTrader + .ExecuteSignal( + tmpSignal, + comment // + ); + if (!result) + { + reason = X_UNKNOWN; + } + + // + return result; + } + + // + // Execute Specific Signals by Checking Spreads ... + // if provided ... + int ExecuteEQMSignals( + const XSignal &signals[], // Signals Collection ... + ENUM_X_SIGNAL_EXECUTION_FAILED &reasons[], // Provides Error Reason ... + bool checkPoliciese = true // Check Account Policies Before Execute Signal ... + ) + { + // + int result = 0; + + // + Clean(reasons); + + // + int signalsCount = ArraySize(signals); + if (signalsCount <= 0) + { + return result; + } + + // + // Here we Have to Check Account Policies + // and Execute Signals base on them ... + + // + for (int i = 0; i < signalsCount; i++) + { + // + XSignal iSignal = signals[i]; + + // + ENUM_X_SIGNAL_EXECUTION_FAILED iReason = X_NOTHING; + + // + bool isExecuted = ExecuteEQMSignal( + iSignal, + iReason, + checkPoliciese // + ); + if (isExecuted) + { + result++; + } + + // + Add( + iReason, + reasons); + } + + // + return result; + } + + // + // Retrieve All EQM Placed Support Orders ... + int GetEQMOrders( + XOrder &orders[] // Hold Result + ) + { + // + int result = 0; + + // + XOrder allOrders[]; + int allOrdersCount = GetOrders(allOrders); + if (allOrdersCount <= 0) + { + return result; + } + + // + // Extract EQM Orders ... + result = GetEQMSupportOrders( + orders, + allOrders); + + // + return result; + } + + // + // Retrieve All EQM Support Positions ... + int GetEQMPositions( + XPosition &positions[] // Hold Result + ) + { + // + int result = 0; + + // + XPosition allPositions[]; + int allPositionsCount = GetPositions(allPositions); + if (allPositionsCount <= 0) + { + return result; + } + + // + // Extract EQM Positions ... + result = GetEQMSupportPositions( + positions, + allPositions); + + // + return result; + } + + // + // Count all open Positions Volume for supports ... + double GetEQMSupportVolume( + bool ignoreEQM = true // Ignore EQM Positions + ) + { + // + double result = 0; + + // + // TODO: + // add to Props ... + double maxEQMSupportVolume = 0.3; + + // + // Retrieve Positions ... + XPosition positions[]; + int positionsCount = GetPositions(positions); + if (positionsCount <= 0) + { + return result; + } + + // + for (int i = 0; i < positionsCount; i++) + { + // + XPosition iPosition = positions[i]; + + // + // Check Current Position is EQM Position Or Not ... + bool isEQM = IsEQMSupport(iPosition.comment); + if (isEQM && ignoreEQM) + { + continue; + } + + // + result += iPosition.volume; + } + + // + // Multiply Volume Summary ... + // TODO: Make it Configurable ... + result *= 1; + if (result > maxEQMSupportVolume) + { + result = maxEQMSupportVolume; + } + + // + return result; + } + + // + // Cancel all EQM Placed Support Orders ... + bool CancelAllEQMOrders() + { + // + bool result = false; + + // + XOrder eqmOrders[]; + int eqmOrdersCount = GetEQMOrders(eqmOrders); + if (eqmOrdersCount <= 0) + { + return result; + } + + // + result = mTrader.CancelOrders(eqmOrders); + + // + return result; + } + + // + // Add Support Signals based on EQM Algo ... + void DoEQMSupport( + const XSignal &signals[], // this used when signallers call EQM ... + const XPosition &positions[] // positions for supporting using EQM ... + ) + { + // + // Check EQM is Enabled Or Not ... + bool isEQMEnable = mMinAgeForDoSupport > 0 && + mMinAgeForUpdateSupports > 0; + if (!isEQMEnable) + { + return; + } + + // + bool doSupportPivots = false; + bool doSupportByFibos = true; + bool doSupportBySignals = true; + + // + int signalsCount = ArraySize(signals); + int positionsCount = ArraySize(positions); + + // + if (positionsCount <= 0) + { + // + // We can Ignore this when + // we need to Support Positions Only ... + // for Other Reasons ... + return; + } + + // + // NOTE: + // we Have to Check Previously Supported Signals ... + // and Extract Longest Age ... + // then if the Age is Long enough for Updating, Cncell All EQM Orders ... + // other wise we have to waits untill Market Decide what to do ... + XOrder orders[]; + int ordersCount = GetEQMOrders(orders); + if (ordersCount > 0) + { + // + XOrder oldestOrder; + int oldestOrderAge = GetOldest( + oldestOrder, + orders); + + // + if (oldestOrderAge <= 0) + { + return; + } + + // + bool isOldEnoughForCancel = + oldestOrderAge >= mMinAgeForUpdateSupports; + if (!isOldEnoughForCancel) + { + // + // There are Enabled EQM Orders ... + // so we have to wait for them ... + return; + } + else + { + // + // Here we Cancel Pending Orders ... + CancelAllEQMOrders(); + } + } + + // + // All Support Signals from + // each Senario collect into this + // and then Executed Once ... + XSignal supports[]; + + // + double volume = GetEQMSupportVolume( + false // doesnt ignore eqm position volumes for supporting + ); + + // + // SENARIO: + // + // IND: (in drawdown) + // - Find Min Profit of InD Positions ... + // - Find Max Profit of InD Positions ... + // + // INP: (in profit) + // - Find Min Profit of InD Positions ... + // - Find Max Profit of InD Positions ... + + // + XPosition inDPositions[]; + XPosition inPPositions[]; + ExtractPositionsBasedOnProfits( + positions, + inDPositions, + inPPositions // + ); + + // + double maxP = 0; + double minP = 0; + int maxInPPositionIDX = -1; + int minInPPositionIDX = -1; + int inPPositionsCount = ArraySize(inPPositions); + if (inPPositionsCount > 0) + { + // + // Find Min and Max ... + for (int i = 0; i < inPPositionsCount; i++) + { + // + XPosition iPosition = inPPositions[i]; + + // + maxP = + maxP == 0 || maxP < iPosition.profit + ? iPosition.profit + : maxP; + if (maxP == iPosition.profit) + { + maxInPPositionIDX = i; + } + + // + minP = + minP == 0 || minP > iPosition.profit + ? iPosition.profit + : minP; + if (minP == iPosition.profit) + { + minInPPositionIDX = i; + } + } + } + + // + double maxD = 0; + double minD = 0; + int maxInDPositionIDX = -1; + int minInDPositionIDX = -1; + int inDPositionsCount = ArraySize(inDPositions); + if (inDPositionsCount > 0) + { + // + // Find Min and Max ... + for (int i = 0; i < inDPositionsCount; i++) + { + // + XPosition iPosition = inDPositions[i]; + + // + maxD = + maxD == 0 || maxD < iPosition.profit + ? iPosition.profit + : maxD; + if (maxD == iPosition.profit) + { + maxInDPositionIDX = i; + } + + // + minD = + minD == 0 || minD > iPosition.profit + ? iPosition.profit + : minD; + if (minD == iPosition.profit) + { + minInDPositionIDX = i; + } + } + } + + // + // For InDPositions: + // it is so Better for US to Follow In Profit Positions for Supporting ... + // if they aren't any in profit Position then start Supporting In DrawDown Positions ... + bool canSupportInDPositions = maxInPPositionIDX == -1 && + minInPPositionIDX == -1; + + // + // Here we have all we want ... + // Next step is to Implement EQM Supporting Senarios ... + + // + // SENARIO: + // - Using Pivots (Support and Resistances); + // ---> find pivots on it's side and place support: + // - Using Fibonacci; + // - Using Provided Signals; + + // + // Using Pivots For Supporting ... + if (doSupportPivots) + { + // + // this must be contains all available pivots ... + double price; + string symbol; + double pivots[]; + XOHCLSupRes supRes; + double rateStep = 15; + ENUM_TIMEFRAMES period; + + // + // here we have to loop through all available providers and retrieve pivots + // then add them to our pivots if their not Exists ... + int providersCount = CountProviders(); + for (int i = 0; i < providersCount; i++) + { + // + X121SignalProvider iSignalProvider = mProviders[i]; + + // + // Extract iSignalProvider's Pivots ... + double iPivots[]; + int iPivotsCount = iSignalProvider + .provider + .FillPivotPoints(iPivots); + if (iPivotsCount <= 0) + { + continue; + } + + // + // Fill their Values to Main Array ... + // if they are not exists ... + AddsIfNotExists( + iPivots, + pivots); + } + + // + int pivotsCount = ArraySize(pivots); + if (pivotsCount > 0) + { + // + // Here we Can Do EQM Support based on Pivots ... + + // + // TODO: Make these Configurable ... + bool placeTP = false; + bool placeSL = false; + bool useBoundaryForTPSL = true; + int numberOfPivotsAroundPrice = 5; + + // + if (maxInPPositionIDX >= 0 && false) + { + // + // this means we have max in profit Position ... + // and this is much better to guard it ... + + // + symbol = inPPositions[maxInPPositionIDX].symbol; + price = GetEntry( + symbol, + inPPositions[maxInPPositionIDX].type // + ); + period = inPPositions[maxInPPositionIDX].period; + rateStep = PointToPrice( + symbol, + rateStep // + ); + + // + // Extract Required Number of Pivots ... + supRes = ExtractSupportAndResistance( + price, + pivots, + numberOfPivotsAroundPrice, + rateStep // + ); + + // + // now we have to Generate Support Signals based on + // retrieve XOHCLSupRes ... + GenerateSupportAndResistanceSignals( + supports, // Result ... + supRes, // Support and Resistance Model ... + symbol, + period, + price, + volume, + placeSL, + placeTP, + useBoundaryForTPSL // + ); + } + + // + if (minInPPositionIDX >= 0 && false) + { + // + // this means we have max in profit Position ... + // and this is much better to guard it ... + + // + symbol = inPPositions[minInPPositionIDX].symbol; + price = GetEntry( + symbol, + inPPositions[minInPPositionIDX].type // + ); + period = inPPositions[minInPPositionIDX].period; + rateStep = PointToPrice( + symbol, + rateStep // + ); + + // + // Extract Required Number of Pivots ... + supRes = ExtractSupportAndResistance( + price, + pivots, + numberOfPivotsAroundPrice, + rateStep // + ); + + // + // now we have to Generate Support Signals based on + // retrieve XOHCLSupRes ... + GenerateSupportAndResistanceSignals( + supports, // Result ... + supRes, // Support and Resistance Model ... + symbol, + period, + price, + volume, + placeSL, + placeTP, + useBoundaryForTPSL // + ); + } + + // + // For InDPositions: + if (canSupportInDPositions) + { + // + if (maxInDPositionIDX >= 0 && false) + { + // + // Extract Required Number of Pivots ... + + // + symbol = inDPositions[maxInDPositionIDX].symbol; + price = GetEntry( + symbol, + inDPositions[maxInDPositionIDX].type // + ); + period = inDPositions[maxInDPositionIDX].period; + rateStep = PointToPrice( + symbol, + rateStep // + ); + + // + // Extract Required Number of Pivots ... + supRes = ExtractSupportAndResistance( + price, + pivots, + numberOfPivotsAroundPrice, + rateStep // + ); + + // + // now we have to Generate Support Signals based on + // retrieve XOHCLSupRes ... + GenerateSupportAndResistanceSignals( + supports, // Result ... + supRes, // Support and Resistance Model ... + symbol, + period, + price, + volume, + placeSL, + placeTP, + useBoundaryForTPSL // + ); + } + + // + if (minInDPositionIDX >= 0 && false) + { + // + // Extract Required Number of Pivots ... + + // + symbol = inDPositions[minInDPositionIDX].symbol; + price = GetEntry( + symbol, + inDPositions[minInDPositionIDX].type // + ); + period = inDPositions[minInDPositionIDX].period; + rateStep = PointToPrice( + symbol, + rateStep // + ); + + // + // Extract Required Number of Pivots ... + supRes = ExtractSupportAndResistance( + price, + pivots, + numberOfPivotsAroundPrice, + rateStep // + ); + + // + // now we have to Generate Support Signals based on + // retrieve XOHCLSupRes ... + GenerateSupportAndResistanceSignals( + supports, // Result ... + supRes, // Support and Resistance Model ... + symbol, + period, + price, + volume, + placeSL, + placeTP, + useBoundaryForTPSL // + ); + } + } + } + } + + // + // Support using Provided Signals ... + if (doSupportBySignals && signalsCount > 0) + { + // + // Change Signals Volume to Support Volume ... + for (int i = 0; i < signalsCount; i++) + { + // + XSignal iSignal = signals[i]; + iSignal.sl = 0; + // iSignal.volume = volume; + + // + Add( + iSignal, + supports); + } + } + + // + // Support Using Fibos ... + if (doSupportByFibos) + { + // + int providersCount = CountProviders(); + for (int i = 0; i < providersCount; i++) + { + // + X121SignalProvider iSignalProvider = mProviders[i]; + + // + // Extract iSignalProvider's Pivots ... + X121MarketConditions iConditions = iSignalProvider + .provider + .GetMarketConditions(0); + + // + double pivots[] = { + // + iConditions.xmanInfo.peaks[0], + // + iConditions.xmanInfo.fibLevel1s[0], + iConditions.xmanInfo.fibLevel2s[0], + iConditions.xmanInfo.fibLevel3s[0], + iConditions.xmanInfo.fibLevel4s[0], + iConditions.xmanInfo.fibLevel5s[0], + // + iConditions.xmanInfo.vales[0]}; + + // + bool placeTP = false; + bool placeSL = false; + bool useBoundaryForTPSL = false; + double price = GetEntry( + iConditions.symbol, + POSITION_TYPE_BUY); + + // + XSignal fibSignals[]; + int fibSignalsCount = GenerateSequentialSignals( + fibSignals, + pivots, + iConditions.symbol, + iConditions.period, + price, + volume, + placeSL, + placeTP, + useBoundaryForTPSL // + ); + if (fibSignalsCount > 0) + { + // + Copy( + fibSignals, + supports, + false); + } + } + } + + // + // Here we Must Execute Support Signals ... + int supportsCount = ArraySize(supports); + if (supportsCount <= 0) + { + return; + } + + // + ENUM_X_SIGNAL_EXECUTION_FAILED reasons[]; + int supported = ExecuteEQMSignals( + supports, + reasons, + false // Since these are Support Signals, we Ignore Accont Policies Check ... + ); + } + + // + // All available Equity Actions Implemented here ... + void HandleEQM( + const XSignal &signals[] // this used when signallers call EQM ... + ) + { + // + XPosition positions[]; + int positionsCount = GetPositions(positions); + if (positionsCount <= 1) + { + return; + } + + // + // Used Signals when EQM required ... + int signalsCount = ArraySize(signals); + + // + double profit = CalculatePositionsProfit(positions); + if (profit > 0) + { + // + double requiredProfit = CalculateRequiredProfitForHedge(positions); + bool canHedge = profit > requiredProfit; + if (canHedge) + { + // + string comment = "EQM Hedge ..."; + bool isHedged = mTrader.ClosePositions( + positions, + comment); + if (isHedged) + { + // + string message = "EQM Hedged (" + ToString(positionsCount) + ") in Profit: " + ToString(profit); + + // + LogMessage(message); + } + } + + // + return; + } + + // + // Check Positions Count ... + bool isPositionsReady = ChecPositionsForTrade(); + if (!isPositionsReady) + { + // + // TODO: + // Implement what is must to do when Max Positions Reached ... + // signals can Used ... + return; + } + + // + // Check Equity For Trade ... + bool isEquityReady = CheckEquityForTrade(); + if (!isEquityReady) + { + // + // Implement EQM Support Of Account here ... + // signals can Used ... + DoEQMSupport( + signals, + positions); + return; + } + + // + // TODO: Implement other Management Senarios if required here ... + } + + // + // PROVIDERS ... + // + + // + // Count Attached Providers ... + int CountProviders() + { + return ArraySize(mProviders); + } + + // + // Find Specific Provider Index by using give symbol and period ... + int GetProviderIndex( + string symbol, // Trading Symbol ... + ENUM_TIMEFRAMES period // Trading Time frame ... + ) + { + // + int result = -1; + + // + // Validate Args ... + if (period == NULL || + symbol == NULL || + StringLen(symbol) == 0) + { + return result; + } + + // + int providersCount = ArraySize(mProviders); + if (providersCount <= 0) + { + return result; + } + + // + for (int i = 0; i < providersCount; i++) + { + // + X121SignalProvider iProvider = mProviders[i]; + + // + if (iProvider.symbol == symbol && iProvider.period == period) + { + // + result = i; + break; + } + } + + // + return result; + } + + // + // Prepare Default Configurations for X121Provider Setup ... + void PrepareProviderConfig() + { + // + // Set Default X121 Provider Configurations ... + + // + // XMAN ... + + // + // Candle Timer ... + mProviderConfig.xmanConfig.candleTimerColor = clrGold; + mProviderConfig.xmanConfig.candleTimerCorner = CORNER_RIGHT_UPPER; + + // + // Chart Style ... + mProviderConfig.xmanConfig.upColor = clrLime; + mProviderConfig.xmanConfig.downColor = clrRed; + mProviderConfig.xmanConfig.lineColor = clrLime; + mProviderConfig.xmanConfig.bearishColor = clrRed; + mProviderConfig.xmanConfig.bullishColor = clrLime; + mProviderConfig.xmanConfig.volumesColor = clrGreen; + mProviderConfig.xmanConfig.chartMode = CHART_CANDLES; + + // + // Market Cycles ... + + // + // Level 1 ... + mProviderConfig.xmanConfig.l1Method = X_PERIOD_AUTO; + mProviderConfig.xmanConfig.l1Period = NULL; + + // + // Level 1 ... + mProviderConfig.xmanConfig.l2Method = X_PERIOD_AUTO; + mProviderConfig.xmanConfig.l2Period = NULL; + + // + // Level 1 ... + mProviderConfig.xmanConfig.l3Method = X_PERIOD_AUTO; + mProviderConfig.xmanConfig.l3Period = NULL; + + // + // Level 1 ... + mProviderConfig.xmanConfig.l4Method = X_PERIOD_AUTO; + mProviderConfig.xmanConfig.l4Period = NULL; + + // + // Fibonacci ... + mProviderConfig.xmanConfig.fiboLevel1 = 0.236; + mProviderConfig.xmanConfig.fiboLevel2 = 0.382; + mProviderConfig.xmanConfig.fiboLevel3 = 0.5; + mProviderConfig.xmanConfig.fiboLevel4 = 0.618; + mProviderConfig.xmanConfig.fiboLevel5 = 0.764; + + // + // Boundary Detection Modes ... + mProviderConfig.xmanConfig.hhMode = MODE_HIGH; + mProviderConfig.xmanConfig.llMode = MODE_LOW; + + // + // Trend Detection ... + mProviderConfig.xmanConfig.trendMultiplier = 3.5; + mProviderConfig.xmanConfig.trendPriceAppliedTo = PRICE_MEDIAN; + + // + // Ribbon Detection ... + mProviderConfig.xmanConfig.ribbonMode = X_MA_SMMA; + + // + // Hull Trend Detection ... + mProviderConfig.xmanConfig.hullDivisor = 2.0; + mProviderConfig.xmanConfig.hullUpAppliedTo = PRICE_HIGH; + mProviderConfig.xmanConfig.hullDownAppliedTo = PRICE_LOW; + + // + // SSL Channel ... + mProviderConfig.xmanConfig.sslcMode = X_MA_SMA; + mProviderConfig.xmanConfig.sslcUpAppliedTo = PRICE_HIGH; + mProviderConfig.xmanConfig.sslcDownAppliedTo = PRICE_LOW; + + // + // Presentation ... + // NOTE: Since we Configure Presentation on PreDefine Section ... + // here we turn of all Presentations as Default ... + mProviderConfig.xmanConfig.showCandleTimer = false; + mProviderConfig.xmanConfig.showCandles = false; + mProviderConfig.xmanConfig.showHKCandles = false; + mProviderConfig.xmanConfig.showSMHKCandles = false; + mProviderConfig.xmanConfig.showPeaksAndVales = false; + mProviderConfig.xmanConfig.showTrends = false; + mProviderConfig.xmanConfig.fillTrends = false; + mProviderConfig.xmanConfig.showLevels = false; + mProviderConfig.xmanConfig.showConsolidations = false; + mProviderConfig.xmanConfig.showRibbons = false; + mProviderConfig.xmanConfig.showHull = false; + mProviderConfig.xmanConfig.showSSLChannel = false; + mProviderConfig.xmanConfig.showFibo1Levels = false; + mProviderConfig.xmanConfig.showFibo2Levels = false; + mProviderConfig.xmanConfig.showFibo3Levels = false; + mProviderConfig.xmanConfig.showFibo4Levels = false; + mProviderConfig.xmanConfig.showFibo5Levels = false; + + // + PreDefineProviderConfig(); + } + + // + // Config Representation of X121 Provider Setup ... + // for Specified Strategies ... + void PreDefineProviderConfig() + { + // + // Here we have to Name or Predefined Styles ... + bool x786Config = true; + + // + // by default we need to Show Candles and also Candle Timer ... + mProviderConfig.xmanConfig.showCandles = true; + mProviderConfig.xmanConfig.showCandleTimer = true; + + // + // now we act based on Predefined Variables ... + if (x786Config) + { + // + bool showHK = false; + bool showPVs = true; + bool showFibo = true; + bool showSMHK = false; + bool showHull = false; + bool showSSLC = false; + bool showTrend = true; + bool showRibbon = true; + bool showPVLevels = false; + bool showPVLevelConsolidations = false; + + // + mProviderConfig.xmanConfig.showCandles = !showHK; + mProviderConfig.xmanConfig.showHKCandles = showHK; + mProviderConfig.xmanConfig.showSMHKCandles = showSMHK; + + // + mProviderConfig.xmanConfig.showHull = showHull; + mProviderConfig.xmanConfig.showTrends = showTrend; + mProviderConfig.xmanConfig.showRibbons = showRibbon; + mProviderConfig.xmanConfig.showSSLChannel = showSSLC; + + // + mProviderConfig.xmanConfig.showFibo1Levels = showFibo; + mProviderConfig.xmanConfig.showFibo2Levels = showFibo; + mProviderConfig.xmanConfig.showFibo3Levels = showFibo; + mProviderConfig.xmanConfig.showFibo4Levels = showFibo; + mProviderConfig.xmanConfig.showFibo5Levels = showFibo; + + // + mProviderConfig.xmanConfig.showPeaksAndVales = showPVs; + + // + mProviderConfig.xmanConfig.showLevels = showPVLevels; + mProviderConfig.xmanConfig.showConsolidations = showPVLevelConsolidations; + } + } + + // + // Check Signallers ... + // when recieved signals we have to check each signal + // based on it's signaller ... + // if there isn't any open Position from it's signaller or + // there was open positions and all of them in profit we accept new recieved signal ... + // in this way we can handle balance between signallers and their positions and also + // we prevent big losses ... + int CheckSignalsProviderState(XSignal &signals[]) + { + // + int result = 0; + + // + int signalsCount = ArraySize(signals); + if (signalsCount <= 0) + { + return result; + } + + // + XSignal tmp[]; + Copy( + signals, + tmp); + Clean(signals); + + // + // Loop through Signals ... + for (int i = 0; i < signalsCount; i++) + { + // + XSignal iSignal = tmp[i]; + + // + int providersCount = ArraySize(iSignal.providers); + if (providersCount <= 0) + { + continue; + } + + // + string iSignaller = iSignal.providers[0]; + + // + // Retrieve Signaller's Open Positions ... + XPosition iSignallerPositions[]; + int iSignallerPositionsCount = GetPositions( + iSignallerPositions, + iSignal.symbol, + iSignal.type, + iSignal.period, + iSignaller); + if (iSignallerPositionsCount <= 0) + { + // + // this means we can accept Signal without Checking anything ... + Add( + iSignal, + signals // + ); + + // + // TODO: Here we can Provide Support Signals for First Arrived Signal ... + + // + continue; + } + else + { + // + // TODO: Remove this ... + // Only One Signal ... + // continue; + } + + // + // here we have to check Signallers open Positions Profit ... + double iSignallerPositionsProfit = CalculatePositionsProfit(iSignallerPositions); + bool isInProfit = iSignallerPositionsProfit > 0; + if (!isInProfit) + { + // TODO: Remove this ... + // continue; + } + + // + // Check Signal Entry ... + // in Compare with nearest Signaller Position ... + + // + // Find Youngest Signaller Position ... + XPosition iSignallerYoungestPosition; + int iSignallerYoungestPositionAge = GetYoungest( + iSignallerYoungestPosition, + iSignallerPositions); + if (iSignallerYoungestPositionAge < 0) + { + // TODO: Remove this ... + // continue; + } + + // + bool isEntryOk = + IsLong(iSignal.type) && + iSignal.type == iSignallerYoungestPosition.type + ? iSignal.entry > iSignallerYoungestPosition.entry + : iSignal.entry < iSignallerYoungestPosition.entry; + if (!isEntryOk) + { + // TODO: Remove this ... + // continue; + } + + // + // this means all Signaller Open Positions in Profit ... + // so we Accept Signal ... + Add( + iSignal, + signals // + ); + } + + // + Clean(tmp); + + // + result = ArraySize(signals); + + // + if (result > 0) + { + // + // This means Signallers provide In Profits Positions Before ... + // the Best thing is make them Risk Free at current Signals Minimum Entry ... + // TODO: Complete This ... + } + + // + return result; + } +}; + +// +// START Usefull Functions ... +// + +// +// END Usefull Functions ... +// diff --git a/MQLTestWorkspace/BKPS/14030222/Classes/x-saherelm.xaccount.class.ex5 b/MQLTestWorkspace/BKPS/14030222/Classes/x-saherelm.xaccount.class.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..b9ab2daa70d80b95b7280a0778ff303ff477de54 GIT binary patch literal 7074 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 vz#BTiz2Ma6&hQ1FL9;W)%qEr3F>ZoFR=F +#include "../Libraries/x-saherelm.common.lib.mq5" + +// +// END Import and Inclused requirements ... +// + +// +// START Overrides ... +// + +// +// END Overrides ... +// + +// +// a Class for Manage Account ... +class XSCAccount +{ + // + // Public ... +public: + // + // Constructor ... + void XSCAccount() + { + // + mAccountInfo = new CAccountInfo(); + } + + // + // Deconstructor ... + void ~XSCAccount() + { + } + + // + // START Provided Functions ... + // + + // + // User Account ... + long GetUserAccount() + { + return mAccountInfo.Login(); + } + + // + // Account Leverage ... + long GetLeverage() + { + return mAccountInfo.Leverage(); + } + + // + // Get Trade Expert State ... + bool CanExpertTrade() + { + return mAccountInfo.TradeExpert(); + } + + // + // User Account Trade Mopde (ENUM_ACCOUNT_TRADE_MODE) ... + // -------------------------- + // ACCOUNT_TRADE_MODE_DEMO + // ACCOUNT_TRADE_MODE_CONTEST + // ACCOUNT_TRADE_MODE_REAL + ENUM_ACCOUNT_TRADE_MODE GetTradeMode() + { + return mAccountInfo.TradeMode(); + } + + // + // Get Account Balance ... + double GetBalance() + { + return mAccountInfo.Balance(); + } + + // + // Get the amount of give Credit ... + double GetCredit() + { + return mAccountInfo.Credit(); + } + + // + // Get the amount of current Profit on account ... + double GetProfit() + { + return mAccountInfo.Profit(); + } + + // + // Get the amount of current Equity on account ... + double GetEquity() + { + return mAccountInfo.Equity(); + } + + // + // Get the amount of reserved Margin ... + double GetMargin() + { + return mAccountInfo.Margin(); + } + + // + // Get the amount of free Margin ... + double GetFreeMargin() + { + return mAccountInfo.FreeMargin(); + } + + // + // Get the Level of Margin ... + double GetMarginLevel() + { + return mAccountInfo.MarginLevel(); + } + + // + // Get the Level Of Margin for a Deposit ... + double GetMarginCall() + { + return mAccountInfo.MarginCall(); + } + + // + // Get the Level of Margin for Stop out ... + double GetMarginStopOut() + { + return mAccountInfo.MarginStopOut(); + } + + // + // Get the Client Name ... + string GetName() + { + return mAccountInfo.Name(); + } + + // + // Get the Trade Server Name ... + string GetServerName() + { + return mAccountInfo.Server(); + } + + // + // Get deposit Currency Name ... + string GetCurrency() + { + return mAccountInfo.Currency(); + } + + // + // Get the Company Name that serves an Account ... + string GetCompany() + { + return mAccountInfo.Company(); + } + + // + // Calculate Profits for the current account based on passed parameters ... + double CalculateTradeProfit( + const string symbol, // trading symbol + ENUM_ORDER_TYPE type, // order type + double volume, // volume + double entry, // open price + double exit // close price + ) + { + // + double result = mAccountInfo.OrderProfitCheck( + symbol, + type, + volume, + entry, + exit); + + // + return result; + } + + // + // Calculate amount of margin which required for trade operation ... + double CalculateMarging( + const string symbol, // trading symbol + ENUM_ORDER_TYPE type, // order type + double volume, // volume + double entry // open price + ) + { + // + double result = mAccountInfo.MarginCheck( + symbol, + type, + volume, + entry); + + // + return result; + } + + // + // Calculate amount of free margin left after trade operation ... + double CalculateFreeMarging( + const string symbol, // trading symbol + ENUM_ORDER_TYPE type, // order type + double volume, // volume + double entry // open price + ) + { + // + double result = mAccountInfo.FreeMarginCheck( + symbol, + type, + volume, + entry); + + // + return result; + } + + // + // Calculate the Maximum possible volume of trade operation ... + double CalculateMaxVolume( + const string symbol, // trading symbol + ENUM_ORDER_TYPE type, // order type + double entry, // open price + double percent = 100 // percent of available margin + ) + { + // + double result = mAccountInfo.MaxLotCheck( + symbol, + type, + entry, + percent); + + // + return result; + } + + // + // Calculate Point Value for Given Symbol based on Account ... + double GetPointValue( + string symbol // trading symbol + ) + { + // + double result = 0; + + // + double tickSize = SymbolInfoDouble(symbol, SYMBOL_TRADE_TICK_SIZE); + double tickValue = SymbolInfoDouble(symbol, SYMBOL_TRADE_TICK_VALUE); + double point = SymbolInfoDouble(symbol, SYMBOL_POINT); + + // + double ticksPerPoint = tickSize / point; + + // + result = tickValue / ticksPerPoint; + + // + return result; + } + + // + // Calculate Risk Amount based on account Currency by Providing: + // Points and Volume ... + double CalculateRiskAmount( + string symbol, // trading symbol + double points, // amount of Risk Points + double volume // position Volume + ) + { + // + double result = 0; + + // + double pointValue = GetPointValue(symbol); + + // + result = pointValue * volume * points; + + // + return result; + } + + // + // Calculate Risk Points based on account Currency by Providing: + // Volume and Amount ... + double CalculateRiskPoints( + string symbol, // trading symbol + double volume, // position Volume + double amount // amount of Risk based on Account Currency + ) + { + // + double result = 0; + + // + double pointValue = GetPointValue(symbol); + + // + result = amount / (pointValue * volume); + + // + return result; + } + + // + // Calculate Volume based on account Currency by Providing: + // Amount and Risk Points ... + double CalculateVolume( + string symbol, // trading symbol + double amount, // amount of Risk based on Account Currency + double points // amount of Risk Points + ) + { + // + double result = 0; + + // + points = + points <= 0 + ? 10 + : points; + + // + double pointValue = GetPointValue(symbol); + + // + result = amount / (pointValue * points); + + // + return result; + } + + // + // END Provided Functions ... + // + + // + // Protected ... +protected: + // + // Private ... +private: + // + // Account Info ... + CAccountInfo mAccountInfo; +}; + +// +// START Usefull Functions ... +// + +// +// END Usefull Functions ... +// diff --git a/MQLTestWorkspace/BKPS/14030222/Classes/x-saherelm.xea.class.ex5 b/MQLTestWorkspace/BKPS/14030222/Classes/x-saherelm.xea.class.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..dba1cbc3e0b0c5989471878fad9d107e36457376 GIT binary patch literal 14258 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 CQajrK literal 0 HcmV?d00001 diff --git a/MQLTestWorkspace/BKPS/14030222/Classes/x-saherelm.xea.class.mq5 b/MQLTestWorkspace/BKPS/14030222/Classes/x-saherelm.xea.class.mq5 new file mode 100644 index 0000000..626a8cd --- /dev/null +++ b/MQLTestWorkspace/BKPS/14030222/Classes/x-saherelm.xea.class.mq5 @@ -0,0 +1,2142 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Class Library +// ---------------------------------------------- +// Name: XSCBaseEA +// Description: provides all Base EA requirements ... +// +// +// Maintainer: +// ------------ +// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) +// +////////////////////////////////////////////////////// +// +// Global Properties ... +#property library +#property copyright "Copyright 2023, SaherElm IT Center" +#property link "https://www.saherelm.ir" +#property version "1.00" +#property strict + +// +// START Definitions ... +// + +// +// if Signal Execution Failed this is the reason ... +enum ENUM_X_SIGNAL_EXECUTION_FAILED +{ + X_NOTHING, // Succeeded ... + X_UNKNOWN, // Failed, but Unknown ... + X_FAILED_REASON_EQUITY, // Failed, Since Equity ... + X_FAILED_REASON_SPREAD, // Failed, Since Spread ... + X_FAILED_REASON_MAX_REACHED // Failed Signce Max Allowed Reached ... +}; + +// +// END Definitions ... +// + +// +// START Import and Inclused requirements ... +// + +// +// Includes ... +#include "../Libraries/x-saherelm.alert.lib.mq5" +#include "../Libraries/x-saherelm.common.lib.mq5" +#include "../Classes/x-saherelm.xtrade.class.mq5" +#include "../Classes/x-saherelm.xaccount.class.mq5" +#include "../Classes/x-saherelm.xprovider.class.mq5" +#include "../Libraries/x-saherelm.seriallizer.lib.mq5" + +// +// END Import and Inclused requirements ... +// + +// +// START Overrides ... +// + +// +// END Overrides ... +// + +// +// a Class for Handle base requirements ... +// for indicators ... +class XSCBaseEA +{ + // + // Public ... +public: + // + // Props ... + XSCTrade *mTrader; + XSCAccount *mAccount; + + // + bool isNewHour; + bool isNewDay; + bool isNewWeek; + bool isNewMonth; + bool isNewCandle; + + // + bool isInTestMode; + + // + bool mWaitsUntilNewCandle; + + // + // Constructor ... + void XSCBaseEA( + string symbol, // Trading Symbol + ENUM_TIMEFRAMES period, // Trading Time Frame + ulong magic, // Magic Number + int slippage, // Slippgae + double maxAllowedSpread, // Max Allowed Spread to Execute Signal + int maxAllowedPositions, // Maximum Allowed Same Time Position + double minProfitPerTrade, // Min Profit Per Trade based On Volume Factor (Hedge) + double minProfitPerVolumeFactor, // Min Volume Factor for Calculating Profit (Hedge) + double maxAllowedDrawDownFactor, // Max Allowed Drawdown factor for Open New Positions + TOnStopLoss onStopLossTriggered = NULL, // On StopLoass Triggered Event Handler + TOnTakeProfit onTakeProfitTriggered = NULL, // On TakeProfit Triggered Event Handler + TOnDealsChanged onDealsChangedHandler = NULL, // On Deals Changed Event Handler + TOnOrdersChanged onOrdersChangedHandler = NULL, // On Orders Changed Event Handler + TOnPositionsChanged onPositionsChangedHandler = NULL, // On Positions Changed Event Handler + TOnTradeStateChanged onTradeStateChangedHandler = NULL // On Trade State Changed Event Handler + ) + { + // + mSymbol = symbol; + mPeriod = period; + + // + mMagic = magic; + mSlippage = slippage; + + // + mMaxAllowedSpread = maxAllowedSpread; + + // + mMaxAllowedPositions = maxAllowedPositions; + mMaxAllowedDrawDownFactor = maxAllowedDrawDownFactor; + + // + mMinProfitPerTrade = minProfitPerTrade; + mMinProfitPerVolumeFactor = minProfitPerVolumeFactor; + + // + mOnStopLossTriggered = onStopLossTriggered; + mOnTakeProfitTriggered = onTakeProfitTriggered; + mOnDealsChangedHandler = onDealsChangedHandler; + mOnOrdersChangedHandler = onOrdersChangedHandler; + mOnPositionsChangedHandler = onPositionsChangedHandler; + mOnTradeStateChangedHandler = onTradeStateChangedHandler; + + // + // Reset Timings ... + ResetTiming(); + + // + InitRequirements(); + } + + // + // Deconstructor ... + void ~XSCBaseEA() + { + // + delete mTrader; + delete mAccount; + } + + // + // START Properties ... + // + + // + // Symbol ... + string GetSymbol() + { + return mSymbol; + } + + // + // Period ... + ENUM_TIMEFRAMES GetPeriod() + { + return mPeriod; + } + + // + // Tag ... + string GetTag() + { + return mTag; + } + + // + ulong GetMagic() + { + return mMagic; + } + + // + int GetSlippage() + { + return mSlippage; + } + + // + // Check Long Signalling State ... + bool EnableLongs() + { + return mEnableLongs; + } + + // + // Set Long Signalling State ... + void EnableLongs(bool enable) + { + // + if (enable == mEnableLongs) + { + return; + } + + // + mEnableLongs = enable; + } + + // + // Check Short Signalling State ... + bool EnableShorts() + { + return mEnableShorts; + } + + // + // Set Short Signalling State ... + void EnableShorts(bool enable) + { + // + if (enable == mEnableShorts) + { + return; + } + + // + mEnableShorts = enable; + } + + // + double MaxAllowedSpread() + { + return mMaxAllowedSpread; + } + + // + void MaxAllowedSpread(double value) + { + // + if (value <= 0) + { + value = 0; + } + + // + if (value == mMaxAllowedSpread) + { + return; + } + + // + mMaxAllowedSpread = value; + } + + // + // Get Max Allowed Positions at Same Time ... + int MaxAllowedPositions() + { + return mMaxAllowedPositions; + } + + // + // Set Max Allowed Positions at Same Time ... + void MaxAllowedPositions(int value) + { + // + if (value < 0 || + value == mMaxAllowedPositions) + { + return; + } + + // + mMaxAllowedPositions = value; + } + + // + // Get Max Allowed DrawDown Factor ... + double MaxAllowedDrawDownFactor() + { + return mMaxAllowedDrawDownFactor; + } + + // + // Set Max Allowed Positions at Same Time ... + void MaxAllowedDrawDownFactor(double value) + { + // + if (value < 0 || + value == mMaxAllowedDrawDownFactor) + { + return; + } + + // + mMaxAllowedDrawDownFactor = value; + } + + // + double MinProfitPerTrade() + { + return mMinProfitPerTrade; + } + + // + void MinProfitPerTrade(double value) + { + // + if (value <= 0) + { + value = 0; + } + + // + if (value == mMinProfitPerTrade) + { + return; + } + + // + mMinProfitPerTrade = value; + } + + // + double MinProfitPerVolumeFactor() + { + return mMinProfitPerVolumeFactor; + } + + // + void MinProfitPerVolumeFactor(double value) + { + // + if (value <= 0) + { + value = 0; + } + + // + if (value == mMinProfitPerVolumeFactor) + { + return; + } + + // + mMinProfitPerVolumeFactor = value; + } + + // + // END Properties ... + // + + // + // START Provided Functions ... + // + + // + // Prepare Tag ... + virtual void PrepareTag() + { + mTag = "XEA" + mSymbol + "," + ToString(mPeriod) + (string)mMagic; + } + + // + // Handle Chart Events ... + virtual void OnChartEvent( + const int id, // event ID + const long &lparam, // long type event parameter + const double &dparam, // double type event parameter + const string &sparam // string type event parameter + ) + { + } + + // + // Check any Registered Providers Signalling ... + virtual bool SignalCheck(XSignal &signals[]) + { + return false; + } + + // + // Check for any Custom Guard Actions Guard Actions ... + virtual bool CheckGuard(XGuard &guards[]) + { + return false; + } + + // + virtual void BeforeSignalExecution(XSignal &signals[]) {} + + // + // NOTE: you have to call these Functions on Static Classes to Handle Works ... + + // + // Handle StopLoss Event ... + virtual void OnStopLossTriggered(const XDeal &deal) {} + + // + // Handle TakeProfit Event ... + virtual void OnTakeProfitTriggered(const XDeal &deal) {} + + // + // Handle Deals Changed Event ... + virtual void OnDealsChangedHandler(int count) {} + + // + // Handle Order Changed Event ... + virtual void OnOrdersChangedHandler(int count) {} + + // + // Handle Position Changed Event ... + virtual void OnPositionsChangedHandler(int count) {} + + // + // Handle Trade State Changed ... + virtual void OnTradeStateChangedHandler(const XOnTradeHandlerState &state) {} + + // + // Implemented Actions ... + + // + // OnTick Handler ... + void OnTick() + { + // + // First Check Guards .... + // Only when Open Positions Exists or Has Pending Order ... + XGuard guards[]; + bool hasGuard = CheckGuard(guards); + if (hasGuard) + { + DoGuards(guards); + } + + // + XSignal signals[]; + bool hasSignal = SignalCheck(signals); + if (hasSignal) + { + // + // Here we have to Check Signals and also it's State ... + XSignal enabledSignals[]; + int signalsCount = ArraySize(signals); + if (signalsCount <= 0) + { + return; + } + + // + // Filter Signals by their type and + // also Check EA Enable their type ... + for (int i = 0; i < signalsCount; i++) + { + // + XSignal iSignal = signals[i]; + bool isLong = IsLong(iSignal.type); + if ((isLong && mEnableLongs) || + (!isLong && mEnableShorts)) + { + // + Add( + iSignal, + enabledSignals); + } + } + + // + int enabledSignalsCount = ArraySize(enabledSignals); + if (enabledSignalsCount <= 0) + { + return; + } + + // + // Here we have do All things before Signals Execution ... + // in this way we can implement custom searios on Inherited Classes ... + BeforeSignalExecution(enabledSignals); + + // + // Now double chack signals Array .... + // if there isn't any signal we prevent moving forward ... + // this helps us to Manage Signal Executions on Above Part ... + // for inherited classes ... + enabledSignalsCount = ArraySize(enabledSignals); + if (enabledSignalsCount <= 0) + { + return; + } + + // + ENUM_X_SIGNAL_EXECUTION_FAILED reasons[]; + ExecuteSignals( + enabledSignals, + reasons, + true // Check Policiese ... + ); + } + } + + // + // Handle On Trade ... + void OnTrade() + { + // + XOnTradeHandlerState state = mTrader.HandleOnTrade(); + + // + if ( + !state.hasNewDeal && + !state.hasNewOrder && + !state.hasNewPosition && + !state.hasNewHistoryOrder) + { + return; + } + + // + // STATE ... + + // + // Notfy Trade State Changed Event ... + OnTradeStateChangedHandler(state); + + // + // DEALS ... + if (state.hasNewDeal) + { + // + // Notfy Deals Changed Event ... + OnDealsChangedHandler(state.newDeals); + + // + // Retrieve Last Deal ... + XDeal deals[]; + mTrader.GetDeals(deals); + int dealsCount = ArraySize(deals); + if (dealsCount > 0) + { + // + XDeal lastDeal = deals[0]; + + // + if (lastDeal.reason == DEAL_REASON_TP) + { + OnTakeProfitTriggered(lastDeal); + } + else if (lastDeal.reason == DEAL_REASON_SL) + { + OnStopLossTriggered(lastDeal); + } + } + } + + // + // ORDERS ... + if (state.hasNewOrder || state.hasNewHistoryOrder) + { + // + // Notfy Orders Changed Event ... + OnOrdersChangedHandler(state.newOrders + state.newHistoryOrders); + } + + // + // POSITIONS ... + if (state.hasNewPosition) + { + // + // Notfy Positions Changed Event ... + OnPositionsChangedHandler(state.newPositions); + } + } + + // + // Retrieve Dept Of Market ... + void OnBookEvent(const string &symbol) + { + // + // TODO: Implement this ... + } + + // + // TOOLS ... + + // + // Execute Specific Signal by Checking Spreads ... + // if provided ... + bool ExecuteSignal( + const XSignal &signal, // Source Signal ... + ENUM_X_SIGNAL_EXECUTION_FAILED &reason, // Provides Error Reason ... + bool checkPoliciese = true // Check Account Policies Before Execute Signal ... + ) + { + // + bool result = false; + reason = X_NOTHING; + + // + // Check Account Policies ... + if (checkPoliciese) + { + // + // First Check Equity ... + result = CheckEquityForTrade(); + if (!result) + { + // + reason = X_FAILED_REASON_EQUITY; + return result; + } + + // + // Check Positions Count ... + result = ChecPositionsForTrade(); + if (!result) + { + // + reason = X_FAILED_REASON_MAX_REACHED; + return result; + } + + // + // Check Spread ... + result = IsSpreadOkForSignalExecution(signal); + if (!result) + { + // + reason = X_FAILED_REASON_SPREAD; + return result; + } + } + + // + XSignal tmpSignal = signal; + PrepareSignal(tmpSignal); + + // + // Generate Provider Comment ... + string comment = GenerateProvidersString(tmpSignal); + + // + result = mTrader + .ExecuteSignal( + tmpSignal, + comment // + ); + if (!result) + { + reason = X_UNKNOWN; + } + + // + return result; + } + + // + // Execute Specific Signals by Checking Spreads ... + // if provided ... + int ExecuteSignals( + const XSignal &signals[], // Signals Collection ... + ENUM_X_SIGNAL_EXECUTION_FAILED &reasons[], // Provides Error Reason ... + bool checkPoliciese = true // Check Account Policies Before Execute Signal ... + ) + { + // + int result = 0; + + // + Clean(reasons); + + // + int signalsCount = ArraySize(signals); + if (signalsCount <= 0) + { + return result; + } + + // + // Here we Have to Check Account Policies + // and Execute Signals base on them ... + + // + for (int i = 0; i < signalsCount; i++) + { + // + XSignal iSignal = signals[i]; + + // + ENUM_X_SIGNAL_EXECUTION_FAILED iReason = X_NOTHING; + + // + bool isExecuted = ExecuteSignal( + iSignal, + iReason, + checkPoliciese // + ); + if (isExecuted) + { + result++; + } + + // + Add( + iReason, + reasons); + } + + // + return result; + } + + // + // Get All Open Trades ... + int GetPositions( + XPosition &result[], // Hold Result ... + string symbol = NULL, // Trading Symbol ... + ENUM_POSITION_TYPE type = NULL, // Trading Type ... + ENUM_TIMEFRAMES period = NULL, // Trading Period ... + string provider = NULL // Signal Provider ... + ) + { + // + int mResult = 0; + + // + Clean(result); + + // + bool hasSymbol = !(symbol == NULL || StringLen(symbol) == 0); + bool hasProvider = !(provider == NULL || StringLen(provider) == 0); + + // + int positionsCount = mTrader.CountPositions(); + if (positionsCount <= 0) + { + return mResult; + } + + // + XPosition positions[]; + mTrader.GetPositions( + positions, + symbol, + period); + positionsCount = ArraySize(positions); + if (positionsCount <= 0) + { + return mResult; + } + + // + if (!hasProvider && type == NULL) + { + // + Copy( + positions, + result); + + // + return ArraySize(result); + } + + // + if (type == NULL) + { + // + ArrayResize( + result, + ArraySize(positions)); + + // + for (int i = 0; i < positionsCount; i++) + { + // + Add( + positions[i], + result); + } + + // + return ArraySize(result); + } + + // + for (int i = 0; i < positionsCount; i++) + { + // + XPosition iPosition = positions[i]; + + // + string iProvider = ExtractProvider(iPosition.comment); + if (hasProvider && iProvider != provider) + { + continue; + } + + // + if (type == NULL || iPosition.type == type) + { + // + Add( + iPosition, + result); + } + } + + // + mResult = ArraySize(result); + + // + return mResult; + } + + // + // Extract Positions by it's Profits ... + void ExtractPositionsBasedOnProfits( + const XPosition &positions[], // Check as Data Source + XPosition &inDPositions[], // Hold In Drawdown Positions + XPosition &inPPositions[] // Hold In Profit Positions + ) + { + // + Clean(inDPositions); + Clean(inPPositions); + + // + int positionsCount = ArraySize(positions); + if (positionsCount <= 0) + { + return; + } + + // + for (int i = 0; i < positionsCount; i++) + { + // + XPosition iPosition = positions[i]; + + // + if (iPosition.profit > 0) + { + // + Add( + iPosition, + inPPositions); + } + else if (iPosition.profit < 0) + { + // + Add( + iPosition, + inDPositions); + } + } + } + + // + // Get All In Profit Trades ... + int GetInProfitPositions( + XPosition &result[], // Hold Result ... + string symbol = NULL, // Trading Symbol ... + ENUM_POSITION_TYPE type = NULL, // Trading Type ... + ENUM_TIMEFRAMES period = NULL, // Trading Period ... + string provider = NULL, // Signal Provider ... + ENUM_X_POSITION_SELECT_METHODS method = NULL // Select Method ... + ) + { + // + int mResult = 0; + + // + Clean(result); + + // + if (method == NULL) + { + method = X_POSITION_SELECT_ALL; + } + + // + // Prevent Going Forwars Since selection type is NONE ... + if (method == X_POSITION_SELECT_NONE) + { + return mResult; + } + + // + bool isMinSelectable = method == X_POSITION_SELECT_MIN; + bool isMaxSelectable = method == X_POSITION_SELECT_MAX; + + // + XPosition positions[]; + GetPositions( + positions, + symbol, + type, + period, + provider); + int positionsCount = ArraySize(positions); + if (positionsCount <= 0) + { + return mResult; + } + + // + // Define Temp Position for Selecting Max Position ... + XPosition maxPos; + maxPos.profit = INVALID_HANDLE; + + // + // Define Temp Position for Selecting Min Position ... + XPosition minPos; + minPos.profit = INVALID_HANDLE; + + // + // Loop through available Positions for Selecting Positions ... + for (int i = 0; i < positionsCount; i++) + { + // + XPosition iPosition = positions[i]; + + // + // Check Profit State ... + if (iPosition.profit <= 0) + { + continue; + } + + // + // Check Selection State ... + if (isMinSelectable) + { + // + if (minPos.profit == INVALID_HANDLE || + minPos.profit > iPosition.profit) + { + minPos = iPosition; + } + + // + continue; + } + else if (isMaxSelectable) + { + // + if (maxPos.profit == INVALID_HANDLE || + maxPos.profit < iPosition.profit) + { + maxPos = iPosition; + } + + // + continue; + } + else + { + // + Add( + iPosition, + result); + } + } + + // + // Add Selected Position if Provided to Results ... + if (isMinSelectable) + { + // + Add( + minPos, + result); + } + else if (isMaxSelectable) + { + // + Add( + maxPos, + result); + } + + // + mResult = ArraySize(result); + + // + return mResult; + } + + // + // Get All In Drawdown Trades ... + int GetInDrawdownPositions( + XPosition &result[], // Hold Result ... + string symbol = NULL, // Trading Symbol ... + ENUM_POSITION_TYPE type = NULL, // Trading Type ... + ENUM_TIMEFRAMES period = NULL, // Trading Period ... + string provider = NULL, // Signal Provider ... + ENUM_X_POSITION_SELECT_METHODS method = NULL // Select Method ... + ) + { + // + int mResult = 0; + + // + Clean(result); + + // + if (method == NULL) + { + method = X_POSITION_SELECT_ALL; + } + + // + // Prevent Going Forwars Since selection type is NONE ... + if (method == X_POSITION_SELECT_NONE) + { + return mResult; + } + + // + bool isMinSelectable = method == X_POSITION_SELECT_MIN; + bool isMaxSelectable = method == X_POSITION_SELECT_MAX; + + // + XPosition positions[]; + GetPositions( + positions, + symbol, + type, + period, + provider); + int positionsCount = ArraySize(positions); + if (positionsCount <= 0) + { + return mResult; + } + + // + // Define Temp Position for Selecting Max Position ... + XPosition maxPos; + maxPos.profit = INVALID_HANDLE; + + // + // Define Temp Position for Selecting Min Position ... + XPosition minPos; + minPos.profit = INVALID_HANDLE; + + // + // Loop through available Positions for Selecting Positions ... + for (int i = 0; i < positionsCount; i++) + { + // + XPosition iPosition = positions[i]; + + // + // Check Profit State ... + if (iPosition.profit >= 0) + { + continue; + } + + // + // Check Selection State ... + if (isMinSelectable) + { + // + if (minPos.profit == INVALID_HANDLE || + minPos.profit < iPosition.profit) + { + minPos = iPosition; + } + + // + continue; + } + else if (isMaxSelectable) + { + // + if (maxPos.profit == INVALID_HANDLE || + maxPos.profit > iPosition.profit) + { + maxPos = iPosition; + } + + // + continue; + } + else + { + // + Add( + iPosition, + result); + } + } + + // + // Add Selected Position if Provided to Results ... + if (isMinSelectable) + { + // + Add( + minPos, + result); + } + else if (isMaxSelectable) + { + // + Add( + maxPos, + result); + } + + // + mResult = ArraySize(result); + + // + return mResult; + } + + // + // Retrieve Orders ... + int GetOrders( + XOrder &result[], // Hold Result ... + string symbol = NULL, // Trading Symbol ... + ENUM_ORDER_TYPE type = NULL, // Trading Type ... + ENUM_ORDER_STATE state = NULL, // Trading State ... + ENUM_TIMEFRAMES period = NULL, // Trading Period ... + string provider = NULL // Signal Provider ... + ) + { + // + int mResult = 0; + + // + Clean(result); + + // + XOrder orders[]; + mTrader.GetOrders( + orders, + symbol, + period, + state); + int ordersCount = ArraySize(orders); + if (ordersCount <= 0) + { + return mResult; + } + + // + if (type == NULL && + (provider == NULL || + StringLen(provider) == 0)) + { + // + Copy( + orders, + result); + + // + mResult = ArraySize(result); + + // + return mResult; + } + + // + for (int i = 0; i < ordersCount; i++) + { + // + XOrder iOrder = orders[i]; + + // + if (type != NULL && iOrder.type != type) + { + continue; + } + + // + if (provider != NULL && + StringLen(provider) > 0) + { + // + // Generate Order Provider ... + string iProvider = ExtractProvider(iOrder.comment); + if (iProvider != provider) + { + continue; + } + } + + // + Add( + iOrder, + result); + } + + // + mResult = ArraySize(result); + + // + return mResult; + } + + // + int GetHistoryOrders( + XOrder &result[], // Hold Result ... + string symbol = NULL, // Trading Symbol ... + ENUM_ORDER_TYPE type = NULL, // Trading Type ... + ENUM_ORDER_STATE state = NULL, // Trading State ... + ENUM_TIMEFRAMES period = NULL, // Trading Period ... + string provider = NULL, // Signal Provider ... + datetime startDate = 0, // Start Date ... + datetime endDate = 0 // End Date ... + ) + { + // + int mResult = 0; + + // + Clean(result); + + // + XOrder history[]; + int historyCount = mTrader + .GetHistoryOrders( + history, + symbol, + period, + type, + state, + startDate, + endDate); + if (historyCount <= 0) + { + return mResult; + } + + // + if (StringLen(provider) == 0 || provider == NULL) + { + // + Copy( + history, + result); + + // + mResult = ArraySize(result); + + // + return mResult; + } + + // + for (int i = 0; i < historyCount; i++) + { + // + XOrder iHistory = history[i]; + + // + if (provider != NULL && + StringLen(provider) > 0) + { + // + // Generate Order Provider ... + string iProvider = ExtractProvider(iHistory.comment); + if (iProvider != provider) + { + continue; + } + } + + // + Add( + iHistory, + result); + } + + // + mResult = ArraySize(result); + + // + return mResult; + } + + // + int GetHistoryDeals( + XDeal &result[], // Hold Result ... + string symbol = NULL, // Trading Symbol ... + ENUM_DEAL_TYPE type = NULL, // Specify Deal Type ... + ENUM_DEAL_REASON reason = NULL, // Specify Deal Reason ... + ENUM_TIMEFRAMES period = NULL, // Trading Period ... + string provider = NULL, // Signal Provider ... + datetime startDate = 0, // Start Date ... + datetime endDate = 0 // End Date ... + ) + { + // + int mResult = 0; + + // + Clean(result); + + // + XDeal history[]; + int historyCount = mTrader + .GetHistoryDeals( + history, + symbol, + type, + reason, + startDate, + endDate); + if (historyCount <= 0) + { + return mResult; + } + + // + bool canCheckPeriod = period != NULL; + bool canCheckProvider = provider != NULL && + StringLen(provider) > 0; + + // + if (!canCheckPeriod && !canCheckProvider) + { + // + Copy( + history, + result); + + // + mResult = ArraySize(history); + + // + return mResult; + } + + // + for (int i = 0; i < historyCount; i++) + { + // + XDeal iDeal = history[i]; + + // + if (canCheckPeriod) + { + // + ENUM_TIMEFRAMES dealPeriod = mTrader.GetDealPeriod(iDeal); + if (dealPeriod != period) + { + continue; + } + } + + // + if (canCheckProvider) + { + // + string comment = mTrader.GetDealPositionComment(iDeal); + if (StringLen(comment) <= 0) + { + continue; + } + + // + string oProvider = ExtractPeriodString(comment); + if (oProvider != provider) + { + continue; + } + } + + // + Add( + iDeal, + result); + } + + // + mResult = ArraySize(result); + + // + return mResult; + } + + // + // GUARD Handlers ... + + // + // Parse Recievd Guards and Do them ... + void DoGuards(XGuard &guards[]) + { + // + int guardsCount = ArraySize(guards); + if (guardsCount <= 0) + { + return; + } + + // + for (int i = 0; i < guardsCount; i++) + { + // + XGuard iGuard = guards[i]; + + // + switch (iGuard.action) + { + // + // Hedge In Profit Specified Positions ... + case X_GUARD_ACTION_HEDGE: + HandleGuardHedgeAction( + iGuard.provider, + iGuard.symbol, + iGuard.type, + iGuard.period); + break; + + // + // Trail Stop Loss in Specified Positions ... + case X_GUARD_ACTION_TRAIL_STOP: + HandleGuardTrailingStopAction( + iGuard.provider, + iGuard.symbol, + iGuard.type, + iGuard.period, + iGuard.dblPayLoad); + break; + + // + // Force Close Specified Positions ... + case X_GUARD_ACTION_FORCE_CLOSE: + HandleGuardForceCloseAction( + iGuard.provider, + iGuard.symbol, + iGuard.type, + iGuard.period); + break; + + // + // Generate and Place Support Signals ... + case X_GUARD_ACTION_ADD_SUPPORT_SIGNAL: + HandleGuardAddSupportPositionAction( + iGuard.provider, + iGuard.symbol, + iGuard.type, + iGuard.period); + break; + + // + // Delete All Placed Pending Orders ... + case X_GUARD_ACTION_CANCEL_PENDING_ORDERS: + HandleGuardCancelPendingOrdersAction( + iGuard.provider, + iGuard.symbol, + iGuard.type, + iGuard.period); + break; + } + } + } + + // + // Close All Specified Provider's Positions in Profit Summary ... + void HandleGuardHedgeAction( + string provider, // Positions Provided by Specific Provider + string symbol, // Trading Symbol + ENUM_POSITION_TYPE type, // Trading Type + ENUM_TIMEFRAMES period, // Specified Time Frame + double minProfitForHedging = 1 // Specified Profit for Hedge + ) + { + // + XPosition positions[]; + int positionsCount = GetPositions( + positions, + symbol, + type, + period, + provider); + if (positionsCount <= 1) + { + return; + } + + // + double profit = CalculatePositionsProfit(positions); + double requiredProfit = CalculateRequiredProfitForHedge(positions); + + // + bool isReadyForHedge = profit >= requiredProfit; + if (!isReadyForHedge) + { + return; + } + + // + string comment = "Guard Hedge " + provider; + int closed = mTrader.ClosePositions( + positions, + comment); + if (closed > 0) + { + // + string message = "Guard Hedge " + provider + "'s Positions on Profit: " + ToString(profit); + + // + LogMessage(message); + } + } + + // + // Close Max In Profit Trade Guard Action ... + void HandleGuardCloseInProfitAction( + string provider, // Positions Provided by Specific Provider + string symbol, // Trading Symbol + ENUM_POSITION_TYPE type, // Trading Type + ENUM_TIMEFRAMES period, // Specified Time Frame + ENUM_X_POSITION_SELECT_METHODS method = NULL // Select Method + ) + { + // + XPosition positions[]; + GetInProfitPositions( + positions, + symbol, + type, + period, + provider, + method); + int positionsCount = ArraySize(positions); + if (positionsCount <= 0) + { + return; + } + + // + string comment = "Close InProfit ..."; + mTrader.ClosePositions( + positions, + comment); + + // + string message = "Guard Close (" + ToString(positionsCount) + ") Postion(s) In Profit ..."; + LogMessage(message); + } + + // + // Close Max In Drawdown Trade Guard Action ... + void HandleGuardCloseInDrawdownAction( + string provider, // Positions Provided by Specific Provider + string symbol, // Trading Symbol + ENUM_POSITION_TYPE type, // Trading Type + ENUM_TIMEFRAMES period, // Specified Time Frame + ENUM_X_POSITION_SELECT_METHODS method = NULL // Select Method + ) + { + // + XPosition positions[]; + GetInDrawdownPositions( + positions, + symbol, + type, + period, + provider, + method); + int positionsCount = ArraySize(positions); + if (positionsCount <= 0) + { + return; + } + + // + string comment = "Close InDrawdown ..."; + mTrader.ClosePositions( + positions, + comment); + + // + string message = "Guard Close (" + ToString(positionsCount) + ") Position(s) In Drawdown ..."; + LogMessage(message); + } + + // + // Force Close Specified Set Of Position ... + void HandleGuardForceCloseAction( + string provider, // Positions Provided by Specific Provider + string symbol, // Trading Symbol + ENUM_POSITION_TYPE type, // Trading Type + ENUM_TIMEFRAMES period, // Specified Time Frame + ulong ticket = 0 // Specific Ticket + ) + { + // + string comment = ""; + + // + // Close All Positions ... + if (ticket == 0) + { + // + XPosition positions[]; + GetPositions( + positions, + symbol, + type, + period, + provider); + if (ArraySize(positions) <= 0) + { + return; + } + + // + comment = provider + " Force Close Guard ..."; + + // + mTrader.ClosePositions( + positions, + comment); + } + // + // Close Specific Position ... + else + { + // + XPosition position; + bool hasPosition = mTrader.GetPosition( + position, + ticket); + + // + if (hasPosition) + { + // + comment = provider + "(" + ToString(ticket) + ")" + " Force Close Guard ..."; + + // + mTrader.Close( + ticket, + comment); + } + } + + // + if (StringLen(comment) > 0) + { + LogMessage(comment); + } + } + + // + // Trailing Specified Set Of Positions Stop Losses ... + void HandleGuardTrailingStopAction( + string provider, // Positions Provided by Specific Provider + string symbol, // Trading Symbol + ENUM_POSITION_TYPE type, // Trading Type + ENUM_TIMEFRAMES period, // Specified Time Frame + double sl // Desired SL Value ... + ) + { + // + if (sl <= 0) + { + return; + } + + // + NormalizePrice( + sl, + symbol); + + // + XPosition positions[]; + GetPositions( + positions, + symbol, + type, + period, + provider); + int positionsCount = ArraySize(positions); + if (positionsCount <= 0) + { + return; + } + + // + int modified = 0; + for (int i = 0; i < positionsCount; i++) + { + // + XPosition iPosition = positions[i]; + + // + string comment = PrepareSLTrailComment(iPosition.comment); + + // + if (iPosition.sl == sl) + { + continue; + } + + // + bool isModified = mTrader.Modify( + iPosition.ticket, + sl, + iPosition.tp, + comment); + if (isModified) + { + modified++; + } + } + + // + if (modified > 0) + { + // + string msg = "(" + ToString(modified) + ") Position's Stop Trailed Successfully ..."; + + // + LogMessage(msg); + } + } + + // + // Add Support Signal for Specified Positions ... + void HandleGuardAddSupportPositionAction( + string provider, // Positions Provided by Specific Provider + string symbol, // Trading Symbol + ENUM_POSITION_TYPE type, // Trading Type + ENUM_TIMEFRAMES period // Specified Time Frame + ) + { + // + // TODO: Implement this ... + } + + // + // Cancel all Placed Orders ... + void HandleGuardCancelPendingOrdersAction( + string provider, // Positions Provided by Specific Provider + string symbol, // Trading Symbol + ENUM_POSITION_TYPE type, // Trading Type + ENUM_TIMEFRAMES period // Specified Time Frame + ) + { + // + // TODO: Implement this ... + } + + // + // END Provided Functions ... + // + + // + // Protected ... +protected: + // + string GetTagPrefix() + { + // + string result = "(" + mSymbol + ")(" + ToString(mPeriod) + ")"; + + // + return result; + } + + // + // Symbol ... + string mSymbol; + + // + // Period ... + ENUM_TIMEFRAMES mPeriod; + + // + // ExpertAdviser MAgic Number ... + ulong mMagic; + + // + // Slipppage ... + int mSlippage; + + // + // Tag Identifier ... + string mTag; + + // + bool mEnableLongs; + bool mEnableShorts; + + // + double mMaxAllowedSpread; + + // + int mMaxAllowedPositions; + double mMaxAllowedDrawDownFactor; + + // + double mMinProfitPerTrade; + double mMinProfitPerVolumeFactor; + + // + // Prepare a Signal and Do Calculations ... + void PrepareSignal( + XSignal &signal // a Signal for Preparation ... + ) + { + // + // Normalize Signal ... + NormalizeSignal(signal); + } + + // + // Check Acocunt Balance is Allow new Trades or not ... + bool CheckEquityForTrade() + { + // + bool result = false; + + // + if (mMaxAllowedDrawDownFactor <= 0) + { + // + result = true; + return result; + } + + // + double equity = mAccount.GetEquity(); + double balance = mAccount.GetBalance(); + + // + double selectedBalance = MathMax(equity, balance) - MathMin(equity, balance); + + // + double balanceForFactor = MathAbs(equity - balance); + if (balanceForFactor <= 0) + { + balanceForFactor = balance; + } + else + { + balanceForFactor = equity; + } + + // + double maxAllowedBalanceDrawDown = balanceForFactor * mMaxAllowedDrawDownFactor; + + // + result = equity > balance || + (equity <= balance && + selectedBalance <= maxAllowedBalanceDrawDown); + + // + return result; + } + + // + // Check Max Allowed Positions Policy for Trade ... + bool ChecPositionsForTrade() + { + // + bool result = false; + + // + if (mMaxAllowedPositions <= 0) + { + // + result = true; + return result; + } + + // + int positionsCount = mTrader.CountPositions(); + if (positionsCount <= 0) + { + // + result = true; + return result; + } + + // + result = positionsCount <= mMaxAllowedPositions; + + // + return result; + } + + // + // Check Spread is Ok for Executing Specific Signal ... + bool IsSpreadOkForSignalExecution(const XSignal &signal) + { + // + bool result = false; + + // + bool isSpreadCheckEnable = mMaxAllowedSpread > 0; + if (!isSpreadCheckEnable) + { + result = true; + } + else + { + // + // Retrieve Signal Spread ... + double spread = PriceToPoint( + signal.symbol, + GetSpread(signal.symbol)); + result = spread <= mMaxAllowedSpread; + } + + // + return result; + } + + // + // Calculate Required Profit for Hedging ... + double CalculateRequiredProfitForHedge( + XPosition &positions[] // Source + ) + { + // + double result = 0; + + // + int positionsCount = ArraySize(positions); + if (positionsCount <= 0) + { + return result; + } + + // + bool isHedgingEnable = mMinProfitPerTrade > 0 && mMinProfitPerVolumeFactor > 0; + if (!isHedgingEnable) + { + return result; + } + + // + for (int i = 0; i < positionsCount; i++) + { + // + XPosition iPosition = positions[i]; + + // + if (mMinProfitPerTrade > 0 && mMinProfitPerVolumeFactor > 0) + { + // + result += + ((iPosition.volume / mMinProfitPerVolumeFactor) * + mMinProfitPerTrade) + + (-1 * iPosition.swap); + } + } + + // + return result; + } + + // + // Calculate Positions Profit Summary ... + double CalculatePositionsProfit( + XPosition &positions[] // Source + ) + { + // + double result = 0; + + // + int positionsCount = ArraySize(positions); + if (positionsCount <= 0) + { + return result; + } + + // + for (int i = 0; i < positionsCount; i++) + { + // + XPosition iPosition = positions[i]; + + // + result += iPosition.profit; + } + + // + return result; + } + + // + // Close a Position Pack and Cancel All of it's Supports ... + bool HandleClosePack(XPositionPack &pack) + { + // + bool result = false; + + // + if (pack.ticket <= 0) + { + return result; + } + + // + XOrder orders[]; + XPosition positions[]; + + // + bool hasPos = pack.position.ticket > 0; + if (hasPos) + { + Add( + pack.position, + positions); + } + + // + bool hasSupportPos = pack.supportPositionsCount > 0; + if (hasSupportPos) + { + // + Copy( + pack.supportPositions, + positions, + false); + } + + // + bool hasSupportOrd = pack.supportOrdersCount > 0; + if (hasSupportOrd) + { + // + Copy( + pack.supportOrders, + orders); + } + + // + string comment = "Close Pack"; + + // + int closed = mTrader.ClosePositions(positions, comment); + int canceled = mTrader.CancelOrders(orders); + + // + result = closed + canceled == ArraySize(orders) + ArraySize(positions); + if (result) + { + // + string message = "Close Position(" + ToString(pack.ticket) + ")'s Pack ..."; + + // + LogMessage(message); + } + + // + return result; + } + + // + // Private ... +private: + // + // Define Requirements ... + + // + // XSCTrade Event Handlers ... + TOnStopLoss mOnStopLossTriggered; + TOnTakeProfit mOnTakeProfitTriggered; + TOnDealsChanged mOnDealsChangedHandler; + TOnOrdersChanged mOnOrdersChangedHandler; + TOnPositionsChanged mOnPositionsChangedHandler; + TOnTradeStateChanged mOnTradeStateChangedHandler; + + // + // Initi Requirements ... + void InitRequirements() + { + // + // Account Manager ... + mAccount = new XSCAccount(); + + // + // Trader ... + mTrader = new XSCTrade( + mSlippage, + mMagic); + + // + // Attach Event Handlers ... + + // + if (mOnStopLossTriggered != NULL) + { + mTrader.AddOnStopLossEventHandler(mOnStopLossTriggered); + } + + // + if (mOnTakeProfitTriggered != NULL) + { + mTrader.AddOnTakeProfitEventHandler(mOnTakeProfitTriggered); + } + + // + if (mOnDealsChangedHandler != NULL) + { + mTrader.AddOnDealsChangedEventHandler(mOnDealsChangedHandler); + } + + // + if (mOnOrdersChangedHandler != NULL) + { + mTrader.AddOnOrdersChangedEventHandler(mOnOrdersChangedHandler); + } + + // + if (mOnPositionsChangedHandler != NULL) + { + mTrader.AddOnPositionsChangedEventHandler(mOnPositionsChangedHandler); + } + + // + if (mOnTradeStateChangedHandler != NULL) + { + mTrader.AddOnTradeStateChangedEventHandler(mOnTradeStateChangedHandler); + } + } +}; + +// +// START Usefull Functions ... +// + +// +// END Usefull Functions ... +// diff --git a/MQLTestWorkspace/BKPS/14030222/Classes/x-saherelm.xhelper.class.ex5 b/MQLTestWorkspace/BKPS/14030222/Classes/x-saherelm.xhelper.class.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..7acd1deb51f9f7bbcd690f7b5273046ed97c3c20 GIT binary patch literal 6298 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 OK=1ZwLb7yF?*9Sa2zaXi literal 0 HcmV?d00001 diff --git a/MQLTestWorkspace/BKPS/14030222/Classes/x-saherelm.xmd5.class.mq5 b/MQLTestWorkspace/BKPS/14030222/Classes/x-saherelm.xmd5.class.mq5 new file mode 100644 index 0000000..cbd7f96 --- /dev/null +++ b/MQLTestWorkspace/BKPS/14030222/Classes/x-saherelm.xmd5.class.mq5 @@ -0,0 +1,441 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Class Library +// ---------------------------------------------- +// Name: XSCMD5 +// Description: Provides MD5 Hashing Requirements ... +// +// +// Maintainer: +// ------------ +// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) +// +////////////////////////////////////////////////////// +// +// Global Properties ... +#property library +#property copyright "Copyright 2023, SaherElm IT Center" +#property link "https://www.saherelm.ir" +#property version "1.00" +#property strict + +// +// START Definitions ... +// + +// +static uchar _md5_PADDING[64] = + { + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + +// +#define _md5_F(x, y, z) (((x) & (y)) | ((~x) & (z))) +#define _md5_G(x, y, z) (((x) & (z)) | ((y) & (~z))) +#define _md5_H(x, y, z) ((x) ^ (y) ^ (z)) +#define _md5_I(x, y, z) ((y) ^ ((x) | (~z))) +#define _md5_ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32 - (n)))) + +// +#define _md5_FF(a, b, c, d, x, s, ac) \ + { \ + (a) += _md5_F((b), (c), (d)) + (x) + (uint)(ac); \ + (a) = _md5_ROTATE_LEFT((a), (s)); \ + (a) += (b); \ + } + +// +#define _md5_GG(a, b, c, d, x, s, ac) \ + { \ + (a) += _md5_G((b), (c), (d)) + (x) + (uint)(ac); \ + (a) = _md5_ROTATE_LEFT((a), (s)); \ + (a) += (b); \ + } + +// +#define _md5_HH(a, b, c, d, x, s, ac) \ + { \ + (a) += _md5_H((b), (c), (d)) + (x) + (uint)(ac); \ + (a) = _md5_ROTATE_LEFT((a), (s)); \ + (a) += (b); \ + } + +// +#define _md5_II(a, b, c, d, x, s, ac) \ + { \ + (a) += _md5_I((b), (c), (d)) + (x) + (uint)(ac); \ + (a) = _md5_ROTATE_LEFT((a), (s)); \ + (a) += (b); \ + } + +// +#define _md5_INIT_STATE_0 0x67452301 +#define _md5_INIT_STATE_1 0xefcdab89 +#define _md5_INIT_STATE_2 0x98badcfe +#define _md5_INIT_STATE_3 0x10325476 + +// +#define _md5_S11 7 +#define _md5_S12 12 +#define _md5_S13 17 +#define _md5_S14 22 + +// +#define _md5_S21 5 +#define _md5_S22 9 +#define _md5_S23 14 +#define _md5_S24 20 + +// +#define _md5_S31 4 +#define _md5_S32 11 +#define _md5_S33 16 +#define _md5_S34 23 + +// +#define _md5_S41 6 +#define _md5_S42 10 +#define _md5_S43 15 +#define _md5_S44 21 + +// +// END Definitions ... +// + +// +// XCMD5 a library for Hashing ... +class XSCMD5 +{ + // + // Public Provides ... +public: + // + // Protected Provides ... + + // + // Constructor ... + XSCMD5(void) {} + + // + // Deconstructor ... + ~XSCMD5(void) {} + + // + // Hash Specified Char Array ... + string Hash( + uchar &source[], // Specify Char Array to Hash + int length = 0 // Specify Length of Char Array which required to hash + ) + { + // + string result = ""; + + // + int sourceCount = ArraySize(source); + + // + // Validate Args ... + if ( + sourceCount <= 0 || + (sourceCount > 0 && length > sourceCount)) + { + return result; + } + + // + // Normalize Args ... + if (length == 0) + { + length = sourceCount; + } + + // + // Init MD5 ... + MD5Init(); + + // + // Update Buffer ... + MD5Update(source, length); + + // + // Calculate Result ... + result = MD5Final(); + + // + return result; + } + + // + // Hash Specified String ... + string Hash( + string source // Specified String + ) + { + // + string result = ""; + + // + // Converts String to Char Array ... + uchar bytes[]; + StringToCharArray( + source, + bytes, + 0, + StringLen(source)); + + // + result = Hash( + bytes, + ArraySize(bytes)); + + // + return result; + } + +protected: + // + // Private Provides ... +private: + // + uint m_lMD5[4]; + uint m_nCount[2]; + uchar m_lpszBuffer[64]; + + // + // Convert Byte to DWord ... + void ByteToDWord(int &out[], uint &in[], uint len) + { + // + uint i = 0; + uint j = 0; + + // + for (; j < len; i++, j += 4) + { + out[i] = (int)in[j] | (int)in[j + 1] << 8 | (int)in[j + 2] << 16 | (int)in[j + 3] << 24; + } + } + + // + // Convert DWord to Byte ... + void DWordToByte(uchar &out[], int &in[], uint len) + { + // + uint i = 0; + uint j = 0; + + // + for (; j < len; i++, j += 4) + { + // + out[j] = (uchar)(in[i] & 0xff); + out[j + 1] = (uchar)((in[i] >> 8) & 0xff); + out[j + 2] = (uchar)((in[i] >> 16) & 0xff); + out[j + 3] = (uchar)((in[i] >> 24) & 0xff); + } + } + + // + // Init MD5 Array ... + void MD5Init() + { + // + ArrayInitialize(m_lpszBuffer, 64); + + // + m_nCount[0] = m_nCount[1] = 0; + m_lMD5[0] = _md5_INIT_STATE_0; + m_lMD5[1] = _md5_INIT_STATE_1; + m_lMD5[2] = _md5_INIT_STATE_2; + m_lMD5[3] = _md5_INIT_STATE_3; + } + + // + // Update MD5 ... + void MD5Update(uchar &inBuf[], uint inLen) + { + // + int i, ii; + int mdi; + + // + uint in[16]; + int i0 = 0; + + // + mdi = (int)((m_nCount[0] >> 3) & 0x3F); + + // + if ((m_nCount[0] + ((uint)inLen << 3)) < m_nCount[0]) + { + m_nCount[1]++; + } + + // + m_nCount[0] += ((uint)inLen << 3); + m_nCount[1] += ((uint)inLen >> 29); + + // + while ((inLen--) > 0) + { + // + m_lpszBuffer[mdi++] = inBuf[i0++]; + if (mdi == 0x40) + { + // + for (i = 0, ii = 0; i < 16; i++, ii += 4) + { + in[i] = (((uint)m_lpszBuffer[ii + 3]) << 24) | (((uint)m_lpszBuffer[ii + 2]) << 16) | (((uint)m_lpszBuffer[ii + 1]) << 8) | ((uint)m_lpszBuffer[ii]); + } + + // + Transform(m_lMD5, in); + + // + mdi = 0; + } + } + } + + // + // Finalize an MD5 Expression ... + string MD5Final() + { + // + uchar bits[8]; + int nIndex; + uint nPadLen; + const int nMD5Size = 16; + uchar lpszMD5[16]; + string temp; + string out = ""; + int i; + + // + DWordToByte(bits, m_nCount, 8); + nIndex = (int)((m_nCount[0] >> 3) & 0x3f); + nPadLen = (nIndex < 56) ? (56 - nIndex) : (120 - nIndex); + MD5Update(_md5_PADDING, nPadLen); + MD5Update(bits, 8); + DWordToByte(lpszMD5, m_lMD5, nMD5Size); + + // + for (i = 0; i < nMD5Size; i++) + { + // + if (lpszMD5[i] == 0) + { + temp = "00"; + } + else if (lpszMD5[i] <= 15) + { + temp = StringFormat("0%x", lpszMD5[i]); + } + else + { + temp = StringFormat("%x", lpszMD5[i]); + } + + // + out += temp; + } + + // + lpszMD5[0] = '\0'; + + // + return (out); + } + + // + // Transform Buffers ... + void Transform(uint &buf[], uint &in[]) + { + // + uint a = buf[0], b = buf[1], c = buf[2], d = buf[3]; + + // + _md5_FF(a, b, c, d, in[0], _md5_S11, 0xD76AA478); + _md5_FF(d, a, b, c, in[1], _md5_S12, 0xE8C7B756); + _md5_FF(c, d, a, b, in[2], _md5_S13, 0x242070DB); + _md5_FF(b, c, d, a, in[3], _md5_S14, 0xC1BDCEEE); + _md5_FF(a, b, c, d, in[4], _md5_S11, 0xF57C0FAF); + _md5_FF(d, a, b, c, in[5], _md5_S12, 0x4787C62A); + _md5_FF(c, d, a, b, in[6], _md5_S13, 0xA8304613); + _md5_FF(b, c, d, a, in[7], _md5_S14, 0xFD469501); + _md5_FF(a, b, c, d, in[8], _md5_S11, 0x698098D8); + _md5_FF(d, a, b, c, in[9], _md5_S12, 0x8B44F7AF); + _md5_FF(c, d, a, b, in[10], _md5_S13, 0xFFFF5BB1); + _md5_FF(b, c, d, a, in[11], _md5_S14, 0x895CD7BE); + _md5_FF(a, b, c, d, in[12], _md5_S11, 0x6B901122); + _md5_FF(d, a, b, c, in[13], _md5_S12, 0xFD987193); + _md5_FF(c, d, a, b, in[14], _md5_S13, 0xA679438E); + _md5_FF(b, c, d, a, in[15], _md5_S14, 0x49B40821); + + // + _md5_GG(a, b, c, d, in[1], _md5_S21, 0xF61E2562); + _md5_GG(d, a, b, c, in[6], _md5_S22, 0xC040B340); + _md5_GG(c, d, a, b, in[11], _md5_S23, 0x265E5A51); + _md5_GG(b, c, d, a, in[0], _md5_S24, 0xE9B6C7AA); + _md5_GG(a, b, c, d, in[5], _md5_S21, 0xD62F105D); + _md5_GG(d, a, b, c, in[10], _md5_S22, 0x02441453); + _md5_GG(c, d, a, b, in[15], _md5_S23, 0xD8A1E681); + _md5_GG(b, c, d, a, in[4], _md5_S24, 0xE7D3FBC8); + _md5_GG(a, b, c, d, in[9], _md5_S21, 0x21E1CDE6); + _md5_GG(d, a, b, c, in[14], _md5_S22, 0xC33707D6); + _md5_GG(c, d, a, b, in[3], _md5_S23, 0xF4D50D87); + _md5_GG(b, c, d, a, in[8], _md5_S24, 0x455A14ED); + _md5_GG(a, b, c, d, in[13], _md5_S21, 0xA9E3E905); + _md5_GG(d, a, b, c, in[2], _md5_S22, 0xFCEFA3F8); + _md5_GG(c, d, a, b, in[7], _md5_S23, 0x676F02D9); + _md5_GG(b, c, d, a, in[12], _md5_S24, 0x8D2A4C8A); + + // + _md5_HH(a, b, c, d, in[5], _md5_S31, 0xFFFA3942); + _md5_HH(d, a, b, c, in[8], _md5_S32, 0x8771F681); + _md5_HH(c, d, a, b, in[11], _md5_S33, 0x6D9D6122); + _md5_HH(b, c, d, a, in[14], _md5_S34, 0xFDE5380C); + _md5_HH(a, b, c, d, in[1], _md5_S31, 0xA4BEEA44); + _md5_HH(d, a, b, c, in[4], _md5_S32, 0x4BDECFA9); + _md5_HH(c, d, a, b, in[7], _md5_S33, 0xF6BB4B60); + _md5_HH(b, c, d, a, in[10], _md5_S34, 0xBEBFBC70); + _md5_HH(a, b, c, d, in[13], _md5_S31, 0x289B7EC6); + _md5_HH(d, a, b, c, in[0], _md5_S32, 0xEAA127FA); + _md5_HH(c, d, a, b, in[3], _md5_S33, 0xD4EF3085); + _md5_HH(b, c, d, a, in[6], _md5_S34, 0x04881D05); + _md5_HH(a, b, c, d, in[9], _md5_S31, 0xD9D4D039); + _md5_HH(d, a, b, c, in[12], _md5_S32, 0xE6DB99E5); + _md5_HH(c, d, a, b, in[15], _md5_S33, 0x1FA27CF8); + _md5_HH(b, c, d, a, in[2], _md5_S34, 0xC4AC5665); + + // + _md5_II(a, b, c, d, in[0], _md5_S41, 0xF4292244); + _md5_II(d, a, b, c, in[7], _md5_S42, 0x432AFF97); + _md5_II(c, d, a, b, in[14], _md5_S43, 0xAB9423A7); + _md5_II(b, c, d, a, in[5], _md5_S44, 0xFC93A039); + _md5_II(a, b, c, d, in[12], _md5_S41, 0x655B59C3); + _md5_II(d, a, b, c, in[3], _md5_S42, 0x8F0CCC92); + _md5_II(c, d, a, b, in[10], _md5_S43, 0xFFEFF47D); + _md5_II(b, c, d, a, in[1], _md5_S44, 0x85845DD1); + _md5_II(a, b, c, d, in[8], _md5_S41, 0x6FA87E4F); + _md5_II(d, a, b, c, in[15], _md5_S42, 0xFE2CE6E0); + _md5_II(c, d, a, b, in[6], _md5_S43, 0xA3014314); + _md5_II(b, c, d, a, in[13], _md5_S44, 0x4E0811A1); + _md5_II(a, b, c, d, in[4], _md5_S41, 0xF7537E82); + _md5_II(d, a, b, c, in[11], _md5_S42, 0xBD3AF235); + _md5_II(c, d, a, b, in[2], _md5_S43, 0x2AD7D2BB); + _md5_II(b, c, d, a, in[9], _md5_S44, 0xEB86D391); + + // + buf[0] += a; + buf[1] += b; + buf[2] += c; + buf[3] += d; + } +}; diff --git a/MQLTestWorkspace/BKPS/14030222/Classes/x-saherelm.xprovider.class.ex5 b/MQLTestWorkspace/BKPS/14030222/Classes/x-saherelm.xprovider.class.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..5689dbf0a9946e7e9a865cace1b5119e1b2fa8a9 GIT binary patch literal 7364 zcmdT|Wl$VUlV03if?IHRcXxM(;1(Pf4KBfhYml%(gKMzG-B~QKxO)f=m-oB7A6NBN z-Tl3%Yo>dio|&rd{xdythJ0`yfHG`Jc)(x40CxYS|FQoQww|zNlaOI3jUB|(itY1ib&wHof( zS0CxZo;0bU9*aI8@-T*29H-Pi+-~q7ywRHeie_7kVemQ^(!1XVq1kn9E z%lzfs{_g(A^ZyzDMC|=H16}}O0LNeP`@ za8^H2_}B)aC#zZNBv-?#qWYDSr>w32n2i%qqcLF1o<6M`Uu+UC#e2NK>$f|}$2k)} z%anyCf8I*-VK`mlvC=+d{>4M&%-|+_;JPv5ijJnAZJI+`7raN%a&zBN+k(*59cJ!s zBB6^1VKGry6i@VB7cwM^ClT_VCbpCiB{8$ir<0X)GCe2V!4P*Grb~a1D7VOUEL$7+ zi3(t*V4g|tPn%?5&P%VH!8RzvEg5J_;JP^H#qslg8Bsd`JG^9=&mwD?)UI+B)ie=| zz;Bm#_Iz&XgLbLosNX7L?ER|zYur~5|MAMPt)kC{(@zP(s7tCSvSLS>7?E2WqlXsE za%3EtVC1-G11y4%Ng+HKV9q_6l@$3r0f$$0_mjl$0k_@Fx2UW0Y;lZSrw%HrpKm*) z80k-7BIt_AJO@_mlc+Tvy&V_vtmNr3UeIH|xSnrPe_#i$$0^P!pF(;CFLW6zjZjZA zqG(4~CXZZIc?&As2N}vN+j)=c&!WkOIcO$MRd`#tyC?8E;4Icm5-UG{tJ1`da!PF> zj?Xbrn;i`+nDN&l3}yX&K=Q<-(?>UQMpE;~koXr7g6=@=6W0Dl>r2?yQ64!L$2S&( zq3=1wOT6nTit6JGnuKq)_~s5QIKT>VV^wICM`R@`0>CWR$8CgB1!jgYNWR6@<;A&? z6bkaTyRoKO(LB8NtCDaRbgUszj_1^ebn^P-iZ|M0a}lvjIptXmom#QnGlfP3SATQk zf>&;xqe3;94d70Qmyr0wlYv2|Y_s3#j_9#IJD62qWv@i%xJsJ+x&MEr4lA0q3R_<94~_4D?L3$M^g8XdF;pmUpzGW_VAh zj~-(Au3lS1c`hM{b*<%uZJr(Rs{;RMb=$5x0q3CQuV+VzU>xeMu@5Sk6RBP>pU&BACVkW8i_dS~_ zrZ>+WJn>Dt%+U+inZ@3vKyc?-vUV_9_>|oj4XqB^GM=1&mf(nG5=Mv!HA>8u;OL%^ zOOAJ_`au6o2Nw4S6LA{Hsf&I;h4f-+GE)|$-q{CN7uDggs1@@zx`@pHPHH7(F!lG-#5{0ANY~peG5B;^ zHf*~F5+3iR&`0?M^k^W52@~+8Fcq7jCf5v!2zbaA(8>8|Li15LWr1ioy7>Cs%d<%d z7If0zpCG{RN95QUyno(-uL3E04oO6Q0eU1ag|=wzig+>LtCS?$zr7~0URc4_sP-O% z7tW;g?)Ujeja$V%DC`wsj6b`6vesQoyEI%S=XtnfYhHu1Nvl%4mu z+@XK9XNnWLwev8WLDQW|A0C^upvKM$VQe_^2|N3?1vOEqUu3JO1SUuK5y@NupIJe+RAG-k4>>Ju(ike6HKwOIlX!7sT-wR`h!(Eg7yD-dMVs$R9e3|yjJ6CT>z&qY5dRD`_d@83?KBEj-}cvsB<`a zgAZ8SoRfx!H^K~FY>;TecvkCK^8MB+5z`mTD#w!HQAV1^MQ>S8;XRHc zw$ulNP|sx4OxD6!wffCmM1RS7n9Xr!%9U?u#PAu+YCRbXkSxJBC%VcT(jIP_tm)l- zjNeQkUuG`GnW6*PK%>l@sz>FXZegqzc#>!?>gqW-HjZsrAVrF)lMUVP4NEaTbXukJ z5Vx`J%5Z#0s4$gzYCHCrX0F9Zw6NByvNIkjTo!#YR&ELL_Y5&7c<1A$q^6}6k1R#SxO)f(FUUnY-CC=4aS2%D%;Gak~Ca1u{4km!kCRPZ~lh zMka$z6BBd_xYT)M3Vxvh3m*k*dLvv@-|e~iIR0$L)oYL?VfcBqx;1B^Xf!K+u9{?O zHDls}q4g>#BlQB2d(?&1M9JgY&2%xtE?A1tyI=2LVCsBwt~qZQAk2JcOt1cu`NvJY zh-`jGpqa#hKF)loSpn~6Pl2U z_<0CLTgIys~2QRp$Pk?07$a zSe|^oAmyF%O<`;Y5BEF5aY`XvzIb$n9xN^xXNCGR3aC=EvgWJvsMg`;NCJs-k!XcU z(o900NAH`x_2}2njbB&H)W|lF1WNWrwsN&8D=OA{wBJBjfsRjPF%MsOfePM34^>s1 z40P%54(&Dw9Oe)@d!Nog@jWm33VpvJky~~Z&5_>&_+TTlKkoG15lLGnGJ_{5I|lm= z_wE*RaUp3yuV$0V_oy1o$B@`1DkkSKU8F8$xWP!^lHIr#@VYu72oODmbDm%QXEJ@= z#YyS0F0^B(Ufx1MeHF*b5v#rC*nSp+WHRNOf)tB1?>xogd(F=1Wo|tB#YgpvQmMc= zw?LKD;O6?|XC$2yE^DhPld!lcli`Sj8YNwEP92=@ZF(5hWO6bFD;tZ&mda z`IS|lj~X@r?!-Vl7aneHXbO~`74;lTth+q*nb4LJ`N>$B~!S!h{@P$2&lK|2c2!>otyF%2&viPsYp|j*8Pz%7U6ZBY}6& zqaWD&XzX-=#><%n@;V6?4?z=sYosI-7z{QkJ!h)b4_(A=y7C!=Aw-2 zw|yq>w!@73vY~{MEq&w=zH7SS5-i$ia$OP8?)ic!Q(OH>9x8Gr$f#25YFg;VzRecv zhK{mw!({i=*b$QIfy|)Pca<`Z_Dv;}=&&)H_0Kq9I)PazJ=h3^x+HKmVSQF4{v>{o zO6)nHJ6POiel)&>XrI7@B3oqG&+AK~Yk4?2bkp9+KYp(SdwqDMW|I12oH(MR3vvWi z6r)eN?(yRC{aPY3EiA+IFd?KwnrEx85PMP`o7I%0Iy#NA)FqB_T3n-8r)8ayAl-j{ zjKq(tOmMDO9-Hi=>&Nc&05=>b?WO9y7a>sFOQf?4i>hNg^JQ>WB@g zhA$rZA%k8Nou1EDO>quHNy$<~S4=cqoXAA>i5n`7kKOskimJ1|AGw6fBF=$2RTmK*9Nkcyz{- zB1+YgcD%Z0n$GsEVp?LjrQ6?hv<)wD6xhYVcPhWX6abW_nw}Gd=9XWlpdVO9vQvpf z5~h#pUC2ktV00jv!NIOvav#e3$*C%12sPP5y=7Z|b(ubrM(v80Q2~U`gIQAt=^bHW zlU`-IF3Y=C_)Wsy+=(N(SW3Cb<%CXkk|%2nhSABiTm&G+{=Krn4q2ybKSUPKR^c zMSetj0u!IbJG3Hbk@sM%br69s)7vTrn{kKxVT z=8PcB+V*%iaomB;NqX7$z{Y$zFN1|dM752q*X-Z+#g`+T;{dVHSLo1|_!h`albGU- zx2UaJR=GCd(NT-^%Vvv7IFlq?Yv~I?AWn_)u%sY*WN6~d7vh{gLzinSG;x2d7+Esf z`QMhgQ8zX3QAbj(?){y_YB)4@rMGh&97$M+hEC@+QBl`knnaQ}c?RKk^w%qQj~au6 zP{@q%5`2XnuBEkYHkumAKODZAIezMqe$epHoRG)YarlfM!$oFS%NoD4=_!ct06UfEQX zdQE5fC3I|3zUV`#+$yA^*U&9L%}dp3m|}zvX~@W7eI?$OINxC3gcV5BP_I;|;$g*C z5~yc`dRX^3nGgycfYg#PKmU2ODGDEBLYFm&jq-oRA%IriW2bJ{#Ta8egs`Jcfg+JZ z5~bZM%EDzb?N_>QSZdMQ6IUGkz zte-)XgzSL_Uo{hpMcaSkziL>UMS_c60BJ*rQX0+NHy-{JNS+nHv+{tTjD(s@MtjH8 z+dx&Ob0g>M6bh{TynF^!M5te2TXdRpP56q6%=E< zmIdi*=}HtG4zq2~@Mi6|&A08M69Cn;^kC&1+c_iPPHQVFo-l9RUb>E3Pp70r7~!;c zTS`jN#oI}3JK|5^u z*z$1YutLC-@+$@Nx%VbNVSKMIqRlv3I_FSCSPX9cG*ys;U-`L>A<+~lSFJVQ(_lFmOAUiNBCP0@Oi?=kI+1q zgrRhLb``}SKisIoesiGv6gKiG^}H*}#hGaiMy?FEwz$Tn0IB=Issn@IZc^5{eK@y> zfOAM0xWiXb6k_&?`G_WgguSH+JqFL#%I<&ke^ef>*H_#2S6>jxhdhK8b7jdHvB_b~ zec8-`VHW;U&GXbOE^)ixc}G_eb$CpPf%&uI0v5Mc4~6V_aD4gthj_bRK#!IVEc`z5 zcb_I#KMTZZb(fM*b%g$Sdqh>-!rRUSP$-eo@$ATYmS&>#!jJy_9oY;)vFj~ZmBAl? zq$;9>3O@bDIAzaX6MW??s%3rH@f1m$Y?2Wd?p0~~U1eyoZ{;4`dTCJ8HF9v-xB#mV zgG)w*RLtA*lRK@3aeP+qUEpYYIF0yIYH>>BEuC%0$bnvIku-{EIK;O9^I+5*>)eh4 zQ3kzRkO_>p&O#@@Y=_&0Xg*U22uXuc-tcj967mFAL5(?b8cDzYa~XDGWb4M8o)AhL z^BSo{3mp_n@wHCwQpe!({h_G_WRiiJ{(Z~Hz^0a#-UwA*`q|%#oZ2&W`pb*mM@F97 z0Z;l7I2{5L*4i#d3QZ7a@OC-|K0OqpJdGG(jD0emw&173RGYLA)g1yQ1_#9?DFq5t zQ^*Hwb7}P21Q|QWw5cl^9n6EI5HhXK(!?6uKp35OltRPd-K$?4rNSkV#8A!4zgNjb zeVqMzBW9%?mp>=+hLdWArwvR6Kl`6-v+ze69=8f3U_`ulE$!v!8Xd7ua3^9GpdAqC z?gP)YM-WjAKM-btsHXu;GbKoKJR>QxZ#VC88yMMyhv9KkaTNk@zEX^#OGw1yeyu*x ziyWjw7q1HEB+BiErj-Hc4n+)DB?(^czKre6tAFzN6jN*0o37vt_ShzQ#8r-cgF7b` zdw13Pfb~+Y5IP{U5pXr9&1mub$d|q18Dp*+I zdV|CZ)%i8@K`1BV`5&gA1o?Pz{gZ{g&@pmgwOgYzAw~1uIv?=|A=-u%-?~j{V@-tW zv7cy!0sB|N{pP)93;9P#gOUbMSCMggd_W)oOr`og@X^K^Laq!k!h$ApC1x(?0NbkEF7Xvxy;4ey~e(I zWvF7iM+-a06?YJ9_#y6Usx!5Of#PFmwFHT$Lq}tSM)te4g#j8~e zuQ$RY@Nk{;Lh#v!In?wrF&VIq3+_Ev{JkQtew0&Qu zp#Uvlut`FZteckZKiYXjB}Q(@CVIwcZEVD$8yYCo{yI&i_tj%tIYt)$~nVkvm& zZ)n8VydM&998&@Zp+1dJ&=m8hfMAiiZ_HvKua%;pI}nRokugpPGKis)$addO4$|$m zuW};3d~EhgJHGv{?8miO7muQ`emL}R`l-|GKV z{(r`Q6g&UB0Vg0XAo_pi_FqQ#Z~nh^oBWqvxoxP zm=jwyeanE+i8<_2!Kb1AuuzaLF1?9lWomDRxX6`dk5 z)_I!&WB-w%4CobK$K-Qb8`w!PjTyqo1${8oPIw0U3kYyLRhyYtT){~|erliQiVt-7y?O;bldEmf`z zGpO~hQX}W2mZdSXg~)TDQabP$&ik`G5=L9}vW}mNv>BGs}-@VL9)A@n~&BAe8i1u)o@Hc;x4b>?SdO@tA&Wv+SG%1nwN+{ZE){q z`hWjyB|K6)4IWnKb_l~(+^+T2FJ?DUWQ^_ALChcJx{64V2o*=~I;%M31mE#PRu5L< zWnN+u---_3Ky20GTuop%+~t$Kupy$pYXE|$rux3TL~-@w`jCa)J1=n*QZ}StuuCO{EEUe?tG z`1WFbxXumq5&l%|B`k(9KG70DC@g}v&>fuEDJ5CY`r^#k@cA3se38KK zkgscvsP*Thr&pw(^_JErDoi22X5bO(cXk^|^XP*NDb-bIF>oyjoU@tUitbUb+O{!M zE+pf>1F}&-AyDw5SD8(sGVpWR;nUE08rS8{U)xTD*b$Q_#k*WmYptQw+7YwLoIE(P zoW5f|d>H}TQdHdPL$9daCz_caIL_fM9N=@COXR@|foap)2kxb>prfvue+v+NX-!)< z_>1Q+?fn>+?1*^~iyPqq{8f}_eHMr`yG5l%;#I?%(lyuKKEad$SjY5tx%43zkUyi7 zu#_nl*wwoC7~pbmxpF}&Z&F%L-P$#DowJ~|arIWj z7w(9T{IQ@=s2#BT=EH}t%WfbBQYx-6DXdbeA;Q%C*7gf>u`L3!uVUtcu#CGzZI-+% z*LN*V+#?z#4nbI%&5fnoS2J$M4t2TOAUe31{1(_xCkk#e$Cngs{$|q`NNmyEKeQ>msoIFnNP%#gW#J* zhM*y(2(_kPRnX=QVO&Uy+J%C=Rm1SO`=v0uoqcybHW3H?`A5CQX-+k`5~9zZ5@J{2 zuY{r8Ys+hk*;GW5HjO$nYL=hp8EwR>h__$M)^g(pMHsoG`n-s8wT^}F zG0zTpkHli#(-_&Y5A*`rT-hF;@ne=!WLm=OL1E{nwR7mCoAe@^HIvDW2#IRo=oVJ- zLQ+_>6I*0CYzw^6l8fJ(IsE2^f?W?<)w7t?;KORg;lpI%!PJDQWKTFDZ3I6^;8EEQ z0^Sfm@0`9;JN4FYkIKWk%lpc6?eh%qe=DzHk37`M_I4zrTr|0|h-Ft}1VOX%t~6Nc z7vgK>Viwd8g5M*;{3BIbP#!y0HGI*CkBrUAu=otH9$baGqJy>gUb}B}f7WNZ;B<&c z4=Nk`3pT9Y6ElV#jHr}Mt+ypy+b_K0bje!7Q_*ix@{}$na*Mh(Q;X1 zQYkBh+4OPTd@Uec22G(4wL^rc@T-q*YSjw8ul&!%bT8%zU$W1cYHGn@R-sFpl??Nm z6d8966&%-=`1I)17^Lka2x=Lr?rb~gR=^3j!GhEOO{g>Y98rKM>wv$SQfm!R2J(Dgzk)nt$w08 zUligfmt{!dmYE7~Jk_4~FUt@a1TWHh-BpK2srsbn-hnQ08MF~3|3XFVev|iI{=9T* zrnkN0hTlf;Wp4=1B=oa{8z_ARH!xhiaOd0Za)dK~hL>VO7ooLkZoG;*ImpSsmvUrf zpiOx=E!|oQ<0t_^VNs{WXbIs9x`=c&2}vGbx>Y>nEBL@E%YyNE7CWC2oO(IRlP`bG z`mEVCEkPtRCdYT)B|d&B8G=e0+F(UT=rg%(uNG6~Fb?+%rlr6X6l>?Uf*M1y6}83D z9y7&iqG@?6*Y*mGt6B4JBC&s*qA7yjMPH;|qUZlHdu!a~t1|kim#il}7WZcmaM{P} z=kP)wo>eRX^W#0_t0mtQ?=FeD6FG{&Zbr_U(u#51Q@cMFq~P(C(_lxF4`1OC(Akc` zxQj}$a4mlJi(^0+Ybl6BH4^!vQxBmlK1hObXCnJr2%kmdvVq2U`=XRLTuXZF0)ltr zf10w%aCv|Wanu<69!0LH_hK) zK8Gj#$u8nGVU;a{y)vU<#H!3t?VE$A^RDR)?Yb^JOAlr{l^JajGJBD|v#3F+V6 z2=j1Upg-E@UGIIssq0X{$Txka?oUcHq>qdwIHWl-5l0@yLu5ldFP~FJ>Sl7+BPNT4 z1opt&U;sr-%a?#K=kNoVwMXi<^a$Jx8ct-6#`Xt{%EcZl_nOnt!b|QJp30uA*9Y zLuN{IJRA963EF%7JEr*yQdAK(5Fg-8A8O_p*}QX2-{G;@qUhY9Li`k z1)niyynTq-dDaxwP;|u4M@oAsA*<4$2X5Tue|MXIM$OMXs~Agr?d?T{Z3mBKg6nl| znjHccO^xk~V&A2m zn&=Gx?w0C5#5gl$zEiMs_~WS|QAM};2zxKxg>YKg71yEp;rqOL4knE;Wd7~J(d1J^x(E1m1-}ga{+sb%%6r^lhE@! zwhdL*!c49Ma^5w{`NX(+?~;7mVNy2$-^>QZc7!5$**dr&1q>*&u!D)kFeD&$R40pp z>Dj0`gaWi99EbU~4j^qgM8-9y?xTw++hw(tAzULBRNcse?zTJ@M$H61MsB-3)lvFd zj}GyBIvx#^#3Z>RDGaLrM1RkkzZLL=nmj{2|triL0t+?PdSjecZn8fPhn za2(!I;;|t*A953yk=cS$B+6+^XYXTHTcd8ze8cjvZB*Uj+F|4c!^Ntj9_uFDf)&Sx%kZVql`!Fn)f~N z+x^-%=?w7MymbDg=jrF(BZ7L(C+-zUD9_L~UuY!hl4L*2;7d!Ei-%zhM4J4h2y7!= zm}!oaU-%lf%3)skV-|m3C!aw9vh-n|FF7G7M*7-2*Yr_Do~IbY5arhg_0p95@3Oiy z^WV$TFrxUG-S)cISA&r1uIsprNP~+xPQlLbPApw>N`v^6@9q5XKas3o^HGrq-Ox~f z*l+0G==(Bx8PY=T4=(%l(Bt=xiLdVF-A!*^7n!&b{5-G+_2)$=S-%%@H>6WV3~$iE z8+RZ_ka}2|XV{V-G~*_=$Nw5BzTFe2nAcj@fNTB28&^)hUtpghizd>(CDOZzkKUTq zAxL?wFrF&VuAcTCtK%#~3d+S5wHkgih!S(2&wJAqFsVA3jXJyYO+kYypf@xN7bFRM z^wqz*s>-4he#7)j@CLBcRO{;n+m>>s(V=i^_#%dxOlgg2rlpOFxgbNJEdwqdKp`rN z8&-Z;Ae&v4bK(Z?P9j#|oXd)<@9BJZTFBq~Hp-G@0@vL1zguw6E;&nYzKUL`VJR)$Iz#K{Kx0xb^U3RvNtsl8ss$|73lK=)XP%zd6D zwh1C<(JuV;fb+7udT|UdZc>5CCt032PqW`MbZu`FstLVu`!3~8AO=BXcPgJoykfYL zS?q-`w^amdA}OS`L{;@Pw|~cnzsOGe_#oN?9s!~Lur8AnL*a3< zsfw6eH}rk6&YkT&{51~cBc7TanI%5U{k*zk!9uw?S}QCl|9~n${~PTVbE+vWeO>?R zpt~oqAA~DH!+3@~nzJGL*s{s%YkavS9R1wbD@hXz{^kKnzFEI}-#KWoEH;!p9}-)* z|K!6}(+VFHUS#fSNHpSp8nnoMx@FgkiVh*Sk->k7gb;CMp}840;47Ec$pXI=d^vbA zAkX)YK$3p}%xsg=Ej18_6CF9MeL8wy93Gs=64jAwiHF;g+TgG?I4h2uV(gZr#k6Sa zxkJaiM68QN!8f3}WCez%3XW#ZyJj;xT7t-ZIA+^(?NTpcKT3CYG7k&Kklh3})SgA> zuZ|rNb_d&w8o3x02X$uwymXPr22(fRUW#iTgfU=A$29i7O>Oll51dl;-a{Eho>6Va z^T;x*#&kCsJc@ZdTLh;mKI97L|eN9I-+eicOahDl+hQ^B<)i0S5uw*{d_ ztdaC!%hcO-Fn)G_Qu*g#r=vgkZXiOyqdcWXjGpjI-4dht6@!IP#SM#;(tO7W2FUJl z>r!(lV6&zRlYJ3CnJsIfG}trUSa?Z?wGK;t90ajTPc~Hj5N#Pm z8oUHCaYma-*7g^wNXvmbzs}29#BUOnC#N(Pit*OOE`E)r{c#$BI-+^gOv@xtUZ)ub z_ufkA|Xs(ga}H!VEk3ul}6-_`FikU4EkU*1o|e8_Z8b!g2mtA6l#6&3NUgjLSOHC zk8ZeDsHnN<7{?=`A0swd%kodyEfGAM#a(3qf}mP#g{BIIkQLx(%By9(Y|JJ@pKcr# z(xJ$Xgh~{)ALR;3unNwuVpl@YafKAabwwZj#NnKvmUNG((wYqweV_DLe4SJu`Gq54 zJPtYl(ED{I|3s^uE{Z@s#{}ELHqFfZ9*E@c)KU4?uA}^-ymzqa9V8NY?~xPO&;SN@ zt_~KQeO;dYOBfy53p#-k;0u`ay=g}zVF;ZN zhN5LCVr$02iY6=xZ_u>vbne^HA03(gI1n_p7R9t0tUZvAA3A6}MBbmGAVn(Q1{e(R zU?%+xAh&3nNf*<5;P5N=ln$HjkKg)HYngwk_0_3_Fmaec`}o1S@a{q9-ehFAV+0SCVq*ruZh+-)Zy=-yP5%Wg zr5&L?)+87NL=p(Ni;;0NSJx1%A2eM+Iw;PW(5}(X*_U#6?7_a#=5rv;kIf z;kKWUN>5&NMJr(RX-3H2sA%Zso6lz8ZNL*Q@~%ZnTe|a+iHfz9oiTYx9x-zm2QI4% zyEa(@zwp)^AD%Fm9UOL8r9`M6vVL?v_NcY`ZQ(Z`9uQ)P7>!;9pg!hE54LLsHV`{^ z>61ZGkXX~KB?BjqHfeiL{yD+~%YD~|-of0!@{YWHSmu&9I%{ym_i46C4EZ98IX7cR zq3p-(j6n23);{+)-4prNDAIKvX-o{|0;n&du1PNt`!4yzk)xAaZ+IOkzLL4pgQ70~JFqPKIy%nx@e?(S13Jqe z4SmZZ;FQ=5If)NfCLD^oV#mUxtn%_VJno4*E_L^_Db4A}Vcjs#||rtqlQmZ7<( zflD%y*w-C^jug8X@n!AiQnNu_qqD;qALO*$>pZ9q;-+(n?qfcA4}NyvCG2N1=4Je; zFa=zETBpJUlo#0=OU@XJblmh>*SmHHaKuVp|Cw9d_+^h874AwGB@$+=j{~GlKnN7upo!$^~2Ae4&2)D1LvA(yyy&tK;dqdnq+t#zD!o%Zr$<=&{sDt<1q)+ieyplLpA zbJs{&g6j{QD&-i<|LF-RIQT>pGmOU`Ug@r25N$ECPqX2YmY;0Zf_ID4PZlZ1FVSbo zOx3n8?kg$r2ahcI@+=bbWt9bDn!QRg^_MBI!kVtE2<=4-fT2@wTC%Iv0CFBEnm4p|h{k?U{)!o$RtyV^!+|%7KV8+Mj$sM*qs?jV{s2`f$+&nNngpwi`tM|C z_>9d+WgZgsg}l1>GPUIn$Idl~M#*8sobA}satnMy!T71r{SB@$7<#z>+PXy-z&1NW zCFWh=s|r_G@ge3khk`VDWcx#U3<=cpA-$E?|F>IF5HH)1zGJS$MpxvNfj_y8OqD@+ zzF`Gj4MjQgwrL!7FQ1gPwha6RRV$M6F7pTPUW;k{aHSi4>3r;22Kn2&<7ZiCq5WV1DIPn7CcnPL%9=Y8N1b=w`u4X%`1ww&#IUjwQWX zOe7=8o_dP_SlZZLfG-CCnuXT&SB$_d#CKXoz{w%XMTJvzJh-b7S z=)jPH7O}3+L%vtUM;%#p`e9;RT>Mnf2Y77h&UI1mCA>oscaw0l1Tr{$U;5Mbeh#o~ zQQjO|-kUK8jDJAk?1P}e+1Gb7df3K~cR9k_1rR9KDtJXu#!2@sGjAw~7H-{317H0? zJ!IWdlH($<@I*{gDDzTtm)dUAN-zIpmqB)NKrZmCWFj3~t07xxM8X(zOQPiVi|Sik zt?|h5P#t4X!aOJqeU%CbmS5%~agkl2c z>SR-Aty(Vo?JplfApY`p{G}M;&{}9l1kz?LSGRf4T;vdBU9_4paB~(goZqD`6W_d4 z3L~&B6KNU3zLhDq8~K#>nf&+LWv7;drjH1!0%Ei*Dp`Ii*VBO76t*j0z#o9{brE#i zOH2Gzq34Zqu%=jiKO&xC*zkCi(}&nEXYT%UkC5eG4BO?J-V)@X5`7P&eK%78srThL zs1wVZC93KQ++C>U^c1{)PuT@h?s6k*SQStzahaPV5=N#LH#06Jgw=R!y91&9OskO6yG& zKAtDkyw(?-FtJ9mc(}+g2w0b3a|T|;7TtHV>5d>@>TsF>y8t%JM)VfWNk|KOKx!^7 z$5T}ZLJY+nN?Abq6N=pI25M6M1lFHN?Qv74O6vdMLHD4;R1C#4UgC zg~=?C{Bfh6SpLmU)0&dIPEv50&>o@TI4!;-dasOiJPgr~0WhiG;2{wLI8%DCDF*(S zq25ll|AT{d2gHw|mA=odo2;pRQB$JHCqc$U$Zx9=24iuF_8Fv9qlxC2x>!y{8(auU zf-NIJoiydI?^l}>JFQg3s1pC+y*YIXMihu4d^!i5%Wc0Xg6=-j%8>>d)*x>5cfJD> zDG|G}Z3uIV#UXs)I$KuL%8c@P%qY`4ok}aUMZ8>+)%mxyPs;Caoqo>a);=qM;;8Vg zJt%lz47;a7g*6*cSJ=^HrkYKhD75;-mPr*=lfHgpDClzD>zk-;Qg)~>N0s0;f##j- zq)ZTSCaoIRwfax=hRON&&D<5~Sv7554`1G$v7{QiT5Oo0UU)N%Om<_WU45>ngQLB~ z8o8-8ha6>3P$~d-ZNx?zfvZtTbLXp=N8`-a-=dz4>KLaFn#+XiYy=)XKfcUbgC~E> zH-a2Y|1&o;GbB!9-%NYbsGWEGoX080g(g*953> z$eJ!vqetgbh2T02qTqfB-gt4c>ks8RL&s$pc^lUW8WSnTI4P#~0>^Wxzfcyn(&Dy{ zHVts<9;AJmYP)SVN1>yt)SH*1!>|g-h~k5Ww~ddX9YduHcW&_s%&7Fx;?kelSK!C{ z!s+}-Vstig-=TOf9z`H%ah4T0K)#q&w&$`d_b`aZ9qK4apET-|CS8b~bEl1jt!W#q z-vQO@5_5#Z>X3ww83CRm;Y_$q{gTcMY49mFu6+P=ZOISd`j0#>TJu)Kye%uUDgl$%6ent`dE#o-I0pwS+U3sQz_w5=MEYf)aqQTY6$ z+xn7Z!KE*U%|&*!ySsOH>VzkM%dbY20>}*#(fo4;wbByo^wC153S;%~{hw>6>fvI8 z4Q$r%ggyvOdglAj-N8TRY+Sm8_xb_lguv!(k{jQ3%<+F`2I1j|&cLU_k0iU%&C6+) zPR6Xd*Wi~mpRz9Zu0NwbuEod#9-i|dtsz~EnIdZ0p$^QPd`fX-Ma3V$*Y81xp^Er* z!Spw?Tzwu9qO(eKnFJQykcB#8o^V`>p+Hgz#xTNFS`%hy3_sB%5dZwWZt^1MS%z|L zmC)?hHXFeB;^eVxGYN?#cj*?m+?hOd zy9ExD1N~j5G7x}7P_xQTus5E&vrb~W>wf{4;a%#tEMPR5+K--{?C#q1j(_|mL#cO5 zxE`A!-XFH*&0Md`VZxFsO3L|oE1-a*gDR>+SJZU#sZr9&%pdxzZR~Oc{yVD~BHvwt z{0o$QQ?x)U*EFWSEXUgGj-nwD77@%ztsuKVD$Bx*rF#HP_~NUt!G)xZtK~1)n_+S( zRaGAA_>U*T_>Z z)g&eHOZ}8s6c3w89BdEf(iGkfTEq3kHk|ZADC*xHS!PV4C5Mpvo*+!T15I_~z>Zl! zl(A&V`U>#dMW`KDd1AgLWprEiOzm;`U;_pnNEeiJe^#jt1C8FTp4A^sRb6FX72ox~ z8~0^B`sBxZzzo(<=Z_xD$!|Im0ynMkKQT+%%p&NOL_Dc$feWiICtCH@G`=A2UK{v1 zv>uah07^dN;G(k2^5*Lm{gyC)%`pd(90@v zY?ofN6a`h6?&>`Loe267$+%rA2_e{pSNof{fCo^!B3l}Y#~|+fv#47)8*mB)$G-qk zfgW@}E+*hx-fy_0TD=7twW$x@9=RVzC;z;(cH6v$LW;GM(RofhlmR8bGJw}0szTB> zO0xcA&h+fD#p8X|R~YoSj>BQtalnSwiIt4t$7@XV!4`&tX8LU?G|F=6X*nt>z2NJ) zz8*y_PWNcK$KAJW15Le}f?&tW)OCk7N?v~z3Um~5#+Bg97L%;-_uEo6QbLrHU;L|BTB!!bEYR6XK z4rQdCc=0pe@K>p~ON0d$v`J0@n+wlgbOV>l5Fq5Ju@rv<936RL_&L zd1p;E2YtA5tf%o?^mT6s{^EN5&HxSTV9#zsuncp(_4Zs7HRI;#a#F|$1;#OWLwpen zf1eee=21Pb@x`-h6HX2@z2-LZ()opx6<;UG-lv0owd|y-s6d-^Odv@DT4*48y1}xK zpJ^vO7}U#koHUaKbL{Tja~y8*i8;rS5NoH7_&})-Rhu-Ou(CBVGhX@R$Ec|&W}*+F$2;R7 zX&K@$>9*p*?9`@Be$}7TTYu(y5c>A7gH|4U>Gz|{vhCaz_lAx0Q^XIx9ROwYk>4v9 zGN~=%Tg9rGxQ0<^fMF0f0{TGodcD-IYxhWZ=aD+~>c-U82|?!`;6KK9==1Pn2WZWi z&lvm>m40q&8!>&Nt^uVkPmYouUyYD7)qZ67opeahO%w!}gYt=N>WV1<%FM<|$w|G2 zwRMD=`Rdh5xR}Y~IR~>D{LrU)WE@>|*zERO<_-%EN@Ws43{Dtoi|&q|#R2d``2K{g ztXxJSw{-qH0)jxXCwYNd+{Vf;iqG6+c71FO$C$Xk)HAZ0=37j{0J%VTk>EHz0m~#- z&}{WHVwVmfZSqBqau=f zd@y4B%A_@2=V?mM{s}f7BjvDx{4e8RSwlQ?IXxLnwh;lsiT0{ccZf)Z`D(}~r;{JW zRu{*7ZAZkr#Ph(DEd)eUA_5pYcr1QufL~c&jU-;@l(@i`N=uUP-eVwKalrv}Qoc+^ zSF(O^A7A1fX9>$NX;wXJZ!HGgYzDfm2XNmO@>x)D)PXhLEA0Wzy@=JlB-E}rIVeUX;er2_+R(4nLZEm(Of@n&`SkDQPqo=nJ zG^xG(CVOd{vdU>uSjR@{59g|efdu0@sa805eZpXeaRxUo$QLW*x>s7`Nf&+Rn4) zQS{&W{rbgxG+7^h-O9;%^8`Dp(ht7SJq0a?0s2(6n>yU=UCH~-5hUpJC{bK8uu-fq zn1RJQLp|O2n68RKDT2tK16%S0B{G2F(oIz}&dL$IlEG zW0C#w$J}zwwO~*sE2iBj0YOsysspmIMfZ>z%=w%NiwlKc6IiyTo+L!dLuoTd&d>tV zAo^#)?f{Tl#j0QW%=9;Wg7#8SFC99F*QqDj18EYmg}rG`U=wb0ic_|lL8PU2#X6b- zG?_EkP6+ngk$wGbZuGJ5yg#J@ax#rgmB$gc2#XsBBowXvS7v|)<5YQ!b>-*N!maN~ z4Lg$$U$nct`Y1?oJD95`btI)rObU!#JUMw(A`56P}p^HQX%zV>sFu-FFf^)Hv@!`qPr5(Zzn zt+VFQH7DI>K&eCtycK1x$?h`SkxmWLb2xt(Uec|HuuL+KLxqJlpx=#Z<>*=1``04V zG;l8EoYA?Su=?Hkh)4DIrqHNL9YO9fPEA#=NZSkj_eu-OiAA#89cpru5)gy6?7b|7 z5T@;6^7#UUw{VZ$qVG_^=vVa3`kE(Y@rhC8>is3uHoX;RFl6=TQbLFJ&NreCOT*vJ z^!AW#AO6q(#|XGs6qA1v8*Yy+LjnHE%R6M;zxJ*}B`3)_Ue6-$q!RaE4}3C-GEq^N z`4;OU&Ed@V*ooLiltN^wqULdOopa9Wi9yZ@*`oA>iB}5f8x$u^z$P`3d+Z%T`&i-s z6rMY}P2)o04zkfNU-fUfX6at2M#RSHmIa!$5YwG^D%dyfcrHJURoKuM->KD-K)6wn zvS!!FX;BE!CQQjRjMS|X^;RaY5<83+#N@$4@mMG)>T<@pJLih(W0nE*M?5l8Qjbm) zM!S=>myTc^QY0cc4$)$&LA9=Im<3AzD&Qjd(Kgy-V3oac)crUz^)oASrg_<;+5Hdx Cm2`3d literal 0 HcmV?d00001 diff --git a/MQLTestWorkspace/BKPS/14030222/Classes/x-saherelm.xtrade.class.mq5 b/MQLTestWorkspace/BKPS/14030222/Classes/x-saherelm.xtrade.class.mq5 new file mode 100644 index 0000000..3b302a3 --- /dev/null +++ b/MQLTestWorkspace/BKPS/14030222/Classes/x-saherelm.xtrade.class.mq5 @@ -0,0 +1,5012 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Class Library +// ---------------------------------------------- +// Name: XSCTrade +// Description: provides all Trade requirements ... +// +// +// Maintainer: +// ------------ +// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) +// +////////////////////////////////////////////////////// +// +// Global Properties ... +#property library +#property copyright "Copyright 2023, SaherElm IT Center" +#property link "https://www.saherelm.ir" +#property version "1.00" +#property strict + +// +// START Definitions ... +// + +// +// Model an Open Position ... +struct XPosition +{ + // + // Magic Number ... + ulong magic; + + // + // Ticket ID ... + ulong ticket; + + // + // Tradinng Symbol ... + string symbol; + + // + // Trading Period ... + ENUM_TIMEFRAMES period; + + // + // Position Type ... + ENUM_POSITION_TYPE type; + + // + // Take Profit ... + double tp; + + // + // Stop Loss ... + double sl; + + // + // Position Current Profit ... + double profit; + + // + // Position Open Price ... + double entry; + + // + // Current Symbol Price ... + double price; + + // + // Position Swap ... + double swap; + + // + // Position Commission ... + double commission; + + // + // Volume ... + double volume; + + // + // Position Open Time ... + datetime openAt; + + // + // Position Comment ... + string comment; +}; + +// +// Model an Order ... +struct XOrder +{ + // + // Time of order placement ... + datetime setupAt; + + // + // Time of order expiration ... + datetime expiredAt; + + // + // Time of order execution or cancellation ... + datetime executedAt; + + // + // Order type ... + ENUM_ORDER_TYPE type; + + // + // Order state ... + ENUM_ORDER_STATE state; + + // + // Type of execution by remainder ... + ENUM_ORDER_TYPE_FILLING filling; + + // + // Order lifetime ... + ENUM_ORDER_TYPE_TIME lifetime; + + // + // Order ticket ... + ulong ticket; + + // + // Magic Number ... + long magic; + + // + // Position id, that is placed on order, + // when it is executed. Each executed order invokes a + // deal, that opens new or changes existing + // position. Id of that position is placed on + // executed order in this moment. + long pocitionID; + + // + // Initial volume on order placement ... + double initialVolume; + + // + // Unfilled volume ... + double currentVolume; + + // + // Price, specified in the order ... + double openPrice; + + // + // Current price by order symbol ... + double currentPrice; + + // + // Price of placing Limit order when StopLimit order is triggered ... + double stopLimitPrice; + + // + // Take Profit level ... + double tp; + + // + // Stop Loss level ... + double sl; + + // + // Trading Symbol ... + string smybol; + + // + // Order Comment ... + string comment; + + // + ENUM_TIMEFRAMES period; +}; + +// +// Model a Deal ... +struct XDeal +{ + // + // the ID of the Expert Advisor, that executed the deal ... + ulong magic; + + // + // the ID of position, in which the deal was involved ... + ulong positionId; + + // + // Ticket ... + ulong ticket; + + // + // the name of the deal symbol ... + string symbol; + + // + // order by which the deal is executed ... + ulong order; + + // + // the time of deal execution ... + datetime time; + + // + // Deal price ... + double price; + + // + // the financial result of the deal (in deposit currency) ... + double profit; + + // + // the amount of swap when position is closed ... + double swap; + + // + // the amount of commission of the deal ... + double commission; + + // + // the volume of deal ... + double volume; + + // + // the deal comment ... + string comment; + + // + // the deal type ... + // ------------------------------------------------------------------ + // DEAL_TYPE_BUY => Buy ... + // DEAL_TYPE_SELL => Sell ... + // DEAL_TYPE_BUY_CANCELED => Canceled buy deal ... + // There can be a situation when a previously executed buy deal is canceled. In this case, + // the type of the previously executed deal (DEAL_TYPE_BUY) is changed to DEAL_TYPE_BUY_CANCELED, + // and its profit/loss is zeroized. Previously obtained profit/loss is charged/withdrawn using a separated balance operation ... + // + // DEAL_TYPE_SELL_CANCELED => Canceled sell deal ... + // There can be a situation when a previously executed sell deal is canceled. In this case, + // the type of the previously executed deal (DEAL_TYPE_SELL) is changed to DEAL_TYPE_SELL_CANCELED, + // and its profit/loss is zeroized. Previously obtained profit/loss is charged/withdrawn using a separated balance operation + // + // DEAL_TYPE_BALANCE => Balance ... + // DEAL_TYPE_CREDIT => Credit ... + // DEAL_TYPE_CHARGE => Additional charge ... + // DEAL_TYPE_CORRECTION => Correction ... + // DEAL_TAX => Tax charges ... + // DEAL_TYPE_BONUS => Bonus ... + // DEAL_TYPE_INTEREST => Interest rate ... + // DEAL_DIVIDEND => Dividend operations... + // DEAL_DIVIDEND_FRANKED => Franked (non-taxable) dividend operations ... + // DEAL_TYPE_COMMISSION => Additional commission ... + // DEAL_TYPE_COMMISSION_DAILY => Daily commission ... + // DEAL_TYPE_COMMISSION_MONTHLY => Monthly commission ... + // DEAL_TYPE_COMMISSION_AGENT_DAILY => Daily agent commission ... + // DEAL_TYPE_COMMISSION_AGENT_MONTHLY => Monthly agent commission + ENUM_DEAL_TYPE type; + + // + // the deal direction ... + // ---------------------------------- + // DEAL_ENTRY_IN => Entry in ... + // DEAL_ENTRY_OUT => Entry out ... + // DEAL_ENTRY_INOUT => Reverse ... + // DEAL_ENTRY_OUT_BY => Close a position by an opposite one ... + ENUM_DEAL_ENTRY entry; + + // + // deal reson ... + // --------------------- + // DEAL_REASON_SL => The deal was executed as a result of Stop Loss activation ... + // DEAL_REASON_TP => The deal was executed as a result of Take Profit activation ... + // DEAL_REASON_SO => The deal was executed as a result of the Stop Out event ... + // DEAL_REASON_WEB => The deal was executed as a result of activation of an order placed from the web platform ... + // DEAL_REASON_SPLIT => The deal was executed after the split (price reduction) of an instrument, which had an open position during split announcement ... + // DEAL_REASON_CLIENT => The deal was executed as a result of activation of an order placed from a desktop terminal ... + // DEAL_REASON_MOBILE => The deal was executed as a result of activation of an order placed from a mobile application ... + // DEAL_REASON_EXPERT => The deal was executed as a result of activation of an order placed from an MQL5 program, i.e. an Expert Advisor or a script ... + // DEAL_REASON_VMARGIN => The deal was executed after charging the variation margin ... + // DEAL_REASON_ROLLOVER => The deal was executed due to a rollover ... + ENUM_DEAL_REASON reason; +}; + +// +// Model a Position with all of it's Supports ... +struct XPositionPack +{ + // + ulong ticket; + + // + XPosition position; + + // + int supportOrdersCount; + int supportPositionsCount; + + // + XOrder supportOrders[]; + XPosition supportPositions[]; +}; + +// +// Model OnTrade Event Handler Result on XCTrade Class ... +struct XOnTradeHandlerState +{ + // + bool hasNewDeal; + int newDeals; + + // + bool hasNewOrder; + int newOrders; + + // + bool hasNewPosition; + int newPositions; + + // + bool hasNewHistoryOrder; + int newHistoryOrders; +}; + +// +typedef void (*TOnDealsChanged)(int count); + +// +typedef void (*TOnOrdersChanged)(int count); + +// +typedef void (*TOnPositionsChanged)(int count); + +// +typedef void (*TOnStopLoss)(const XDeal &deal); +typedef void (*TOnTakeProfit)(const XDeal &deal); + +// +typedef void (*TOnTradeStateChanged)(const XOnTradeHandlerState &state); + +// +// END Definitions ... +// + +// +// START Import and Inclused requirements ... +// + +// +// Includes ... +#include +#include "../Libraries/x-saherelm.log.lib.mq5" +#include "../Libraries/x-saherelm.common.lib.mq5" +#include "../Libraries/x-saherelm.seriallizer.lib.mq5" + +// +// END Import and Inclused requirements ... +// + +// +// START Overrides ... +// + +// +// XCTrade Base Class ... +class XSCTradeBase : public CTrade +{ +public: + // + // Modify Specific Position, by Specific Comment ... + bool PositionModify( + const string symbol, // Symbol + const double sl, // Stop Loss + const double tp, // Take Profit + const string comment = "" // Comment For Modify + ) + { + // + // check stopped + if (IsStopped(__FUNCTION__)) + { + return (false); + } + + // + // check position existence + if (!SelectPosition(symbol)) + { + return (false); + } + + // + // clean + ClearStructures(); + + // + // setting request + m_request.action = TRADE_ACTION_SLTP; + m_request.symbol = symbol; + m_request.magic = m_magic; + m_request.sl = sl; + m_request.tp = tp; + m_request.position = PositionGetInteger(POSITION_TICKET); + + // + // Specified Comment ... + if (StringLen(comment) > 0) + { + m_request.comment = comment; + } + + // + // action and return the result + return (OrderSend(m_request, m_result)); + } + bool PositionModify( + const ulong ticket, // Position Ticket + const double sl, // Stop Loss + const double tp, // Take Profit + const string comment = "" // Comment For Modify + ) + { + // + // check stopped + if (IsStopped(__FUNCTION__)) + { + return (false); + } + + // + // check position existence + if (!PositionSelectByTicket(ticket)) + { + return (false); + } + + // + // clean + ClearStructures(); + + // + // setting request + m_request.action = TRADE_ACTION_SLTP; + m_request.position = ticket; + m_request.symbol = PositionGetString(POSITION_SYMBOL); + m_request.magic = m_magic; + m_request.sl = sl; + m_request.tp = tp; + + // + // Specified Comment ... + if (StringLen(comment) > 0) + { + m_request.comment = comment; + } + + // + // action and return the result + return (OrderSend(m_request, m_result)); + } + + // + // Close Specific Position, by Specific Comment ... + bool PositionClose( + const string symbol, // Symbol + const ulong deviation, // Deviation + const string comment = "" // Comment For Close + ) + { + // + bool partial_close = false; + int retry_count = 10; + uint retcode = TRADE_RETCODE_REJECT; + + // + // check stopped + if (IsStopped(__FUNCTION__)) + { + return (false); + } + + // + // clean + ClearStructures(); + + // + // check filling + if (!FillingCheck(symbol)) + { + return (false); + } + + // + do + { + // + // check + if (SelectPosition(symbol)) + { + // + if ((ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY) + { + // + // prepare request for close BUY position + m_request.type = ORDER_TYPE_SELL; + m_request.price = SymbolInfoDouble(symbol, SYMBOL_BID); + } + else + { + // + // prepare request for close SELL position + m_request.type = ORDER_TYPE_BUY; + m_request.price = SymbolInfoDouble(symbol, SYMBOL_ASK); + } + } + else + { + // + // position not found + m_result.retcode = retcode; + return (false); + } + + // + // setting request + m_request.action = TRADE_ACTION_DEAL; + m_request.symbol = symbol; + m_request.volume = PositionGetDouble(POSITION_VOLUME); + m_request.magic = m_magic; + m_request.deviation = (deviation == ULONG_MAX) ? m_deviation : deviation; + m_request.position = PositionGetInteger(POSITION_TICKET); + + // + // Specify Comment ... + m_request.comment = comment; + + // + // check volume + double max_volume = SymbolInfoDouble(symbol, SYMBOL_VOLUME_MAX); + if (m_request.volume > max_volume) + { + // + m_request.volume = max_volume; + partial_close = true; + } + else + { + partial_close = false; + } + + // + // hedging? just send order + if (IsHedging()) + { + return (OrderSend(m_request, m_result)); + } + + // + // order send + if (!OrderSend(m_request, m_result)) + { + // + if (--retry_count != 0) + { + continue; + } + + // + if (retcode == TRADE_RETCODE_DONE_PARTIAL) + { + m_result.retcode = retcode; + } + + // + return (false); + } + + // + //--- WARNING. If position volume exceeds the maximum volume allowed for deal, + //--- and when the asynchronous trade mode is on, for safety reasons, position is closed not completely, + //--- but partially. It is decreased by the maximum volume allowed for deal. + if (m_async_mode) + { + break; + } + + // + retcode = TRADE_RETCODE_DONE_PARTIAL; + if (partial_close) + { + Sleep(1000); + } + } while (partial_close); + + // + // succeed + return (true); + } + bool PositionClose( + const ulong ticket, // Position Ticket + const ulong deviation, // Deviation + const string comment = "" // Comment For Close + ) + { + // + // check stopped + if (IsStopped(__FUNCTION__)) + { + return (false); + } + + // + // check position existence + if (!PositionSelectByTicket(ticket)) + { + return (false); + } + + // + string symbol = PositionGetString(POSITION_SYMBOL); + + // + // clean + ClearStructures(); + + // + // check filling + if (!FillingCheck(symbol)) + { + return (false); + } + + // + // check + if ((ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY) + { + // + // prepare request for close BUY position + m_request.type = ORDER_TYPE_SELL; + m_request.price = SymbolInfoDouble(symbol, SYMBOL_BID); + } + else + { + // + // prepare request for close SELL position + m_request.type = ORDER_TYPE_BUY; + m_request.price = SymbolInfoDouble(symbol, SYMBOL_ASK); + } + + // + // setting request + m_request.action = TRADE_ACTION_DEAL; + m_request.position = ticket; + m_request.symbol = symbol; + m_request.volume = PositionGetDouble(POSITION_VOLUME); + m_request.magic = m_magic; + m_request.deviation = (deviation == ULONG_MAX) ? m_deviation : deviation; + + // + // Specify Comment ... + m_request.comment = comment; + + // + // close position + return (OrderSend(m_request, m_result)); + } + + // + // Partial Close Specific Position, by Specific Comment ... + bool PositionClosePartial( + const string symbol, // Symbol + const double volume, // Partial Closing Volume + const ulong deviation, // Deviation + const string comment = "" // Comment For Close + ) + { + // + uint retcode = TRADE_RETCODE_REJECT; + + // + // check stopped + if (IsStopped(__FUNCTION__)) + { + return (false); + } + + // + // for hedging mode only + if (!IsHedging()) + { + return (false); + } + + // + // clean + ClearStructures(); + + // + // check filling + if (!FillingCheck(symbol)) + { + return (false); + } + + // + // check + if (SelectPosition(symbol)) + { + // + if ((ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY) + { + // + // prepare request for close BUY position + m_request.type = ORDER_TYPE_SELL; + m_request.price = SymbolInfoDouble(symbol, SYMBOL_BID); + } + else + { + // + // prepare request for close SELL position + m_request.type = ORDER_TYPE_BUY; + m_request.price = SymbolInfoDouble(symbol, SYMBOL_ASK); + } + } + else + { + // + // position not found + m_result.retcode = retcode; + return (false); + } + + // + // check volume + double position_volume = PositionGetDouble(POSITION_VOLUME); + if (position_volume > volume) + { + position_volume = volume; + } + + // + // setting request + m_request.action = TRADE_ACTION_DEAL; + m_request.symbol = symbol; + m_request.volume = position_volume; + m_request.magic = m_magic; + m_request.deviation = (deviation == ULONG_MAX) ? m_deviation : deviation; + m_request.position = PositionGetInteger(POSITION_TICKET); + + // + // Specifieng Comment ... + m_request.comment = comment; + + // + // hedging? just send order + return (OrderSend(m_request, m_result)); + } + bool PositionClosePartial( + const ulong ticket, // Position Ticket + const double volume, // Partial Closing Volume + const ulong deviation, // Deviation + const string comment = "" // Comment For Close + ) + { + // + // check stopped + if (IsStopped(__FUNCTION__)) + { + return (false); + } + + // + // for hedging mode only + if (!IsHedging()) + { + return (false); + } + + // + // check position existence + if (!PositionSelectByTicket(ticket)) + { + return (false); + } + + // + string symbol = PositionGetString(POSITION_SYMBOL); + + // + // clean + ClearStructures(); + + // + // check filling + if (!FillingCheck(symbol)) + { + return (false); + } + + // + // check + if ((ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY) + { + // + // prepare request for close BUY position + m_request.type = ORDER_TYPE_SELL; + m_request.price = SymbolInfoDouble(symbol, SYMBOL_BID); + } + else + { + // + // prepare request for close SELL position + m_request.type = ORDER_TYPE_BUY; + m_request.price = SymbolInfoDouble(symbol, SYMBOL_ASK); + } + + // + // check volume + double position_volume = PositionGetDouble(POSITION_VOLUME); + if (position_volume > volume) + { + position_volume = volume; + } + + // + // setting request + m_request.action = TRADE_ACTION_DEAL; + m_request.position = ticket; + m_request.symbol = symbol; + m_request.volume = position_volume; + m_request.magic = m_magic; + m_request.deviation = (deviation == ULONG_MAX) ? m_deviation : deviation; + + // + // Specifieng Comment ... + m_request.comment = comment; + + // + // close position + return (OrderSend(m_request, m_result)); + } +}; + +// +// END Overrides ... +// + +// +// a Class for Manage Trades ... +class XSCTrade +{ + // + // Public ... +public: + // + // Constructor ... + void XSCTrade( + int slippage, // Specify Slippage + ulong magicNumber // Specify Magic Number + ) + { + // + mSlippage = slippage; + mMagicNumber = magicNumber; + + // + mPeriodPrefix = "PR"; + + // + mTrader = new XSCTradeBase(); + + // + mTrader.SetAsyncMode(false); + mTrader.SetDeviationInPoints(mSlippage); + mTrader.SetExpertMagicNumber(mMagicNumber); + + // + // Setting Log Level ... + mTrader.LogLevel(LOG_LEVEL_ERRORS); + + // + // Prepare Trade Event Materials ... + // + mDaysForRead = 1; + mScanStarted = false; + + // + // Reset On Trade Counter ... + ResetOnTradeContext(); + + // + // Init On Trade Context ... + InitOnTradeContext(); + } + + // + // Deconstructor ... + void ~XSCTrade() + { + } + + // + // START Event Processing ... + // + + // + // This Must be Called Every time OnTrade Event Happening ... + XOnTradeHandlerState HandleOnTrade() + { + // + // Handle OnTrade Event ... + XOnTradeHandlerState state = {}; + HandleOnTradeEvent(state); + if ( + !state.hasNewDeal && + !state.hasNewOrder && + !state.hasNewPosition && + !state.hasNewHistoryOrder) + { + return state; + } + + // + // STATE ... + + // + // Notfy Trade State Changed Event ... + NotifyTradeStateChangeEvent(state); + + // + // DEALS ... + if (state.hasNewDeal) + { + // + // Notfy Deals Changed Event ... + NotifyDealsChangeEvent(state.newDeals); + + // + // Retrieve Last Deal ... + XDeal deals[]; + GetDeals(deals); + int dealsCount = ArraySize(deals); + if (dealsCount > 0) + { + // + XDeal lastDeal = deals[0]; + + // + if (lastDeal.reason == DEAL_REASON_TP) + { + NotifyTakeProfitEvent(lastDeal); + } + else if (lastDeal.reason == DEAL_REASON_SL) + { + NotifyStopLossEvent(lastDeal); + } + } + } + + // + // ORDERS ... + if (state.hasNewOrder || state.hasNewHistoryOrder) + { + // + // Notfy Orders Changed Event ... + NotifyOrdersChangeEvent(state.newOrders + state.newHistoryOrders); + } + + // + // POSITIONS ... + if (state.hasNewPosition) + { + // + // Notfy Positions Changed Event ... + NotifyPositionsChangeEvent(state.newPositions); + } + + // + return state; + } + + // + // Process On Trade Requirement + void HandleOnTradeEvent( + XOnTradeHandlerState &result // Hold's Result + ) + { + // + if (mScanStarted) + { + ProcessOnTradeContext(result); + } + else + { + InitOnTradeContext(); + } + } + + // + // Event Emitters ... + + // + // STATE Changed ... + + // + // Clear Trade State Changed Event Handlers ... + void ClearOnTradeStateChangedEventHandlers() + { + // + ArrayFree(mTradeStateChangedEventHandlers); + + // + ArrayResize(mTradeStateChangedEventHandlers, 0); + } + + // + // Add New Deals Changed Event Handler ... + void AddOnTradeStateChangedEventHandler(TOnTradeStateChanged handler) + { + // + ArrayResize( + mTradeStateChangedEventHandlers, + ArraySize(mTradeStateChangedEventHandlers) + 1); + + // + mTradeStateChangedEventHandlers[ArraySize(mTradeStateChangedEventHandlers) - 1] = handler; + } + + // + // DEALS ... + + // + // Clear Deals Changed Event Handlers ... + void ClearOnDealsChangedEventHandlers() + { + // + ArrayFree(mDealsChangedEventHandlers); + + // + ArrayResize(mDealsChangedEventHandlers, 0); + } + + // + // Add New Deals Changed Event Handler ... + void AddOnDealsChangedEventHandler(TOnDealsChanged handler) + { + // + ArrayResize( + mDealsChangedEventHandlers, + ArraySize(mDealsChangedEventHandlers) + 1); + + // + mDealsChangedEventHandlers[ArraySize(mDealsChangedEventHandlers) - 1] = handler; + } + + // + // ORDERS ... + + // + // Clear Orders Changed Event Handlers ... + void ClearOnOrdersChangedEventHandlers() + { + // + ArrayFree(mOrdersChangedEventHandlers); + + // + ArrayResize(mOrdersChangedEventHandlers, 0); + } + + // + // Add New Orders Changed Event Handler ... + void AddOnOrdersChangedEventHandler(TOnOrdersChanged handler) + { + // + ArrayResize( + mOrdersChangedEventHandlers, + ArraySize(mOrdersChangedEventHandlers) + 1); + + // + mOrdersChangedEventHandlers[ArraySize(mOrdersChangedEventHandlers) - 1] = handler; + } + + // + // POSITIONS ... + + // + // Clear Positions Changed Event Handlers ... + void ClearOnPositionsChangedEventHandlers() + { + // + ArrayFree(mPositionsChangedEventHandlers); + + // + ArrayResize(mPositionsChangedEventHandlers, 0); + } + + // + // Add New Positions Changed Event Handler ... + void AddOnPositionsChangedEventHandler(TOnPositionsChanged handler) + { + // + ArrayResize( + mPositionsChangedEventHandlers, + ArraySize(mPositionsChangedEventHandlers) + 1); + + // + mPositionsChangedEventHandlers[ArraySize(mPositionsChangedEventHandlers) - 1] = handler; + } + + // + // TPSL ... + + // + // Clear Stop Loss Event Handlers ... + void ClearOnStopLossEventHandlers() + { + // + ArrayFree(mStopLossEventHandlers); + + // + ArrayResize(mStopLossEventHandlers, 0); + } + + // + // Add New Stop Loss Event Handler ... + void AddOnStopLossEventHandler(TOnStopLoss handler) + { + // + ArrayResize( + mStopLossEventHandlers, + ArraySize(mStopLossEventHandlers) + 1); + + // + mStopLossEventHandlers[ArraySize(mStopLossEventHandlers) - 1] = handler; + } + + // + // Clear Take Profit Event Handlers ... + void ClearOnTakeProfitEventHandlers() + { + // + ArrayFree(mTakeProfitEventHandlers); + + // + ArrayResize(mTakeProfitEventHandlers, 0); + } + + // + // Add New Stop Loss Event Handler ... + void AddOnTakeProfitEventHandler(TOnTakeProfit handler) + { + // + ArrayResize( + mTakeProfitEventHandlers, + ArraySize(mTakeProfitEventHandlers) + 1); + + // + mTakeProfitEventHandlers[ArraySize(mTakeProfitEventHandlers) - 1] = handler; + } + + // + // END Event Processing ... + // + + // + // START Provided Functions ... + // + + // + // Count Currently Open Positions ... + int CountPositions( + string symbol = "", // Specified Symbol + ENUM_POSITION_TYPE type = NULL // Specified Type + ) + { + // + int result = 0; + + // + int allPositions = 0; + int longPositions = 0; + int shortPositions = 0; + + // + int positionsCount = PositionsTotal(); + if (positionsCount <= 0) + { + return result; + } + + // + for (int i = 0; i < positionsCount; i++) + { + // + if (!mPositionInfo.SelectByIndex(i)) + { + continue; + } + + // + if (mPositionInfo.Magic() != mMagicNumber) + { + continue; + } + + // + string positionSymbol = mPositionInfo.Symbol(); + + // + ENUM_POSITION_TYPE positionType = mPositionInfo.PositionType(); + + // + if ( + type == NULL && + StringLen(symbol) <= 0) + { + // + allPositions++; + + // + continue; + } + else if ( + type != NULL && + StringLen(symbol) > 0) + { + // + if (type == positionType && + symbol == positionSymbol) + { + // + if (type == POSITION_TYPE_BUY) + { + longPositions++; + } + else + { + shortPositions++; + } + + // + continue; + } + } + else if (StringLen(symbol) > 0) + { + // + if (positionSymbol == symbol) + { + // + allPositions++; + + // + continue; + } + } + else if (type != NULL) + { + // + if (type == positionType) + { + // + if (type == POSITION_TYPE_BUY) + { + longPositions++; + } + else + { + shortPositions++; + } + + // + continue; + } + } + } + + // + // Specify Result ... + if ( + type == NULL && + StringLen(symbol) <= 0) + { + // + result = allPositions; + } + else if ( + type != NULL && + StringLen(symbol) > 0) + { + // + if (type == POSITION_TYPE_BUY) + { + result = longPositions; + } + else + { + result = shortPositions++; + } + } + else if (StringLen(symbol) > 0) + { + // + result = allPositions; + } + else if (type != NULL) + { + // + if (type == POSITION_TYPE_BUY) + { + result = longPositions; + } + else + { + result = shortPositions; + } + } + + // + return result; + } + + // + // Retrieve Max In Profit Position Ticket ... + ulong GetMaxInProfitPosition( + string symbol = "", // Specified Symbol + ENUM_POSITION_TYPE type = NULL // Specified Type + ) + { + // + ulong result = -1; + + // + double profit = 0; + + // + int positionsCount = PositionsTotal(); + if (positionsCount <= 0) + { + return result; + } + + // + for (int i = 0; i < positionsCount; i++) + { + // + if (!mPositionInfo.SelectByIndex(i)) + { + continue; + } + + // + if (mPositionInfo.Magic() != mMagicNumber) + { + continue; + } + + // + ulong positionTicket = mPositionInfo.Ticket(); + + // + string positionSymbol = mPositionInfo.Symbol(); + + // + double positionProfit = mPositionInfo.Profit(); + double positionAbsProfit = MathAbs(positionProfit); + if (positionProfit <= 0) + { + continue; + } + + // + ENUM_POSITION_TYPE positionType = mPositionInfo.PositionType(); + + // + if ( + type == NULL && + StringLen(symbol) <= 0) + { + // + if (profit < positionAbsProfit) + { + // + result = positionTicket; + profit = positionAbsProfit; + } + + // + continue; + } + else if ( + type != NULL && + StringLen(symbol) > 0) + { + // + if (type == positionType && + symbol == positionSymbol) + { + // + if (type == POSITION_TYPE_BUY) + { + // + if (profit < positionAbsProfit) + { + // + result = positionTicket; + profit = positionAbsProfit; + } + } + else + { + // + if (profit < positionAbsProfit) + { + // + result = positionTicket; + profit = positionAbsProfit; + } + } + + // + continue; + } + } + else if (StringLen(symbol) > 0) + { + // + if (positionSymbol == symbol) + { + // + if (profit < positionAbsProfit) + { + // + result = positionTicket; + profit = positionAbsProfit; + } + + // + continue; + } + } + else if (type != NULL) + { + // + if (type == positionType) + { + // + if (type == POSITION_TYPE_BUY) + { + // + if (profit < positionAbsProfit) + { + // + result = positionTicket; + profit = positionAbsProfit; + } + } + else + { + // + if (profit < positionAbsProfit) + { + // + result = positionTicket; + profit = positionAbsProfit; + } + } + + // + continue; + } + } + } + + // + return result; + } + + // + // Retrieve Max In DrawDown Position Ticket ... + ulong GetMaxInDrawDownPosition( + string symbol = "", // Specified Symbol + ENUM_POSITION_TYPE type = NULL // Specified Type + ) + { + // + ulong result = -1; + + // + double profit = 0; + + // + int positionsCount = PositionsTotal(); + if (positionsCount <= 0) + { + return result; + } + + // + for (int i = 0; i < positionsCount; i++) + { + // + if (!mPositionInfo.SelectByIndex(i)) + { + continue; + } + + // + if (mPositionInfo.Magic() != mMagicNumber) + { + continue; + } + + // + ulong positionTicket = mPositionInfo.Ticket(); + + // + string positionSymbol = mPositionInfo.Symbol(); + + // + double positionProfit = mPositionInfo.Profit(); + double positionAbsProfit = MathAbs(positionProfit); + if (positionProfit >= 0) + { + continue; + } + + // + ENUM_POSITION_TYPE positionType = mPositionInfo.PositionType(); + + // + if ( + type == NULL && + StringLen(symbol) <= 0) + { + // + if (profit < positionAbsProfit) + { + // + result = positionTicket; + profit = positionAbsProfit; + } + + // + continue; + } + else if ( + type != NULL && + StringLen(symbol) > 0) + { + // + if (type == positionType && + symbol == positionSymbol) + { + // + if (type == POSITION_TYPE_BUY) + { + // + if (profit < positionAbsProfit) + { + // + result = positionTicket; + profit = positionAbsProfit; + } + } + else + { + // + if (profit < positionAbsProfit) + { + // + result = positionTicket; + profit = positionAbsProfit; + } + } + + // + continue; + } + } + else if (StringLen(symbol) > 0) + { + // + if (positionSymbol == symbol) + { + // + if (profit < positionAbsProfit) + { + // + result = positionTicket; + profit = positionAbsProfit; + } + + // + continue; + } + } + else if (type != NULL) + { + // + if (type == positionType) + { + // + if (type == POSITION_TYPE_BUY) + { + // + if (profit < positionAbsProfit) + { + // + result = positionTicket; + profit = positionAbsProfit; + } + } + else + { + // + if (profit < positionAbsProfit) + { + // + result = positionTicket; + profit = positionAbsProfit; + } + } + + // + continue; + } + } + } + + // + return result; + } + + // + // Retrieve Specific Position's Profit ... + double GetPositionProfit( + const ulong ticket // Specified Position Ticket + ) + { + // + double result = 0; + + // + int positionsCount = PositionsTotal(); + if (positionsCount <= 0) + { + return result; + } + + // + for (int i = 0; i < positionsCount; i++) + { + // + if (!mPositionInfo.SelectByIndex(i)) + { + continue; + } + + // + if (mPositionInfo.Magic() != mMagicNumber) + { + continue; + } + + // + ulong positionTicket = mPositionInfo.Ticket(); + if (positionTicket != ticket) + { + continue; + } + + // + result = mPositionInfo.Profit(); + break; + } + + // + return result; + } + + // + // Retrieve Specific Position's OpenDate ... + datetime GetPositionOpenDate( + const ulong ticket // Specified Position Ticket + ) + { + // + datetime result = 0; + + // + int positionsCount = PositionsTotal(); + if (positionsCount <= 0) + { + return result; + } + + // + for (int i = 0; i < positionsCount; i++) + { + // + if (!mPositionInfo.SelectByIndex(i)) + { + continue; + } + + // + if (mPositionInfo.Magic() != mMagicNumber) + { + continue; + } + + // + ulong positionTicket = mPositionInfo.Ticket(); + if (positionTicket != ticket) + { + continue; + } + + // + result = mPositionInfo.Time(); + break; + } + + // + return result; + } + + // + // Retrieve Specific Position's Comment ... + string GetPositionComment( + const ulong ticket // Specified Position Ticket + ) + { + // + string result = ""; + + // + int positionsCount = PositionsTotal(); + if (positionsCount <= 0) + { + return result; + } + + // + for (int i = 0; i < positionsCount; i++) + { + // + if (!mPositionInfo.SelectByIndex(i)) + { + continue; + } + + // + if (mPositionInfo.Magic() != mMagicNumber) + { + continue; + } + + // + ulong positionTicket = mPositionInfo.Ticket(); + if (positionTicket != ticket) + { + continue; + } + + // + result = mPositionInfo.Comment(); + break; + } + + // + return result; + } + + // + // Retrieve All Open Positions Profit ... + double GetPositionsProfit( + string symbol = "", // Specified Symbol + ENUM_POSITION_TYPE type = NULL // Specified Type + ) + { + // + double result = 0; + + // + int positionsCount = PositionsTotal(); + if (positionsCount <= 0) + { + return result; + } + + // + for (int i = 0; i < positionsCount; i++) + { + // + if (!mPositionInfo.SelectByIndex(i)) + { + continue; + } + + // + if (mPositionInfo.Magic() != mMagicNumber) + { + continue; + } + + // + ulong positionTicket = mPositionInfo.Ticket(); + + // + string positionSymbol = mPositionInfo.Symbol(); + + // + double positionProfit = mPositionInfo.Profit(); + + // + ENUM_POSITION_TYPE positionType = mPositionInfo.PositionType(); + + // + if ( + type == NULL && + StringLen(symbol) <= 0) + { + // + result += positionProfit; + + // + continue; + } + else if ( + type != NULL && + StringLen(symbol) > 0) + { + // + if (type == positionType && + symbol == positionSymbol) + { + // + if (type == POSITION_TYPE_BUY) + { + result += positionProfit; + } + else + { + result += positionProfit; + } + + // + continue; + } + } + else if (StringLen(symbol) > 0) + { + // + if (positionSymbol == symbol) + { + result += positionProfit; + + // + continue; + } + } + else if (type != NULL) + { + // + if (type == positionType) + { + // + if (type == POSITION_TYPE_BUY) + { + result += positionProfit; + } + else + { + result += positionProfit; + } + + // + continue; + } + } + } + + // + return result; + } + + // + // Find Oldes Position ... + ulong GetOldestPosition( + string symbol = "", // Specified Symbol + ENUM_POSITION_TYPE type = NULL // Specified Type + ) + { + // + ulong result = 0; + + // + int age = 0; + + // + int positionsCount = PositionsTotal(); + if (positionsCount <= 0) + { + return result; + } + + // + for (int i = 0; i < positionsCount; i++) + { + // + if (!mPositionInfo.SelectByIndex(i)) + { + continue; + } + + // + if (mPositionInfo.Magic() != mMagicNumber) + { + continue; + } + + // + ulong positionTicket = mPositionInfo.Ticket(); + + // + string positionSymbol = mPositionInfo.Symbol(); + + // + double positionProfit = mPositionInfo.Profit(); + double positionAbsProfit = MathAbs(positionProfit); + if (positionProfit >= 0) + { + continue; + } + + // + ENUM_POSITION_TYPE positionType = mPositionInfo.PositionType(); + + // + string positionComment = mPositionInfo.Comment(); + ENUM_TIMEFRAMES positionPeriod = ExtractPositionPeriod(positionComment); + + // + // Calculate Position's Age ... + datetime positionOpenTime = mPositionInfo.Time(); + + // + // Retrieve Trade Open Bar Index based on Current Period ... + int positionOpenBarIndex = iBarShift( + positionSymbol, + positionPeriod, + positionOpenTime); + + // + // Calculate Trade Life ... + int positionAge = MathAbs(0 - positionOpenBarIndex); + + // + if ( + type == NULL && + StringLen(symbol) <= 0) + { + // + if (age < positionAge) + { + // + age = positionAge; + result = positionTicket; + } + + // + continue; + } + else if ( + type != NULL && + StringLen(symbol) > 0) + { + // + if (type == positionType && + symbol == positionSymbol) + { + // + if (type == POSITION_TYPE_BUY) + { + // + if (age < positionAge) + { + // + age = positionAge; + result = positionTicket; + } + } + else + { + // + if (age < positionAge) + { + // + age = positionAge; + result = positionTicket; + } + } + + // + continue; + } + } + else if (StringLen(symbol) > 0) + { + // + if (positionSymbol == symbol) + { + // + if (age < positionAge) + { + // + age = positionAge; + result = positionTicket; + } + + // + continue; + } + } + else if (type != NULL) + { + // + if (type == positionType) + { + // + if (type == POSITION_TYPE_BUY) + { + // + if (age < positionAge) + { + // + age = positionAge; + result = positionTicket; + } + } + else + { + // + if (age < positionAge) + { + // + age = positionAge; + result = positionTicket; + } + } + + // + continue; + } + } + } + + // + return result; + } + + // + // Force Open a Buy/Long Position ... + bool Buy( + string symbol, // Specified Symbol + ENUM_TIMEFRAMES period, // Specified Trade's Period + double volume, // position volume + double price, // execution price + double sl = 0, // stop loss price + double tp = 0, // take profit price + string comment = "" // comment + ) + { + // + bool result = false; + + // + string mPeriodStr = GeneratePositionPeriodComment(period); + + // + comment += mPeriodStr; + + // + result = mTrader.Buy( + volume, + symbol, + price, + sl, + tp, + comment); + + // + return result; + } + + // + // Send BUY LIMIT order ... + bool BuyLimit( + string symbol, // Specified Symbol + ENUM_TIMEFRAMES period, // Specified Trade's Period + double volume, // order volume + double price, // order price + double sl = 0.0, // stop loss price + double tp = 0.0, // take profit price + ENUM_ORDER_TYPE_TIME typeTime = ORDER_TIME_GTC, // order lifetime + datetime expiration = 0, // order expiration time + string comment = "" // comment + ) + { + // + bool result = false; + + // + string mPeriodStr = GeneratePositionPeriodComment(period); + + // + comment += mPeriodStr; + + // + result = mTrader.BuyLimit( + volume, + price, + symbol, + sl, + tp, + typeTime, + expiration, + comment); + + // + return result; + } + + // + // Send BUY STOP order ... + bool BuyStop( + string symbol, // Specified Symbol + ENUM_TIMEFRAMES period, // Specified Trade's Period + double volume, // order volume + double price, // order price + double sl = 0.0, // stop loss price + double tp = 0.0, // take profit price + ENUM_ORDER_TYPE_TIME typeTime = ORDER_TIME_GTC, // order lifetime + datetime expiration = 0, // order expiration time + string comment = "" // comment + ) + { + // + bool result = false; + + // + string mPeriodStr = GeneratePositionPeriodComment(period); + + // + comment += mPeriodStr; + + // + result = mTrader.BuyStop( + volume, + price, + symbol, + sl, + tp, + typeTime, + expiration, + comment); + + // + return result; + } + + // + // Force Open a Sell/Short Position ... + bool Sell( + string symbol, // Specified Symbol + ENUM_TIMEFRAMES period, // Specified Trade's Period + double volume, // position volume + double price, // execution price + double sl = 0, // stop loss price + double tp = 0, // take profit price + string comment = "" // comment + ) + { + // + bool result = false; + + // + string mPeriodStr = GeneratePositionPeriodComment(period); + + // + comment += mPeriodStr; + + // + result = mTrader.Sell( + volume, + symbol, + price, + sl, + tp, + comment); + + // + return result; + } + + // + // Send SELL LIMIT order ... + bool SellLimit( + string symbol, // Specified Symbol + ENUM_TIMEFRAMES period, // Specified Trade's Period + double volume, // order volume + double price, // order price + double sl = 0.0, // stop loss price + double tp = 0.0, // take profit price + ENUM_ORDER_TYPE_TIME typeTime = ORDER_TIME_GTC, // order lifetime + datetime expiration = 0, // order expiration time + string comment = "" // comment + ) + { + // + bool result = false; + + // + string mPeriodStr = GeneratePositionPeriodComment(period); + + // + comment += mPeriodStr; + + // + result = mTrader.SellLimit( + volume, + price, + symbol, + sl, + tp, + typeTime, + expiration, + comment); + + // + return result; + } + + // + // Send SELL STOP order ... + bool SellStop( + string symbol, // Specified Symbol + ENUM_TIMEFRAMES period, // Specified Trade's Period + double volume, // order volume + double price, // order price + double sl = 0.0, // stop loss price + double tp = 0.0, // take profit price + ENUM_ORDER_TYPE_TIME typeTime = ORDER_TIME_GTC, // order lifetime + datetime expiration = 0, // order expiration time + string comment = "" // comment + ) + { + // + bool result = false; + + // + string mPeriodStr = GeneratePositionPeriodComment(period); + + // + comment += mPeriodStr; + + // + result = mTrader.SellStop( + volume, + price, + symbol, + sl, + tp, + typeTime, + expiration, + comment); + + // + return result; + } + + // + // Modify Position ... + bool Modify( + const ulong ticket, // position ticket + double sl = 0, // stop loss price + double tp = 0, // take profit + string comment = "" // comment + ) + { + // + bool result = false; + + // + // Validate Args ... + if (tp <= 0 && sl <= 0) + { + result = false; + return result; + } + + // + // Use Position Comment when there isn't new One ... + if (StringLen(comment) == 0) + { + comment = GetPositionComment(ticket); + } + + // + result = mTrader.PositionModify( + ticket, + sl, + tp, + comment); + + // + return result; + } + + // + // Close Position By Ticket ... + bool Close( + ulong ticket, // Position Ticket + string comment = "" // Close Position By Specific Comment + ) + { + // + bool result = false; + + // + // Try to Select Position ... + if (!mPositionInfo.SelectByTicket(ticket)) + { + return result; + } + + // + // Close Position By Specific Comment ... + result = mTrader.PositionClose( + ticket, + mSlippage, + comment); + + // + return result; + } + + // + // Close All Positions ... + void CloseAllPositions( + string comment = "" // Close Position By Specific Comment + ) + { + // + int positionsCount = PositionsTotal(); + if (positionsCount <= 0) + { + return; + } + + // + for (int i = 0; i < positionsCount; i++) + { + // + if (!mPositionInfo.SelectByIndex(i)) + { + continue; + } + + // + if (mPositionInfo.Magic() != mMagicNumber) + { + continue; + } + + // + ulong positionTicket = mPositionInfo.Ticket(); + Close( + positionTicket, + comment); + } + } + + // + // Close Partial By Ticket ... + bool ClosePartial( + ulong ticket, // Position Ticket + double volume, // Volume Size for Partial Closing + string comment = "" // Close Position By Specific Comment + ) + { + // + bool result = false; + + // + if (!mPositionInfo.SelectByTicket(ticket)) + { + return result; + } + + // + result = mTrader.PositionClosePartial( + ticket, + volume, + mSlippage, + comment); + + // + return result; + } + + // + // Find Position Open Bar Index ... + int GetPositionOpenBarIndex( + const ulong ticket // position ticket + ) + { + // + int result = -1; + + // + int positionsCount = PositionsTotal(); + if (positionsCount <= 0) + { + return result; + } + + // + for (int i = 0; i < positionsCount; i++) + { + // + if (!mPositionInfo.SelectByIndex(i)) + { + continue; + } + + // + if (mPositionInfo.Magic() != mMagicNumber) + { + continue; + } + + // + ulong positionTicket = mPositionInfo.Ticket(); + if (positionTicket != ticket) + { + continue; + } + + // + string symbol = mPositionInfo.Symbol(); + datetime openAt = mPositionInfo.Time(); + string comment = mPositionInfo.Comment(); + ENUM_TIMEFRAMES period = ExtractPositionPeriod(comment); + + // + result = iBarShift( + symbol, + period, + openAt); + } + + // + return result; + } + + // + bool GetPosition( + XPosition &position, // Holds result ... + ulong ticket // Required Position Ticket ... + ) + { + // + bool result = false; + + // + XPosition positions[]; + GetPositions(positions); + int positionsCount = ArraySize(positions); + if (positionsCount <= 0) + { + return result; + } + + // + for (int i = 0; i < positionsCount; i++) + { + // + XPosition iPosition = positions[i]; + + // + result = iPosition.ticket == ticket; + if (!result) + { + continue; + } + + // + position = iPosition; + break; + } + + // + return result; + } + + // + // Retrieve Positions as an Array ... + void GetPositions( + XPosition &result[] // Hold Result ... + ) + { + // + Clean(result); + + // + int positionsCount = PositionsTotal(); + if (positionsCount <= 0) + { + return; + } + + // + for (int i = 0; i < positionsCount; i++) + { + // + if (!mPositionInfo.SelectByIndex(i)) + { + continue; + } + + // + if (mPositionInfo.Magic() != mMagicNumber) + { + continue; + } + + // + ulong magic = mPositionInfo.Magic(); + ulong ticket = mPositionInfo.Ticket(); + string symbol = mPositionInfo.Symbol(); + datetime openAt = mPositionInfo.Time(); + double swap = mPositionInfo.Swap(); + double sl = mPositionInfo.StopLoss(); + double tp = mPositionInfo.TakeProfit(); + double profit = mPositionInfo.Profit(); + double volume = mPositionInfo.Volume(); + string comment = mPositionInfo.Comment(); + double entry = mPositionInfo.PriceOpen(); + double price = mPositionInfo.PriceCurrent(); + double commission = mPositionInfo.Commission(); + ENUM_POSITION_TYPE type = mPositionInfo.PositionType(); + ENUM_TIMEFRAMES period = ExtractPositionPeriod(comment); + + // + XPosition iPosition = {}; + + // + iPosition.tp = tp; + iPosition.sl = sl; + iPosition.swap = swap; + iPosition.type = type; + iPosition.magic = magic; + iPosition.entry = entry; + iPosition.price = price; + iPosition.ticket = ticket; + iPosition.symbol = symbol; + iPosition.period = period; + iPosition.volume = volume; + iPosition.openAt = openAt; + iPosition.profit = profit; + iPosition.comment = comment; + iPosition.commission = commission; + + // + Add( + iPosition, + result); + } + } + + // + void GetPositions( + XPosition &result[], // Hold Result ... + string symbol, // Trading Symbol ... + ENUM_TIMEFRAMES period // Trading Period ... + ) + { + // + Clean(result); + + // + bool hasPeriod = period != NULL; + bool hasSymbol = symbol != NULL && StringLen(symbol) > 0; + + // + int positionsCount = PositionsTotal(); + if (positionsCount <= 0) + { + return; + } + + // + XPosition allPositions[]; + GetPositions(allPositions); + + // + if (!hasPeriod && !hasSymbol) + { + // + Copy( + allPositions, + result); + + // + return; + } + + // + for (int i = 0; i < positionsCount; i++) + { + // + XPosition iPosition = allPositions[i]; + + // + if (hasSymbol && + symbol != iPosition.symbol) + { + continue; + } + + // + ENUM_TIMEFRAMES positionPeriod = ExtractPositionPeriod(iPosition.comment); + if (hasPeriod && + period != positionPeriod) + { + continue; + } + + // + Add( + iPosition, + result); + } + } + + // + // Execute a Signal ... + bool ExecuteSignal( + XSignal &signal, // Signal ... + string comment = "", // Position Comment ... + ENUM_ORDER_TYPE_TIME lifetime = ORDER_TIME_GTC, // Order LifeTime ... + datetime expiration = 0 // order expiration time + ) + { + // + bool result = false; + + // + double currentEntry = GetEntry( + signal.symbol, + signal.type); + bool isLong = IsLong(signal.type); + + // + ResetLastError(); + + // + if (signal.mode == X_ORDER_MODE_MARKET) + { + // + // Execute MArket Orders ... + if (isLong) + { + // + result = Buy( + signal.symbol, + signal.period, + signal.volume, + signal.entry, + signal.sl, + signal.tp, + comment); + } + else + { + // + result = Sell( + signal.symbol, + signal.period, + signal.volume, + signal.entry, + signal.sl, + signal.tp, + comment); + } + } + else if (signal.mode == X_ORDER_MODE_LIMIT) + { + // + // Execute Limit Orders ... + + // + // Check Conditions ... + + // + // Check Price ... + result = isLong + ? signal.entry < currentEntry + : signal.entry > currentEntry; + if (!result) + { + return result; + } + + // + // Check Expiration Date ... + result = (lifetime == ORDER_TIME_SPECIFIED || lifetime == ORDER_TIME_SPECIFIED_DAY) + ? expiration > 0 + : true; + if (!result) + { + return result; + } + + // + if (isLong) + { + // + result = BuyLimit( + signal.symbol, + signal.period, + signal.volume, + signal.entry, + signal.sl, + signal.tp, + lifetime, + expiration, + comment); + } + else + { + // + result = SellLimit( + signal.symbol, + signal.period, + signal.volume, + signal.entry, + signal.sl, + signal.tp, + lifetime, + expiration, + comment); + } + } + else if (signal.mode == X_ORDER_MODE_STOP) + { + // + // Execute Stop Orders ... + + // + // Check Conditions ... + + // + // Check Price ... + result = isLong + ? signal.entry > currentEntry + : signal.entry < currentEntry; + if (!result) + { + return result; + } + + // + // Check Expiration Date ... + result = (lifetime == ORDER_TIME_SPECIFIED || lifetime == ORDER_TIME_SPECIFIED_DAY) + ? expiration > 0 + : true; + if (!result) + { + return result; + } + + // + if (isLong) + { + // + result = BuyStop( + signal.symbol, + signal.period, + signal.volume, + signal.entry, + signal.sl, + signal.tp, + lifetime, + expiration, + comment); + } + else + { + // + result = SellStop( + signal.symbol, + signal.period, + signal.volume, + signal.entry, + signal.sl, + signal.tp, + lifetime, + expiration, + comment); + } + } + + // + if (!result) + { + LogMessage("Error: " + (string)GetLastError() + ", " + GetErrorDescription(GetLastError())); + } + else + { + // + // Retrieve Last Position Ticket ... + ulong ticket = GetLastOpenPositionTicket(); + + // + // Check Position have Support Signals or not ... + int supportsCount = ArraySize(signal.supports); + if (supportsCount > 0) + { + // + int executed = 0; + for (int i = 0; i < supportsCount; i++) + { + // + XSignal iSupport = signal.supports[i]; + + // + int supIndex = i + 1; + string iComment = GenerateSupportSignalComment( + ticket, + supIndex); + + // + bool isExecuted = ExecuteSignal( + iSupport, + iComment); + if (isExecuted) + { + executed++; + } + } + + // + result = executed == supportsCount; + } + } + + // + return result; + } + + // + // Execute a Collection of Signals ... + int ExecuteSignals( + const XSignal &signals[], // an Array of Signals ... + string comment = "", // Position Comment ... + ENUM_ORDER_TYPE_TIME lifetime = ORDER_TIME_GTC, // Order LifeTime ... + datetime expiration = 0 // order expiration time + ) + { + // + int result = 0; + + // + int signalsCount = ArraySize(signals); + if (signalsCount <= 0) + { + return result; + } + + // + for (int i = 0; i < signalsCount; i++) + { + // + XSignal iSignal = signals[i]; + + // + if (StringLen(comment) == 0) + { + comment = GenerateProvidersString(iSignal); + } + + // + bool isExecuted = ExecuteSignal( + iSignal, + comment, + lifetime, + expiration); + + // + if (isExecuted) + { + result++; + } + } + + // + return result; + } + + // + // Retrieve in Profit Positions ... + void GetInProfitPositions( + XPosition &result[] // Hold Result ... + ) + { + // + Clean(result); + + // + XPosition allPositions[]; + GetPositions(allPositions); + int positionsCount = ArraySize(allPositions); + if (positionsCount <= 0) + { + return; + } + + // + for (int i = 0; i < positionsCount; i++) + { + // + XPosition iPosition = allPositions[i]; + + // + if (iPosition.profit > 0) + { + Add( + iPosition, + result); + } + } + } + + // + // Retrieve in Drawdown Positions ... + void GetInDrawdownPositions( + XPosition &result[] // Hold Result ... + ) + { + // + Clean(result); + + // + XPosition allPositions[]; + GetPositions(allPositions); + int positionsCount = ArraySize(allPositions); + if (positionsCount <= 0) + { + return; + } + + // + for (int i = 0; i < positionsCount; i++) + { + // + XPosition iPosition = allPositions[i]; + + // + if (iPosition.profit < 0) + { + Add( + iPosition, + result); + } + } + } + + // + // Close a Collection Of Positions ... + int ClosePositions( + XPosition &positions[], // Positions to Close ... + string comment = "" // Specified Comment ... + ) + { + // + int result = 0; + int positionsCount = ArraySize(positions); + if (positionsCount <= 0) + { + return result; + } + + // + for (int i = 0; i < positionsCount; i++) + { + // + XPosition iPosition = positions[i]; + + // + bool isClosed = Close( + iPosition.ticket, + comment); + if (isClosed) + { + result++; + } + } + + // + return result; + } + + // + // Retrieve All Orders ... + void GetOrders( + XOrder &result[], // Holdes Result .... + string symbol, // Trading Symbol ... + ENUM_TIMEFRAMES period, // Trading TimeFrame ... + ENUM_ORDER_STATE state = NULL // Order State ... + ) + { + // + Clean(result); + + // + int ordersCount = OrdersTotal(); + if (ordersCount <= 0) + { + return; + } + + // + // Since Orders may be so more than positions ... + // start Orders Collectiong Loops reverse ... + for (int i = ordersCount - 1; i >= 0; i--) + { + // + if (!mOrderInfo.SelectByIndex(i)) + { + continue; + } + + // + if (mOrderInfo.Magic() != mMagicNumber) + { + continue; + } + + // + // Reading Order Info ... + long magic = mOrderInfo.Magic(); + double sl = mOrderInfo.StopLoss(); + ulong ticket = mOrderInfo.Ticket(); + double tp = mOrderInfo.TakeProfit(); + string oSymbol = mOrderInfo.Symbol(); + string comment = mOrderInfo.Comment(); + long positionID = mOrderInfo.PositionId(); + double openPrice = mOrderInfo.PriceOpen(); + datetime setupAt = mOrderInfo.TimeSetup(); + datetime executedAt = mOrderInfo.TimeDone(); + ENUM_ORDER_STATE oState = mOrderInfo.State(); + ENUM_ORDER_TYPE type = mOrderInfo.OrderType(); + double currentPrice = mOrderInfo.PriceCurrent(); + datetime expiredAt = mOrderInfo.TimeExpiration(); + double initialVolume = mOrderInfo.VolumeInitial(); + double currentVolume = mOrderInfo.VolumeCurrent(); + double stopLimitPrice = mOrderInfo.PriceStopLimit(); + ENUM_ORDER_TYPE_TIME lifetime = mOrderInfo.TypeTime(); + ENUM_ORDER_TYPE_FILLING filling = mOrderInfo.TypeFilling(); + + // + if (StringLen(symbol) > 0 && symbol != oSymbol) + { + continue; + } + + // + ENUM_TIMEFRAMES oPeriod = ExtractPositionPeriod(comment); + if (period != NULL && period != oPeriod) + { + continue; + } + + // + if (state != NULL && oState != state) + { + continue; + } + + // + // Now Create an instance of XOrder struct and fill it by + // retrieved data, and add it to results ... + XOrder iOrder = {}; + + // + iOrder.sl = sl; + iOrder.tp = tp; + iOrder.type = type; + iOrder.magic = magic; + iOrder.state = oState; + iOrder.ticket = ticket; + iOrder.smybol = oSymbol; + iOrder.period = oPeriod; + iOrder.setupAt = setupAt; + iOrder.comment = comment; + iOrder.filling = filling; + iOrder.lifetime = lifetime; + iOrder.expiredAt = expiredAt; + iOrder.openPrice = openPrice; + iOrder.pocitionID = positionID; + iOrder.executedAt = executedAt; + iOrder.currentPrice = currentPrice; + iOrder.initialVolume = initialVolume; + iOrder.currentVolume = currentVolume; + iOrder.stopLimitPrice = stopLimitPrice; + + // + Add( + iOrder, + result); + } + } + + // + int CountOrders() + { + return OrdersTotal(); + } + + // + // Cancel Specific Order ... + bool CancelOrder(ulong ticket) + { + return mTrader.OrderDelete(ticket); + } + + // + // Cancel Specific Orders ... + bool CancelOrders( + XOrder &orders[]) + { + // + bool result = false; + + // + int ordersCount = ArraySize(orders); + if (ordersCount <= 0) + { + return result; + } + + // + for (int i = 0; i < ordersCount; i++) + { + // + XOrder iOrder = orders[i]; + + // + bool isDeleted = mTrader.OrderDelete(iOrder.ticket); + if (isDeleted && !result) + { + result = isDeleted; + } + } + + // + return result; + } + + // + // Retrieve All Deals ... + void GetDeals(XDeal &result[]) + { + // + Clean(result); + + // + int dealsCount = HistoryDealsTotal(); + if (dealsCount <= 0) + { + return; + } + + // + for (int i = dealsCount - 1; i >= 0; i--) + { + // + if (!mDealInfo.SelectByIndex(i)) + { + continue; + } + + // + if (mDealInfo.Magic() != mMagicNumber) + { + continue; + } + + // + // Reading Order Info ... + double swap = mDealInfo.Swap(); + ulong magic = mDealInfo.Magic(); + ulong order = mDealInfo.Order(); + ulong ticket = mDealInfo.Ticket(); + datetime time = mDealInfo.Time(); + double price = mDealInfo.Price(); + string symbol = mDealInfo.Symbol(); + double profit = mDealInfo.Profit(); + double volume = mDealInfo.Volume(); + string comment = mDealInfo.Comment(); + ulong positionId = mDealInfo.PositionId(); + ENUM_DEAL_ENTRY entry = mDealInfo.Entry(); + double commission = mDealInfo.Commission(); + ENUM_DEAL_TYPE type = mDealInfo.DealType(); + ENUM_DEAL_REASON reason = (ENUM_DEAL_REASON)HistoryDealGetInteger( + ticket, + DEAL_REASON); + + // + XDeal iDeal = {}; + + // + iDeal.swap = swap; + iDeal.time = time; + iDeal.type = type; + iDeal.magic = magic; + iDeal.entry = entry; + iDeal.order = order; + iDeal.price = price; + iDeal.ticket = ticket; + iDeal.symbol = symbol; + iDeal.profit = profit; + iDeal.volume = volume; + iDeal.reason = reason; + iDeal.comment = comment; + iDeal.positionId = positionId; + iDeal.commission = commission; + + // + Add( + iDeal, + result); + } + } + + // + // Retrieve all History Orders of Specific Deal ... + int GetDealHistory( + const XDeal &deal, // Specified Deal + XOrder &history[] // Hold Result + ) + { + // + int result = 0; + + // + Clean(history); + + // + bool isHistorySelected = HistorySelectByPosition(deal.positionId); + if (!isHistorySelected) + { + return result; + } + + // + int ordersCount = HistoryOrdersTotal(); + if (ordersCount <= 0) + { + return result; + } + + // + for (int i = 0; i < ordersCount; i++) + { + // + if (!mHistoryOrderInfo.SelectByIndex(i)) + { + continue; + } + + // + ulong ticket = mHistoryOrderInfo.Ticket(); + + // + long positionId = mHistoryOrderInfo.PositionId(); + if (positionId != deal.positionId) + { + continue; + } + + // + // Reading Order Info ... + long magic = mHistoryOrderInfo.Magic(); + double sl = mHistoryOrderInfo.StopLoss(); + double tp = mHistoryOrderInfo.TakeProfit(); + string oSymbol = mHistoryOrderInfo.Symbol(); + string comment = mHistoryOrderInfo.Comment(); + double openPrice = mHistoryOrderInfo.PriceOpen(); + datetime setupAt = mHistoryOrderInfo.TimeSetup(); + datetime executedAt = mHistoryOrderInfo.TimeDone(); + ENUM_ORDER_STATE oState = mHistoryOrderInfo.State(); + ENUM_ORDER_TYPE type = mHistoryOrderInfo.OrderType(); + double currentPrice = mHistoryOrderInfo.PriceCurrent(); + datetime expiredAt = mHistoryOrderInfo.TimeExpiration(); + double initialVolume = mHistoryOrderInfo.VolumeInitial(); + double currentVolume = mHistoryOrderInfo.VolumeCurrent(); + double stopLimitPrice = mHistoryOrderInfo.PriceStopLimit(); + ENUM_ORDER_TYPE_TIME lifetime = mHistoryOrderInfo.TypeTime(); + ENUM_ORDER_TYPE_FILLING filling = mHistoryOrderInfo.TypeFilling(); + + // + ENUM_TIMEFRAMES oPeriod = ExtractPositionPeriod(comment); + + // + // Now Create an instance of XOrder struct and fill it by + // retrieved data, and add it to results ... + XOrder iOrder = {}; + + // + iOrder.sl = sl; + iOrder.tp = tp; + iOrder.type = type; + iOrder.magic = magic; + iOrder.state = oState; + iOrder.ticket = ticket; + iOrder.smybol = oSymbol; + iOrder.period = oPeriod; + iOrder.setupAt = setupAt; + iOrder.comment = comment; + iOrder.filling = filling; + iOrder.lifetime = lifetime; + iOrder.expiredAt = expiredAt; + iOrder.openPrice = openPrice; + iOrder.pocitionID = positionId; + iOrder.executedAt = executedAt; + iOrder.currentPrice = currentPrice; + iOrder.initialVolume = initialVolume; + iOrder.currentVolume = currentVolume; + iOrder.stopLimitPrice = stopLimitPrice; + + // + Add( + iOrder, + history); + } + + // + result = ArraySize(history); + + // + return result; + } + + // + // Retrieve Specific Dates History Orders ... + int GetHistoryOrders( + XOrder &orders[], // Hold Result + string symbol = NULL, // Specify Symbol + ENUM_TIMEFRAMES period = NULL, // Speify Period + ENUM_ORDER_TYPE type = NULL, // Trading Type + ENUM_ORDER_STATE state = NULL, // Trading State + datetime startDate = 0, // Start Date + datetime endDate = 0 // End Date + ) + { + // + int result = 0; + + // + Clean(orders); + + // + if (startDate <= 0) + { + startDate = TimeCurrent() - (3 * PeriodSeconds(PERIOD_D1)); + } + + // + if (endDate <= 0) + { + endDate = TimeCurrent(); + } + + // + if (endDate <= startDate) + { + return result; + } + + // + bool isSelected = HistorySelect(startDate, endDate); + if (!isSelected) + { + return result; + } + + // + int ordersCount = HistoryOrdersTotal(); + if (ordersCount <= 0) + { + return result; + } + + // + for (int i = 0; i < ordersCount; i++) + { + // + if (!mHistoryOrderInfo.SelectByIndex(i)) + { + continue; + } + + // + // + // Reading Order Info ... + + // + long magic = mHistoryOrderInfo.Magic(); + if (magic != mMagicNumber) + { + continue; + } + + // + string oSymbol = mHistoryOrderInfo.Symbol(); + if (StringLen(symbol) > 0 && symbol != NULL && oSymbol != symbol) + { + continue; + } + + // + string comment = mHistoryOrderInfo.Comment(); + ENUM_TIMEFRAMES oPeriod = ExtractPositionPeriod(comment); + if (period != NULL && oPeriod != period) + { + continue; + } + + // + ENUM_ORDER_TYPE oType = mHistoryOrderInfo.OrderType(); + if (type != NULL && oType != type) + { + continue; + } + + // + ENUM_ORDER_STATE oState = mHistoryOrderInfo.State(); + if (state != NULL && oState != state) + { + continue; + } + + // + double sl = mHistoryOrderInfo.StopLoss(); + ulong ticket = mHistoryOrderInfo.Ticket(); + double tp = mHistoryOrderInfo.TakeProfit(); + long positionId = mHistoryOrderInfo.PositionId(); + double openPrice = mHistoryOrderInfo.PriceOpen(); + datetime setupAt = mHistoryOrderInfo.TimeSetup(); + datetime executedAt = mHistoryOrderInfo.TimeDone(); + double currentPrice = mHistoryOrderInfo.PriceCurrent(); + datetime expiredAt = mHistoryOrderInfo.TimeExpiration(); + double initialVolume = mHistoryOrderInfo.VolumeInitial(); + double currentVolume = mHistoryOrderInfo.VolumeCurrent(); + double stopLimitPrice = mHistoryOrderInfo.PriceStopLimit(); + ENUM_ORDER_TYPE_TIME lifetime = mHistoryOrderInfo.TypeTime(); + ENUM_ORDER_TYPE_FILLING filling = mHistoryOrderInfo.TypeFilling(); + + // + + // + // Now Create an instance of XOrder struct and fill it by + // retrieved data, and add it to results ... + XOrder iOrder = {}; + + // + iOrder.sl = sl; + iOrder.tp = tp; + iOrder.type = type; + iOrder.magic = magic; + iOrder.state = oState; + iOrder.ticket = ticket; + iOrder.smybol = oSymbol; + iOrder.period = oPeriod; + iOrder.setupAt = setupAt; + iOrder.comment = comment; + iOrder.filling = filling; + iOrder.lifetime = lifetime; + iOrder.expiredAt = expiredAt; + iOrder.openPrice = openPrice; + iOrder.pocitionID = positionId; + iOrder.executedAt = executedAt; + iOrder.currentPrice = currentPrice; + iOrder.initialVolume = initialVolume; + iOrder.currentVolume = currentVolume; + iOrder.stopLimitPrice = stopLimitPrice; + + // + Add( + iOrder, + orders); + } + + // + result = ArraySize(orders); + + // + return result; + } + + // + // Retrieve Specific Dates History Deals ... + int GetHistoryDeals( + XDeal &deals[], // Hold Result + string symbol = NULL, // Specify Symbol + ENUM_DEAL_TYPE type = NULL, // Specify Deal Type + ENUM_DEAL_REASON reason = NULL, // Specify Deal Reason + datetime startDate = 0, // Start Date + datetime endDate = 0 // End Date + ) + { + // + int result = 0; + + // + Clean(deals); + + // + if (startDate <= 0) + { + startDate = TimeCurrent() - (3 * PeriodSeconds(PERIOD_D1)); + } + + // + if (endDate <= 0) + { + endDate = TimeCurrent(); + } + + // + if (endDate <= startDate) + { + return result; + } + + // + bool isSelected = HistorySelect(startDate, endDate); + if (!isSelected) + { + return result; + } + + // + int dealsCount = HistoryDealsTotal(); + if (dealsCount <= 0) + { + return result; + } + + // + for (int i = 0; i < dealsCount; i++) + { + // + if (!mDealInfo.SelectByIndex(i)) + { + continue; + } + + // + // Reading Deal Info ... + + // + long magic = mDealInfo.Magic(); + if (magic != mMagicNumber) + { + continue; + } + + // + string oSymbol = mDealInfo.Symbol(); + if (StringLen(symbol) > 0 && symbol != NULL && oSymbol != symbol) + { + continue; + } + + // + ENUM_DEAL_TYPE oType = mDealInfo.DealType(); + if (type != NULL && oType != type) + { + continue; + } + + // + ulong ticket = mDealInfo.Ticket(); + ENUM_DEAL_REASON oReason = (ENUM_DEAL_REASON)HistoryDealGetInteger( + ticket, + DEAL_REASON); + if (reason != NULL && oReason != reason) + { + continue; + } + + // + double swap = mDealInfo.Swap(); + ulong order = mDealInfo.Order(); + datetime time = mDealInfo.Time(); + double price = mDealInfo.Price(); + double profit = mDealInfo.Profit(); + double volume = mDealInfo.Volume(); + string comment = mDealInfo.Comment(); + ulong positionId = mDealInfo.PositionId(); + ENUM_DEAL_ENTRY entry = mDealInfo.Entry(); + double commission = mDealInfo.Commission(); + + // + XDeal iDeal; + + // + iDeal.swap = swap; + iDeal.time = time; + iDeal.type = type; + iDeal.magic = magic; + iDeal.entry = entry; + iDeal.order = order; + iDeal.price = price; + iDeal.ticket = ticket; + iDeal.symbol = symbol; + iDeal.profit = profit; + iDeal.volume = volume; + iDeal.reason = reason; + iDeal.comment = comment; + iDeal.positionId = positionId; + iDeal.commission = commission; + + // + Add( + iDeal, + deals); + } + + // + result = ArraySize(deals); + + // + return result; + } + + // + // Find Deal Period ... + ENUM_TIMEFRAMES GetDealPeriod(const XDeal &deal) + { + // + ENUM_TIMEFRAMES result = NULL; + + // + XOrder history[]; + int historyCount = GetDealHistory( + deal, + history); + if (historyCount <= 0) + { + return result; + } + + // + for (int i = 0; i < historyCount; i++) + { + // + XOrder iOrder = history[i]; + + // + if (StringLen(iOrder.comment) == 0) + { + continue; + } + + // + string periodStr = ExtractPositionPeriodString(iOrder.comment); + if (StringLen(periodStr) > 0) + { + // + result = ToPeriod(periodStr); + break; + } + } + + // + return result; + } + + // + // Find Deal Position Comment ... + string GetDealPositionComment(const XDeal &deal) + { + // + string result = ""; + + // + XOrder history[]; + int historyCount = GetDealHistory( + deal, + history); + if (historyCount <= 0) + { + return result; + } + + // + for (int i = 0; i < historyCount; i++) + { + // + XOrder iOrder = history[i]; + + // + if (StringLen(iOrder.comment) > 0) + { + // + result = iOrder.comment; + break; + } + } + + // + return result; + } + + // + // Generate String Representation Of Position's Time Frame ... + string GeneratePositionPeriodComment(ENUM_TIMEFRAMES period) + { + // + string result = mPeriodPrefix + "(" + ToString(period) + ")"; + + // + return result; + } + + // + string ExtractPositionPeriodString(string comment) + { + // + string result = ""; + + // + if (StringLen(comment) <= 0) + { + return result; + } + + // + result = ExtractString( + comment, + mPeriodPrefix + "(", + ")"); + + // + return result; + } + + // + // Extract Position Time Frame From it's Comment ... + ENUM_TIMEFRAMES ExtractPositionPeriod(string comment) + { + // + ENUM_TIMEFRAMES result = NULL; + + // + string periodStr = ExtractPositionPeriodString(comment); + if (StringLen(periodStr) <= 0) + { + return result; + } + + // + result = ToPeriod(periodStr); + + // + return result; + } + + // + // Retrieve Last Open Position Ticket ... + ulong GetLastOpenPositionTicket() + { + // + ulong result = 0; + + int positionsCount = PositionsTotal(); + if (positionsCount <= 0) + { + return result; + } + + // + result = PositionGetTicket(PositionsTotal() - 1); + + // + return result; + } + + // + // Retrieve Last Placed Order Ticket ... + ulong GetLastPlacedOrderTicket() + { + // + ulong result = 0; + + int ordersCount = OrdersTotal(); + if (ordersCount <= 0) + { + return result; + } + + // + if (mOrderInfo.SelectByIndex(ordersCount - 1)) + { + result = mOrderInfo.Ticket(); + } + + // + return result; + } + + // + // SUPPORT Signals ... + + // + // Retrieve a Position if Exists + // by all of it's Supported Positon/Order (s) ... + bool GetPositionPack( + ulong ticket, // Sepcified Position's Ticket + XPositionPack &pack // Hold Result ... + ) + { + // + bool result = false; + + // + int positionsCount = CountPositions(); + int ordersCount = CountOrders(); + if (ordersCount <= 0 && positionsCount <= 0) + { + return result; + } + + // + XPosition position; + result = GetPosition( + position, + ticket); + if (!result) + { + return result; + } + + // + XOrder supportOrders[]; + XPosition supportPositions[]; + + // + XOrder orders[]; + GetOrders( + orders, + position.symbol, + position.period, + ORDER_STATE_PLACED); + ordersCount = ArraySize(orders); + + // + // Select Orders ... + if (ordersCount > 0) + { + // + for (int i = 0; i < ordersCount; i++) + { + // + XOrder iOrder = orders[i]; + + // + string params[]; + bool hasSupport = ExtractSupportParams( + iOrder.comment, + params); + if (hasSupport) + { + // + ulong parentTicket = ExtractParentTicket(iOrder.comment); + if (parentTicket == ticket) + { + // + Add( + iOrder, + supportOrders); + } + } + } + } + + // + XPosition positions[]; + GetPositions( + positions, + position.symbol, + position.period); + positionsCount = ArraySize(positions); + + // + // Select Positions ... + if (positionsCount > 0) + { + // + for (int i = 0; i < positionsCount; i++) + { + // + XPosition iPosition = positions[i]; + + // + string params[]; + bool hasSupport = ExtractSupportParams( + iPosition.comment, + params); + if (hasSupport) + { + // + ulong parentTicket = ExtractParentTicket(iPosition.comment); + if (parentTicket == ticket) + { + // + Add( + iPosition, + supportPositions); + } + } + } + } + + // + int supportOrdersCount = ArraySize(supportOrders); + int supportPositionsCount = ArraySize(supportPositions); + + // + pack.ticket = ticket; + pack.position = position; + + // + Copy(supportOrders, + pack.supportOrders); + Copy(supportPositions, + pack.supportPositions); + + // + pack.supportOrdersCount = supportOrdersCount; + pack.supportPositionsCount = supportPositionsCount; + + // + result = true; + + // + return result; + } + + // + // Extract specific Positions Pack ... + // in this senario there is no need to Position exists itself ... + bool GetPositionPack( + ulong ticket, // Specified Positions Ticket ... + string symbol, // Specified Position Symbol ... + ENUM_TIMEFRAMES period, // Specified Position Period ... + XPositionPack &pack // Hold Result ... + ) + { + // + bool result = false; + + // + // NOTE: We Have to Force Retrieve Position's pack event + // it's parent Position not Eists ... + pack.ticket = ticket; + pack.supportOrdersCount = 0; + Clean(pack.supportOrders); + pack.supportPositionsCount = 0; + Clean(pack.supportPositions); + + // + XPosition position; + bool hasPosition = GetPosition( + position, + ticket); + if (hasPosition) + { + pack.position = position; + } + + // + XOrder supportOrders[]; + XPosition supportPositions[]; + + // + XOrder orders[]; + GetOrders( + orders, + symbol, // Specified Symbol ... + period, // Specified Period + ORDER_STATE_PLACED // Just UnTriggered Orders ... + ); + int ordersCount = ArraySize(orders); + + // + // Select Orders ... + if (ordersCount > 0) + { + // + for (int i = 0; i < ordersCount; i++) + { + // + XOrder iOrder = orders[i]; + + // + string params[]; + bool hasSupport = ExtractSupportParams( + iOrder.comment, + params); + if (hasSupport) + { + // + ulong parentTicket = ExtractParentTicket(iOrder.comment); + if (parentTicket == ticket) + { + // + Add( + iOrder, + supportOrders); + } + } + } + } + + // + int supportOrdersCount = ArraySize(supportOrders); + if (supportOrdersCount > 0) + { + // + pack.supportOrdersCount = supportOrdersCount; + + // + Copy( + supportOrders, + pack.supportOrders); + } + + // + XPosition positions[]; + GetPositions( + positions, + symbol, // Specified Symbol ... + period // Specified Period ... + ); + int positionsCount = ArraySize(positions); + + // + // Select Positions ... + if (positionsCount > 0) + { + // + for (int i = 0; i < positionsCount; i++) + { + // + XPosition iPosition = positions[i]; + + // + string params[]; + bool hasSupport = ExtractSupportParams( + iPosition.comment, + params); + if (hasSupport) + { + // + ulong parentTicket = ExtractParentTicket(iPosition.comment); + if (parentTicket == ticket) + { + // + Add( + iPosition, + supportPositions); + } + } + } + } + + // + int supportPositionsCount = ArraySize(supportPositions); + if (supportPositionsCount > 0) + { + // + pack.supportPositionsCount = supportPositionsCount; + + // + Copy( + supportPositions, + pack.supportPositions); + } + + // + result = supportOrdersCount > 0 || supportPositionsCount > 0; + + // + return result; + } + + // + // Extract Specific Deals Position's Pack ... + // this used when a Position SL or TP triggered and we want to close + // all it's Supported Packs ... + bool GetDealPack( + const XDeal &deal, + XPositionPack &pack) + { + // + bool result = false; + + // + ulong ticket = deal.positionId; + ENUM_TIMEFRAMES dealPeriod = GetDealPeriod(deal); + string dealSymbol = deal.symbol; + + // + // So We Have to Get Positions Pack ... + result = GetPositionPack( + ticket, + dealSymbol, + dealPeriod, + pack); + + // + return result; + } + + // + // END Provided Functions ... + // + + // + // Protected ... +protected: + // + // Private ... + + // + // EVENTS Handlers Notifiers ... + + // + // STATE ... + void NotifyTradeStateChangeEvent(const XOnTradeHandlerState &state) + { + // + int count = ArraySize(mTradeStateChangedEventHandlers); + if (count <= 0) + { + return; + } + + // + for (int i = 0; i < count; i++) + { + // + TOnTradeStateChanged iHandler = mTradeStateChangedEventHandlers[i]; + iHandler(state); + } + } + + // + // DEALS ... + void NotifyDealsChangeEvent(int changes) + { + // + int count = ArraySize(mDealsChangedEventHandlers); + if (count <= 0) + { + return; + } + + // + for (int i = 0; i < count; i++) + { + // + TOnDealsChanged iHandler = mDealsChangedEventHandlers[i]; + iHandler(changes); + } + } + + // + // ORDERS ... + void NotifyOrdersChangeEvent(int changes) + { + // + int count = ArraySize(mOrdersChangedEventHandlers); + if (count <= 0) + { + return; + } + + // + for (int i = 0; i < count; i++) + { + // + TOnOrdersChanged iHandler = mOrdersChangedEventHandlers[i]; + iHandler(changes); + } + } + + // + // POSITIONS ... + void NotifyPositionsChangeEvent(int changes) + { + // + int count = ArraySize(mPositionsChangedEventHandlers); + if (count <= 0) + { + return; + } + + // + for (int i = 0; i < count; i++) + { + // + TOnPositionsChanged iHandler = mPositionsChangedEventHandlers[i]; + iHandler(changes); + } + } + + // + // TPSL ... + + // + void NotifyStopLossEvent(const XDeal &deal) + { + // + int count = ArraySize(mStopLossEventHandlers); + if (count <= 0) + { + return; + } + + // + for (int i = 0; i < count; i++) + { + // + TOnStopLoss iHandler = mStopLossEventHandlers[i]; + iHandler(deal); + } + } + + // + void NotifyTakeProfitEvent(const XDeal &deal) + { + // + int count = ArraySize(mTakeProfitEventHandlers); + if (count <= 0) + { + return; + } + + // + for (int i = 0; i < count; i++) + { + // + TOnTakeProfit iHandler = mTakeProfitEventHandlers[i]; + iHandler(deal); + } + } + +private: + // + // using deviation, it must be in Point ... + int mSlippage; + + // + // using magic number ... + ulong mMagicNumber; + + // + // using CTrade instance ... + XSCTradeBase mTrader; + + // + // Deals Info ... + CDealInfo mDealInfo; + + // + // Order Info ... + COrderInfo mOrderInfo; + + // + // using PositionInfo instance ... + CPositionInfo mPositionInfo; + + // + // History Orders ... + CHistoryOrderInfo mHistoryOrderInfo; + + // + // ADDITIONAL Data ... + + // + string mPeriodPrefix; + + // + // START Trade Processing ... + // + + // + int mDaysForRead; + + // + // set the limits of the trade history on the global scope ... + + // + // // start date for trade history in cache ... + datetime mStartDate; + + // + // end date for trade history in cache ... + datetime mEndDate; + + // + // global OnTrade counters ... + + // + // number of active orders ... + int mOrdersCount; + + // + // number of open positions ... + int mPositionsCount; + + // + // number of deals in the trade history cache ... + int mDealsCount; + + // + // number of orders in the trade history cache ... + int mHistoryOrdersCount; + + // + // flag of counter relevance ... + bool mScanStarted; + + // + // Check Statrt Date In Trade History ... + void CheckStartDateInTradeHistory() + { + // + // initial interval, if we were to start working right now .. + datetime currStart = TimeCurrent() - (mDaysForRead * PeriodSeconds(PERIOD_D1)); + + // + // make sure that the start limit of the trade history has not gone + // more than 1 day over the intended date ... + if (currStart - mStartDate > PeriodSeconds(PERIOD_D1)) + { + // + // correct the start date of history to be loaded in the cache ... + mStartDate = currStart; + + // + // now reload the trade history for the updated interval ... + HistorySelect(mStartDate, mEndDate); + + // + // correct the deal and order counters in history for further comparison + mHistoryOrdersCount = HistoryOrdersTotal(); + mDealsCount = HistoryDealsTotal(); + } + } + + // + // Process On Trade Context ... + void ProcessOnTradeContext( + XOnTradeHandlerState &result // Hold's Result + ) + { + // + mEndDate = TimeCurrent(); + + // + ResetLastError(); + + // + // download trading history from the specified interval to the program cache ... + bool selected = HistorySelect(mStartDate, mEndDate); + if (!selected) + { + return; + } + + // + // get the current values ... + int currOrders = OrdersTotal(); + int currPositions = PositionsTotal(); + int currDeals = HistoryDealsTotal(); + int currHistoryOrders = HistoryOrdersTotal(); + + // + // Orders ... + // check if the number of active orders has been changed ... + if (currOrders != mOrdersCount) + { + // + // number of active orders has been changed ... + result.hasNewOrder = true; + result.newOrders = currOrders - mOrdersCount; + + // + // update the value ... + mOrdersCount = currOrders; + } + + // + // Positions ... + // changes in the number of open positions ... + if (currPositions != mPositionsCount) + { + // + // number of open positions has been changed ... + result.hasNewPosition = true; + result.newPositions = currPositions - mPositionsCount; + + // + // update the value ... + mPositionsCount = currPositions; + } + + // + // Deals ... + // changes in the number of deals in the trade history cache ... + if (currDeals != mDealsCount) + { + // + // number of deals in the trade history cache has been changed ... + result.hasNewDeal = true; + result.newDeals = currDeals - mDealsCount; + + // + // update the value ... + mDealsCount = currDeals; + } + + // + // History Orders ... + // changes in the number of history orders in the trade history cache ... + if (currHistoryOrders != mHistoryOrdersCount) + { + // + // number of history orders in the trade history cache has been changed ... + result.hasNewHistoryOrder = true; + result.newHistoryOrders = currHistoryOrders - mHistoryOrdersCount; + + // + // update the value ... + mHistoryOrdersCount = currHistoryOrders; + } + + // + // checking if it is necessary to change the limits of the trade history to be requested in cache ... + CheckStartDateInTradeHistory(); + } + + // + // Reset On Trade Scanner Context ... + void ResetOnTradeContext() + { + // + mEndDate = TimeCurrent(); + mStartDate = mEndDate - (mDaysForRead * PeriodSeconds(PERIOD_D1)); + } + + // + // Initial Context Of Trade Scanner ... + void InitOnTradeContext() + { + // + ResetLastError(); + + // + mOrdersCount = OrdersTotal(); + mPositionsCount = PositionsTotal(); + + // + // load history ... + bool selected = HistorySelect(mStartDate, mEndDate); + if (!selected) + { + return; + } + + // + // get the current value ... + mDealsCount = HistoryDealsTotal(); + mHistoryOrdersCount = HistoryOrdersTotal(); + + // + mScanStarted = true; + } + + // + // Deals Changed Event Handlers ... + TOnDealsChanged mDealsChangedEventHandlers[]; + + // + // Orders Changed Event Handlers ... + TOnOrdersChanged mOrdersChangedEventHandlers[]; + + // + // Positions Changed Event Handlers ... + TOnPositionsChanged mPositionsChangedEventHandlers[]; + + // + // Trade State Changed Event Handlers ... + TOnTradeStateChanged mTradeStateChangedEventHandlers[]; + + // + // TPSL ... + TOnStopLoss mStopLossEventHandlers[]; + TOnTakeProfit mTakeProfitEventHandlers[]; + + // + // END Trade Processing ... + // +}; + +// +// START Usefull Functions ... +// + +// +// Add Specific XPosition to Specified Array ... +void Add( + XDeal &item, + XDeal &buffer[]) +{ + // + ArrayResize( + buffer, + ArraySize(buffer) + 1); + + // + buffer[ArraySize(buffer) - 1] = item; +} +void Add( + XOrder &item, + XOrder &buffer[]) +{ + // + ArrayResize( + buffer, + ArraySize(buffer) + 1); + + // + buffer[ArraySize(buffer) - 1] = item; +} +void Add( + XPosition &item, + XPosition &buffer[]) +{ + // + ArrayResize( + buffer, + ArraySize(buffer) + 1); + + // + buffer[ArraySize(buffer) - 1] = item; +} + +// +// Clear All Items Inside Array ... +void Clean(XDeal &buffer[]) +{ + // + ArrayFree(buffer); + ArrayResize(buffer, 0); +} +void Clean(XOrder &buffer[]) +{ + // + ArrayFree(buffer); + ArrayResize(buffer, 0); +} +void Clean(XPosition &buffer[]) +{ + // + ArrayFree(buffer); + ArrayResize(buffer, 0); +} + +// +// Generate Identifier Tag ... +string GenerateTag(XSignal &info) +{ + // + string result = ""; + + // + result = info.symbol + "," + ToString(info.period); + + // + return result; +} + +// +// Convert Position to Signal ... +XSignal ToSignalInfo( + XPosition &position) +{ + // + XSignal result; + + // + result.tp = position.tp; + result.sl = position.sl; + result.type = position.type; + result.entry = position.entry; + result.symbol = position.symbol; + result.period = position.period; + result.volume = position.volume; + + // + return result; +} + +// +// AGE Calculations ... +// + +// +// Retrieve a Position Age ... +int GetAge( + XPosition &position, // Selected Position ... + ENUM_TIMEFRAMES period = NULL // Dest Time Frame ... +) +{ + // + int result = -1; + + // + if (period == NULL) + { + period = _Period; + } + + // + result = iBarShift( + position.symbol, + period, + position.openAt); + + // + return result; +} + +// +// Retrieve an Order Age ... +int GetAge( + XOrder &order, // Selected Order ... + ENUM_TIMEFRAMES period = NULL // Dest Time Frame ... +) +{ + // + int result = -1; + + // + if (period == NULL) + { + period = _Period; + } + + // + result = iBarShift( + order.smybol, + period, + order.setupAt); + + // + return result; +} + +// +// Retrieve a Deal Age ... +int GetAge( + XDeal &deal, // Selected Deal ... + ENUM_TIMEFRAMES period = NULL // Dest Time Frame ... +) +{ + // + int result = -1; + + // + if (period == NULL) + { + period = _Period; + } + + // + result = iBarShift( + deal.symbol, + period, + deal.time); + + // + return result; +} + +// +// OLDEST Detection ... + +// +// Get Oldest Deal ... +int GetOldest( + XDeal &item, // Hold Result ... + XDeal &items[] // Source Array ... +) +{ + // + int result = -1; + + // + int itemsCount = ArraySize(items); + if (itemsCount <= 0) + { + return result; + } + + // + int tmpAge = 0; + XDeal tmpItem; + for (int i = 0; i < itemsCount; i++) + { + // + XDeal iItem = items[i]; + + // + int iAge = GetAge(iItem); + if (iAge > 0 && + (tmpAge == 0 || tmpAge < iAge)) + { + // + tmpAge = iAge; + tmpItem = iItem; + } + } + + // + if (tmpAge > 0) + { + // + result = tmpAge; + item = tmpItem; + } + + // + return result; +} + +// +// Get Youngest Deal ... +int GetYoungest( + XDeal &item, // Hold Result ... + XDeal &items[] // Source Array ... +) +{ + // + int result = -1; + + // + int itemsCount = ArraySize(items); + if (itemsCount <= 0) + { + return result; + } + + // + int tmpAge = 0; + XDeal tmpItem; + for (int i = 0; i < itemsCount; i++) + { + // + XDeal iItem = items[i]; + + // + int iAge = GetAge(iItem); + if (iAge > 0 && + (tmpAge == 0 || tmpAge > iAge)) + { + // + tmpAge = iAge; + tmpItem = iItem; + } + } + + // + if (tmpAge > 0) + { + // + result = tmpAge; + item = tmpItem; + } + + // + return result; +} + +// +// Get Oldest Order ... +int GetOldest( + XOrder &item, // Hold Result ... + XOrder &items[] // Source Array ... +) +{ + // + int result = -1; + + // + int itemsCount = ArraySize(items); + if (itemsCount <= 0) + { + return result; + } + + // + int tmpAge = 0; + XOrder tmpItem; + for (int i = 0; i < itemsCount; i++) + { + // + XOrder iItem = items[i]; + + // + int iAge = GetAge(iItem); + if (iAge > 0 && + (tmpAge == 0 || tmpAge < iAge)) + { + // + tmpAge = iAge; + tmpItem = iItem; + } + } + + // + if (tmpAge > 0) + { + // + result = tmpAge; + item = tmpItem; + } + + // + return result; +} + +// +// Get Youngest Order ... +int GetYoungest( + XOrder &item, // Hold Result ... + XOrder &items[] // Source Array ... +) +{ + // + int result = -1; + + // + int itemsCount = ArraySize(items); + if (itemsCount <= 0) + { + return result; + } + + // + int tmpAge = 0; + XOrder tmpItem; + for (int i = 0; i < itemsCount; i++) + { + // + XOrder iItem = items[i]; + + // + int iAge = GetAge(iItem); + if (iAge > 0 && + (tmpAge == 0 || tmpAge > iAge)) + { + // + tmpAge = iAge; + tmpItem = iItem; + } + } + + // + if (tmpAge > 0) + { + // + result = tmpAge; + item = tmpItem; + } + + // + return result; +} + +// +// Get Oldes Position ... +int GetOldest( + XPosition &item, // Hold Result ... + XPosition &items[] // Source Array ... +) +{ + // + int result = -1; + + // + int itemsCount = ArraySize(items); + if (itemsCount <= 0) + { + return result; + } + + // + int tmpAge = 0; + XPosition tmpItem; + for (int i = 0; i < itemsCount; i++) + { + // + XPosition iItem = items[i]; + + // + int iAge = GetAge(iItem); + if (iAge > 0 && + (tmpAge == 0 || tmpAge < iAge)) + { + // + tmpAge = iAge; + tmpItem = iItem; + } + } + + // + if (tmpAge > 0) + { + // + result = tmpAge; + item = tmpItem; + } + + // + return result; +} + +// +// Get Youngest Position ... +int GetYoungest( + XPosition &item, // Hold Result ... + XPosition &items[] // Source Array ... +) +{ + // + int result = -1; + + // + int itemsCount = ArraySize(items); + if (itemsCount <= 0) + { + return result; + } + + // + int tmpAge = 0; + XPosition tmpItem; + for (int i = 0; i < itemsCount; i++) + { + // + XPosition iItem = items[i]; + + // + int iAge = GetAge(iItem); + if (iAge > 0 && + (tmpAge == 0 || tmpAge > iAge)) + { + // + tmpAge = iAge; + tmpItem = iItem; + } + } + + // + if (tmpAge > 0) + { + // + result = tmpAge; + item = tmpItem; + } + + // + return result; +} + +// +// END Usefull Functions ... +// diff --git a/MQLTestWorkspace/BKPS/14030222/Documents/.gitkeep b/MQLTestWorkspace/BKPS/14030222/Documents/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/MQLTestWorkspace/BKPS/14030222/Documents/BKP/x-sample.ea.mq5 b/MQLTestWorkspace/BKPS/14030222/Documents/BKP/x-sample.ea.mq5 new file mode 100644 index 0000000..b0e98b3 --- /dev/null +++ b/MQLTestWorkspace/BKPS/14030222/Documents/BKP/x-sample.ea.mq5 @@ -0,0 +1,180 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center XSAMPLE MQL5 Expert Advisor +// ------------------------------------------------- +// Name: XSAMPLE +// Description: an Exper Advisor which used RSI and MA +// to Analyse Market ... +// +// Maintainer: +// ------------ +// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) +// +//////////////////////////////////////////////////////x +// +// Global Properties ... +#property copyright "Copyright 2023, SaherElm IT Center" +#property link "https://saherelm.ir" +#property version "1.00" +#property description "SaherElm XSAMPLE" +#property strict + +// +#define ShortName "XSAMPLE" + +// +#include "../Libraries/x-saherelm.log.lib.mq5" +#include "../Libraries/x-saherelm.draw.lib.mq5" +#include "../Libraries/x-saherelm.common.lib.mq5" +#include "../Classes/x-saherelm.xtrade.class.mq5" + +// +// Inputs ... +long xSampleEAMagicNumber = 78692110; // Magic Number +int xSampleEASlippage = 10; // Slippgae + +// +double xSampleEAVolume = 0.01; + +// +// Vars ... +string xSampleEASymbol; +ENUM_TIMEFRAMES xSampleEAPeriod; + +// +int maxBuys = 1; +int maxSells = 1; +int buyCount = 0; +int sellCount = 0; + +// +double _tp = 0; +double _sl = 0; +double _entry = 0; +ENUM_POSITION_TYPE _type = NULL; + +// +MqlTick xSampleEATick; +XSCTrade *xSampleEATrader; + +// +// Event Handlers ... +// +// Initialization ... +int OnInit() +{ + // + if (xSampleEASymbol == NULL || StringLen(xSampleEASymbol) <= 0) + { + xSampleEASymbol = _Symbol; + } + + // + if (xSampleEAPeriod == NULL) + { + xSampleEAPeriod = _Period; + } + + // + // Validate Inputs ... + if (!XSampleEAValidateInputs()) + { + return INIT_PARAMETERS_INCORRECT; + } + + // + logTag = ShortName; + drawPrefix = ShortName; + + // + // Initialize XTrader ... + xSampleEATrader = new XSCTrade( + xSampleEASlippage, + xSampleEAMagicNumber); + + // + // Init Succeed ... + return INIT_SUCCEEDED; +} + +// +// DeInitialization ... +void OnDeinit(const int reason) +{ + // + // REASON_PROGRAM 0 The EA has stopped working calling the ExpertRemove() function + // REASON_REMOVE 1 Program removed from a chart + // REASON_RECOMPILE 2 Program recompiled + // REASON_CHARTCHANGE 3 A symbol or a chart period is changed + // REASON_CHARTCLOSE 4 Chart closed + // REASON_PARAMETERS 5 Inputs changed by a user + // REASON_ACCOUNT 6 Another account has been activated or reconnection to the trade server has occurred due to changes in the account settings + // REASON_TEMPLATE 7 Another chart template applied + // REASON_INITFAILED 8 The OnInit() handler returned a non-zero value + // REASON_CLOSE 9 Terminal closed + + // + // De Initialize XSampleEA Providers ... + delete xSampleEATrader; +} + +// +// On Tick Handler ... +void OnTick() +{ + // + if (!IsNewCandle( + xSampleEASymbol, + xSampleEAPeriod)) + { + return; + } + + // + // Reading Tick ... + if (!SymbolInfoTick(xSampleEASymbol, xSampleEATick)) + { + return; + } + + // + // Counting Currently Open Positions ... + buyCount = xSampleEATrader.CountPositions(xSampleEASymbol, POSITION_TYPE_BUY); + sellCount = xSampleEATrader.CountPositions(xSampleEASymbol, POSITION_TYPE_SELL); + + // + if (buyCount < maxBuys) + { + // + // Check For Buy Signals ... + } + + // + if (sellCount < maxSells) + { + // + // Check for Sell Signals ... + } +} + +// +// Custom Functions ... + +// +// Validate Variables nd Inputs ... +bool XSampleEAValidateInputs() +{ + // + bool result = false; + + // + result = + // + xSampleEASlippage > 0 && + xSampleEAMagicNumber > 0 + // + ; + + // + return result; +} diff --git a/MQLTestWorkspace/BKPS/14030222/Documents/JsModules/x-color.tools.js b/MQLTestWorkspace/BKPS/14030222/Documents/JsModules/x-color.tools.js new file mode 100644 index 0000000..c3ac5f9 --- /dev/null +++ b/MQLTestWorkspace/BKPS/14030222/Documents/JsModules/x-color.tools.js @@ -0,0 +1,506 @@ +/** + * XColor Tools Module ... + * a module for handle colorify text contents in node js ... + * + * Maintainer + * + * Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) + */ + +// +//#region Module Imports ... +const XValueTools = require("./x-value.tools"); +//#endregion + +// +//#region Constants ... +/** + * these are available style which can applied to an string ... + */ +const AVAILABLE_STYLES = { + // + Bold: "\x1b[1m", + Dim: "\x1b[2m", + Underlined: "\x1b[4m", + Blink: "\x1b[5m", + ReverseFandB: "\x1b[7m", + Hidden: "\x1b[8m", + // + // Commonly used for reset all Styles ... + Reset: "\x1b[0m" +}; + +/** + * these are available foreground colors which can applied to an string ... + */ +const AVAILABLE_FOREGROUND_COLORS = { + Default: "\x1b[39m", + Black: "\x1b[30m", + Red: "\x1b[31m", + Green: "\x1b[32m", + Yellow: "\x1b[33m", + Blue: "\x1b[34m", + Magenta: "\x1b[35m", + Cyan: "\x1b[36m", + LightGray: "\x1b[37m", + DarkGray: "\x1b[90m", + LightRed: "\x1b[91m", + LightGreen: "\x1b[92m", + LightYellow: "\x1b[93m", + LightBlue: "\x1b[94m", + LightMagenta: "\x1b[95m", + LightCyan: "\x1b[96m", + White: "\x1b[97m", +}; + +/** + * these are available background colors which can applied to an string ... + */ +const AVAILABLE_BACKGROUND_COLORS = { + Default: "\x1b[49m", + Black: "\x1b[40m", + Red: "\x1b[41m", + Green: "\x1b[42m", + Yellow: "\x1b[43m", + Blue: "\x1b[44m", + Magenta: "\x1b[45m", + Cyan: "\x1b[46m", + LightGray: "\x1b[47m", + DarkGray: "\x1b[100m", + LightRed: "\x1b[101m", + LightGreen: "\x1b[102m", + LightYellow: "\x1b[103m", + LightBlue: "\x1b[104m", + LightMagenta: "\x1b[105m", + LightCyan: "\x1b[106m", + White: "\x1b[107m", +}; + +/** + * these are available style names, which exports from module and + * users can use them ... + */ +const STYLE_NAMES = { + Bold: "Bold", + Dim: "Dim", + Underlined: "Underlined", + Blink: "Blink", + ReverseFandB: "ReverseFandB", + Hidden: "Hidden", + Reset: "Reset", +}; + +/** + * these are available color names, which exports from module and + * users can use them ... + */ +const COLOR_NAMES = { + Default: "Default", + Black: "Black", + Red: "Red", + Green: "Green", + Yellow: "Yellow", + Blue: "Blue", + Magenta: "Magenta", + Cyan: "Cyan", + LightGray: "LightGray", + DarkGray: "DarkGray", + LightRed: "LightRed", + LightGreen: "LightGreen", + LightYellow: "LightYellow", + LightBlue: "LightBlue", + LightMagenta: "LightMagenta", + LightCyan: "LightCyan", + White: "White", +}; +//#endregion + +// +//#region Actions ... +/** + * apply specified style and color on a content ... + * + * @param {string} content specified content for styling ... + * @param {string} color specific color name for using to styling ... + * @param {string} style soecufic style name to use ... + * @param {boolean} toForeground apply specified color as foreground ... + * @param {boolean} toBackground apply specified color as background ... + * @returns {string} styled content ... + */ +function apply( + content, + color, + style, + toForeground = true, + toBackground = false +) { + // + let result = content; + + // + // Validate Arg ... + if (!XValueTools.isValidArg(content)) { + return result; + } + + // + // Detect and Validate Style and Apply it ... + let eStyle = AVAILABLE_STYLES[style]; + if (XValueTools.isValidArg(eStyle)) { + result = `${eStyle}${result}${AVAILABLE_STYLES.Reset}`; + } + + // + // Detect and Validate Foreground Color and Apply it ... + let eFColor = AVAILABLE_FOREGROUND_COLORS[color]; + if ( + !!toForeground + && XValueTools.isValidArg(eFColor) + ) { + result = `${eFColor}${result}${AVAILABLE_STYLES.Reset}`; + } + + // + // Detect and Validate Background Color and Apply it ... + let eBColor = AVAILABLE_BACKGROUND_COLORS[color]; + if ( + !!toBackground + && XValueTools.isValidArg(eBColor) + ) { + result = `${eBColor}${result}${AVAILABLE_STYLES.Reset}`; + } + +} + +/** + * apply specific style on a content ... + * + * @param {string} content specific content which going to styled ... + * @param {string} style a member of STYLE_NAMES which specified that which style going to applied to content ... + * @returns {string} styled content ... + */ +function applyStyle(content, style) { + // + // Validate Arg ... + if (!XValueTools.isValidArg(content)) { + return content; + } + + // + let eStyle = AVAILABLE_STYLES[style]; + if (eStyle === undefined) { + return content; + } + + // + return `${eStyle}${content}${AVAILABLE_STYLES.Reset}`; +} + +/** + * apply specific foreground color on a content ... + * + * @param {string} content specific content which going to colorified ... + * @param {string} color a member of COLOR_NAMES which specified that which color going to applied to content ... + * @returns {string} colorified content ... + */ +function applyForegroundColor(content, color) { + // + // Validate Arg ... + if (!XValueTools.isValidArg(content)) { + return content; + } + + // + let eColor = AVAILABLE_FOREGROUND_COLORS[color]; + if (eColor === undefined) { + return content; + } + + // + return `${eColor}${content}${AVAILABLE_STYLES.Reset}`; +} + +/** + * apply specific background color on a content ... + * + * @param {string} content specific content which going to colorified ... + * @param {string} color a member of COLOR_NAMES which specified that which color going to applied to content ... + * @returns {string} colorified content ... + */ +function applyBackgroundColor(content, color) { + // + // Validate Arg ... + if (!XValueTools.isValidArg(content)) { + return content; + } + + // + let eColor = AVAILABLE_BACKGROUND_COLORS[color]; + if (eColor === undefined) { + return content; + } + + // + return `${eColor}${content}${AVAILABLE_STYLES.Reset}`; +} + +/** + * generate style and color applier expression ... + * + * @param {string} color specific color name for using to styling ... + * @param {string} style soecufic style name to use ... + * @param {boolean} reset close applier string by reset styles ... + * @param {boolean} toForeground apply specified color as foreground ... + * @param {boolean} toBackground apply specified color as background ... + * @returns {string} style and color applier string ... + */ +function getApplier( + style = "", + color = "", + reset = false, + toForeground = true, + toBackground = false +) { + // + let result = ""; + + // + // Detect and Validate Style and Apply it ... + let eStyle = AVAILABLE_STYLES[style]; + if (XValueTools.isValidArg(eStyle)) { + result = `${eStyle}`; + } + + // + // Detect and Validate Foreground Color and Apply it ... + let eFColor = AVAILABLE_FOREGROUND_COLORS[color]; + if ( + !!toForeground + && XValueTools.isValidArg(eFColor) + ) { + result = `${eFColor}`; + } + + // + // Detect and Validate Background Color and Apply it ... + let eBColor = AVAILABLE_BACKGROUND_COLORS[color]; + if ( + !!toBackground + && XValueTools.isValidArg(eBColor) + ) { + result = `${eBColor}`; + } + + // + if ( + !!reset && + result.length > 0 + ) { + result = `${result}${AVAILABLE_STYLES.Reset}`; + } + + // + return result; +} + +/** + * generate style applier expression ... + * + * @param {string} style soecufic style name to use ... + * @param {boolean} reset close applier string by reset styles ... + * @returns {string} style applier string ... + */ +function getStyleApplier( + style = "", + reset = false +) { + // + let result = ""; + + // + // Detect and Validate Style and Apply it ... + let eStyle = AVAILABLE_STYLES[style]; + if (XValueTools.isValidArg(eStyle)) { + result = `${eStyle}`; + } + + // + if ( + !!reset && + result.length > 0 + ) { + result = `${result}${AVAILABLE_STYLES.Reset}`; + } + + // + return result; +} + +/** + * generate color applier expression ... + * + * @param {string} color specific color name for using to styling ... + * @param {boolean} reset close applier string by reset styles ... + * @param {boolean} toForeground apply specified color as foreground ... + * @param {boolean} toBackground apply specified color as background ... + * @returns {string} color applier string ... + */ +function getColorApplier( + color = "", + reset = false, + toForeground = true, + toBackground = false +) { + // + let result = ""; + + // + // Detect and Validate Foreground Color and Apply it ... + let eFColor = AVAILABLE_FOREGROUND_COLORS[color]; + if ( + !!toForeground + && XValueTools.isValidArg(eFColor) + ) { + result = `${eFColor}`; + } + + // + // Detect and Validate Background Color and Apply it ... + let eBColor = AVAILABLE_BACKGROUND_COLORS[color]; + if ( + !!toBackground + && XValueTools.isValidArg(eBColor) + ) { + result = `${eBColor}`; + } + + // + if ( + !!reset && + result.length > 0 + ) { + result = `${result}${AVAILABLE_STYLES.Reset}`; + } + + // + return result; +} + +/** + * colorified specific content ... + * + * @param {string} content specified content for styling ... + * @param {string} color specific color name for using to styling ... + * @param {boolean} toForeground apply specified color as foreground ... + * @param {boolean} toBackground apply specified color as background ... + * @returns {string} + */ +function colorifyContent( + content = "", + color = "", + toForeground = true, + toBackground = false +) { + // + let result = content; + + // + if (!XValueTools.isValidArg(content)) { + return result; + } + + // + // Finde Colors ... + + // + // Detect and Validate Foreground Color and Apply it ... + let eFColor = AVAILABLE_FOREGROUND_COLORS[color]; + if ( + !!toForeground + && XValueTools.isValidArg(eFColor) + ) { + result = `${eFColor}${result}`; + } + + // + // Detect and Validate Background Color and Apply it ... + let eBColor = AVAILABLE_BACKGROUND_COLORS[color]; + if ( + !!toBackground + && XValueTools.isValidArg(eBColor) + ) { + result = `${eBColor}${result}`; + } + + // + if ( + result.length > 0 + && ( + XValueTools.isValidArg(eFColor) || + XValueTools.isValidArg(eBColor) + ) + ) { + result = `${result}${AVAILABLE_STYLES.Reset}`; + } + + // + return result; +} + +/** + * apply style on specific content ... + * + * @param {string} content specified content for styling ... + * @param {string} style soecufic style name to use ... + * @returns {string} + */ +function stylifiyContent( + content = "", + style = "", +) { + // + let result = content; + + // + if (!XValueTools.isValidArg(content)) { + return result; + } + + // + // Detect and Validate Style and Apply it ... + let eStyle = AVAILABLE_STYLES[style]; + if (XValueTools.isValidArg(eStyle)) { + result = `${eStyle}${result}`; + } + + // + if ( + result.length > 0 + && XValueTools.isValidArg(eStyle) + ) { + result = `${result}${AVAILABLE_STYLES.Reset}`; + } + + // + return result; +} +//#endregion + +// +//#region Module Exports ... +module.exports = { + // + STYLE_NAMES, + COLOR_NAMES, + // + apply, + applyStyle, + getApplier, + getColorApplier, + getStyleApplier, + colorifyContent, + stylifiyContent, + applyForegroundColor, + applyBackgroundColor, +} +//#endregion \ No newline at end of file diff --git a/MQLTestWorkspace/BKPS/14030222/Documents/JsModules/x-file.tools.js b/MQLTestWorkspace/BKPS/14030222/Documents/JsModules/x-file.tools.js new file mode 100644 index 0000000..a1642a4 --- /dev/null +++ b/MQLTestWorkspace/BKPS/14030222/Documents/JsModules/x-file.tools.js @@ -0,0 +1,830 @@ +/** + * XFile Tools Module ... + * a module for handle all file/folder manipulating task in node js ... + * + * Maintainer + * + * Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) + */ + +// +//#region Module Imports ... +const fs = require('fs'); +const os = require('os'); +const Path = require('path'); +const http = require('http'); +const https = require('https'); +const XValueTools = require('./x-value.tools'); +//#endregion + +// +//#region Constants ... +/** + * current os path separators ... + */ +const PathSeparator = Path.sep; + +/** + * current directory ... + */ +const CurrentDir = __dirname; +//#endregion + +// +//#region Actions ... +// +//#region Global ... +/** + * retrieve a path status ... + * + * @param {string} path a path value to check ... + * @returns an stat object ... + */ +function getStatus(path = '') { + // + if (!XValueTools.isValidArg(path)) { + return undefined; + } + + // + return fs.statSync(path); +} + +/** + * retrieve user's Home path ... + * + * @returns {string} a path ... + */ +function getHomePath() { + return os.homedir(); +} +//#endregion + +// +//#region Path ... +/** + * retrieve the base name of specific address path ... + * + * @param {string} path address of file or folder ... + * @returns string ... + */ +function basename(path = '') { + // + if (!XValueTools.isValidArg(path)) { + return ''; + } + + // + const result = Path.basename(path); + return result; +} + +/** + * join several path segments together ... + * + * @param {...string} path path params ... + * @returns a joined paths ... + */ +function joinPath(...path) { + return Path.join(...path); +} + +/** + * resolve a relative path to absolute ... + * + * @param {string[]} path a path value to check ... + * @returns {string} + */ +function resolvePath(...path) { + return Path.resolve(...path); +} +//#endregion + +// +//#region File ... +/** + * determines a path destination is a file or not ... + * + * @param {string} path a path value to check ... + * @returns a boolean value ... + */ +function isFileExists(path = '') { + // + if (!XValueTools.isValidArg(path)) { + return false; + } + + // + try { + const stat = getStatus(path); + if (!stat) { + return false; + } + + // + return stat.isFile(); + } catch { + return false; + } +} + +/** + * remove a file ... + * + * @param {string} path a file path ... + * @returns {Promise} action done or not ... + */ +function removeFile(path = '') { + return new Promise((resolve) => { + // + if (!isFileExists(path)) { + resolve(false); + } + + // + fs.unlink(path, (err) => { + // + if (err) { + resolve(false); + return; + } + + // + resolve(true); + }); + }); +} + +/** + * copy a file to destination path ... + * + * @param {string} source source file path ... + * @param {string} dest dest folder path ... + * @returns {Promise} action done or not ... + */ +function copyFile( + source = '', + dest = '' +) { + return new Promise((resolve) => { + // + if ( + !isFileExists(source) || + !isDirectoryExists(dest) + ) { + resolve(false); + return; + } + + // + const destFilePath = Path.join(dest, Path.basename(source)); + fs.copyFile(source, destFilePath, (err) => { + // + if (err) { + resolve(false); + return; + } + + // + resolve(true); + }); + }); +} + +/** + * reading specified file content ... + * + * @param {string} path a file path ... + * @returns {Promise} file content ... + */ +function readFile(path = '') { + return new Promise((resolve) => { + // + if (!isFileExists(path)) { + resolve(''); + return; + } + + // + fs.readFile(path, 'utf8', (err, content) => { + // + if (err) { + resolve(undefined); + return; + } + + // + resolve(content); + }); + }); +} + +/** + * write content to a file ... + * + * @param {string} path a file path ... + * @param {string} content the content which going to write to the file ... + * @param {bool} overwrite determines file overwrite if exists ... + * @returns {Promise} action done or not ... + */ +function writeFile( + path = '', + content = '', + overwrite = true +) { + return new Promise((resolve) => { + // + if (isFileExists(path) && !overwrite) { + // + resolve(false); + return; + } + + // + // Normalize Content ... + content = XValueTools.isValidArg(content) ? + content : + ''; + + // + fs.writeFile(path, content, (err) => { + // + if (err) { + // + resolve(false); + return; + } + + // + resolve(true); + }); + }); +} + +/** + * create a file ... + * + * @param {string} path file path ... + * @param {string} fileName file name ... + * @returns {Promise} action done or not ... + */ +function createFile( + path = '', + fileName = '' +) { + return new Promise((resolve) => { + // + const filePath = Path.join(path, fileName); + if ( + isFileExists(filePath) || + !XValueTools.isValidArg(path) || + !XValueTools.isValidArg(fileName) + ) { + // + resolve(false); + return; + } + + // + fs.writeFile(filePath, '', (err) => { + // + if (err) { + // + resolve(false); + return; + } + + // + resolve(true); + }); + }); +} + +/** + * remove a file name extension ... + * + * @param {string} name + * @returns {string} name without extension ... + */ +function removeFileExtension(name = '') { + return name.substring(0, name.lastIndexOf('.')) || name; +} + +/** + * retrieve a file extension ... + * + * @param {string} path a path which locate a file ... + * @returns {string} + */ +function getFileExtension(path = '') { + // + let result = ""; + + // + // Validate Arg ... + if ( + !XValueTools.isValidArg(path) + || !isFileExists(path) + ) { + return result; + } + + // + // Retrieve just file name ... + const fileName = basename(path); + result = fileName.replace( + removeFileExtension(fileName), + "" + ); + + // + return result; +} + +/** + * retrieve all files list recursively from specific path ... + * + * @param {string} path a source folder path ... + * @param {string[]} extensions which file extensions need to be listed, live empty for all files ... + * @returns {Promise} + */ +async function getRecursiveFilesList( + path = "", + extensions = [] +) { + // + let result = []; + + // + // Validate Args ... + if ( + !XValueTools.isValidArg(path) + || !isDirectoryExists(path) + ) { + return result; + } + + // + const contents = await getDirectoryContents(path); + for(const item of contents) { + // + const itemPath = joinPath( + path, + item + ); + + // + const isItemFile = isFileExists(itemPath); + if (isItemFile) { + // + const itemFileExtension = getFileExtension(itemPath); + const isFileInSupportedExtensions = + extensions === undefined || extensions.length === 0 + ? true + : extensions.includes(itemFileExtension) + ; + if (isFileInSupportedExtensions) { + result.push(itemPath); + } + } else if (isDirectoryExists(itemPath)) { + // + const itemPathFiles = await getRecursiveFilesList(itemPath, extensions); + result.push(...itemPathFiles); + } + } + + // + return result; +} +//#endregion + +// +//#region Directory ... +/** + * create a directory ... + * + * @param {string} path destination path including dir name ... + * @param {boolean} recursive create directories recursively ... + * @returns action done or not ... + */ +function createDirectory( + path = '', + recursive = true +) { + // + let result = false; + + // + if ( + isDirectoryExists(path) || + !XValueTools.isValidArg(path) + ) { + return false; + } + + // + try { + // + fs.mkdirSync(path, { recursive: recursive }); + result = true; + return result; + } catch { + return false; + } +} + +/** + * remove a directory ... + * + * @param {string} path destination path including dir name ... + * @param {boolean} recursive removes directories recursively ... + * @returns {Promise} action done or not ... + */ +function removeDirectory( + path = '', + recursive = false +) { + return new Promise((resolve) => { + // + if (!isDirectoryExists(path)) { + resolve(false); + return; + } + + // + fs.rm(path, { + recursive + }, (err) => { + // + if (err) { + resolve(false); + return; + } + + // + resolve(true); + }); + }); +} + +/** + * determines a path destination is a directory or not ... + * + * @param {string} path a folder path ... + * @returns represent destnation path is Directory or not ... + */ +function isDirectoryExists(path = '') { + // + if (!XValueTools.isValidArg(path)) { + return false; + } + + // + try { + // + const isExists = fs.existsSync(path); + if (!isExists) { + return false; + } + + // + const stat = getStatus(path); + if (!stat) { + return false; + } + + // + const result = stat.isDirectory(); + return result; + } catch { + return false; + } +} + +/** + * retrieve a directory content ... + * + * @param {string} path a folder path ... + * @returns {Promise} a collection of folder files ... + */ +function getDirectoryContents(path = '') { + return new Promise((resolve) => { + // + if (!isDirectoryExists(path)) { + resolve([]); + return; + } + + // + fs.readdir(path, (err, content) => { + // + if (err) { + resolve([]); + return; + } + + // + resolve(content); + }); + }); +} + +/** + * retrieve a directory files ... + * + * @param {string} path a folder path ... + * @returns {Promise} a collection of folder files ... + */ +function getDirectoryFiles( + path = '', + containsHiddenFiles = false +) { + return new Promise((resolve) => { + // + if (!isDirectoryExists(path)) { + resolve([]); + return; + } + + // + fs.readdir(path, (err, content) => { + // + if (err) { + resolve([]); + return; + } + + // + if (!containsHiddenFiles) { + content = content.filter(c => !c.startsWith('.')); + } + + // + const result = []; + content + .forEach(c => { + // + const cPath = Path.join(path, c); + if (isFileExists(cPath)) { + result.push(c); + } + }); + + // + resolve(result); + }); + }); +} + +/** + * retrieve a directory folders ... + * + * @param {string} path a folder path ... + * @returns {Promise} a collection of folder names ... + */ +function getDirectoryFolders(path = '') { + return new Promise((resolve) => { + // + if (!isDirectoryExists(path)) { + resolve([]); + return; + } + + // + fs.readdir(path, (err, content) => { + // + if (err) { + resolve([]); + return; + } + + // + const result = []; + content.forEach(c => { + // + const cPath = Path.join(path, c); + if (isDirectoryExists(cPath)) { + result.push(c); + } + }); + + // + resolve(result); + }); + }); +} + +/** + * copy a folder with all of it's content to dest ... + * + * @param {string} source source folder path ... + * @param {string} dest dest folder path ... + * @returns {Promise} action done or not ... + */ +async function copyFolder( + source = '', + dest = '' +) { + // + if ( + !isDirectoryExists(source) || + !XValueTools.isValidArg(dest) || + !XValueTools.isValidArg(source) + ) { + return false; + } + + // + const folderName = Path.basename(source); + const destPath = Path.join(dest, folderName); + + // + // Create Dest Path folder if not exists ... + if (!isDirectoryExists(destPath)) { + // + let result = createDirectory(destPath, true); + if (!result) { + return false; + } + } + + // + // Files ... + const files = await getDirectoryFiles(source); + if (files && files.constructor === Array && files.length > 0) { + // + const filesPromises = files.map(file => copyFile(Path.join(source, file), destPath)); + const filesResult = (await Promise.all(filesPromises)).every(r => !!r); + if (!filesResult) { + return false; + } + } + + // + // Folders ... + const folders = await getDirectoryFolders(source); + if (folders && folders.constructor === Array && folders.length > 0) { + // + const folderPromises = folders.map(folder => copyFolder(Path.join(source, folder), destPath)); + const filesResult = (await Promise.all(folderPromises)).every(r => !!r); + if (!filesResult) { + return false; + } + } + + // + return true; +} +//#endregion + +// +//#region Downloader ... +/** + * download a file from specific url and store it ... + * + * @param {string} filepath the file name and path which required to put download file on it ... + * @param {string} url the web url for downloading ... + */ +function download(filepath, url) { + // + // Validate Args ... + if ( + !XValueTools.isValidArg(url) + || !XValueTools.isValidURL(url) + || !XValueTools.isValidArg(filepath) + ) { + return; + } + + // + var file = fs.createWriteStream(filepath); + + // + if (url.startsWith('https:')) { + https.get(url, function (response) { + response.pipe(file); + }); + } else if (url.startsWith('http:')) { + http.get(url, function (response) { + response.pipe(file); + }); + } +} +//#endregion + +// +//#region JSON ... +/** + * read and parse a JSON content from a file ... + * + * @param {string} path source file path ... + * @returns {any} + */ +function readJSON(path = "") { + // + // Validate Args ... + if (!isFileExists(path)) { + return undefined; + } + + // + let result = undefined; + try { + result = require(path); + } catch { + result = undefined; + } + + // + return result; +} + +/** + * write a JSON Object content into a file ... + * + * @param {string} path dest file path ... + * @param {any} content an object which required to write to file ... + * @returns {Promise} + */ +async function writeJSON( + path = "", + content = undefined +) { + // + let result = false; + + // + // Validate Args ... + if (!XValueTools.isValidArg(path)) { + return result; + } + + // + // Normallize Content ... + if (content === undefined) { + content = {}; + } + + // + const contentString = XValueTools.beautifyJSON(content); + + // + result = await writeFile( + path, + contentString, + true + ); + + // + return result; +} +//#endregion +//#endregion + +// +//#region Module Exports ... +module.exports = { + // + CurrentDir, + PathSeparator, + + // + getStatus, + getHomePath, + + // + basename, + joinPath, + resolvePath, + + // + download, + + // + readJSON, + writeJSON, + + // + copyFile, + readFile, + writeFile, + createFile, + removeFile, + isFileExists, + getFileExtension, + removeFileExtension, + getRecursiveFilesList, + + // + copyFolder, + createDirectory, + removeDirectory, + createDirectory, + removeDirectory, + isDirectoryExists, + isDirectoryExists, + getDirectoryFiles, + getDirectoryFolders, + getDirectoryContents, +} +//#endregion \ No newline at end of file diff --git a/MQLTestWorkspace/BKPS/14030222/Documents/JsModules/x-shell.tools.js b/MQLTestWorkspace/BKPS/14030222/Documents/JsModules/x-shell.tools.js new file mode 100644 index 0000000..0ee13de --- /dev/null +++ b/MQLTestWorkspace/BKPS/14030222/Documents/JsModules/x-shell.tools.js @@ -0,0 +1,219 @@ +/** + * XShell Tools Module ... + * a module for handling shell actions and retrieve OS Info in node js ... + * + * Maintainer + * + * Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) + */ + +// +//#region Imports ... +const os = require('os'); +const process = require('process'); +const { exec } = require("child_process"); +const XFileTools = require('./x-file.tools'); +//#endregion + +// +//#region Constants ... +// +const OS = { + Aix: 'aix', + Darwin: 'darwin', + FreeBSD: 'freebsd', + Linux: 'linux', + OpenBSD: 'openbsd', + SnOS: 'sunos', + Windows: 'win32' +}; + +// +const isWindows = process.platform === OS.Windows; +//#endregion + +// +//#region Actions ... +// +//#region Pure shell commands ... +/** + * execute a command using NodeJS on shell ... + * + * @param {string} cmd command to execute ... + * @param {string} cwd working directory ... + * + * @returns Promise instance ... + */ +function execute(cmd, cwd) { + return new Promise((resolve, reject) => { + // + if (!cmd || cmd.toString().length === 0 || (cwd && !XFileTools.isDirectoryExists(cwd))) { + reject('invalid args ...'); + return; + } + + // + exec(cmd, { cwd }, (err, result, stdError) => { + // + if (err) { + reject(err); + return; + } + + // + if (stdError) { + // + // reject(stdError); + // return; + } + + // + resolve(result); + }); + }); +}; + +/** + * determines a command exists on host or not ... + * + * @param {string} name specific command name ... + * + * @returns boolean Promise ... + */ +function checkCommandExists(name) { + return new Promise(resolve => { + // + if (!name) { + resolve(false); + return; + } + + // + const cmd = isWindows ? `${name} >nul 2>&1` : `type ${name} >/dev/null 2>&1`; + execute(cmd).then(result => { + resolve(true); + }) + .catch(err => { + resolve(false); + }); + }); +} +//#endregion + +// +//#region required commands state ... +/** + * check al required commands exists or not ... + * + * @returns + */ +async function isRequiredCommandsExists() { + // + let result = false; + + // + // const isTarExists = await isTarCommandExists(); + // const isCatExists = await isCatCommandExists(); + // const isGrepExists = await isGrepCommandExists(); + // const isSedExists = await isSedCommandExists(); + const isNpmExists = await isNpmCommandExists(); + const isNgExists = await isNgCommandExists(); + const isIonicExists = await isIonicCommandExists(); + const isCordovaExists = await isCordovaCommandExists(); + + // + result = isNpmExists + && isNgExists + && isIonicExists + && isCordovaExists + ; + + // + return result; +} + +/** + * retrieve required commands state object ... + * + * @returns + */ +async function getRequiredCommandsStates() { + // + const result = {}; + + // + // const isTarExists = await isTarCommandExists(); + // const isCatExists = await isCatCommandExists(); + // const isGrepExists = await isGrepCommandExists(); + // const isSedExists = await isSedCommandExists(); + const isNpmExists = await isNpmCommandExists(); + const isNgExists = await isNgCommandExists(); + const isIonicExists = await isIonicCommandExists(); + const isCordovaExists = await isCordovaCommandExists(); + + // + result['npm'] = isNpmExists; + result['ng'] = isNgExists; + result['ionic'] = isIonicExists; + result['cordova'] = isCordovaExists; + + // + return result; +} +//#endregion + +// +//#region Commonly used Command Checkers ... +/** + * determines npm command exists or not ... + * + * @returns + */ +function isNpmCommandExists() { + return checkCommandExists('npm'); +} + +/** + * determines ng command exists or not ... + * + * @returns + */ +function isNgCommandExists() { + return checkCommandExists('ng'); +} + +/** + * determines ionic command exists or not ... + * + * @returns + */ +function isIonicCommandExists() { + return checkCommandExists('ionic'); +} + +/** + * determines cordova command exists or not ... + * + * @returns + */ +function isCordovaCommandExists() { + return checkCommandExists('cordova'); +} +//#endregion +//#endregion + +// +//#region Module Exports ... +module.exports = { + // + execute, + checkCommandExists, + isRequiredCommandsExists, + getRequiredCommandsStates, + + // + isNgCommandExists, + isIonicCommandExists, + isCordovaCommandExists, +} +//#endregion \ No newline at end of file diff --git a/MQLTestWorkspace/BKPS/14030222/Documents/JsModules/x-type-detector.tools.js b/MQLTestWorkspace/BKPS/14030222/Documents/JsModules/x-type-detector.tools.js new file mode 100644 index 0000000..86ed3d8 --- /dev/null +++ b/MQLTestWorkspace/BKPS/14030222/Documents/JsModules/x-type-detector.tools.js @@ -0,0 +1,268 @@ +/** + * DataType Tools Module ... + * a module for manipulate and detect supported data types in node js ... + * + * Maintainer + * + * Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) + */ + +// +//#region Constants ... +/** + * all supported data types ... + */ +const DataTypes = { + Null: 'null', + Date: 'date', + Array: 'array', + Object: 'object', + String: 'string', + Number: 'number', + Unknown: 'unknown', + Boolean: 'boolean', + Function: 'function', + Undefined: 'undefined', +}; +//#endregion + +// +//#region Actions ... +/** + * detect type of a content ... + * + * @param {any} value the content which going to check ... + * @returns + */ +function getType(value) { + // + const type = typeof value; + + // + let result = DataTypes.Unknown; + let dateIdentifier = '[object Date]'; + let constructor = value && value.constructor ? + value.constructor.toString() : + ''; + + // + switch (type) { + // + case 'undefined': + result = DataTypes.Undefined; + break; + + // + case 'boolean': + result = DataTypes.Boolean; + break; + + // + case 'string': + result = DataTypes.String; + break; + + // + case 'number': + result = DataTypes.Number; + break; + + // + case 'function': + result = DataTypes.Function; + break; + + // + case 'object': + // + // Null ... + if (value === null) { + result = DataTypes.Null; + } else + // + // Array ... + if (Array.isArray(value)) { + result = DataTypes.Array; + } else + // + // Data ... + if ( + value instanceof Date || + isFunction(value.getMonth) || + constructor.includes(dateIdentifier) || + Object.prototype.toString.call(value) === dateIdentifier + ) { + result = DataTypes.Date; + } else + // + // Object ... + { + result = DataTypes.Object; + } + break; + + // + default: + result = DataTypes.Unknown; + break; + } + + // + return result; +} + +/** + * retrieve an object constructor ... + * + * @param {any} value the content which going to check ... + * @returns + */ +function getConstructor(value) { + // + const result = value && value.constructor ? + value.constructor.toString() : + ''; + + // + return result; +} + +/** + * retrieve an object prototype ... + * + * @param {any} value the content which going to check ... + * @returns + */ +function getPrototype(value) { + // + const result = value ? + Object.prototype.toString.call(value) : + ''; + + // + return result; +} + +/** + * check an object is null or not ... + * + * @param {any} value the content which going to check ... + * @returns + */ +function isNull(value) { + return getType(value) === DataTypes.Null; +} + +/** + * check an object is undefined or not ... + * + * @param {any} value the content which going to check ... + * @returns + */ +function isUndefined(value) { + return getType(value) === DataTypes.Undefined; +} + +/** + * check an object is null or undefined or not ... + * + * @param {any} value the content which going to check ... + * @returns + */ +function isNullOrUndefined(value) { + return isNull(value) || isUndefined(value); +} + +/** + * check an object is a date or not ... + * + * @param {any} value the content which going to check ... + * @returns + */ +function isDate(value) { + return getType(value) === DataTypes.Date; +} + +/** + * check an object is number or not ... + * + * @param {any} value the content which going to check ... + * @returns + */ +function isNumber(value) { + return getType(value) === DataTypes.Number; +} + +/** + * check an object is string or not ... + * + * @param {any} value the content which going to check ... + * @returns + */ +function isString(value) { + return getType(value) === DataTypes.String; +} + +/** + * check an object is boolean or not ... + * + * @param {any} value the content which going to check ... + * @returns + */ +function isBoolean(value) { + return getType(value) === DataTypes.Boolean; +} + +/** + * check an object is an Array or not ... + * + * @param {any} value the content which going to check ... + * @returns + */ +function isArray(value) { + return getType(value) === DataTypes.Array; +} + +/** + * check an object is and Object or not ... + * + * @param {any} value the content which going to check ... + * @returns + */ +function isObject(value) { + return getType(value) === DataTypes.Object; +} + +/** + * check an object is a Function or not ... + * + * @param {any} value the content which going to check ... + * @returns + */ +function isFunction(value) { + return getType(value) === DataTypes.Function; +} +//#endregion + +// +//#region Module Exports ... +module.exports = { + // + DataTypes, + + // + getType, + getConstructor, + getPrototype, + isNull, + isUndefined, + isNullOrUndefined, + isDate, + isNumber, + isString, + isBoolean, + isArray, + isObject, + isFunction, +} +//#endregion \ No newline at end of file diff --git a/MQLTestWorkspace/BKPS/14030222/Documents/JsModules/x-value.tools.js b/MQLTestWorkspace/BKPS/14030222/Documents/JsModules/x-value.tools.js new file mode 100644 index 0000000..81cfcc4 --- /dev/null +++ b/MQLTestWorkspace/BKPS/14030222/Documents/JsModules/x-value.tools.js @@ -0,0 +1,1528 @@ +/** + * Value Tools Module ... + * a module for Validate args and values ... + * + * Maintainer + * + * Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) + */ + +// +//#region Imports ... +const XTypeTools = require('./x-type-detector.tools'); +//#endregion + +// +//#region Actions ... +/** +* validate a value as an argument ... +* +* @param {string} value the value which going to validate ... +* @returns +*/ +function isValidArg(value) { + // + let result = false; + + // + result = value && + value.length > 0; + + // + return result; +} + +/** + * validate a collection of valuea as an arguments ... + * + * @param {string|string[]} values the value collection which going to checked ... + * @returns + */ +function isValidArgs(values) { + // + // Normalize Values ... + const normalValues = toNormalArray(values); + if (!hasChildArray(normalValues)) { + return false; + } + + // + let result = normalValues.every(nv => isValidArg(nv)); + return result; +} + +/** + * converts content to an array object ... + * + * @param {string|string[]} content the content which required to normalized ... + * @returns {string[]} array object ... + */ +function toNormalArray(content = '') { + // + // Validate Args ... + if (!isValidArg(content)) { + return []; + } + + // + const result = Array.isArray(content) ? + [...content] : + content.includes(',') && + content !== ',' ? + [...content.split(',')] : + [content]; + + // + return result; +} + +/** + * determines value is array and has atleast one child ... + * + * @param {any} value the value which going to checked ... + * @returns {boolean} result of checking ... + */ +function hasChildArray(value) { + // + let result = false; + result = value && + Array.isArray(value) && + value.length > 0; + + // + return result; +} + +/** + * check an string is ends with specified symbol ... + * + * @param {string} symbol specified search symbol ... + * @param {string} value specified search content ... + * @param {boolean} ignoreCase specified search case sensitive or not ... + * @returns + */ +function endsWidth( + symbol = '', + value = '', + ignoreCase = true +) { + // + if (!isValidArg(value)) { + return false; + } + + // + if (!isValidArg(symbol)) { + return true; + } + + // + // TODO: uncomment it if necessary ... + // symbol = symbol.trim(); + + // + let result = false; + const subtractedContent = value.substring(value.length - symbol.length); + result = !!ignoreCase ? + subtractedContent + .toLowerCase() === symbol + .toLowerCase() : + subtractedContent === symbol; + + // + return result; +} + +/** + * surround specified content by provided symbol ... + * + * @param {string} symbol surround string ... + * @param {string} content used content to surrounded by symbol ... + * @returns surrounded content ... + */ +function surroundBy( + symbol = '', + content = '' +) { + // + // Validate Args ... + if (!isValidArg(content)) { + content = ''; + } + + // + if (!isValidArg(symbol)) { + symbol = ''; + } + + // + if (isSurrounded(symbol, content)) { + return content; + } + + // + const result = `${symbol}${content}${symbol}`; + return result; +} + +/** + * convert a parsed sign to clear string ... + * + * @param {string} value a parsed content ... + * @returns clear parsed signs ... + */ +function toStringExpression(value) { + // + let result = ''; + result = value; + + // + if ( + !value || + !isValidArg(value) || + !isSurroundedString(value) + ) { + return result; + } + + // + const startSymbol = value.charAt(0); + const endSymbol = value.charAt(value.length - 1); + + // + if (startSymbol !== endSymbol) { + return result; + } + + // + if ( + startSymbol === "\"" || + startSymbol === "\'" + ) { + result = clearSurround(startSymbol, value); + } + + // + return result; +} + + + +/** + * find and cleare proposed candidates from specified content ... + * + * @param {string|string[]} candidates the proposed string(s) whic going to cleared from content ... + * @param {string} content the destination content which used to find and replace candidates on it ... + * @returns cleared content ... + */ +function clearContent( + candidates, + content +) { + // + // Validate Args ... + if ( + !candidates || + !isValidArg(content) + ) { + return ''; + } + + // + // Normalize candidates ... + const normalCandidates = toNormalArray(candidates) + .filter(c => isValidArg(c)); + if (!hasChildArray(normalCandidates)) { + return content; + } + + // + // define regexp for content ... + const regExpExpression = normalCandidates.join('|'); + const regExp = new RegExp( + regExpExpression, + 'gi' + ); + + // + let result = ''; + result = content.replace(regExp, ''); + + // + return result; +} + +/** + * clear surrounded symbol from content ... + * + * @param {string} symbol specified search symbol ... + * @param {string} content specified content to clear ... + * @returns + */ +function clearSurround( + symbol = '', + content = '' +) { + // + // Validate Args ... + if ( + !isValidArg(content) || + (isValidArg(symbol) && + symbol.length >= content.length - 1) + ) { + return ''; + } + + // + // Validate Surround ... + if (!isSurrounded(symbol, content)) { + return content; + } + + // + if (!isValidArg(symbol)) { + return content; + } + + // + let result = content.substring(symbol.length, content.length - symbol.length); + return result; +} + +/** + * clear object sign ... + * + * @param {string} content + * @returns cleared content ... + */ +function clearObjectSurround(content = '') { + // + // Validate Args ... + if ( + !isValidArg(content) || + !isSurroundedObject(content) + ) { + return content; + } + + // + const endIndex = content.length - ( + endsWidth('}', content) ? + 1 : + endsWidth('},', content) || + endsWidth('};', content) || + endsWidth('}\n', content) ? + 2 : + 0 + ); + + // + const result = content.substring(1, endIndex); + return result; +} + +/** + * clear array sign ... + * + * @param {string} content + * @returns cleared content ... + */ +function clearArraySurround(content = '') { + // + // Validate Args ... + if ( + !isValidArg(content) || + !isSurroundedArray(content) + ) { + return content; + } + + // + const endIndex = content.length - ( + endsWidth(']', content) ? + 1 : + endsWidth('],', content) || + endsWidth('];', content) || + endsWidth(']\n', content) ? + 2 : + 0 + ); + + // + const result = content.substring(1, endIndex); + return result; +} + +/** + * slice a content to individual parts ... + * + * @param {number|number[]} indexes which indexes used to slice ... + * @param {strng} content the content which going to sliced ... + * @returns sliced parts of content ... + */ +function sliceContent(indexes, content) { + // + // Validate Args ... + if ( + !isValidArg(indexes) || + !isValidArg(content) + ) { + return []; + } + + // + // Normalize indexes ... + const normalIndexes = toNormalArray(indexes) + .filter(index => index > -1 && index < content.length); + if (!hasChildArray(normalIndexes)) { + return []; + } + + // + let result = ['']; + result.pop(); + + // + let lastIndex = 0; + for (const index of normalIndexes) { + // + const part = content.substring(lastIndex, index); + if (isValidArg(part)) { + result.push(part.trim()); + } + + // + lastIndex = index + 1; + } + + // + // check remained parts ... + if (lastIndex < content.length) { + // + const part = content.substring(lastIndex); + if (isValidArg(part)) { + result.push(part.trim()); + } + } + + // + return result; +} + + + +/** + * check an string is starts and ends with specified symbol ... + * + * @param {string} symbol specified search symbol ... + * @param {string} content specified search content ... + * @param {boolean} ignoreCase specified search case sensitive or not ... + * @returns + */ +function isSurrounded( + symbol = '', + content = '', + ignoreCase = true +) { + // + // Validate Args ... + if (!isValidArg(content)) { + return false; + } + + // + if (!isValidArg(symbol)) { + return true; + } + + // + symbol = symbol.trim(); + + // + let result = false; + result = (!!ignoreCase ? + content + .toLowerCase() + .startsWith(symbol.toLowerCase()) : + content.startsWith(symbol) + ) && + endsWidth(symbol, content, ignoreCase); + + // + return result; +} + +/** + * determines a content is an string surrounded value or not ... + * + * @param {string} content a content which going to check ... + * @returns + */ +function isSurroundedString(content = '') { + // + // Validate Args ... + if (!isValidArg(content)) { + return false; + } + + // + let result = false; + result = ( + content.startsWith('\'') && + ( + endsWidth('\'', content) || + endsWidth('\',', content) || + endsWidth('\';', content) || + endsWidth('\'\n', content) + ) || + content.startsWith('\"') && + ( + endsWidth('\"', content) || + endsWidth('\",', content) || + endsWidth('\";', content) || + endsWidth('\"\n', content) + ) || + content.startsWith('`') && + ( + endsWidth('\`', content) || + endsWidth('\`,', content) || + endsWidth('\`;', content) || + endsWidth('\`\n', content) + ) + ); + return result; +} + +/** + * check a content is an array content or not ... + * + * @param {string} content + * @returns + */ +function isSurroundedArray(content = '') { + // + // Validate Args ... + if (!isValidArg(content)) { + return false; + } + + // + let result = false; + result = content.startsWith('[') && + ( + endsWidth(']', content) || + endsWidth('],', content) || + endsWidth('];', content) || + endsWidth(']\n', content) + ); + return result; +} + +/** + * check a content is an object content or not ... + * + * @param {string} content + * @returns + */ +function isSurroundedObject(content = '') { + // + // Validate Args ... + if (!isValidArg(content)) { + return false; + } + + // + let result = false; + result = content.startsWith('{') && + ( + endsWidth('}', content) || + endsWidth('},', content) || + endsWidth('};', content) || + endsWidth('}\n', content) + ); + return result; +} + +/** + * check an index model is contains inside anothers or not ... + * + * @param {{ start: number, end: number}} source the source index model to check ... + * @param {...{ start: number, end: number}} dest the collection of index models which going to check ... + * @returns + */ +function isIndexInside(source, ...dest) { + // + let result = false; + + // + // Validate Args ... + if (!source || !dest) { + return result; + } + + // + // Check idx is standard ... + if ( + !source || + !source.end || + !source.start || + source.start > source.end + ) { + return false; + } + + // + // Check types of destinations ... + for (let index of dest) { + // + // Check idx is standard ... + if ( + !index || + !index.end || + !index.start || + index.start > index.end + ) { + return false; + } + } + + // + if (dest.includes(source)) { + dest = dest.filter(d => d !== source); + } + + // + const insideContentIndex = dest.find(dIndex => { + // + const result = source.start >= dIndex.start && + source.start <= dIndex.end && + source.end >= dIndex.start && + source.end <= dIndex.end; + return result; + }); + + // + result = insideContentIndex; + return result; +} + +/** + * check a number exists in + * @param {number} idx the number which going to check ... + * @param {{ start: number, end: number}} index the index model + * @returns + */ +function isInsideIndex(idx = -1, index) { + // + let result = false; + + // + // Validate Args ... + if ( + !index || + !index.hasOwnProperty('end') || + !index.hasOwnProperty('start') + ) { + return result; + } + + // + result = idx > index.start && idx < index.end; + return result; +} + +/** + * determines an object is key/value and type ... + * + * @param {any} content the object which we are going to check ... + * @returns + */ +function isKeyValueType(content) { + // + const result = content && + content.hasOwnProperty('key') && + content.hasOwnProperty('type') && + content.hasOwnProperty('value'); + + // + return result; +} + + + +/** + * find all indexes of token(s) in content ... + * + * @param {string|string[]} tokens the tokens which require to search ... + * @param {string} content the content which using to search ... + * @returns {number[]} all occured indexes ... + */ +function findAllIndexes( + tokens, + content +) { + // + // Validate Args ... + if ( + !isValidArg(tokens) || + !isValidArg(content) + ) { + return []; + } + + // + // normalize tokens ... + const normalTokens = toNormalArray(tokens); + if (!hasChildArray(normalTokens)) { + return []; + } + + // + // Parse contents ... + let match; + const result = []; + const regExp = new RegExp( + normalTokens.join('|'), + 'g' + ); + while ((match = regExp.exec(content)) !== null) { + result.push(match.index); + } + if (!hasChildArray(result)) { + return []; + } + + // + return result; +} + +/** + * find nearest symbol in a content from specified index ... + * + * @param {string|string[]} candidates specifies which symbols to find ... + * @param {string} content te content for seasrch ... + * @param {number} startFromIndex the index of start position ... + * @returns + */ +function findNearest( + candidates, + content = '', + startFromIndex = 0 +) { + // + // Validate Args ... + if ( + !isValidArg(content) || + !isValidArg(candidates) || + !isValidArg(content.trim()) + ) { + return ''; + } + + // + // Normalize Content ... + content = content.trim(); + + // + // Normalize Starts From ... + startFromIndex = startFromIndex < 0 || startFromIndex > content.length - 1 ? 0 : startFromIndex; + + // + // Normalize Symbols ... + const normalCandidates = toNormalArray(candidates); + if (!hasChildArray(normalCandidates)) { + return ''; + } + + // + let nearestIndex = findNearestIndex( + normalCandidates, + content, + startFromIndex + ); + if (nearestIndex < 0) { + return ''; + } + + // + let result = content.substring( + nearestIndex, + nearestIndex + Math.max(...normalCandidates.map(nc => nc.length)) + ).trim(); + return result; +} + +/** + * search candidates in content and find nearest one and return it ... + * + * @param {string|string[]} candidates which candidates required to check ... + * @param {string} content the content which required to search candidates ... + * @param {number} startFromIndex the proposed index to start searching content from on ... + * @returns + */ +function findNearestIndex( + candidates = [''], + content = '', + startFromIndex = 0, + ignoreClosedItems = false +) { + // + // Validate Args ... + if ( + !isValidArg(content) || + !isValidArg(candidates) + ) { + return -1; + } + + // + // Mormalize startFromIndex value ... + startFromIndex = startFromIndex < 0 ? + 0 : + startFromIndex > content.length - 1 ? + content.length - 1 : + startFromIndex; + + // + // Normalize candidates ... + let normalCandidates = toNormalArray(candidates); + + // + if (!!ignoreClosedItems) { + normalCandidates = normalCandidates + .map(c => content.indexOf( + c, + startFromIndex + ) + ).map(c => +c) + .filter(c => +c > -1); + } else { + normalCandidates = findAllIndexesOutOfCloseds(normalCandidates, content) + .filter(c => c >= startFromIndex); + } + if (!hasChildArray(normalCandidates)) { + return -1; + } + + // + let result = -1; + result = Math.min(...normalCandidates); + + // + return result; +} + +/** + * find close index of specific sign in destination content ... + * + * @param {string} openSymbol open of area sign ... + * @param {string} closeSymbol close of area sign ... + * @param {string} content the destination content for parsing ... + * @param {number} startsFrom an start index of content for start parsing ... + * @returns + */ +function findCloseIndex( + openSymbol = '', + closeSymbol = '', + content = '', + startsFrom = -1 +) { + // + // Validate Args ... + if ( + startsFrom < 0 || + !isValidArg(content) || + !isValidArg(openSymbol) || + !isValidArg(closeSymbol) || + openSymbol === closeSymbol || + !content.includes(openSymbol) || + !content.includes(closeSymbol) || + startsFrom > content.length - 1 + ) { + return -1; + } + + // + let result = -1; + + // + let index = startsFrom; + const openSignStack = []; + while (index < content.length) { + // + const openCandidate = content.substring(index, index + openSymbol.length); + const closeCandidate = content.substring(index, index + closeSymbol.length); + + // + if (openCandidate === openSymbol) { + openSignStack.push(index); + } else if (closeCandidate === closeSymbol) { + // + if (openSignStack.length > 0) { + openSignStack.pop(); + } + + // + if (openSignStack.length === 0) { + result = index; + break; + } + } + + // + index++; + } + + // + return result; +} + +/** + * find closed contents of specific sign in destination content ... + * + * @param {string} openSymbol open of area sign ... + * @param {string} closeSymbol close of area sign ... + * @param {string} content the destination content for parsing ... + * @param {number} startsFrom an start index of content for start parsing ... + * @returns + */ +function findClosedContent( + openSymbol = '', + closeSymbol = '', + content = '', + startsFrom = 0, +) { + // + let result = [{ + start: -1, + end: -1, + content: '' + }]; + result.pop(); + + // + // Validate Args ... + if ( + !isValidArg(content) || + !isValidArg(openSymbol) || + !isValidArg(closeSymbol) || + !content.includes(openSymbol) || + !content.includes(closeSymbol) || + openSymbol.length >= content.length || + closeSymbol.length >= content.length + ) { + return result; + } + + // + // Normalize Start From ... + startsFrom = startsFrom < 0 || startsFrom >= content.length ? 0 : startsFrom; + + // + let canContinue = true; + while (!!canContinue) { + // + let openSymbolIndex = content.indexOf(openSymbol, startsFrom); + if (openSymbolIndex < 0) { + // + canContinue = false; + continue; + } + + // + let closeSymbolIndex = findCloseIndex( + openSymbol, + closeSymbol, + content, + openSymbolIndex + ); + if (closeSymbolIndex < 0) { + // + canContinue = false; + continue; + } + if (content.charAt(closeSymbolIndex) !== closeSymbol) { + closeSymbolIndex++; + } + + // + // Prevent ${} string interpolations ... + if ( + openSymbol === '{' && + openSymbolIndex - 1 >= 0 + ) { + // + const prevChar = content.charAt(openSymbolIndex - 1); + if (prevChar === '$') { + continue; + } + } + + // + const item = content + .substring(openSymbolIndex, closeSymbolIndex + 1) + .trim(); + startsFrom = closeSymbolIndex + 1; + result.push({ + start: openSymbolIndex, + end: closeSymbolIndex, + content: item + }); + } + + // + if (!hasChildArray(result)) { + return result; + } + + // + return result; +} + +/** + * extract a collection of closed contents exists in a content ... + * + * @param symbols a collection of open and close contents ... + * @param {string} content a content for searching inside it ... + * @returns a collection of closed content ... + */ +function findClosedContents( + symbols = [ + { + openSymbol: '', + closeSymbol: '' + } + ], + content = '' +) { + // + let result = [{ + start: -1, + end: -1, + content: '' + }]; + result.pop(); + + // + if ( + !isValidArg(content) || + !hasChildArray(symbols) + ) { + return []; + } + + // + symbols.forEach(symbol => { + // + const closedContent = findClosedContent( + symbol.openSymbol, + symbol.closeSymbol, + content + ); + + // + if (hasChildArray(closedContent)) { + result.push( + ...closedContent + ); + } + }); + + // + return result; +} + +/** + * find all string content closed items ... + * + * @param {string} content a content which going to search ... + * @returns a collection of index descriptors ... + */ +function findClosedStrings(content = '') { + // + // Validate Args ... + if (!isValidArg(content)) { + return []; + } + + // + // there are 3 types of strings ... + // ' " and ` + + // + const token1 = '\''; + const token1Stack = [0]; + token1Stack.pop(); + + // + const token2 = '"'; + const token2Stack = [0]; + token2Stack.pop(); + + // + const token3 = '`'; + const token3Stack = [0]; + token3Stack.pop(); + + // + const result = [ + { + start: -1, + end: -1, + content: '' + } + ]; + result.pop(); + + // + for (let i = 0; i < content.length; i++) { + // + const currentChart = content.charAt(i); + + // + //#region Token 1 ... + if (currentChart === token1) { + // + if (!hasChildArray(token1Stack)) { + token1Stack.push(i); + } else { + // + const start = token1Stack.pop(); + const end = i + 1; + const pContent = content.substring(start, end); + result.push({ + start, + end, + content: pContent + }); + } + } + //#endregion + + // + //#region Token 2 ... + if (currentChart === token2) { + // + if (!hasChildArray(token2Stack)) { + token2Stack.push(i); + } else { + // + const start = token2Stack.pop(); + const end = i + 1; + const pContent = content.substring(start, end); + result.push({ + start, + end, + content: pContent + }); + } + } + //#endregion + + // + //#region Token 3 ... + if (currentChart === token3) { + // + if (!hasChildArray(token3Stack)) { + token3Stack.push(i); + } else { + // + const start = token3Stack.pop(); + const end = i + 1; + const pContent = content.substring(start, end); + result.push({ + start, + end, + content: pContent + }); + } + } + //#endregion + } + + // + return result; +} + +/** + * find container indexes from within indexes ... + * + * @param {...{start: number, end: number}} index the collection of indexes to find beiggers inside ... + * @returns + */ +function findContainerIndexes(...index) { + // + let result = [ + { + start: -1, + end: -1, + content: '' + } + ]; + result.pop(); + + // + let concatedIndexes = []; + for (let idx of index) { + // + // Index Childs ... + for (let iix of idx) { + // + // Check idx is standard ... + if ( + !iix || + !iix.end || + !iix.start || + iix.start > iix.end + ) { + continue; + } + + // + // Check index inside another index ... + concatedIndexes.push(iix); + } + } + + // + if (!hasChildArray(concatedIndexes)) { + return result; + } + + // + for (let ccIdx of concatedIndexes) { + // + const isInside = isIndexInside(ccIdx, ...concatedIndexes); + if (isInside) { + continue; + } + + // + if (hasChildArray(result)) { + // + const isInsideResult = isIndexInside(ccIdx, ...result); + if (isInsideResult) { + continue; + } + } + + // + result.push(ccIdx); + } + + // + return result; +} + +/** + * find all tokens indexes inside a content which they are not inside closed items ... + * + * @param {string|string[]} tokens the tokens which require to search ... + * @param {string} content the content which using to search ... + * @returns + */ +function findAllIndexesOutOfCloseds1( + tokens, + content, +) { + // + // Validate Args ... + if (!isValidArg(content)) { + return []; + } + + // + // Extract token Indexes ... + const tokensIndexes = findAllIndexes(tokens, content); + if (!hasChildArray(tokensIndexes)) { + return []; + } + + // + // Extract Closed Objects Indexes ... + const closedArrays = findClosedContent('[', ']', content); + const closedObjects = findClosedContent('{', '}', content); + const closedStrings = findClosedStrings(content); + if ( + !hasChildArray(closedObjects) && + !hasChildArray(closedArrays) && + !hasChildArray(closedStrings) + ) { + return tokensIndexes; + } + + // + // find bigger sloded ... + let containerClosedItems = findContainerIndexes( + closedArrays, + closedObjects, + closedStrings + ).filter(i => !isSurroundedString(i.content)); + + // + let result = [-1]; + result.pop(); + + // + for (let tIdx of tokensIndexes) { + // + let canAdd = true; + for (let ccIndex of containerClosedItems) { + // + canAdd = isInsideIndex(tIdx, ccIndex); + if (canAdd) { + break; + } + } + + // + if (!canAdd) { + result.push(tIdx); + } + } + + // + return result; +} + +/** + * find all tokens indexes inside a content which they are not inside closed items ... + * + * @param {string|string[]} tokens the tokens which require to search ... + * @param {string} content the content which using to search ... + * @returns + */ +function findAllIndexesOutOfCloseds( + tokens, + content, +) { + // + // Define Result ... + let result = [-1]; + result.pop(); + + // + // Validate Args ... + if (!isValidArg(content)) { + return []; + } + + // + // Normalize Tokens ... + const normalizeTokens = toNormalArray(tokens); + if (!hasChildArray(normalizeTokens)) { + return result; + } + + // + // Extract Closed Objects Indexes ... + let openSymbols = [ + '{', + '[', + '\'', + '"', + '`' + ]; + let closeSymbols = [ + '}', + ']', + '\'', + '"', + '`' + ]; + let openStack = []; + let lastOpenSymbol = ''; + let lastClosedIndex = -1; + for (let i = 0; i < content.length; i++) { + // + const prevChar = content.charAt(i - 1) || ''; + const char = content.charAt(i); + const nextChar = content.charAt(i + 1) || ''; + + // + const isToken = normalizeTokens.includes(char); + const isOpenSymbol = openSymbols.includes(char); + const isCloseSymbol = closeSymbols.includes(char); + + // + if (isOpenSymbol && lastOpenSymbol !== char) { + openStack.push(i); + lastOpenSymbol = char === '\'' || char === '"' || char === '`' ? char : lastOpenSymbol; + } else if (isCloseSymbol) { + // + lastOpenSymbol = char === '\'' || char === '"' || char === '`' ? '' : lastOpenSymbol; + let lastPop = openStack.pop(); + if (openStack.length === 0) { + lastClosedIndex = lastPop; + } + } else if (isToken) { + if ( + i > lastClosedIndex && + openStack.length === 0 + ) { + result.push(i); + } + } + } + + // + return result; +} +//#endregion + +// +//#region Validator Actions ... +/** + * check specified value is Valid URL Address or not ... + * + * @param {string} value specified string which required to check + * @returns {boolean} + */ +function isValidURL(value = "") { + // + if (!isValidArg(value)) { + return false; + } + + const pattern = new RegExp( + '^([a-zA-Z]+:\\/\\/)?' + // protocol + '((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|' + // domain name + '((\\d{1,3}\\.){3}\\d{1,3}))' + // OR IP (v4) address + '(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*' + // port and path + '(\\?[;&a-z\\d%_.~+=-]*)?' + // query string + '(\\#[-a-z\\d_]*)?$', // fragment locator + 'i' + ); + + // + const result = pattern.test(value); + return result; +} + +/** + * check specified value is Valid URL Address or not ... + * + * @param {string} value specified string which required to check + */ +function isValidEmail(value = "") { + // + if (!isValidArg(value)) { + return false; + } + + // + const pattern = /[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}/gim; + + // + const result = pattern.test(value); + return result; +} +//#endregion + +// +//#region Normallizers ... +/** + * normallize an string ... + * + * @param {string} value specified value ... + * @returns {string} + */ +function toNormalString(value = "") { + // + if (!XTypeTools.isString(value)) { + value = ""; + } + + // + const result = value + .trim() + .toLowerCase(); + + // + return result; +} +//#endregion + +// +//#region Beautifiers ... +/** + * converts an object to string based on json and beautify result ... + * + * @param {any} object + * @returns {string} + */ +function beautifyJSON(object = undefined) { + // + // TODO: Complete this ... + let result = ""; + + // + // validate object ... + if (object === undefined) { + return result; + } + + // + // Convert result ... + result = JSON.stringify( + object, + null, + 4 + ); + + // + return result; +} +//#endregion + +// +//#region Module Exports ... +module.exports = { + // + endsWidth, + surroundBy, + isValidArg, + isValidArgs, + toNormalArray, + hasChildArray, + toStringExpression, + + // + sliceContent, + clearContent, + clearSurround, + clearArraySurround, + clearObjectSurround, + + // + isSurrounded, + isIndexInside, + isInsideIndex, + isKeyValueType, + isSurroundedArray, + isSurroundedString, + isSurroundedObject, + + // + findNearest, + findAllIndexes, + findCloseIndex, + findNearestIndex, + findClosedContent, + findClosedStrings, + findClosedContents, + findAllIndexesOutOfCloseds, + + // + // Validator Actions ... + isValidURL, + isValidEmail, + + // + // Normallizers ... + toNormalString, + + // + beautifyJSON, +} +//#endregion \ No newline at end of file diff --git a/MQLTestWorkspace/BKPS/14030222/Documents/Temp/multi.asset.configs.yml b/MQLTestWorkspace/BKPS/14030222/Documents/Temp/multi.asset.configs.yml new file mode 100644 index 0000000..79e0ba7 --- /dev/null +++ b/MQLTestWorkspace/BKPS/14030222/Documents/Temp/multi.asset.configs.yml @@ -0,0 +1 @@ +EURUSDb,GBPUSDb,USDJPYb,USDCHFb,XAUUSDb|M5,M15|0.01|X786|true \ No newline at end of file diff --git a/MQLTestWorkspace/BKPS/14030222/Experts/x-donchain.ea.ex5 b/MQLTestWorkspace/BKPS/14030222/Experts/x-donchain.ea.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..233ee8afa3db81980a9975ed10ac848c6d95a7f1 GIT binary patch literal 27024 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 + +// +#define ShortName "XDONCHAINEA" + +// +// Inputs ... +long magicNumber = 78692110; +double lotSize = 0.01; + +// +double stopLoss = 200; +double takeProfit = 400; + +// +// +// + +// +int xdonHandler; +double xdonUpperBuffer[]; +double xdonLowerBuffer[]; + +// +int ma20Handler; +double ma20Buffer[]; + +// +int ma50Handler; +double ma50Buffer[]; + +// +int ma100Handler; +double ma100Buffer[]; + +// +CTrade trade; + +// +ENUM_TIMEFRAMES scPeriod = NULL; +ENUM_TIMEFRAMES mcPeriod = NULL; +ENUM_TIMEFRAMES lcPeriod = NULL; +ENUM_TIMEFRAMES hcPeriod = NULL; + +// +MqlTick currentTick; +MqlRates rates[]; +MqlRates scRates[]; +MqlRates mcRates[]; +MqlRates lcRates[]; +MqlRates hcRates[]; + +// +// Initialization ... +int OnInit() +{ + // + // Validate Inputs ... + if (!ValidateInputs()) + { + return INIT_PARAMETERS_INCORRECT; + } + + // + trade.SetExpertMagicNumber(magicNumber); + + // + xdonHandler = iCustom( + // + _Symbol, + _Period, + "x-saherelm.xdon", + // + // Inputs ... + 52, + 0 + // + ); + + // + ma20Handler = iMA( + _Symbol, + _Period, + 20, + 0, + MODE_SMA, + PRICE_OPEN); + + // + ma50Handler = iMA( + _Symbol, + _Period, + 50, + 0, + MODE_SMA, + PRICE_OPEN); + + // + ma100Handler = iMA( + _Symbol, + _Period, + 100, + 0, + MODE_SMA, + PRICE_OPEN); + + // + if (xdonHandler == INVALID_HANDLE || + ma20Handler == INVALID_HANDLE || + ma50Handler == INVALID_HANDLE || + ma100Handler == INVALID_HANDLE) + { + return INIT_FAILED; + } + + // + ArraySetAsSeries(rates, true); + ArraySetAsSeries(ma20Buffer, true); + ArraySetAsSeries(ma50Buffer, true); + ArraySetAsSeries(ma100Buffer, true); + ArraySetAsSeries(xdonUpperBuffer, true); + ArraySetAsSeries(xdonLowerBuffer, true); + + // + // Init Succeed ... + return INIT_SUCCEEDED; +} + +// +// DeInitialization ... +void OnDeinit(const int reason) +{ + // + // REASON_PROGRAM 0 The EA has stopped working calling the ExpertRemove() function + // REASON_REMOVE 1 Program removed from a chart + // REASON_RECOMPILE 2 Program recompiled + // REASON_CHARTCHANGE 3 A symbol or a chart period is changed + // REASON_CHARTCLOSE 4 Chart closed + // REASON_PARAMETERS 5 Inputs changed by a user + // REASON_ACCOUNT 6 Another account has been activated or reconnection to the trade server has occurred due to changes in the account settings + // REASON_TEMPLATE 7 Another chart template applied + // REASON_INITFAILED 8 The OnInit() handler returned a non-zero value + // REASON_CLOSE 9 Terminal closed + + // + // De Initialize XEA Providers ... + IndicatorRelease(ma20Handler); + IndicatorRelease(ma50Handler); + IndicatorRelease(ma100Handler); + IndicatorRelease(xdonHandler); +} + +// +// On Tick Handler ... +void OnTick() +{ + // + if (!IsNewBar()) + { + return; + } + + // + // Reading Tick ... + if (!SymbolInfoTick(_Symbol, currentTick)) + { + return; + } + + // + // if (scPeriod == NULL) { + // scPeriod = GetNearest + // } + + // + // Prepare Rates ... + int ratesCopied = CopyRates( + _Symbol, + _Period, + 0, + 15, + rates); + + // + int xdonUpperCopied = CopyBuffer( + xdonHandler, + 0, + 0, + 15, + xdonUpperBuffer); + int xdonLowerCopied = CopyBuffer( + xdonHandler, + 1, + 0, + 15, + xdonLowerBuffer); + if (xdonUpperCopied <= 0 || xdonLowerCopied <= 0) + { + return; + } + + // + int ma20Copied = CopyBuffer( + ma20Handler, + 0, + 0, + 15, + ma20Buffer); + int ma50Copied = CopyBuffer( + ma50Handler, + 0, + 0, + 15, + ma50Buffer); + int ma100Copied = CopyBuffer( + ma100Handler, + 0, + 0, + 15, + ma100Buffer); + if (ma20Copied <= 0 || ma50Copied <= 0 || ma100Copied <= 0) + { + return; + } + + // + // BUY ... + bool buyConditions = + // + // First Condition ... + // ma20Buffer[1] < MathMin(ma50Buffer[1], ma100Buffer[1]) + // // + // && + // + // Donchain Condition ... + // Candle Must Shadow Hunt ... + (rates[1].low < xdonLowerBuffer[1] && + MathMin(rates[1].open, rates[1].close) > xdonLowerBuffer[1]) + // + || + // + (rates[1].low < xdonLowerBuffer[1] && + rates[2].low < xdonLowerBuffer[2]) + // + ; + if (buyConditions) + { + // + + // + double sl = + stopLoss <= 0 + ? 0 + : currentTick.bid - (stopLoss * _Point); + if (!NormalizePrice(sl)) + { + return; + } + + // + double tp = + takeProfit <= 0 + ? 0 + : currentTick.bid + (takeProfit * _Point); + if (!NormalizePrice(tp)) + { + return; + } + + // + trade.PositionOpen( + _Symbol, + ORDER_TYPE_BUY, + lotSize, + currentTick.ask, + sl, + tp, + ShortName); + } + + // + // SELL ... + bool sellConditions = + // + // First Condition ... + // ma20Buffer[1] > MathMax(ma50Buffer[1], ma100Buffer[1]) + // // + // && + // + // Donchain Condition ... + // Candle Must Shadow Hunt ... + (rates[1].high > xdonUpperBuffer[1] && + MathMax(rates[1].open, rates[1].close) < xdonUpperBuffer[1]) + // + || + // + (rates[1].high > xdonUpperBuffer[1] && + rates[2].high > xdonUpperBuffer[2]) + // + ; + if (sellConditions) + { + // + double sl = + stopLoss <= 0 + ? 0 + : currentTick.ask - (stopLoss * _Point); + if (!NormalizePrice(sl)) + { + return; + } + + // + double tp = + takeProfit <= 0 + ? 0 + : currentTick.ask + (takeProfit * _Point); + if (!NormalizePrice(tp)) + { + return; + } + + // + trade.PositionOpen( + _Symbol, + ORDER_TYPE_SELL, + lotSize, + currentTick.bid, + sl, + tp, + ShortName); + } +} + +// +// TOOLS ... +bool IsNewBar() +{ + // + static datetime prevTime = 0; + datetime currentTime = iTime(_Symbol, _Period, 0); + + // + if (prevTime != currentTime) + { + // + prevTime = currentTime; + return true; + } + + // + return false; +} + +// +bool ValidateInputs() +{ + // + bool result = true; + + // + return result; +} + +// +bool NormalizePrice( + double &price // What to Normal +) +{ + // + bool result = false; + + // + double tickSize = 0; + result = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_SIZE, tickSize); + if (!result) + { + return result; + } + + // + price = NormalizeDouble(MathRound(price / tickSize) * tickSize, _Digits); + + // + return result; +} + +// +bool CountOpenPositions( + int &buyCount, // Buys + int &sellCount // Sells +) +{ + // + bool result = false; + + // + buyCount = 0; + sellCount = 0; + + // + int total = PositionsTotal(); + if (total <= 0) + { + return true; + } + + // + for (int i = total - 1; i >= 0; i--) + { + // + ulong ticket = PositionGetTicket(i); + if (ticket <= 0) + { + continue; + } + + // + bool isSelected = PositionSelectByTicket(ticket); + if (!isSelected) + { + continue; + } + + // + long magic; + bool isMagicSelected = PositionGetInteger(POSITION_MAGIC, magic); + if (!isMagicSelected || (isMagicSelected && magic != magicNumber)) + { + continue; + } + + // + long typeInt; + ENUM_POSITION_TYPE type; + bool isTypeSelected = PositionGetInteger(POSITION_TYPE, typeInt); + if (!isTypeSelected) + { + continue; + } + + // + type = (ENUM_POSITION_TYPE)typeInt; + + // + if (type == POSITION_TYPE_BUY) + { + buyCount++; + } + else if (type == POSITION_TYPE_SELL) + { + sellCount++; + } + } + + // + result = true; + + // + return result; +} + +// +bool ClosePositions(ENUM_POSITION_TYPE type) +{ + // + bool result = false; + + // + int total = PositionsTotal(); + if (total <= 0) + { + return true; + } + + // + for (int i = total - 1; i >= 0; i--) + { + // + ulong ticket = PositionGetTicket(i); + if (ticket <= 0) + { + continue; + } + + // + bool isSelected = PositionSelectByTicket(ticket); + if (!isSelected) + { + continue; + } + + // + long magic; + bool isMagicSelected = PositionGetInteger(POSITION_MAGIC, magic); + if (!isMagicSelected || (isMagicSelected && magic != magicNumber)) + { + continue; + } + + // + long typeInt; + ENUM_POSITION_TYPE pType; + bool isTypeSelected = PositionGetInteger(POSITION_TYPE, typeInt); + if (!isTypeSelected) + { + continue; + } + + // + pType = (ENUM_POSITION_TYPE)typeInt; + + // + if (type != pType) + { + continue; + } + + // + trade.PositionClose(ticket); + } + + // + result = true; + + // + return result; +} + +// +template +string ToString(const T value) +{ + // + return (string)value; +} \ No newline at end of file diff --git a/MQLTestWorkspace/BKPS/14030222/Experts/x-rsima.ea.ex5 b/MQLTestWorkspace/BKPS/14030222/Experts/x-rsima.ea.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..46b5bc3b70c0442c15c9d7a8128e7bd46d9327c4 GIT binary patch literal 65108 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 + +// +#define ShortName "XRSIMAEA" + +// +// Inputs ... +long magicNumber = 78692110; +double lotSize = 0.01; + +// +int rsiLength = 25; +int rsiLevel = 70; + +// +int maLength = 25; + +// +double stopLoss = 200; +double takeProfit = 100; + +// +bool closeSignal = false; + +// +// +// + +// +int rsiHandler; +double rsiBuffer[]; + +// +int maHandler; +double maBuffer[]; + +// +CTrade trade; + +// +MqlTick currentTick; + +// +datetime openTimeBuy = 0; +datetime openTimeSell = 0; + +// +// Initialization ... +int OnInit() +{ + // + // Validate Inputs ... + if (!ValidateInputs()) + { + return INIT_PARAMETERS_INCORRECT; + } + + // + trade.SetExpertMagicNumber(magicNumber); + + // + rsiHandler = iRSI( + _Symbol, + _Period, + rsiLength, + PRICE_OPEN); + + // + maHandler = iMA( + _Symbol, + PERIOD_H1, + maLength, + 0, + MODE_SMA, + PRICE_OPEN); + + // + if (rsiHandler == INVALID_HANDLE || maHandler == INVALID_HANDLE) + { + return INIT_FAILED; + } + + // + ArraySetAsSeries(rsiBuffer, true); + ArraySetAsSeries(maBuffer, true); + + // + // Init Succeed ... + return INIT_SUCCEEDED; +} + +// +// DeInitialization ... +void OnDeinit(const int reason) +{ + // + // REASON_PROGRAM 0 The EA has stopped working calling the ExpertRemove() function + // REASON_REMOVE 1 Program removed from a chart + // REASON_RECOMPILE 2 Program recompiled + // REASON_CHARTCHANGE 3 A symbol or a chart period is changed + // REASON_CHARTCLOSE 4 Chart closed + // REASON_PARAMETERS 5 Inputs changed by a user + // REASON_ACCOUNT 6 Another account has been activated or reconnection to the trade server has occurred due to changes in the account settings + // REASON_TEMPLATE 7 Another chart template applied + // REASON_INITFAILED 8 The OnInit() handler returned a non-zero value + // REASON_CLOSE 9 Terminal closed + + // + // De Initialize XEA Providers ... + IndicatorRelease(rsiHandler); + IndicatorRelease(maHandler); +} + +// +// On Tick Handler ... +void OnTick() +{ + // + if (!IsNewBar()) + { + return; + } + + // + // Reading Tick ... + if (!SymbolInfoTick(_Symbol, currentTick)) + { + return; + } + + // + int rsiCopied = CopyBuffer( + rsiHandler, + 0, + 0, + 2, + rsiBuffer); + if (rsiCopied < 2) + { + return; + } + + // + int maCopied = CopyBuffer( + maHandler, + 0, + 0, + 1, + maBuffer); + if (maCopied < 1) + { + return; + } + + // + Comment( + "rsi[0]: " + ToString(rsiBuffer[0]) + "\n" + + "rsi[1]: " + ToString(rsiBuffer[1]) + "\n" + + "ma[0]: " + ToString(maBuffer[0])); + + // + int buyCount; + int sellCount; + // + if (!CountOpenPositions(buyCount, sellCount)) + { + return; + } + + // + // BUY ... + if ( + buyCount == 0 && + rsiBuffer[1] >= (100 - rsiLevel) && + rsiBuffer[0] < (100 - rsiLevel) && + currentTick.ask > maBuffer[0]) + { + // + if (closeSignal) + { + // + bool isClose = ClosePositions(POSITION_TYPE_SELL); + if (!isClose) + { + return; + } + } + + // + double sl = + stopLoss <= 0 + ? 0 + : currentTick.bid - (stopLoss * _Point); + if (!NormalizePrice(sl)) + { + return; + } + + // + double tp = + takeProfit <= 0 + ? 0 + : currentTick.bid + (takeProfit * _Point); + if (!NormalizePrice(tp)) + { + return; + } + + // + trade.PositionOpen( + _Symbol, + ORDER_TYPE_BUY, + lotSize, + currentTick.ask, + sl, + tp, + ShortName); + } + + // + // SELL ... + if ( + sellCount == 0 && + rsiBuffer[1] <= rsiLevel && + rsiBuffer[0] > rsiLevel && + currentTick.bid < maBuffer[0]) + { + // + if (closeSignal) + { + // + bool isClose = ClosePositions(POSITION_TYPE_BUY); + if (!isClose) + { + return; + } + } + + // + double sl = + stopLoss <= 0 + ? 0 + : currentTick.ask - (stopLoss * _Point); + if (!NormalizePrice(sl)) + { + return; + } + + // + double tp = + takeProfit <= 0 + ? 0 + : currentTick.ask + (takeProfit * _Point); + if (!NormalizePrice(tp)) + { + return; + } + + // + trade.PositionOpen( + _Symbol, + ORDER_TYPE_SELL, + lotSize, + currentTick.bid, + sl, + tp, + ShortName); + } +} + +// +// TOOLS ... +bool IsNewBar() +{ + // + static datetime prevTime = 0; + datetime currentTime = iTime(_Symbol, _Period, 0); + + // + if (prevTime != currentTime) + { + // + prevTime = currentTime; + return true; + } + + // + return false; +} + +// +bool ValidateInputs() +{ + // + bool result = true; + + // + return result; +} + +// +bool NormalizePrice( + double &price // What to Normal +) +{ + // + bool result = false; + + // + double tickSize = 0; + result = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_SIZE, tickSize); + if (!result) + { + return result; + } + + // + price = NormalizeDouble(MathRound(price / tickSize) * tickSize, _Digits); + + // + return result; +} + +// +bool CountOpenPositions( + int &buyCount, // Buys + int &sellCount // Sells +) +{ + // + bool result = false; + + // + buyCount = 0; + sellCount = 0; + + // + int total = PositionsTotal(); + if (total <= 0) + { + return true; + } + + // + for (int i = total - 1; i >= 0; i--) + { + // + ulong ticket = PositionGetTicket(i); + if (ticket <= 0) + { + continue; + } + + // + bool isSelected = PositionSelectByTicket(ticket); + if (!isSelected) + { + continue; + } + + // + long magic; + bool isMagicSelected = PositionGetInteger(POSITION_MAGIC, magic); + if (!isMagicSelected || (isMagicSelected && magic != magicNumber)) + { + continue; + } + + // + long typeInt; + ENUM_POSITION_TYPE type; + bool isTypeSelected = PositionGetInteger(POSITION_TYPE, typeInt); + if (!isTypeSelected) + { + continue; + } + + // + type = (ENUM_POSITION_TYPE)typeInt; + + // + if (type == POSITION_TYPE_BUY) + { + buyCount++; + } + else if (type == POSITION_TYPE_SELL) + { + sellCount++; + } + } + + // + result = true; + + // + return result; +} + +// +bool ClosePositions(ENUM_POSITION_TYPE type) +{ + // + bool result = false; + + // + int total = PositionsTotal(); + if (total <= 0) + { + return true; + } + + // + for (int i = total - 1; i >= 0; i--) + { + // + ulong ticket = PositionGetTicket(i); + if (ticket <= 0) + { + continue; + } + + // + bool isSelected = PositionSelectByTicket(ticket); + if (!isSelected) + { + continue; + } + + // + long magic; + bool isMagicSelected = PositionGetInteger(POSITION_MAGIC, magic); + if (!isMagicSelected || (isMagicSelected && magic != magicNumber)) + { + continue; + } + + // + long typeInt; + ENUM_POSITION_TYPE pType; + bool isTypeSelected = PositionGetInteger(POSITION_TYPE, typeInt); + if (!isTypeSelected) + { + continue; + } + + // + pType = (ENUM_POSITION_TYPE)typeInt; + + // + if (type != pType) + { + continue; + } + + // + trade.PositionClose(ticket); + } + + // + result = true; + + // + return result; +} + +// +template +string ToString(const T value) +{ + // + return (string)value; +} \ No newline at end of file diff --git a/MQLTestWorkspace/BKPS/14030222/Experts/x-saherelm.xea.ex5 b/MQLTestWorkspace/BKPS/14030222/Experts/x-saherelm.xea.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..db70fbb52882130357748bdff8e32e84fa431dfa GIT binary patch literal 620306 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�LRf%`qc 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Π58vx;^Gx{hSwuDgr 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 z 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

rN%mSq%LMes^4I=U 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 z%0A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

F6gf?QJw6s6!` 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�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

9HZ)-7@VL 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 rates_total || prev_calculated <= 0) ? rates_total : (rates_total - prev_calculated) + 1; + + // + // Buffers Copy ... + int copiedTenkans = CopyBuffer(mHandler, TENKANSEN_LINE, 0, limit, dTenkanBuffer); + int copiedKijuns = CopyBuffer(mHandler, KIJUNSEN_LINE, 0, limit, dKijunBuffer); + int copiedChikous = CopyBuffer(mHandler, CHIKOUSPAN_LINE, 0, limit, dChikouBuffer); + int copiedSSAs = CopyBuffer(mHandler, SENKOUSPANA_LINE, 0, limit, dSSABuffer); + int copiedSSBs = CopyBuffer(mHandler, SENKOUSPANB_LINE, 0, limit, dSSBBuffer); + if ( + copiedSSAs < 0 || + copiedSSBs < 0 || + copiedKijuns < 0 || + copiedTenkans < 0 || + copiedChikous < 0) + { + return prev_calculated; + } + + // + // Main Loop ... + for (int i = limit - 1; i >= 0 && !IsStopped(); i--) + { + CalculateBuffers(i); + } + + // + return rates_total; +} + +// +// END Event Handlers ... +// + +// +// START Functions ... +// + +// +// Validate Input Args for Initialization ... +bool ValidateInputs() +{ + // + bool result = + // + (tenkanSenLength > 2 && + kijunSenLength > tenkanSenLength && + senkouSpanBLength > kijunSenLength) + // + ; + + // + return result; +} + +// +// Retrieve all Exists Input Max Length ... +// use for Start Of Drawing ... +int ExtractMaxLengthOfInputs() +{ + // + int result = 0; + + // + // Ichimoku ... + result = MathMax(result, tenkanSenLength); + result = MathMax(result, kijunSenLength); + result = MathMax(result, senkouSpanBLength); + + // + return result; +} + +// +// Define Indexes and Styles ... +void DefineBuffers() +{ + // + // ICHIMOKU ... + + // + // TENKANSEN ... + + // + ENUM_DRAW_TYPE tenkanSenDrawType = showTenkanSen ? DRAW_LINE : DRAW_NONE; + + // + ArraySetAsSeries(tenkanSenBuffer, true); + SetIndexBuffer(tenkanSenBufferIndex, tenkanSenBuffer, INDICATOR_DATA); + PlotIndexSetInteger(tenkanSenBufferIndex, PLOT_DRAW_BEGIN, maxLength); + PlotIndexSetInteger(tenkanSenBufferIndex, PLOT_SHOW_DATA, showTenkanSen); + PlotIndexSetInteger(tenkanSenBufferIndex, PLOT_DRAW_TYPE, tenkanSenDrawType); + + // + // KIJUNSEN ... + + // + ENUM_DRAW_TYPE kijunSenDrawType = showKijunSen ? DRAW_LINE : DRAW_NONE; + + // + ArraySetAsSeries(kijunSenBuffer, true); + SetIndexBuffer(kijunSenBufferIndex, kijunSenBuffer, INDICATOR_DATA); + PlotIndexSetInteger(kijunSenBufferIndex, PLOT_DRAW_BEGIN, maxLength); + PlotIndexSetInteger(kijunSenBufferIndex, PLOT_SHOW_DATA, showKijunSen); + PlotIndexSetInteger(kijunSenBufferIndex, PLOT_DRAW_TYPE, kijunSenDrawType); + + // + // KIJUNSEN Plus ... + + // + ENUM_DRAW_TYPE kijunSenPlusDrawType = showKijunSenPlus ? DRAW_LINE : DRAW_NONE; + + // + ArraySetAsSeries(kijunSenPlusBuffer, true); + SetIndexBuffer(kijunSenPlusBufferIndex, kijunSenPlusBuffer, INDICATOR_DATA); + PlotIndexSetInteger(kijunSenPlusBufferIndex, PLOT_DRAW_BEGIN, maxLength); + PlotIndexSetInteger(kijunSenPlusBufferIndex, PLOT_SHIFT, kijunSenLength); + PlotIndexSetInteger(kijunSenPlusBufferIndex, PLOT_SHOW_DATA, false); + PlotIndexSetInteger(kijunSenPlusBufferIndex, PLOT_DRAW_TYPE, kijunSenPlusDrawType); + + // + // KIJUNSEN Negative ... + + // + ENUM_DRAW_TYPE kijunSenNegativeDrawType = showKijunSenNegative ? DRAW_LINE : DRAW_NONE; + + // + ArraySetAsSeries(kijunSenNegativeBuffer, true); + SetIndexBuffer(kijunSenNegativeBufferIndex, kijunSenNegativeBuffer, INDICATOR_DATA); + PlotIndexSetInteger(kijunSenNegativeBufferIndex, PLOT_DRAW_BEGIN, maxLength); + PlotIndexSetInteger(kijunSenNegativeBufferIndex, PLOT_SHIFT, -kijunSenLength); + PlotIndexSetInteger(kijunSenNegativeBufferIndex, PLOT_SHOW_DATA, false); + PlotIndexSetInteger(kijunSenNegativeBufferIndex, PLOT_DRAW_TYPE, kijunSenNegativeDrawType); + + // + // CHIKOUSPAN ... + + // + ENUM_DRAW_TYPE chikouSpanDrawType = showChikouSpan ? DRAW_LINE : DRAW_NONE; + + // + ArraySetAsSeries(chikouSpanBuffer, true); + SetIndexBuffer(chikouSpanBufferIndex, chikouSpanBuffer, INDICATOR_DATA); + PlotIndexSetInteger(chikouSpanBufferIndex, PLOT_DRAW_BEGIN, maxLength); + PlotIndexSetInteger(chikouSpanBufferIndex, PLOT_SHIFT, -kijunSenLength); + PlotIndexSetInteger(chikouSpanBufferIndex, PLOT_SHOW_DATA, showChikouSpan); + PlotIndexSetInteger(chikouSpanBufferIndex, PLOT_DRAW_TYPE, chikouSpanDrawType); + + // + // SENKOUSPAN A and B ... + int shiftSize = shiftKumo ? kijunSenLength : 0; + + // + // SENKOUSPANA ... + ENUM_DRAW_TYPE senkouSpanADrawType = showSenkouSpanA ? DRAW_LINE : DRAW_NONE; + ArraySetAsSeries(senkouABuffer, true); + SetIndexBuffer(senkouABufferIndex, senkouABuffer, INDICATOR_DATA); + PlotIndexSetInteger(senkouABufferIndex, PLOT_SHIFT, shiftSize); + PlotIndexSetInteger(senkouABufferIndex, PLOT_SHOW_DATA, showSenkouSpanA); + PlotIndexSetInteger(senkouABufferIndex, PLOT_DRAW_TYPE, senkouSpanADrawType); + + // + // SENKOUSPANB ... + ENUM_DRAW_TYPE senkouSpanBDrawType = showSenkouSpanB ? DRAW_LINE : DRAW_NONE; + ArraySetAsSeries(senkouBBuffer, true); + SetIndexBuffer(senkouBBufferIndex, senkouBBuffer, INDICATOR_DATA); + PlotIndexSetInteger(senkouBBufferIndex, PLOT_SHIFT, shiftSize); + PlotIndexSetInteger(senkouBBufferIndex, PLOT_SHOW_DATA, showSenkouSpanB); + PlotIndexSetInteger(senkouBBufferIndex, PLOT_DRAW_TYPE, senkouSpanBDrawType); + + // + // KUMO ... + + // + // SENKOUSPANA ... + ArraySetAsSeries(senkouSpanABuffer, true); + SetIndexBuffer(senkouSpanABufferIndex, senkouSpanABuffer, INDICATOR_DATA); + PlotIndexSetInteger(senkouSpanABufferIndex, PLOT_DRAW_BEGIN, maxLength); + + // + // SENKOUSPANB ... + ArraySetAsSeries(senkouSpanBBuffer, true); + SetIndexBuffer(senkouSpanBBufferIndex, senkouSpanBBuffer, INDICATOR_DATA); + PlotIndexSetInteger(senkouSpanBBufferIndex, PLOT_DRAW_BEGIN, maxLength); + + // + // KUMO ... + + // + ENUM_DRAW_TYPE kumoDrawType = showKumo ? DRAW_FILLING : DRAW_NONE; + + // + PlotIndexSetInteger(kumoBufferIndex, PLOT_SHIFT, shiftSize); + PlotIndexSetInteger(kumoBufferIndex, PLOT_SHOW_DATA, false); + PlotIndexSetInteger(kumoBufferIndex, PLOT_DRAW_TYPE, kumoDrawType); + + // + // DATA Buffers ... + + // + // D Tenkan ... + ArraySetAsSeries(dTenkanBuffer, true); + SetIndexBuffer(dTenkanBufferIndex, dTenkanBuffer, INDICATOR_CALCULATIONS); + + // + // D Kijun ... + ArraySetAsSeries(dKijunBuffer, true); + SetIndexBuffer(dKijunBufferIndex, dKijunBuffer, INDICATOR_CALCULATIONS); + + // + // D Chikou ... + ArraySetAsSeries(dChikouBuffer, true); + SetIndexBuffer(dChikouBufferIndex, dChikouBuffer, INDICATOR_CALCULATIONS); + + // + // D SSA ... + ArraySetAsSeries(dSSABuffer, true); + SetIndexBuffer(dSSABufferIndex, dSSABuffer, INDICATOR_CALCULATIONS); + + // + // D SSB ... + ArraySetAsSeries(dSSBBuffer, true); + SetIndexBuffer(dSSBBufferIndex, dSSBBuffer, INDICATOR_CALCULATIONS); +} + +// +// Set Indicator Short Name and also we can define Buffers Labels ... +void SetIndicatorName() +{ + IndicatorSetString(INDICATOR_SHORTNAME, ShortName); +} + +// +// Calculate Buffers ... +void CalculateBuffers( + int bar_index // Selected Bar Index +) +{ + // + // ICHIMOKU ... + + // + double topValue; + double bottomValue; + + // + // TENKANSEN ... + + // + // Extract Tenkan Sen Top/Bottom Calculation Mode based on User Input ... + if (mTenkanSenTopMode == NULL || mTenkanSenBottomMode == NULL) + { + // + switch (tenkanSenMode) + { + // + case X_XICH_HH_LL_MODE: + // + mTenkanSenTopMode = MODE_HIGH; + mTenkanSenBottomMode = MODE_LOW; + break; + + // + case X_XICH_HO_LC_MODE: + // + mTenkanSenTopMode = MODE_OPEN; + mTenkanSenBottomMode = MODE_CLOSE; + break; + } + } + + // + // Calculate Top ... + topValue = GetHighestHigh( + _Symbol, + _Period, + mTenkanSenTopMode, + tenkanSenLength, + bar_index); + + // + // Calculate Bottom ... + bottomValue = GetLowestLow( + _Symbol, + _Period, + mTenkanSenBottomMode, + tenkanSenLength, + bar_index); + + // + double tenkanSenValue = (topValue + bottomValue) / 2; + tenkanSenBuffer[bar_index] = tenkanSenValue; + + // + // KIJUNSEN ... + + // + // Extract Kijun Sen Top/Bottom Calculation Mode based on User Input ... + if (mKijunSenTopMode == NULL || mKijunSenBottomMode == NULL) + { + // + switch (kijunSenMode) + { + // + case X_XICH_HH_LL_MODE: + // + mKijunSenTopMode = MODE_HIGH; + mKijunSenBottomMode = MODE_LOW; + break; + + // + case X_XICH_HO_LC_MODE: + // + mKijunSenTopMode = MODE_OPEN; + mKijunSenBottomMode = MODE_CLOSE; + break; + } + } + + // + // Calculate Top ... + topValue = GetHighestHigh( + _Symbol, + _Period, + mKijunSenTopMode, + kijunSenLength, + bar_index); + + // + // Calculate Bottom ... + bottomValue = GetLowestLow( + _Symbol, + _Period, + mKijunSenBottomMode, + kijunSenLength, + bar_index); + + // + double kijunSenValue = (topValue + bottomValue) / 2; + kijunSenBuffer[bar_index] = kijunSenValue; + + // + kijunSenPlusBuffer[bar_index] = kijunSenValue; + kijunSenNegativeBuffer[bar_index] = kijunSenValue; + + // + // CHIKOUSPAN ... + double chikouSpanValue = GetAppliedPrice( + bar_index, + chikuoSpanAppliedTo); + chikouSpanBuffer[bar_index] = chikouSpanValue; + + // + // KUMO ... + + // + // SENKOUSPANA ... + double senkouSpanAValue = (tenkanSenValue + kijunSenValue) / 2; + senkouABuffer[bar_index] = senkouSpanAValue; + senkouSpanABuffer[bar_index] = senkouSpanAValue; + + // + // SENKOUSPANB ... + + // + // Extract Senkou Span B Top/Bottom Calculation Mode based on User Input ... + if (mSenkouSpanBTopMode == NULL || mSenkouSpanBBottomMode == NULL) + { + // + switch (senkouSpanBMode) + { + // + case X_XICH_HH_LL_MODE: + // + mSenkouSpanBTopMode = MODE_HIGH; + mSenkouSpanBBottomMode = MODE_LOW; + break; + + // + case X_XICH_HO_LC_MODE: + // + mSenkouSpanBTopMode = MODE_OPEN; + mSenkouSpanBBottomMode = MODE_CLOSE; + break; + } + } + + // + // Calculate Top ... + topValue = GetHighestHigh( + _Symbol, + _Period, + mSenkouSpanBTopMode, + senkouSpanBLength, + bar_index); + + // + // Calculate Bottom ... + bottomValue = GetLowestLow( + _Symbol, + _Period, + mSenkouSpanBBottomMode, + senkouSpanBLength, + bar_index); + + // + double senkouSpanBValue = (topValue + bottomValue) / 2; + senkouBBuffer[bar_index] = senkouSpanBValue; + senkouSpanBBuffer[bar_index] = senkouSpanBValue; +} + +// +// END Functions ... +// diff --git a/MQLTestWorkspace/BKPS/14030222/Indicators/x-saherelm.x121.xman.ex5 b/MQLTestWorkspace/BKPS/14030222/Indicators/x-saherelm.x121.xman.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..7dd3033008cbf5afa4716556b23cbc3db066871d GIT binary patch literal 87386 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

KC=mnbZ|N-qxI(l9A~;R_if;sw2dq-2el%4 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 1 ? mPeriod : 1); + mHalfPeriod = (int)(mFullPeriod > 1 ? mFullPeriod / (mDivisor > 1 ? mDivisor : 1) : 1); + mSqrtPeriod = (int)MathSqrt(mFullPeriod); + + // + mArraySize = -1; + mWeight1 = mWeight2 = mWeight3 = 1; + + // + result = true; + + // + return result; + } + + // + // CalCulate Specific Value ... + double Calculate( + double value, + int i, + int bars) + { + // + double result = 0; + + // + if (mArraySize < bars) + { + // + mArraySize = ArrayResize(mData, bars + 500); + if (mArraySize < bars) + return result; + } + + // + mData[i].value = value; + if (i > mFullPeriod) + { + // + mData[i].wsum1 = mData[i - 1].wsum1 + value * mHalfPeriod - mData[i - 1].lsum1; + mData[i].lsum1 = mData[i - 1].lsum1 + value - mData[i - mHalfPeriod].value; + mData[i].wsum2 = mData[i - 1].wsum2 + value * mFullPeriod - mData[i - 1].lsum2; + mData[i].lsum2 = mData[i - 1].lsum2 + value - mData[i - mFullPeriod].value; + } + else + { + // + mData[i].wsum1 = mData[i].wsum2 = + mData[i].lsum1 = mData[i].lsum2 = mWeight1 = mWeight2 = 0; + for (int k = 0, w1 = mHalfPeriod, w2 = mFullPeriod; w2 > 0 && i >= k; k++, w1--, w2--) + { + // + if (w1 > 0) + { + // + mData[i].wsum1 += mData[i - k].value * w1; + mData[i].lsum1 += mData[i - k].value; + mWeight1 += w1; + } + + // + mData[i].wsum2 += mData[i - k].value * w2; + mData[i].lsum2 += mData[i - k].value; + mWeight2 += w2; + } + } + + // + mData[i].value3 = 2.0 * mData[i].wsum1 / mWeight1 - mData[i].wsum2 / mWeight2; + + // + if (i > mSqrtPeriod) + { + // + mData[i].wsum3 = mData[i - 1].wsum3 + mData[i].value3 * mSqrtPeriod - mData[i - 1].lsum3; + mData[i].lsum3 = mData[i - 1].lsum3 + mData[i].value3 - mData[i - mSqrtPeriod].value3; + } + else + { + // + mData[i].wsum3 = + mData[i].lsum3 = mWeight3 = 0; + + // + for (int k = 0, w3 = mSqrtPeriod; w3 > 0 && i >= k; k++, w3--) + { + // + mData[i].wsum3 += mData[i - k].value3 * w3; + mData[i].lsum3 += mData[i - k].value3; + mWeight3 += w3; + } + } + + // + result = mData[i].wsum3 / mWeight3; + + // + return result; + } + + // + // Protected ... +protected: + // + // Private ... +private: + // + int mFullPeriod; + int mHalfPeriod; + int mSqrtPeriod; + int mArraySize; + double mWeight1; + double mWeight2; + double mWeight3; + + // + XHullData mData[]; +}; + +// +#include +#include "../Libraries/x-saherelm.xman.parser.lib.mq5" + +// +// END Constants ... +// + +// +// START Inputs ... +// + +// +input group "Candle Timer"; +input string cTimerConfig = "candleTimerColor(clrGold)candleTimerCorner(2)"; // Config + +// +input group "Chart Style"; +input string cStyleConfig = "upColor(clrLime) downColor(clrRed) lineColor(clrLime) bearishColor(clrRed) bullishColor(clrLime) volumesColor(clrGreen) chartMode(1)"; // Config + +// +input group "Makret Cycles"; +input group "Short"; +input string scConfig = "l1Method(1)l1Period(NULL)"; // Config +input group "Medium"; +input string mcConfig = "l2Method(1)l2Period(NULL)"; // Config +input group "Long"; +input string lcConfig = "l3Method(1)l3Period(NULL)"; // Config +input group "Hind"; +input string hcConfig = "l4Method(1)l4Period(NULL)"; // Config + +// +input group "Fibonacci"; +input string fibConfig = "fiboLevel1(0.236)fiboLevel2(0.382)fiboLevel3(0.5)fiboLevel4(0.618)fiboLevel5(0.764)"; // Config + +// +input group "Boundary Detection Modes"; +input string bdConfig = "hhMode(2)llMode(1)"; // Config + +// +input group "Trend Detection"; +input string tdConfig = "trendMultiplier(3)trendPriceAppliedTo(4)"; // Config + +// +input group "Ribbon Detection"; +input string rbConfig = "ribbonMode(5)"; // Config + +// +input group "Hull Trend Detection"; +input string hullConfig = "hullDivisor(2.0)hullUpAppliedTo(3)hullDownAppliedTo(4)"; // Config + +// +input group "SSL Channel"; +input string sslcConfig = "sslcMode(1)sslcUpAppliedTo(3)sslcDownAppliedTo(4)"; // Config + +// +input group "Presentation"; +input string stylePRSConfig = "showCandleTimer(true)showCandles(true)showHKCandles(false)showSMHKCandles(false)"; // Styles +input string pvPRSConfig = "showPeaksAndVales(true)showLevels(false)showConsolidations(false)"; // Peaks and Vales +input string trendPRSConfig = "showHull(false)showTrends(false)fillTrends(false)showRibbons(false)showSSLChannel(false)"; // Trend +input string fiboPRSConfig = "showFibo1Levels(false)showFibo2Levels(false)showFibo3Levels(false)showFibo4Levels(false)showFibo5Levels(false)"; // Fibonacci + +// +// END Inputs ... +// + +// +// START Configs ... +// + +// +// Candles Timer ... +color candleTimerColor = clrGold; // Text Color +ENUM_BASE_CORNER candleTimerCorner = CORNER_RIGHT_UPPER; // Text Position + +// +// Chart Style +color upColor = clrLime; // Up Color +color downColor = clrRed; // Down Color +color lineColor = clrLime; // Line mode and Doji candlestick Color +color bearishColor = clrRed; // Bullish Color +color bullishColor = clrLime; // Bearish Color +color volumesColor = clrGreen; // Volumes Color +ENUM_CHART_MODE chartMode = CHART_CANDLES; // Chart Mode + +// +// Makret Cycles + +// +// Level 1 ... +ENUM_X_PERIOD_METHOD l1Method = X_PERIOD_AUTO; // How to Find Period +ENUM_TIMEFRAMES l1Period = NULL; // Time Period + +// +// Level 2 ... +ENUM_X_PERIOD_METHOD l2Method = X_PERIOD_AUTO; // How to Find Period +ENUM_TIMEFRAMES l2Period = NULL; // Time Period + +// +// Level 3 ... +ENUM_X_PERIOD_METHOD l3Method = X_PERIOD_AUTO; // How to Find Period +ENUM_TIMEFRAMES l3Period = NULL; // Time Period + +// +// Level 4 ... +ENUM_X_PERIOD_METHOD l4Method = X_PERIOD_AUTO; // How to Find Period +ENUM_TIMEFRAMES l4Period = NULL; // Time Period + +// +// Fibonacci ... +double fiboLevel1 = 0.236; // Fibio 1st Level +double fiboLevel2 = 0.382; // Fibio 2st Level +double fiboLevel3 = 0.5; // Fibio 3rd Level +double fiboLevel4 = 0.618; // Fibio 4th Level +double fiboLevel5 = 0.764; // Fibio 5th Level + +// +// Boundary Detection Modes ... +ENUM_SERIESMODE hhMode = MODE_HIGH; // Highest High Calculation Method +ENUM_SERIESMODE llMode = MODE_LOW; // Lowest Low Calculation Method + +// +// Trend Detection ... +double trendMultiplier = 3.5; // Multiplier +ENUM_APPLIED_PRICE trendPriceAppliedTo = PRICE_MEDIAN; // Applied To + +// +// Ribbon Detection ... +ENUM_X_MA_METHOD ribbonMode = X_MA_AMA; // How to Calculate + +// +// Hull Trend Detection ... +double hullDivisor = 2.0; // Divisor (Speed) +ENUM_APPLIED_PRICE hullUpAppliedTo = PRICE_HIGH; // Up Zone Applied to +ENUM_APPLIED_PRICE hullDownAppliedTo = PRICE_LOW; // Down Zone Applied to + +// +// SSL Channel Detection ... +ENUM_X_MA_METHOD sslcMode = X_MA_SMA; // How to Calculate +ENUM_APPLIED_PRICE sslcUpAppliedTo = PRICE_HIGH; // Up Applied To +ENUM_APPLIED_PRICE sslcDownAppliedTo = PRICE_LOW; // Down Applied To + +// +// Presentation ... +bool showCandleTimer = true; // Show Candle Time +bool showCandles = true; // Show Candles +bool showHKCandles = false; // Draw Hiken Ashi Candle +bool showSMHKCandles = false; // Draw Smoothed Hiken Ashi Candle +bool showPeaksAndVales = true; // Show Peaks and Vales +bool showTrends = true; // Show Trends +bool fillTrends = false; // Fill Trends +bool showLevels = false; // Show Levels +bool showConsolidations = false; // Show Consolidations +bool showRibbons = false; // Show Ribbons +bool showHull = false; // Show Hull +bool showSSLChannel = false; // Show SSL Channel +bool showFibo1Levels = false; // Show Fibo 1st Level +bool showFibo2Levels = false; // Show Fibo 2nd Level +bool showFibo3Levels = false; // Show Fibo 3rd Level +bool showFibo4Levels = false; // Show Fibo 4th Level +bool showFibo5Levels = false; // Show Fibo 5th Level + +// +// END Configs ... +// + +// +// START Includes and Imports ... +// + +// +// Includes Draw Library ... +#include "../Libraries/x-saherelm.draw.lib.mq5" + +// +// Includes Common Library ... +#include "../Libraries/x-saherelm.common.lib.mq5" + +// +// END Includes and Imports ... +// + +// +// START Buffers ... +// +#property indicator_chart_window + +// +#property indicator_buffers 94 +#property indicator_plots 50 + +// +// PEKSANDVALES ... + +// +// PEAKS ... + +// +#define peaksBufferIndex 0 +double peaksBuffer[]; + +// +#property indicator_label1 "X121_XMAN PEAKS" +#property indicator_type1 DRAW_ARROW +#property indicator_color1 clrAqua +#property indicator_width1 1 + +// +// VALES ... + +// +#define valesBufferIndex 1 +double valesBuffer[]; + +// +#property indicator_label2 "X121_XMAN VALES" +#property indicator_type2 DRAW_ARROW +#property indicator_color2 clrMagenta +#property indicator_width2 1 + +// +#define rBufferIndex 2 +double rBuffer[]; + +// +#define rColorBufferIndex 3 +double rColorBuffer[]; + +// +#property indicator_label3 "X121_XMAN R" +#property indicator_type3 DRAW_COLOR_LINE +#property indicator_color3 CLR_NONE, clrAqua +#property indicator_style3 STYLE_DOT +#property indicator_width3 1 + +// +#define sBufferIndex 4 +#define sBufferPlotIndex 3 +double sBuffer[]; + +// +#define sColorBufferIndex 5 +double sColorBuffer[]; + +// +#property indicator_label4 "X121_XMAN S" +#property indicator_type4 DRAW_COLOR_LINE +#property indicator_color4 CLR_NONE, clrMagenta +#property indicator_style4 STYLE_DOT +#property indicator_width4 1 + +// +// FIBBO Level 1 ... + +// +#define fl1BufferIndex 6 +#define fl1BufferPlotIndex 4 +double fl1Buffer[]; + +// +#define fl1ColorBufferIndex 7 +double fl1ColorBuffer[]; + +// +#property indicator_label5 "X121_XMAN FL1" +#property indicator_type5 DRAW_COLOR_LINE +#property indicator_color5 CLR_NONE, clrGold +#property indicator_style5 STYLE_DASHDOTDOT +#property indicator_width5 1 + +// +// FIBBO Level 2 ... + +// +#define fl2BufferIndex 8 +#define fl2BufferPlotIndex 5 +double fl2Buffer[]; + +// +#define fl2ColorBufferIndex 9 +double fl2ColorBuffer[]; + +// +#property indicator_label6 "X121_XMAN FL2" +#property indicator_type6 DRAW_COLOR_LINE +#property indicator_color6 CLR_NONE, clrGold +#property indicator_style6 STYLE_DASHDOTDOT +#property indicator_width6 1 + +// +// FIBBO Level 3 ... + +// +#define fl3BufferIndex 10 +#define fl3BufferPlotIndex 6 +double fl3Buffer[]; + +// +#define fl3ColorBufferIndex 11 +double fl3ColorBuffer[]; + +// +#property indicator_label7 "X121_XMAN FL3" +#property indicator_type7 DRAW_COLOR_LINE +#property indicator_color7 CLR_NONE, clrGold +#property indicator_style7 STYLE_DASHDOTDOT +#property indicator_width7 1 + +// +// FIBBO Level 4 ... + +// +#define fl4BufferIndex 12 +#define fl4BufferPlotIndex 7 +double fl4Buffer[]; + +// +#define fl4ColorBufferIndex 13 +double fl4ColorBuffer[]; + +// +#property indicator_label8 "X121_XMAN FL4" +#property indicator_type8 DRAW_COLOR_LINE +#property indicator_color8 CLR_NONE, clrGold +#property indicator_style8 STYLE_DASHDOTDOT +#property indicator_width8 1 + +// +// FIBBO Level 5 ... + +// +#define fl5BufferIndex 14 +#define fl5BufferPlotIndex 8 +double fl5Buffer[]; + +// +#define fl5ColorBufferIndex 15 +double fl5ColorBuffer[]; + +// +#property indicator_label9 "X121_XMAN FL5" +#property indicator_type9 DRAW_COLOR_LINE +#property indicator_color9 CLR_NONE, clrGold +#property indicator_style9 STYLE_DASHDOTDOT +#property indicator_width9 1 + +// +// LEVELS ... + +// +#define sHHBufferIndex 16 +#define sHHBufferPlotIndex 9 +double sHHBuffer[]; + +// +#define sHHColorBufferIndex 17 +double sHHColorBuffer[]; + +// +#property indicator_label10 "X121_XMAN SHH" +#property indicator_type10 DRAW_COLOR_LINE +#property indicator_color10 CLR_NONE, clrLightGray, clrAqua, clrMagenta +#property indicator_style10 STYLE_DOT +#property indicator_width10 1 + +#define sLLBufferIndex 18 +#define sLLBufferPlotIndex 10 +double sLLBuffer[]; + +// +#define sLLColorBufferIndex 19 +double sLLColorBuffer[]; + +// +#property indicator_label11 "X121_XMAN SLL" +#property indicator_type11 DRAW_COLOR_LINE +#property indicator_color11 CLR_NONE, clrLightGray, clrAqua, clrMagenta +#property indicator_style11 STYLE_DOT +#property indicator_width11 1 + +// +#define mHHBufferIndex 20 +#define mHHBufferPlotIndex 11 +double mHHBuffer[]; + +// +#define mHHColorBufferIndex 21 +double mHHColorBuffer[]; + +// +#property indicator_label12 "X121_XMAN MHH" +#property indicator_type12 DRAW_COLOR_LINE +#property indicator_color12 CLR_NONE, clrLightGray, clrAqua, clrMagenta +#property indicator_style12 STYLE_DOT +#property indicator_width12 1 + +// +#define mLLBufferIndex 22 +#define mLLBufferPlotIndex 12 +double mLLBuffer[]; + +// +#define mLLColorBufferIndex 23 +double mLLColorBuffer[]; + +// +#property indicator_label13 "X121_XMAN MLL" +#property indicator_type13 DRAW_COLOR_LINE +#property indicator_color13 CLR_NONE, clrLightGray, clrAqua, clrMagenta +#property indicator_style13 STYLE_DOT +#property indicator_width13 1 + +// +#define lHHBufferIndex 24 +#define lHHBufferPlotIndex 13 +double lHHBuffer[]; + +// +#define lHHColorBufferIndex 25 +double lHHColorBuffer[]; + +// +#property indicator_label14 "X121_XMAN LHH" +#property indicator_type14 DRAW_COLOR_LINE +#property indicator_color14 CLR_NONE, clrLightGray, clrAqua, clrMagenta +#property indicator_style14 STYLE_DOT +#property indicator_width14 1 + +// +#define lLLBufferIndex 26 +#define lLLBufferPlotIndex 14 +double lLLBuffer[]; + +// +#define lLLColorBufferIndex 27 +double lLLColorBuffer[]; + +// +#property indicator_label15 "X121_XMAN LLL" +#property indicator_type15 DRAW_COLOR_LINE +#property indicator_color15 CLR_NONE, clrLightGray, clrAqua, clrMagenta +#property indicator_style15 STYLE_DOT +#property indicator_width15 1 + +// +#define hHHBufferIndex 28 +#define hHHBufferPlotIndex 15 +double hHHBuffer[]; + +// +#define hHHColorBufferIndex 29 +double hHHColorBuffer[]; + +// +#property indicator_label16 "X121_XMAN HHH" +#property indicator_type16 DRAW_COLOR_LINE +#property indicator_color16 CLR_NONE, clrLightGray, clrAqua, clrMagenta +#property indicator_style16 STYLE_DOT +#property indicator_width16 1 + +// +#define hLLBufferIndex 30 +#define hLLBufferPlotIndex 16 +double hLLBuffer[]; + +// +#define hLLColorBufferIndex 31 +double hLLColorBuffer[]; + +// +#property indicator_label17 "X121_XMAN HLL" +#property indicator_type17 DRAW_COLOR_LINE +#property indicator_color17 CLR_NONE, clrLightGray, clrAqua, clrMagenta +#property indicator_style17 STYLE_DOT +#property indicator_width17 1 + +// +// XSTR Buffers ... + +// +#define fillUpBufferIndex 32 +double fillUpBuffer[]; + +#define fillDownBufferIndex 33 +double fillDownBuffer[]; + +// +#define fillingBufferPlotIndex 17 + +// +#property indicator_label18 "X121_XMAN TRND Filling" +#property indicator_type18 DRAW_FILLING +#property indicator_color18 clrBisque, clrPaleGreen + +// +#define trendBufferIndex 34 +#define trendBufferPlotIndex 18 +double trendBuffer[]; + +// +#define trendColorBufferIndex 35 +double trendColorBuffer[]; + +// +#property indicator_label19 "X121_XMAN TRND" +#property indicator_type19 DRAW_COLOR_LINE +#property indicator_color19 CLR_NONE, clrGreen, clrDarkRed +#property indicator_style19 STYLE_DOT +#property indicator_width19 1 + +// +// XMRB ... + +// +// RIBBON 1 ... +// High ... + +// +#define ribbon1BufferIndex 36 +#define ribbon1BufferPlotIndex 19 +double ribbon1Buffer[]; + +// +#define ribbon1ColorBufferIndex 37 +double ribbon1ColorBuffer[]; + +// +#property indicator_label20 "X121_XMAN RB 1" +#property indicator_type20 DRAW_COLOR_LINE +#property indicator_color20 CLR_NONE, clrGray, clrGreen, clrDarkRed +#property indicator_style20 STYLE_DASH +#property indicator_width20 1 + +// +// RIBBON 2 ... +// Open ... + +// +#define ribbon2BufferIndex 38 +#define ribbon2BufferPlotIndex 20 +double ribbon2Buffer[]; + +// +#define ribbon2ColorBufferIndex 39 +double ribbon2ColorBuffer[]; + +// +#property indicator_label21 "X121_XMAN RB 2" +#property indicator_type21 DRAW_COLOR_LINE +#property indicator_color21 CLR_NONE, clrGray, clrGreen, clrDarkRed +#property indicator_style21 STYLE_DASH +#property indicator_width21 1 + +// +// RIBBON 3 ... +// Close ... + +// +#define ribbon3BufferIndex 40 +#define ribbon3BufferPlotIndex 21 +double ribbon3Buffer[]; + +// +#define ribbon3ColorBufferIndex 41 +double ribbon3ColorBuffer[]; + +// +#property indicator_label22 "X121_XMAN RB 3" +#property indicator_type22 DRAW_COLOR_LINE +#property indicator_color22 CLR_NONE, clrGray, clrGreen, clrDarkRed +#property indicator_style22 STYLE_DASH +#property indicator_width22 1 + +// +// RIBBON 4 ... +// Median ... + +// +#define ribbon4BufferIndex 42 +#define ribbon4BufferPlotIndex 22 +double ribbon4Buffer[]; + +// +#define ribbon4ColorBufferIndex 43 +double ribbon4ColorBuffer[]; + +// +#property indicator_label23 "X121_XMAN RB 4" +#property indicator_type23 DRAW_COLOR_LINE +#property indicator_color23 CLR_NONE, clrGray, clrGreen, clrDarkRed +#property indicator_style23 STYLE_DASH +#property indicator_width23 1 + +// +// RIBBON 5 ... +// Typical ... + +// +#define ribbon5BufferIndex 44 +#define ribbon5BufferPlotIndex 23 +double ribbon5Buffer[]; + +// +#define ribbon5ColorBufferIndex 45 +double ribbon5ColorBuffer[]; + +// +#property indicator_label24 "X121_XMAN RB 5" +#property indicator_type24 DRAW_COLOR_LINE +#property indicator_color24 CLR_NONE, clrGray, clrGreen, clrDarkRed +#property indicator_style24 STYLE_DASH +#property indicator_width24 1 + +// +// RIBBON 6 ... +// Low ... + +// +#define ribbon6BufferIndex 46 +#define ribbon6BufferPlotIndex 24 +double ribbon6Buffer[]; + +// +#define ribbon6ColorBufferIndex 47 +double ribbon6ColorBuffer[]; + +// +#property indicator_label25 "X121_XMAN RB 6" +#property indicator_type25 DRAW_COLOR_LINE +#property indicator_color25 CLR_NONE, clrGray, clrGreen, clrDarkRed +#property indicator_style25 STYLE_DASH +#property indicator_width25 1 + +// +// XSSLC ... + +// +#define sslcUpBufferIndex 48 +#define sslcUpBufferPlotIndex 25 +double sslcUpBuffer[]; + +// +#define sslcUpColorBufferIndex 49 +double sslcUpColorBuffer[]; + +// +#property indicator_label26 "X121_XMAN SSLC Up" +#property indicator_type26 DRAW_COLOR_LINE +#property indicator_color26 CLR_NONE, clrLime +#property indicator_style26 STYLE_SOLID +#property indicator_width26 1 + +// +#define sslcDownBufferIndex 50 +#define sslcDownBufferPlotIndex 26 +double sslcDownBuffer[]; + +// +#define sslcDownColorBufferIndex 51 +double sslcDownColorBuffer[]; + +// +#property indicator_label27 "X121_XMAN SSLC Down" +#property indicator_type27 DRAW_COLOR_LINE +#property indicator_color27 CLR_NONE, clrRed +#property indicator_style27 STYLE_SOLID +#property indicator_width27 1 + +// +// XHULL ... + +// +// UP Zone ... + +// +#define hullUpZoneBufferIndex 52 +#define hullUpZoneBufferPlotIndex 27 +#define hullUpZoneColorBufferIndex 53 + +// +double hullUpZoneBuffer[]; +double hullUpZoneColorBuffer[]; + +// +#property indicator_label28 "X121_XMAN HULL Up" +#property indicator_type28 DRAW_COLOR_LINE +#property indicator_color28 CLR_NONE, clrGray, clrAqua, clrMagenta +#property indicator_width28 1 + +// +// DOWN Zone ... + +// +#define hullDownZoneBufferIndex 54 +#define hullDownZoneBufferPlotIndex 28 +#define hullDownZoneColorBufferIndex 55 + +// +double hullDownZoneBuffer[]; +double hullDownZoneColorBuffer[]; + +// +#property indicator_label29 "X121_XMAN HULL Down" +#property indicator_type29 DRAW_COLOR_LINE +#property indicator_color29 CLR_NONE, clrGray, clrAqua, clrMagenta +#property indicator_width29 1 + +// +// Open ... +#define hkOpenBufferIndex 56 +double hkOpenBuffer[]; + +// +// High ... +#define hkHighBufferIndex 57 +double hkHighBuffer[]; + +// +// Low ... +#define hkLowBufferIndex 58 +double hkLowBuffer[]; + +// +// Close ... +#define hkCloseBufferIndex 59 +double hkCloseBuffer[]; + +// +// Candle Color ... +#define hkCandleColorBufferIndex 60 +double hkCandleColorBuffer[]; + +// +#define hkCandlesBufferIndex 29 + +// +#property indicator_label30 "X121_XMAN HK Open;X121_XMAN HK High;X121_XMAN HK Low;X121_XMAN HK Close" +#property indicator_type30 DRAW_COLOR_CANDLES +#property indicator_color30 CLR_NONE, clrAqua, clrMagenta + +// +// Open ... +#define smhkOpenBufferIndex 61 +double smhkOpenBuffer[]; + +// +// High ... +#define smhkHighBufferIndex 62 +double smhkHighBuffer[]; + +// +// Low ... +#define smhkLowBufferIndex 63 +double smhkLowBuffer[]; + +// +// Close ... +#define smhkCloseBufferIndex 64 +double smhkCloseBuffer[]; + +// +// Candle Color ... +#define smhkCandleColorBufferIndex 65 +double smhkCandleColorBuffer[]; + +// +#define smhkCandlesBufferIndex 30 + +// +#property indicator_label31 "X121_XMAN SMHK Open;X121_XMAN SMHK High;X121_XMAN SMHK Low;X121_XMAN SMHK Close" +#property indicator_type31 DRAW_COLOR_CANDLES +#property indicator_color31 CLR_NONE, clrOliveDrab, clrSaddleBrown + +// +// DATA Buffers ... + +#define lastBufferIndex 65 + +// +// 66 +#define atrBufferIndex lastBufferIndex + 1 +double atrBuffer[]; + +// +// 67 +#define trendStateBufferIndex lastBufferIndex + 2 +double trendStateBuffer[]; + +// +// 68 +#define upBufferIndex lastBufferIndex + 3 +double upBuffer[]; + +// +// 69 +#define downBufferIndex lastBufferIndex + 4 +double downBuffer[]; + +// +// 70 +#define priceBufferIndex lastBufferIndex + 5 +double priceBuffer[]; + +// +// 71 +#define sslcUpMaBufferIndex lastBufferIndex + 6 +double sslcUpMaBuffer[]; + +// +// 72 +#define sslcDownMaBufferIndex lastBufferIndex + 7 +double sslcDownMaBuffer[]; + +// +// 73 +#define sslcKpiBufferIndex lastBufferIndex + 8 +double sslcKpiBuffer[]; + +// +// STATE Buffers ... + +// +// 74 +// When new Peaks Happens it's Valued otherwise EMPTY_VALUE ... +#define peaksStateBufferIndex lastBufferIndex + 9 +double peaksStateBuffer[]; + +// +// 75 +// When new Vales Happens it's Valued otherwise EMPTY_VALUE ... +#define valesStateBufferIndex lastBufferIndex + 10 +double valesStateBuffer[]; + +// +// SHORT Cycle ... + +// +// 76 +#define sHHStateBufferIndex lastBufferIndex + 11 +double sHHStateBuffer[]; + +// +// 77 +#define sLLStateBufferIndex lastBufferIndex + 12 +double sLLStateBuffer[]; + +// +// MEDIUM Cycle ... + +// +// 78 +#define mHHStateBufferIndex lastBufferIndex + 13 +double mHHStateBuffer[]; + +// +// 79 +#define mLLStateBufferIndex lastBufferIndex + 14 +double mLLStateBuffer[]; + +// +// LONG Cycle ... + +// +// 80 +#define lHHStateBufferIndex lastBufferIndex + 15 +double lHHStateBuffer[]; + +// +// 81 +#define lLLStateBufferIndex lastBufferIndex + 16 +double lLLStateBuffer[]; + +// +// HIND Cycle ... + +// +// 82 +#define hHHStateBufferIndex lastBufferIndex + 17 +double hHHStateBuffer[]; + +// +// 83 +#define hLLStateBufferIndex lastBufferIndex + 18 +double hLLStateBuffer[]; + +// +// XSTR ... +// 84 +#define strTrendStateBufferIndex lastBufferIndex + 19 +double strTrendStateBuffer[]; + +// +// XMRB ... + +// +// RIBBON 1 (High) ... +// 85 +#define rb1StateBufferIndex lastBufferIndex + 20 +double rb1StateBuffer[]; + +// +// RIBBON 2 (Open) ... +// 86 +#define rb2StateBufferIndex lastBufferIndex + 21 +double rb2StateBuffer[]; + +// +// RIBBON 3 (Close) ... +// 87 +#define rb3StateBufferIndex lastBufferIndex + 22 +double rb3StateBuffer[]; + +// +// RIBBON 4 (Median) ... +// 88 +#define rb4StateBufferIndex lastBufferIndex + 23 +double rb4StateBuffer[]; + +// +// RIBBON 5 (Typical) ... +// 89 +#define rb5StateBufferIndex lastBufferIndex + 24 +double rb5StateBuffer[]; + +// +// RIBBON 6 (Low) ... +// 90 +#define rb6StateBufferIndex lastBufferIndex + 25 +double rb6StateBuffer[]; + +// +// XHULL ... + +// +// 91 +#define hullUpStateBufferIndex lastBufferIndex + 26 +double hullUpStateBuffer[]; + +// +// 92 +#define hullDownStateBufferIndex lastBufferIndex + 27 +double hullDownStateBuffer[]; + +// +// XHK ... +// 93 +#define hkStateBufferIndex lastBufferIndex + 28 +double hkStateBuffer[]; + +// +// END Buffers ... +// + +// +// START Global Definitions: Variables, Properties and etc ... +// + +// +int maxLength; + +// +double lastPeak; +double lastVale; + +// +double mLastSHH = 0; +double mLastSLL = 0; + +// +double mLastMHH = 0; +double mLastMLL = 0; + +// +double mLastLHH = 0; +double mLastLLL = 0; + +// +double mLastHHH = 0; +double mLastHLL = 0; + +// +double mHideColorIDX = 0; + +// +int currentPeriodSecconds = 0; + +// +// CYCLE 1 ... +int mL1Candles; +int mL1PeriodSecconds = 0; +int mLastL1StartBarIndex = 0; +datetime mLastL1StartTime = NULL; +ENUM_TIMEFRAMES mL1Period = NULL; + +// +// CYCLE 2 ... +int mL2Candles; +int mL2PeriodSecconds = 0; +int mLastL2StartBarIndex = 0; +datetime mLastL2StartTime = NULL; +ENUM_TIMEFRAMES mL2Period = NULL; + +// +// CYCLE 3 ... +int mL3Candles; +int mL3PeriodSecconds = 0; +int mLastL3StartBarIndex = 0; +datetime mLastL3StartTime = NULL; +ENUM_TIMEFRAMES mL3Period = NULL; + +// +// CYCLE 4 ... +int mL4Candles; +int mL4PeriodSecconds = 0; +int mLastL4StartBarIndex = 0; +datetime mLastL4StartTime = NULL; +ENUM_TIMEFRAMES mL4Period = NULL; + +// +// XSTR ... + +// +int atrHandler = INVALID_HANDLE; + +// +int changeOfTrend; +int startBearishTrend; +int startBullishTrend; + +// +int mStrLength; + +// +// XMRB ... + +int mMRBLength; +int mMRBAMAFast = 2; +int mMRBAMASlow = 30; + +// +int rb1Handler = INVALID_HANDLE; +int rb2Handler = INVALID_HANDLE; +int rb3Handler = INVALID_HANDLE; +int rb4Handler = INVALID_HANDLE; +int rb5Handler = INVALID_HANDLE; +int rb6Handler = INVALID_HANDLE; + +// +// XSSLC ... + +// +int mSSLCLength; + +// +int sslcUpHandler = INVALID_HANDLE; +int sslcDownHandler = INVALID_HANDLE; + +// +// XHULL ... + +// +int mHULLLength; + +// +XSCHull *mUpZHull; +XSCHull *mDownZHull; + +// +double mLastHullUpValue; +double mLastHullUpColorValue = 1; +double mLastHullDownValue; +double mLastHullDownColorValue = 1; + +// +// XCC ... + +// +XChartStyle chartStyle; +XChartStyle clearStyle; + +// +int mHKSmoothingLength; + +// +// END Global Definitions: Variables, Properties and etc ... +// + +// +// START Event Handlers ... +// + +// +// Initialization ... +int OnInit() +{ + // + // Parse Configs ... + if (!ParseConfigs()) + { + return INIT_PARAMETERS_INCORRECT; + } + + // + // Validate Inputs ... + if (!ValidateInputs()) + { + return INIT_PARAMETERS_INCORRECT; + } + + // + InitCandleTimer(); + + // + // Initial Periods ... + InitialCycles(); + + // + drawPrefix = ShortName; + + // + // because in some cases we may have more than one input for + // calculation and we must prevent any calculation + // untill we pass the biggest input length, here we get max Input length + // and then wait until pass it ... + maxLength = ExtractMaxLengthOfInputs(); + + // + // We Can Choose ATR Length based on Other Cycles ... + mStrLength = mL4Candles * 3; + atrHandler = iATR( + _Symbol, + _Period, + mStrLength); + if (atrHandler == INVALID_HANDLE) + { + return INIT_FAILED; + } + + // + mMRBLength = mL4Candles; + if (!InitRibbons()) + { + return INIT_FAILED; + } + + // + mSSLCLength = mL4Candles; + if (!InitSSLChannel()) + { + return INIT_FAILED; + } + + // + mHULLLength = mL4Candles; + if (!InitHullTrend()) + { + return INIT_FAILED; + } + + // + mHKSmoothingLength = mL4Candles * 3; + + // + // Define Index Buffers ... + DefineBuffers(); + + // + // Set Indicator ShortName ... + SetIndicatorName(); + + // + // Apply Chart Style ... + ApplyCustomChartStyle(); + + // + // Init Succeed ... + return INIT_SUCCEEDED; +} + +// +// DeInitialization ... +void OnDeinit(const int reason) +{ + // + // REASON_PROGRAM 0 The EA has stopped working calling the ExpertRemove() function + // REASON_REMOVE 1 Program removed from a chart + // REASON_RECOMPILE 2 Program recompiled + // REASON_CHARTCHANGE 3 A symbol or a chart period is changed + // REASON_CHARTCLOSE 4 Chart closed + // REASON_PARAMETERS 5 Inputs changed by a user + // REASON_ACCOUNT 6 Another account has been activated or reconnection to the trade server has occurred due to changes in the account settings + // REASON_TEMPLATE 7 Another chart template applied + // REASON_INITFAILED 8 The OnInit() handler returned a non-zero value + // REASON_CLOSE 9 Terminal closed + + // + // Here we can handle De Initialization Reasons ... + IndicatorRelease(atrHandler); + + // + // XMRB ... + IndicatorRelease(rb1Handler); + IndicatorRelease(rb2Handler); + IndicatorRelease(rb3Handler); + IndicatorRelease(rb4Handler); + IndicatorRelease(rb5Handler); + IndicatorRelease(rb6Handler); + + // + // XSSLC ... + IndicatorRelease(sslcUpHandler); + IndicatorRelease(sslcDownHandler); + + // + // XHULL ... + delete mUpZHull; + delete mDownZHull; + + // + ObjectDelete(0, ShortName); + + // + Comment(""); +} + +// +// Calculating what we want ... +int OnCalculate( + // + // total Candles on chart ... + const int rates_total, + // + // total calculated Candles on charts ... + const int prev_calculated, + // + // history of Candles Open Time ... + const datetime &time[], + // + // history of Candles Open Price ... + const double &open[], + // + // history of Candles High Price ... + const double &high[], + // + // history of Candles Low Price ... + const double &low[], + // + // history of Candles Close Price ... + const double &close[], + // + // history of Tick Volumes on Candle ... + const long &tick_volume[], + // + // history of Trade Volumes ... + const long &volume[], + // + // history of Candles Spread Price ... + const int &spread[]) +{ + // + // Calculate Candle Remain Time ... + CalculateCandleTimer(); + + // + // this counts Available Bars ... + int limit; + + // + limit = prev_calculated - 1; + if (limit < 0) + { + limit = 0; + } + + // + // Main Loop ... + for (int i = limit; i < rates_total && !IsStopped(); i++) + { + // + double upPrice = GetAppliedPrice( + hullUpAppliedTo, + open, high, low, close, i); + + // + double downPrice = GetAppliedPrice( + hullDownAppliedTo, + open, high, low, close, i); + + // + CalculateHull(i, rates_total, upPrice, downPrice); + } + + // + bool isXSTRCalculated = CalculateXSTR( + rates_total, + prev_calculated, + open, + high, + low, + close); + if (!isXSTRCalculated) + { + return prev_calculated; + } + + // + // Prepare Buffers ... + ArraySetAsSeries(time, true); + ArraySetAsSeries(open, true); + ArraySetAsSeries(high, true); + ArraySetAsSeries(low, true); + ArraySetAsSeries(close, true); + ArraySetAsSeries(tick_volume, true); + ArraySetAsSeries(volume, true); + ArraySetAsSeries(spread, true); + + // + + // + // Checking Handlers Calculated Bars ... + + // + // XMRB ... + int rb1CalculatedBars = BarsCalculated(rb1Handler); + int rb2CalculatedBars = BarsCalculated(rb2Handler); + int rb3CalculatedBars = BarsCalculated(rb3Handler); + int rb4CalculatedBars = BarsCalculated(rb4Handler); + int rb5CalculatedBars = BarsCalculated(rb5Handler); + int rb6CalculatedBars = BarsCalculated(rb6Handler); + + // + // XSSLC ... + int sslcUpCalculatedBars = BarsCalculated(sslcUpHandler); + int sslcDownCalculatedBars = BarsCalculated(sslcDownHandler); + + // + bool isCalculatedBarsNotPassed = + // + // XMRB ... + rb1CalculatedBars < maxLength || + rb2CalculatedBars < maxLength || + rb3CalculatedBars < maxLength || + rb4CalculatedBars < maxLength || + rb5CalculatedBars < maxLength || + rb6CalculatedBars < maxLength || + // + // XSSLC ... + sslcUpCalculatedBars < maxLength || + sslcDownCalculatedBars < maxLength + // + ; + + // + if (isCalculatedBarsNotPassed) + { + return prev_calculated; + } + + // + limit = (prev_calculated > rates_total || prev_calculated <= 0) ? rates_total : (rates_total - prev_calculated) + 1; + + // + // Check Handlers Copied Bars ... + + // + // XMRB ... + int rb1CopiedBars = CopyBuffer(rb1Handler, 0, 0, limit, ribbon1Buffer); + int rb2CopiedBars = CopyBuffer(rb2Handler, 0, 0, limit, ribbon2Buffer); + int rb3CopiedBars = CopyBuffer(rb3Handler, 0, 0, limit, ribbon3Buffer); + int rb4CopiedBars = CopyBuffer(rb4Handler, 0, 0, limit, ribbon4Buffer); + int rb5CopiedBars = CopyBuffer(rb5Handler, 0, 0, limit, ribbon5Buffer); + int rb6CopiedBars = CopyBuffer(rb6Handler, 0, 0, limit, ribbon6Buffer); + + // + // XSSLC ... + int sslcUpCopiedBars = CopyBuffer(sslcUpHandler, 0, 0, limit, sslcUpMaBuffer); + int sslcDownCopiedBars = CopyBuffer(sslcDownHandler, 0, 0, limit, sslcDownMaBuffer); + + // + bool isCopiedBarsNotPassed = + // + // XMRB ... + rb1CopiedBars < 0 || + rb2CopiedBars < 0 || + rb3CopiedBars < 0 || + rb4CopiedBars < 0 || + rb5CopiedBars < 0 || + rb6CopiedBars < 0 || + // + // XSSLC ... + sslcUpCopiedBars < 0 || + sslcDownCopiedBars < 0 + // + ; + + // + if (isCopiedBarsNotPassed) + { + return prev_calculated; + } + + // + // Main Loop ... + for (int i = limit - 1; i >= 0 && !IsStopped(); i--) + { + // + CalculateBuffers(i); + + // + CalculateRibbonsColors(i, low, high); + + // + CalculateHikenAshi(i, prev_calculated, rates_total, open, high, close, low); + + // + CalculateSSLC(i, limit, rates_total, prev_calculated, close); + } + + // + CalculateSMHK(rates_total, prev_calculated); + + // + return rates_total; +} + +// +// END Event Handlers ... +// + +// +// START Functions ... +// + +// +// Parse Configs ... +bool ParseConfigs() +{ + // + bool result = false; + + // + // Since we Use Default Values ... + // Apply Changes Only When it's Provided ... + + // + bool hasCTConfig = StringLen(cTimerConfig) > 0; + if (hasCTConfig) + { + // + XCTimerConfig cfg = ParseCTimerConfig(cTimerConfig); + + // + candleTimerColor = cfg.candleTimerColor; + candleTimerCorner = cfg.candleTimerCorner; + } + + // + bool hasChartConfig = StringLen(cStyleConfig) > 0; + if (hasChartConfig) + { + // + XChartStyleConfig cfg = ParseChartStyleConfig(cStyleConfig); + + // + upColor = cfg.upColor; + downColor = cfg.downColor; + lineColor = cfg.lineColor; + bearishColor = cfg.bearishColor; + bullishColor = cfg.bullishColor; + volumesColor = cfg.volumesColor; + chartMode = cfg.chartMode; + } + + // + bool hasSCConfig = StringLen(scConfig) > 0; + if (hasSCConfig) + { + // + XSCConfig cfg = PrseSCConfig(scConfig); + + // + l1Method = cfg.l1Method; + l1Period = cfg.l1Period; + } + + // + bool hasMCConfig = StringLen(mcConfig) > 0; + if (hasMCConfig) + { + // + XMCConfig cfg = PrseMCConfig(mcConfig); + + // + l2Method = cfg.l2Method; + l2Period = cfg.l2Period; + } + + // + bool hasLCConfig = StringLen(lcConfig) > 0; + if (hasLCConfig) + { + // + XLCConfig cfg = PrseLCConfig(lcConfig); + + // + l3Method = cfg.l3Method; + l3Period = cfg.l3Period; + } + + // + bool hasHCConfig = StringLen(hcConfig) > 0; + if (hasHCConfig) + { + // + XHCConfig cfg = PrseHCConfig(hcConfig); + + // + l4Method = cfg.l4Method; + l4Period = cfg.l4Period; + } + + // + bool hasFibConfig = StringLen(fibConfig) > 0; + if (hasFibConfig) + { + // + XFiboConfig cfg = PrseFiboConfig(fibConfig); + + // + fiboLevel1 = cfg.fiboLevel1; + fiboLevel2 = cfg.fiboLevel2; + fiboLevel3 = cfg.fiboLevel3; + fiboLevel4 = cfg.fiboLevel4; + fiboLevel5 = cfg.fiboLevel5; + } + + // + bool hasBDConfig = StringLen(bdConfig) > 0; + if (hasBDConfig) + { + // + XBDConfig cfg = ParseBDConfig(bdConfig); + + // + hhMode = cfg.hhMode; + llMode = cfg.llMode; + } + + // + bool hasTDConfig = StringLen(tdConfig) > 0; + if (hasTDConfig) + { + // + XTDConfig cfg = ParseTDConfig(tdConfig); + + // + trendMultiplier = cfg.trendMultiplier; + trendPriceAppliedTo = cfg.trendPriceAppliedTo; + } + + // + bool hasRBConfig = StringLen(rbConfig) > 0; + if (hasRBConfig) + { + // + XRBConfig cfg = ParseRBConfig(rbConfig); + + // + ribbonMode = cfg.ribbonMode; + } + + // + bool hasHullConfig = StringLen(hullConfig) > 0; + if (hasHullConfig) + { + // + XHullConfig cfg = ParseHullConfig(hullConfig); + + // + hullDivisor = cfg.hullDivisor; + hullUpAppliedTo = cfg.hullUpAppliedTo; + hullDownAppliedTo = cfg.hullDownAppliedTo; + } + + // + bool hasSSLCConfig = StringLen(sslcConfig) > 0; + if (hasSSLCConfig) + { + // + XSSLCConfig cfg = ParseSSLCConfig(sslcConfig); + + // + sslcMode = cfg.sslcMode; + sslcUpAppliedTo = cfg.sslcUpAppliedTo; + sslcDownAppliedTo = cfg.sslcDownAppliedTo; + } + + // + bool hasStylePresentationConfig = StringLen(stylePRSConfig) > 0; + if (hasStylePresentationConfig) + { + // + XStylePresentationConfig cfg = ParseStylePresentationConfig(stylePRSConfig); + + // + showCandleTimer = cfg.showCandleTimer; + showCandles = cfg.showCandles; + showHKCandles = cfg.showHKCandles; + showSMHKCandles = cfg.showSMHKCandles; + } + + // + bool hasPVPresentationConfig = StringLen(pvPRSConfig) > 0; + if (hasPVPresentationConfig) + { + // + XPVPresentationConfig cfg = ParsePVPresentationConfig(pvPRSConfig); + + // + showPeaksAndVales = cfg.showPeaksAndVales; + showLevels = cfg.showLevels; + showConsolidations = cfg.showConsolidations; + } + + // + bool hasSTrendPresentationConfig = StringLen(trendPRSConfig) > 0; + if (hasSTrendPresentationConfig) + { + // + XTrendPresentationConfig cfg = ParseTrendPresentationConfig(trendPRSConfig); + + // + showHull = cfg.showHull; + showTrends = cfg.showTrends; + fillTrends = cfg.fillTrends; + showRibbons = cfg.showRibbons; + showSSLChannel = cfg.showSSLChannel; + } + + // + bool hasFiboPresentationConfig = StringLen(fiboPRSConfig) > 0; + if (hasFiboPresentationConfig) + { + // + XFiboPresentationConfig cfg = ParePresentationConfig(fiboPRSConfig); + + // + showFibo1Levels = cfg.showFibo1Levels; + showFibo2Levels = cfg.showFibo2Levels; + showFibo3Levels = cfg.showFibo3Levels; + showFibo4Levels = cfg.showFibo4Levels; + showFibo5Levels = cfg.showFibo5Levels; + } + + // + result = true; + + // + return result; +} + +// +// Validate Input Args for Initialization ... +bool ValidateInputs() +{ + // + bool result = true; + + // + // Validate User Inputs ... + result = + // + // L1 ... + // Short Cycle ... + ( + // + l1Method == X_PERIOD_AUTO + ? l1Period == NULL + : l1Period != NULL && l1Method != X_PERIOD_NOTHING + // + ) + // + && + // + // L2 ... + // Medium Cycle ... + ( + // + l2Method == X_PERIOD_AUTO + ? l2Period == NULL + : l2Period != NULL && l2Method != X_PERIOD_NOTHING + // + ) + // + && + // + // L3 ... + // Long Cycle ... + ( + // + l3Method == X_PERIOD_AUTO + ? l3Period == NULL + : l3Period != NULL && l3Method != X_PERIOD_NOTHING + // + ) + // + && + // + // L4 ... + // Hind Cycle ... + ( + // + l4Method == X_PERIOD_AUTO + ? l4Period == NULL + : l4Period != NULL && l4Method != X_PERIOD_NOTHING + // + ) + // + && + // + // Validate Ribbon ... + ( + // + ribbonMode != X_MA_NOTHING + // + ) + // + ; + + // + return result; +} + +// +// Retrieve all Exists Input Max Length ... +// use for Start Of Drawing ... +int ExtractMaxLengthOfInputs() +{ + // + int result = 1; + + // + result = MathMax(result, mL1Candles); + result = MathMax(result, mL2Candles); + result = MathMax(result, mL3Candles); + result = MathMax(result, mL4Candles); + + // + return result; +} + +// +// Init Candle Timer ... +void InitCandleTimer() +{ + // + // Validate Inputs ... + if (showCandleTimer) + { + CreateIndicatorObject(); + } + else + { + ObjectDelete(0, ShortName); + } +} + +// +// Initial Multi Time Frame Cycles Periods ... +void InitialCycles() +{ + // + // Calculate Current Period Secconds ... + currentPeriodSecconds = PeriodSeconds(_Period); + + // + // Nearest ... + // Calculate Cycle 1 Requirements ... + if (mL1Period == NULL) + { + // + if (l1Method == X_PERIOD_AUTO) + { + mL1Period = GetNearestTimeFrame(_Period); + } + else + { + mL1Period = l1Period; + } + + // + mL1PeriodSecconds = PeriodSeconds(mL1Period); + + // + mL1Candles = mL1PeriodSecconds / currentPeriodSecconds; + } + + // + // Mediest ... + // Calculate Cycle 2 Requirements ... + if (mL2Period == NULL) + { + // + if (l2Method == X_PERIOD_AUTO) + { + mL2Period = GetMediestTimeFrame(_Period); + } + else + { + mL2Period = l2Period; + } + + // + mL2PeriodSecconds = PeriodSeconds(mL2Period); + + // + mL2Candles = mL2PeriodSecconds / currentPeriodSecconds; + } + + // + // Farest ... + // Calculate Cycle 3 Requirements ... + if (mL3Period == NULL) + { + // + if (l3Method == X_PERIOD_AUTO) + { + mL3Period = GetFarestTimeFrame(_Period); + } + else + { + mL3Period = l3Period; + } + + // + mL3PeriodSecconds = PeriodSeconds(mL3Period); + + // + mL3Candles = mL3PeriodSecconds / currentPeriodSecconds; + } + + // + // HindMost ... + // Calculate Cycle 4 Requirements ... + if (mL4Period == NULL) + { + // + if (l4Method == X_PERIOD_AUTO) + { + mL4Period = GetHindmostTimeFrame(_Period); + } + else + { + mL4Period = l4Period; + } + + // + mL4PeriodSecconds = PeriodSeconds(mL4Period); + + // + mL4Candles = mL4PeriodSecconds / currentPeriodSecconds; + } + + // + string comment = GenerateCyclesRepresentation(); + Comment(comment); +} + +// +bool InitRibbons() +{ + // + bool result = false; + + // + if (mMRBLength <= 0) + { + return result; + } + + // + // RIBBON 1 ... + // High ... + result = InitMaHandler( + rb1Handler, + mMRBLength, + ribbonMode, + PRICE_HIGH); + if (!result) + { + return result; + } + + // + // RIBBON 2 ... + // Open ... + result = InitMaHandler( + rb2Handler, + mMRBLength, + ribbonMode, + PRICE_OPEN); + if (!result) + { + return result; + } + + // + // RIBBON 3 ... + // Close ... + result = InitMaHandler( + rb3Handler, + mMRBLength, + ribbonMode, + PRICE_CLOSE); + if (!result) + { + return result; + } + + // + // RIBBON 4 ... + // Median ... + result = InitMaHandler( + rb4Handler, + mMRBLength, + ribbonMode, + PRICE_MEDIAN); + if (!result) + { + return result; + } + + // + // RIBBON 5 ... + // Typical ... + result = InitMaHandler( + rb5Handler, + mMRBLength, + ribbonMode, + PRICE_TYPICAL); + if (!result) + { + return result; + } + + // + // RIBBON 6 ... + // Low ... + result = InitMaHandler( + rb6Handler, + mMRBLength, + ribbonMode, + PRICE_LOW); + + // + return result; +} + +// +bool InitSSLChannel() +{ + // + bool result = false; + + // + if (mSSLCLength <= 0) + { + return result; + } + + // + // SSLUP ... + result = InitMaHandler( + sslcUpHandler, + mSSLCLength, + sslcMode, + sslcUpAppliedTo); + if (!result) + { + return result; + } + + // + // SSLDOWN ... + result = InitMaHandler( + sslcDownHandler, + mSSLCLength, + sslcMode, + sslcDownAppliedTo); + + // + return result; +} + +// +bool InitHullTrend() +{ + // + bool result = false; + + // + if (mHULLLength <= 0) + { + return result; + } + + // + mUpZHull = new XSCHull(); + mUpZHull.Init( + mHULLLength, + hullDivisor); + + // + mDownZHull = new XSCHull(); + mDownZHull.Init( + mHULLLength, + hullDivisor); + + // + result = true; + + // + return result; +} + +// +// Define Indexes and Styles ... +void DefineBuffers() +{ + // + // RANGE ... + + // + // PEAKS and VALES ... + ENUM_DRAW_TYPE pvDrawType = showPeaksAndVales ? DRAW_ARROW : DRAW_NONE; + + // + // PEAKS ... + ArraySetAsSeries(peaksBuffer, true); + SetIndexBuffer(peaksBufferIndex, peaksBuffer, INDICATOR_DATA); + PlotIndexSetInteger(peaksBufferIndex, PLOT_ARROW, 225); + PlotIndexSetDouble(peaksBufferIndex, PLOT_EMPTY_VALUE, 0); + + // + PlotIndexSetInteger(peaksBufferIndex, PLOT_SHOW_DATA, showPeaksAndVales); + PlotIndexSetInteger(peaksBufferIndex, PLOT_DRAW_TYPE, pvDrawType); + + // + // VALES ... + ArraySetAsSeries(valesBuffer, true); + SetIndexBuffer(valesBufferIndex, valesBuffer, INDICATOR_DATA); + PlotIndexSetInteger(valesBufferIndex, PLOT_ARROW, 225); + PlotIndexSetDouble(valesBufferIndex, PLOT_EMPTY_VALUE, 0); + + // + PlotIndexSetInteger(valesBufferIndex, PLOT_SHOW_DATA, showPeaksAndVales); + PlotIndexSetInteger(valesBufferIndex, PLOT_DRAW_TYPE, pvDrawType); + + // + // SUPPORT and RESISTANCE ... + // + + // + // RESISTANCE ... + ArraySetAsSeries(rBuffer, true); + SetIndexBuffer(rBufferIndex, rBuffer, INDICATOR_DATA); + PlotIndexSetInteger(rBufferIndex, PLOT_SHOW_DATA, false); + PlotIndexSetInteger(rBufferIndex, PLOT_DRAW_BEGIN, maxLength); + + // + // RESISTANCE Color ... + ArraySetAsSeries(rColorBuffer, true); + SetIndexBuffer(rColorBufferIndex, rColorBuffer, INDICATOR_COLOR_INDEX); + + // + // SUPPORT ... + ArraySetAsSeries(sBuffer, true); + SetIndexBuffer(sBufferIndex, sBuffer, INDICATOR_DATA); + PlotIndexSetInteger(sBufferPlotIndex, PLOT_DRAW_BEGIN, maxLength); + PlotIndexSetInteger(sBufferPlotIndex, PLOT_SHOW_DATA, false); + + // + // SUPPORT Color ... + ArraySetAsSeries(sColorBuffer, true); + SetIndexBuffer(sColorBufferIndex, sColorBuffer, INDICATOR_COLOR_INDEX); + + // + // FIBBO Levels ... + + // + // LEVEL 1 ... + + // + // Buffer ... + ArraySetAsSeries(fl1Buffer, true); + SetIndexBuffer(fl1BufferIndex, fl1Buffer, INDICATOR_DATA); + PlotIndexSetInteger(fl1BufferPlotIndex, PLOT_DRAW_BEGIN, maxLength); + PlotIndexSetInteger(fl1BufferPlotIndex, PLOT_SHOW_DATA, showFibo1Levels); + + // + // Color ... + ArraySetAsSeries(fl1ColorBuffer, true); + SetIndexBuffer(fl1ColorBufferIndex, fl1ColorBuffer, INDICATOR_COLOR_INDEX); + + // + // LEVEL 2 ... + + // + // Buffer ... + ArraySetAsSeries(fl2Buffer, true); + SetIndexBuffer(fl2BufferIndex, fl2Buffer, INDICATOR_DATA); + PlotIndexSetInteger(fl2BufferPlotIndex, PLOT_DRAW_BEGIN, maxLength); + PlotIndexSetInteger(fl2BufferPlotIndex, PLOT_SHOW_DATA, showFibo2Levels); + + // + // Color ... + ArraySetAsSeries(fl2ColorBuffer, true); + SetIndexBuffer(fl2ColorBufferIndex, fl2ColorBuffer, INDICATOR_COLOR_INDEX); + + // + // LEVEL 3 ... + + // + // Buffer ... + ArraySetAsSeries(fl3Buffer, true); + SetIndexBuffer(fl3BufferIndex, fl3Buffer, INDICATOR_DATA); + PlotIndexSetInteger(fl3BufferPlotIndex, PLOT_DRAW_BEGIN, maxLength); + PlotIndexSetInteger(fl3BufferPlotIndex, PLOT_SHOW_DATA, showFibo3Levels); + + // + // Color ... + ArraySetAsSeries(fl3ColorBuffer, true); + SetIndexBuffer(fl3ColorBufferIndex, fl3ColorBuffer, INDICATOR_COLOR_INDEX); + + // + // LEVEL 4 ... + + // + // Buffer ... + ArraySetAsSeries(fl4Buffer, true); + SetIndexBuffer(fl4BufferIndex, fl4Buffer, INDICATOR_DATA); + PlotIndexSetInteger(fl4BufferPlotIndex, PLOT_DRAW_BEGIN, maxLength); + PlotIndexSetInteger(fl4BufferPlotIndex, PLOT_SHOW_DATA, showFibo4Levels); + + // + // Color ... + ArraySetAsSeries(fl4ColorBuffer, true); + SetIndexBuffer(fl4ColorBufferIndex, fl4ColorBuffer, INDICATOR_COLOR_INDEX); + + // + // LEVEL 5 ... + + // + // Buffer ... + ArraySetAsSeries(fl5Buffer, true); + SetIndexBuffer(fl5BufferIndex, fl5Buffer, INDICATOR_DATA); + PlotIndexSetInteger(fl5BufferPlotIndex, PLOT_DRAW_BEGIN, maxLength); + PlotIndexSetInteger(fl5BufferPlotIndex, PLOT_SHOW_DATA, showFibo5Levels); + + // + // Color ... + ArraySetAsSeries(fl5ColorBuffer, true); + SetIndexBuffer(fl5ColorBufferIndex, fl5ColorBuffer, INDICATOR_COLOR_INDEX); + + // + // SHORT Buffers ... + + // + // HIGH ... + ArraySetAsSeries(sHHBuffer, true); + SetIndexBuffer(sHHBufferIndex, sHHBuffer, INDICATOR_DATA); + + // + PlotIndexSetInteger(sHHBufferPlotIndex, PLOT_DRAW_BEGIN, maxLength); + PlotIndexSetInteger(sHHBufferPlotIndex, PLOT_SHOW_DATA, showLevels); + + // + ArraySetAsSeries(sHHColorBuffer, true); + SetIndexBuffer(sHHColorBufferIndex, sHHColorBuffer, INDICATOR_COLOR_INDEX); + + // + // LOW ... + ArraySetAsSeries(sLLBuffer, true); + SetIndexBuffer(sLLBufferIndex, sLLBuffer, INDICATOR_DATA); + + // + PlotIndexSetInteger(sLLBufferPlotIndex, PLOT_DRAW_BEGIN, maxLength); + PlotIndexSetInteger(sLLBufferPlotIndex, PLOT_SHOW_DATA, showLevels); + + // + ArraySetAsSeries(sLLColorBuffer, true); + SetIndexBuffer(sLLColorBufferIndex, sLLColorBuffer, INDICATOR_COLOR_INDEX); + + // + // MEDIUM Buffer ... + + // + // HIGH ... + ArraySetAsSeries(mHHBuffer, true); + SetIndexBuffer(mHHBufferIndex, mHHBuffer, INDICATOR_DATA); + + // + PlotIndexSetInteger(mHHBufferPlotIndex, PLOT_DRAW_BEGIN, maxLength); + PlotIndexSetInteger(mHHBufferPlotIndex, PLOT_SHOW_DATA, showLevels); + + // + ArraySetAsSeries(mHHColorBuffer, true); + SetIndexBuffer(mHHColorBufferIndex, mHHColorBuffer, INDICATOR_COLOR_INDEX); + + // + // LOW ... + ArraySetAsSeries(mLLBuffer, true); + SetIndexBuffer(mLLBufferIndex, mLLBuffer, INDICATOR_DATA); + + // + PlotIndexSetInteger(mLLBufferPlotIndex, PLOT_DRAW_BEGIN, maxLength); + PlotIndexSetInteger(mLLBufferPlotIndex, PLOT_SHOW_DATA, showLevels); + + // + ArraySetAsSeries(mLLColorBuffer, true); + SetIndexBuffer(mLLColorBufferIndex, mLLColorBuffer, INDICATOR_COLOR_INDEX); + + // + // LONG Buffer ... + + // + // HIGH ... + ArraySetAsSeries(lHHBuffer, true); + SetIndexBuffer(lHHBufferIndex, lHHBuffer, INDICATOR_DATA); + + // + PlotIndexSetInteger(lHHBufferPlotIndex, PLOT_DRAW_BEGIN, maxLength); + PlotIndexSetInteger(lHHBufferPlotIndex, PLOT_SHOW_DATA, showLevels); + + // + ArraySetAsSeries(lHHColorBuffer, true); + SetIndexBuffer(lHHColorBufferIndex, lHHColorBuffer, INDICATOR_COLOR_INDEX); + + // + // LOW ... + ArraySetAsSeries(lLLBuffer, true); + SetIndexBuffer(lLLBufferIndex, lLLBuffer, INDICATOR_DATA); + + // + PlotIndexSetInteger(lLLBufferPlotIndex, PLOT_DRAW_BEGIN, maxLength); + PlotIndexSetInteger(lLLBufferPlotIndex, PLOT_SHOW_DATA, showLevels); + + // + ArraySetAsSeries(lLLColorBuffer, true); + SetIndexBuffer(lLLColorBufferIndex, lLLColorBuffer, INDICATOR_COLOR_INDEX); + + // + // HIND Buffer ... + + // + // HIGH ... + ArraySetAsSeries(hHHBuffer, true); + SetIndexBuffer(hHHBufferIndex, hHHBuffer, INDICATOR_DATA); + + // + PlotIndexSetInteger(hHHBufferPlotIndex, PLOT_DRAW_BEGIN, maxLength); + PlotIndexSetInteger(hHHBufferPlotIndex, PLOT_SHOW_DATA, showLevels); + + // + ArraySetAsSeries(hHHColorBuffer, true); + SetIndexBuffer(hHHColorBufferIndex, hHHColorBuffer, INDICATOR_COLOR_INDEX); + + // + // LOW ... + ArraySetAsSeries(hLLBuffer, true); + SetIndexBuffer(hLLBufferIndex, hLLBuffer, INDICATOR_DATA); + + // + PlotIndexSetInteger(hLLBufferPlotIndex, PLOT_DRAW_BEGIN, maxLength); + PlotIndexSetInteger(hLLBufferPlotIndex, PLOT_SHOW_DATA, showLevels); + + // + ArraySetAsSeries(hLLColorBuffer, true); + SetIndexBuffer(hLLColorBufferIndex, hLLColorBuffer, INDICATOR_COLOR_INDEX); + + // + // XSTR ... + + // + // FILLINGS ... + SetIndexBuffer(fillUpBufferIndex, fillUpBuffer, INDICATOR_DATA); + SetIndexBuffer(fillDownBufferIndex, fillDownBuffer, INDICATOR_DATA); + PlotIndexSetInteger(fillingBufferPlotIndex, PLOT_SHOW_DATA, false); + + // + // MAIN ... + SetIndexBuffer(trendBufferIndex, trendBuffer, INDICATOR_DATA); + PlotIndexSetInteger(trendBufferPlotIndex, PLOT_SHOW_DATA, showTrends); + SetIndexBuffer(trendColorBufferIndex, trendColorBuffer, INDICATOR_COLOR_INDEX); + + // + // RIBBON 1 ... + + // + ArraySetAsSeries(ribbon1Buffer, true); + SetIndexBuffer(ribbon1BufferIndex, ribbon1Buffer, INDICATOR_DATA); + + // + PlotIndexSetInteger(ribbon1BufferPlotIndex, PLOT_DRAW_BEGIN, maxLength); + PlotIndexSetInteger(ribbon1BufferPlotIndex, PLOT_SHOW_DATA, showRibbons); + + // + ArraySetAsSeries(ribbon1ColorBuffer, true); + SetIndexBuffer(ribbon1ColorBufferIndex, ribbon1ColorBuffer, INDICATOR_COLOR_INDEX); + + // + // RIBBON 2 ... + + // + ArraySetAsSeries(ribbon2Buffer, true); + SetIndexBuffer(ribbon2BufferIndex, ribbon2Buffer, INDICATOR_DATA); + + // + PlotIndexSetInteger(ribbon2BufferPlotIndex, PLOT_DRAW_BEGIN, maxLength); + PlotIndexSetInteger(ribbon2BufferPlotIndex, PLOT_SHOW_DATA, showRibbons); + + // + ArraySetAsSeries(ribbon2ColorBuffer, true); + SetIndexBuffer(ribbon2ColorBufferIndex, ribbon2ColorBuffer, INDICATOR_COLOR_INDEX); + + // + // RIBBON 3 ... + + // + ArraySetAsSeries(ribbon3Buffer, true); + SetIndexBuffer(ribbon3BufferIndex, ribbon3Buffer, INDICATOR_DATA); + + // + PlotIndexSetInteger(ribbon3BufferPlotIndex, PLOT_DRAW_BEGIN, maxLength); + PlotIndexSetInteger(ribbon3BufferPlotIndex, PLOT_SHOW_DATA, showRibbons); + + // + ArraySetAsSeries(ribbon3ColorBuffer, true); + SetIndexBuffer(ribbon3ColorBufferIndex, ribbon3ColorBuffer, INDICATOR_COLOR_INDEX); + + // + // RIBBON 4 ... + + // + ArraySetAsSeries(ribbon4Buffer, true); + SetIndexBuffer(ribbon4BufferIndex, ribbon4Buffer, INDICATOR_DATA); + + // + PlotIndexSetInteger(ribbon4BufferPlotIndex, PLOT_DRAW_BEGIN, maxLength); + PlotIndexSetInteger(ribbon4BufferPlotIndex, PLOT_SHOW_DATA, showRibbons); + + // + ArraySetAsSeries(ribbon4ColorBuffer, true); + SetIndexBuffer(ribbon4ColorBufferIndex, ribbon4ColorBuffer, INDICATOR_COLOR_INDEX); + + // + // RIBBON 5 ... + + // + ArraySetAsSeries(ribbon5Buffer, true); + SetIndexBuffer(ribbon5BufferIndex, ribbon5Buffer, INDICATOR_DATA); + + // + PlotIndexSetInteger(ribbon5BufferPlotIndex, PLOT_DRAW_BEGIN, maxLength); + PlotIndexSetInteger(ribbon5BufferPlotIndex, PLOT_SHOW_DATA, showRibbons); + + // + ArraySetAsSeries(ribbon5ColorBuffer, true); + SetIndexBuffer(ribbon5ColorBufferIndex, ribbon5ColorBuffer, INDICATOR_COLOR_INDEX); + + // + // RIBBON 6 ... + + // + ArraySetAsSeries(ribbon6Buffer, true); + SetIndexBuffer(ribbon6BufferIndex, ribbon6Buffer, INDICATOR_DATA); + + // + PlotIndexSetInteger(ribbon6BufferPlotIndex, PLOT_DRAW_BEGIN, maxLength); + PlotIndexSetInteger(ribbon6BufferPlotIndex, PLOT_SHOW_DATA, showRibbons); + + // + ArraySetAsSeries(ribbon6ColorBuffer, true); + SetIndexBuffer(ribbon6ColorBufferIndex, ribbon6ColorBuffer, INDICATOR_COLOR_INDEX); + + // + // XSSLC ... + + // + // UP ... + + // + ArraySetAsSeries(sslcUpBuffer, true); + SetIndexBuffer(sslcUpBufferIndex, sslcUpBuffer, INDICATOR_DATA); + + // + PlotIndexSetInteger(sslcUpBufferPlotIndex, PLOT_DRAW_BEGIN, maxLength); + PlotIndexSetInteger(sslcUpBufferPlotIndex, PLOT_SHOW_DATA, showSSLChannel); + + // + ArraySetAsSeries(sslcUpColorBuffer, true); + SetIndexBuffer(sslcUpColorBufferIndex, sslcUpColorBuffer, INDICATOR_COLOR_INDEX); + + // + // DOWN ... + + // + ArraySetAsSeries(sslcDownBuffer, true); + SetIndexBuffer(sslcDownBufferIndex, sslcDownBuffer, INDICATOR_DATA); + + // + PlotIndexSetInteger(sslcDownBufferPlotIndex, PLOT_DRAW_BEGIN, maxLength); + PlotIndexSetInteger(sslcDownBufferPlotIndex, PLOT_SHOW_DATA, showSSLChannel); + + // + ArraySetAsSeries(sslcDownColorBuffer, true); + SetIndexBuffer(sslcDownColorBufferIndex, sslcDownColorBuffer, INDICATOR_COLOR_INDEX); + + // + // XHULL ... + + // + // UP ... + + // + SetIndexBuffer(hullUpZoneBufferIndex, hullUpZoneBuffer, INDICATOR_DATA); + + // + PlotIndexSetInteger(hullUpZoneBufferPlotIndex, PLOT_DRAW_BEGIN, maxLength); + PlotIndexSetInteger(hullUpZoneBufferPlotIndex, PLOT_SHOW_DATA, showHull); + + // + SetIndexBuffer(hullUpZoneColorBufferIndex, hullUpZoneColorBuffer, INDICATOR_COLOR_INDEX); + + // + // DOWN ... + + // + SetIndexBuffer(hullDownZoneBufferIndex, hullDownZoneBuffer, INDICATOR_DATA); + + // + PlotIndexSetInteger(hullDownZoneBufferPlotIndex, PLOT_DRAW_BEGIN, maxLength); + PlotIndexSetInteger(hullDownZoneBufferPlotIndex, PLOT_SHOW_DATA, showHull); + + // + SetIndexBuffer(hullDownZoneColorBufferIndex, hullDownZoneColorBuffer, INDICATOR_COLOR_INDEX); + + // + // XHK ... + + // + // Candles Color ... + ArraySetAsSeries(hkCandleColorBuffer, true); + SetIndexBuffer(hkCandleColorBufferIndex, hkCandleColorBuffer, INDICATOR_COLOR_INDEX); + + // + // Set EMPTY_VALUE on Candles Buffer ... + PlotIndexSetDouble(hkCandlesBufferIndex, PLOT_EMPTY_VALUE, 0.0); + + // + PlotIndexSetInteger(hkCandlesBufferIndex, PLOT_SHOW_DATA, false); + PlotIndexSetInteger(hkCandleColorBufferIndex, PLOT_SHOW_DATA, false); + + // + // Open ... + ArraySetAsSeries(hkOpenBuffer, true); + PlotIndexSetInteger(hkOpenBufferIndex, PLOT_SHOW_DATA, false); + SetIndexBuffer(hkOpenBufferIndex, hkOpenBuffer, INDICATOR_DATA); + + // + // High ... + ArraySetAsSeries(hkHighBuffer, true); + SetIndexBuffer(hkHighBufferIndex, hkHighBuffer, INDICATOR_DATA); + PlotIndexSetInteger(hkHighBufferIndex, PLOT_SHOW_DATA, false); + + // + // Close ... + ArraySetAsSeries(hkCloseBuffer, true); + SetIndexBuffer(hkCloseBufferIndex, hkCloseBuffer, INDICATOR_DATA); + PlotIndexSetInteger(hkCloseBufferIndex, PLOT_SHOW_DATA, false); + + // + // Low ... + ArraySetAsSeries(hkLowBuffer, true); + SetIndexBuffer(hkLowBufferIndex, hkLowBuffer, INDICATOR_DATA); + PlotIndexSetInteger(hkLowBufferIndex, PLOT_SHOW_DATA, false); + + // + // XSMHK ... + + // + // Candles Color ... + ArraySetAsSeries(smhkCandleColorBuffer, true); + SetIndexBuffer(smhkCandleColorBufferIndex, smhkCandleColorBuffer, INDICATOR_COLOR_INDEX); + + // + // Set EMPTY_VALUE on Candles Buffer ... + PlotIndexSetDouble(smhkCandlesBufferIndex, PLOT_EMPTY_VALUE, 0.0); + + // + PlotIndexSetInteger(smhkCandlesBufferIndex, PLOT_SHOW_DATA, false); + PlotIndexSetInteger(smhkCandleColorBufferIndex, PLOT_SHOW_DATA, false); + + // + // Open ... + ArraySetAsSeries(smhkOpenBuffer, true); + PlotIndexSetInteger(smhkOpenBufferIndex, PLOT_SHOW_DATA, false); + SetIndexBuffer(smhkOpenBufferIndex, smhkOpenBuffer, INDICATOR_DATA); + + // + // High ... + ArraySetAsSeries(smhkHighBuffer, true); + SetIndexBuffer(smhkHighBufferIndex, smhkHighBuffer, INDICATOR_DATA); + PlotIndexSetInteger(smhkHighBufferIndex, PLOT_SHOW_DATA, false); + + // + // Close ... + ArraySetAsSeries(smhkCloseBuffer, true); + SetIndexBuffer(smhkCloseBufferIndex, smhkCloseBuffer, INDICATOR_DATA); + PlotIndexSetInteger(smhkCloseBufferIndex, PLOT_SHOW_DATA, false); + + // + // Low ... + ArraySetAsSeries(smhkLowBuffer, true); + SetIndexBuffer(smhkLowBufferIndex, smhkLowBuffer, INDICATOR_DATA); + PlotIndexSetInteger(smhkLowBufferIndex, PLOT_SHOW_DATA, false); + + // + // DATA Buffers ... + + // + // ATR ... + SetIndexBuffer(atrBufferIndex, atrBuffer, INDICATOR_CALCULATIONS); + + // + // TREND ... + SetIndexBuffer(trendStateBufferIndex, trendStateBuffer, INDICATOR_CALCULATIONS); + + // + // UP ... + SetIndexBuffer(upBufferIndex, upBuffer, INDICATOR_CALCULATIONS); + + // + // DOWN ... + SetIndexBuffer(downBufferIndex, downBuffer, INDICATOR_CALCULATIONS); + + // + // PRICE ... + SetIndexBuffer(priceBufferIndex, priceBuffer, INDICATOR_CALCULATIONS); + + // + // SSLCDOWNMA ... + ArraySetAsSeries(sslcUpMaBuffer, true); + SetIndexBuffer(sslcUpMaBufferIndex, sslcUpMaBuffer, INDICATOR_CALCULATIONS); + + // + // SSLCUPMA ... + ArraySetAsSeries(sslcDownMaBuffer, true); + SetIndexBuffer(sslcDownMaBufferIndex, sslcDownMaBuffer, INDICATOR_CALCULATIONS); + + // + // SSLCKPI ... + ArraySetAsSeries(sslcKpiBuffer, true); + SetIndexBuffer(sslcKpiBufferIndex, sslcKpiBuffer, INDICATOR_CALCULATIONS); + + // + // STATE Buffers ... + + // + // PEAKS ... + ArraySetAsSeries(peaksStateBuffer, true); + SetIndexBuffer(peaksStateBufferIndex, peaksStateBuffer, INDICATOR_CALCULATIONS); + + // + // VALES ... + ArraySetAsSeries(valesStateBuffer, true); + SetIndexBuffer(valesStateBufferIndex, valesStateBuffer, INDICATOR_CALCULATIONS); + + // + // CYCLES ... + + // + // SHORT ... + + // + ArraySetAsSeries(sHHStateBuffer, true); + SetIndexBuffer(sHHStateBufferIndex, sHHStateBuffer, INDICATOR_CALCULATIONS); + + // + ArraySetAsSeries(sLLStateBuffer, true); + SetIndexBuffer(sLLStateBufferIndex, sLLStateBuffer, INDICATOR_CALCULATIONS); + + // + // MEDIUM ... + + // + ArraySetAsSeries(mHHStateBuffer, true); + SetIndexBuffer(mHHStateBufferIndex, mHHStateBuffer, INDICATOR_CALCULATIONS); + + // + ArraySetAsSeries(mLLStateBuffer, true); + SetIndexBuffer(mLLStateBufferIndex, mLLStateBuffer, INDICATOR_CALCULATIONS); + + // + // LONG ... + + // + ArraySetAsSeries(lHHStateBuffer, true); + SetIndexBuffer(lHHStateBufferIndex, lHHStateBuffer, INDICATOR_CALCULATIONS); + + // + ArraySetAsSeries(lLLStateBuffer, true); + SetIndexBuffer(lLLStateBufferIndex, lLLStateBuffer, INDICATOR_CALCULATIONS); + + // + // HIND ... + + // + ArraySetAsSeries(hHHStateBuffer, true); + SetIndexBuffer(hHHStateBufferIndex, hHHStateBuffer, INDICATOR_CALCULATIONS); + + // + ArraySetAsSeries(hLLStateBuffer, true); + SetIndexBuffer(hLLStateBufferIndex, hLLStateBuffer, INDICATOR_CALCULATIONS); + + // + // XSTR ... + SetIndexBuffer(strTrendStateBufferIndex, strTrendStateBuffer, INDICATOR_CALCULATIONS); + + // + // XMBR ... + + // + // RIBBON 1 _ (High) ... + ArraySetAsSeries(rb1StateBuffer, true); + SetIndexBuffer(rb1StateBufferIndex, rb1StateBuffer, INDICATOR_CALCULATIONS); + + // + // RIBBON 2 _ (Open) ... + ArraySetAsSeries(rb2StateBuffer, true); + SetIndexBuffer(rb2StateBufferIndex, rb2StateBuffer, INDICATOR_CALCULATIONS); + + // + // RIBBON 3 _ (Close) ... + ArraySetAsSeries(rb3StateBuffer, true); + SetIndexBuffer(rb3StateBufferIndex, rb3StateBuffer, INDICATOR_CALCULATIONS); + + // + // RIBBON 4 _ (Median) ... + ArraySetAsSeries(rb4StateBuffer, true); + SetIndexBuffer(rb4StateBufferIndex, rb4StateBuffer, INDICATOR_CALCULATIONS); + + // + // RIBBON 5 _ (Typical) ... + ArraySetAsSeries(rb5StateBuffer, true); + SetIndexBuffer(rb5StateBufferIndex, rb5StateBuffer, INDICATOR_CALCULATIONS); + + // + // RIBBON 6 _ (Low) ... + ArraySetAsSeries(rb6StateBuffer, true); + SetIndexBuffer(rb6StateBufferIndex, rb6StateBuffer, INDICATOR_CALCULATIONS); + + // + // XHULL ... + + // + // UP Zone ... + SetIndexBuffer(hullUpStateBufferIndex, hullUpStateBuffer, INDICATOR_CALCULATIONS); + + // + // DOWN Zone ... + SetIndexBuffer(hullDownStateBufferIndex, hullDownStateBuffer, INDICATOR_CALCULATIONS); + + // + // XHK ... + + // + ArraySetAsSeries(hkStateBuffer, true); + SetIndexBuffer(hkStateBufferIndex, hkStateBuffer, INDICATOR_CALCULATIONS); +} + +// +// Set Indicator Short Name and also we can define Buffers Labels ... +void SetIndicatorName() +{ + IndicatorSetString(INDICATOR_SHORTNAME, ShortName); +} + +// +// Calculate Buffers ... +void CalculateBuffers( + int bar_index // Selected Bar Index +) +{ + // + // Calculate ... + + // + // Calculate Short Cycle ... + CalculateShortCycle(bar_index); + + // + // Calculate Medium Cycle ... + CalculateMediumCycle(bar_index); + + // + // Calculate Long Cycle ... + CalculateLongCycle(bar_index); + + // + // Calculate Hind Cycle ... + CalculateHindCycle(bar_index); + + // + // Calculate Peaks and Vales ... + CalculatePeaksAndVales(bar_index); + + // + // Calculate Fibonnaci ... + CalculateFibonacci(bar_index); +} + +// +// START Calculation Parts ... +// + +// +// SHORT Cycle ... +void CalculateShortCycle( + int bar_index // Selected Bar Index +) +{ + // + ENUM_TIMEFRAMES mPeriod = mL1Period; + + // + double hhValue = GetCycleHHC( + bar_index, + mPeriod); + + // + double llValue = GetCycleLLC( + bar_index, + mPeriod); + + // + double lastHH = mLastSHH; + double lastLL = mLastSLL; + + // + double mHHState = EMPTY_VALUE; + double mhhColorIDX = mHideColorIDX; + if (showLevels) + { + // + if (hhValue == lastHH) + { + mhhColorIDX = showConsolidations ? 1 : mHideColorIDX; + } + else if (hhValue > lastHH) + { + mhhColorIDX = 2; + } + else if (hhValue < lastHH) + { + mhhColorIDX = 3; + } + + // + mHHState = mhhColorIDX; + } + else + { + mhhColorIDX = mHideColorIDX; + } + + // + double mLLState = EMPTY_VALUE; + double mllColorIDX = mHideColorIDX; + if (showLevels) + { + // + if (llValue == lastLL) + { + mllColorIDX = showConsolidations ? 1 : mHideColorIDX; + } + else if (llValue > lastLL) + { + mllColorIDX = 2; + } + else if (llValue < lastLL) + { + mllColorIDX = 3; + } + + // + mLLState = mllColorIDX; + } + else + { + mllColorIDX = mHideColorIDX; + } + + // + mLastSHH = hhValue; + mLastSLL = llValue; + + // + sHHBuffer[bar_index] = hhValue; + sLLBuffer[bar_index] = llValue; + sHHStateBuffer[bar_index] = mHHState; + sLLStateBuffer[bar_index] = mLLState; + sHHColorBuffer[bar_index] = mhhColorIDX; + sLLColorBuffer[bar_index] = mllColorIDX; +} + +// +// MEDIUM Cycle ... +void CalculateMediumCycle( + int bar_index // Selected Bar Index +) +{ + // + ENUM_TIMEFRAMES mPeriod = mL2Period; + + // + double hhValue = GetCycleHHC( + bar_index, + mPeriod); + + // + double llValue = GetCycleLLC( + bar_index, + mPeriod); + + // + double lastHH = mLastMHH; + double lastLL = mLastMLL; + + // + double mHHState = EMPTY_VALUE; + double mhhColorIDX = mHideColorIDX; + if (showLevels) + { + // + if (hhValue == lastHH) + { + mhhColorIDX = showConsolidations ? 1 : mHideColorIDX; + } + else if (hhValue > lastHH) + { + mhhColorIDX = 2; + } + else if (hhValue < lastHH) + { + mhhColorIDX = 3; + } + + // + mHHState = mhhColorIDX; + } + else + { + mhhColorIDX = mHideColorIDX; + } + + // + double mLLState = EMPTY_VALUE; + double mllColorIDX = mHideColorIDX; + if (showLevels) + { + // + if (llValue == lastLL) + { + mllColorIDX = showConsolidations ? 1 : mHideColorIDX; + } + else if (llValue > lastLL) + { + mllColorIDX = 2; + } + else if (llValue < lastLL) + { + mllColorIDX = 3; + } + + // + mLLState = mllColorIDX; + } + else + { + mllColorIDX = mHideColorIDX; + } + + // + mLastMHH = hhValue; + mLastMLL = llValue; + + // + mHHBuffer[bar_index] = hhValue; + mLLBuffer[bar_index] = llValue; + mHHStateBuffer[bar_index] = mHHState; + mLLStateBuffer[bar_index] = mLLState; + mHHColorBuffer[bar_index] = mhhColorIDX; + mLLColorBuffer[bar_index] = mllColorIDX; +} + +// +// LONG Cycle ... +void CalculateLongCycle( + int bar_index // Selected Bar Index +) +{ + // + ENUM_TIMEFRAMES mPeriod = mL3Period; + + // + double hhValue = GetCycleHHC( + bar_index, + mPeriod); + + // + double llValue = GetCycleLLC( + bar_index, + mPeriod); + + // + double lastHH = mLastLHH; + double lastLL = mLastLLL; + + // + double mHHState = EMPTY_VALUE; + double mhhColorIDX = mHideColorIDX; + if (showLevels) + { + // + if (hhValue == lastHH) + { + mhhColorIDX = showConsolidations ? 1 : mHideColorIDX; + } + else if (hhValue > lastHH) + { + mhhColorIDX = 2; + } + else if (hhValue < lastHH) + { + mhhColorIDX = 3; + } + + // + mHHState = mhhColorIDX; + } + else + { + mhhColorIDX = mHideColorIDX; + } + + // + double mLLState = EMPTY_VALUE; + double mllColorIDX = mHideColorIDX; + if (showLevels) + { + // + if (llValue == lastLL) + { + mllColorIDX = showConsolidations ? 1 : mHideColorIDX; + } + else if (llValue > lastLL) + { + mllColorIDX = 2; + } + else if (llValue < lastLL) + { + mllColorIDX = 3; + } + + // + mLLState = mllColorIDX; + } + else + { + mllColorIDX = mHideColorIDX; + } + + // + mLastLHH = hhValue; + mLastLLL = llValue; + + // + lHHBuffer[bar_index] = hhValue; + lLLBuffer[bar_index] = llValue; + lHHStateBuffer[bar_index] = mHHState; + lLLStateBuffer[bar_index] = mLLState; + lHHColorBuffer[bar_index] = mhhColorIDX; + lLLColorBuffer[bar_index] = mllColorIDX; +} + +// +// HIND Cycle ... +void CalculateHindCycle( + int bar_index // Selected Bar Index +) +{ + // + ENUM_TIMEFRAMES mPeriod = mL4Period; + + // + double hhValue = GetCycleHHC( + bar_index, + mPeriod); + + // + double llValue = GetCycleLLC( + bar_index, + mPeriod); + + // + double lastHH = mLastHHH; + double lastLL = mLastHLL; + + // + double mHHState = EMPTY_VALUE; + double mhhColorIDX = mHideColorIDX; + if (showLevels) + { + // + if (hhValue == lastHH) + { + mhhColorIDX = showConsolidations ? 1 : mHideColorIDX; + } + else if (hhValue > lastHH) + { + mhhColorIDX = 2; + } + else if (hhValue < lastHH) + { + mhhColorIDX = 3; + } + + // + mHHState = mhhColorIDX; + } + else + { + mhhColorIDX = mHideColorIDX; + } + + // + double mLLState = EMPTY_VALUE; + double mllColorIDX = mHideColorIDX; + if (showLevels) + { + // + if (llValue == lastLL) + { + mllColorIDX = showConsolidations ? 1 : mHideColorIDX; + } + else if (llValue > lastLL) + { + mllColorIDX = 2; + } + else if (llValue < lastLL) + { + mllColorIDX = 3; + } + + // + mLLState = mllColorIDX; + } + else + { + mllColorIDX = mHideColorIDX; + } + + // + mLastHHH = hhValue; + mLastHLL = llValue; + + // + hHHBuffer[bar_index] = hhValue; + hLLBuffer[bar_index] = llValue; + hHHStateBuffer[bar_index] = mHHState; + hLLStateBuffer[bar_index] = mLLState; + hHHColorBuffer[bar_index] = mhhColorIDX; + hLLColorBuffer[bar_index] = mllColorIDX; +} + +// +// Calculate Peaks and Values ... +void CalculatePeaksAndVales( + int bar_index // Bar Index +) +{ + // + // Retrieve Requirements ... + + // + // Short ... + double sHHValue = sHHBuffer[bar_index]; + double sLLValue = sLLBuffer[bar_index]; + + // + // Medium ... + double mHHValue = mHHBuffer[bar_index]; + double mLLValue = mLLBuffer[bar_index]; + + // + // Long ... + double lHHValue = lHHBuffer[bar_index]; + double lLLValue = lLLBuffer[bar_index]; + + // + // Hind ... + double hHHValue = hHHBuffer[bar_index]; + double hLLValue = hLLBuffer[bar_index]; + + // + double rColorIDX = mHideColorIDX; + double sColorIDX = mHideColorIDX; + + // + // RESISTANCE ... + double rValue = (sHHValue + mHHValue + lHHValue + hHHValue) / 4; + + // + // PEAKS ... + bool isPeak = rValue == hHHValue && + hHHValue == lHHValue && + lHHValue == mHHValue && + mHHValue == sHHValue; + + // + if (isPeak && lastPeak != rValue) + { + // + rColorIDX = 1; + lastPeak = rValue; + peaksStateBuffer[bar_index] = rColorIDX; + } + else + { + peaksStateBuffer[bar_index] = EMPTY_VALUE; + } + + // + // SUPPORT ... + double sValue = (sLLValue + mLLValue + lLLValue + hLLValue) / 4; + + // + // VALES ... + bool isVale = sValue == hLLValue && + hLLValue == lLLValue && + lLLValue == mLLValue && + mLLValue == sLLValue; + + // + if (isVale && lastVale != sValue) + { + // + sColorIDX = 1; + lastVale = sValue; + valesStateBuffer[bar_index] = sColorIDX; + } + else + { + valesStateBuffer[bar_index] = EMPTY_VALUE; + } + + // + rBuffer[bar_index] = rValue; + sBuffer[bar_index] = sValue; + peaksBuffer[bar_index] = lastPeak; + valesBuffer[bar_index] = lastVale; + + // + if (showPeaksAndVales) + { + // + rColorBuffer[bar_index] = rColorIDX; + sColorBuffer[bar_index] = sColorIDX; + } + else + { + // + rColorBuffer[bar_index] = mHideColorIDX; + sColorBuffer[bar_index] = mHideColorIDX; + } +} + +// +// Calculate Fibonacci Level 1 ... +void CalculateFibonacci( + int bar_index // Bar Index +) +{ + // + // Select Requirements ... + double upPrice = peaksBuffer[bar_index]; + double downPrice = valesBuffer[bar_index]; + + // + // Level 1 ... + double fibLevel1Value = GetFibonacciLevel( + upPrice, + downPrice, + fiboLevel1, + 1); + // + // Level 2 ... + double fibLevel2Value = GetFibonacciLevel( + upPrice, + downPrice, + fiboLevel2, + 1); + + // + // Level 3 ... + double fibLevel3Value = GetFibonacciLevel( + upPrice, + downPrice, + fiboLevel3, + 1); + + // + // Level 4 ... + double fibLevel4Value = GetFibonacciLevel( + upPrice, + downPrice, + fiboLevel4, + 1); + + // + // Level 5 ... + double fibLevel5Value = GetFibonacciLevel( + upPrice, + downPrice, + fiboLevel5, + 1); + + // + fl1Buffer[bar_index] = fibLevel1Value; + fl2Buffer[bar_index] = fibLevel2Value; + fl3Buffer[bar_index] = fibLevel3Value; + fl4Buffer[bar_index] = fibLevel4Value; + fl5Buffer[bar_index] = fibLevel5Value; + + // + double fl1ColorIdx = showFibo1Levels ? 1 : mHideColorIDX; + double fl2ColorIdx = showFibo2Levels ? 1 : mHideColorIDX; + double fl3ColorIdx = showFibo3Levels ? 1 : mHideColorIDX; + double fl4ColorIdx = showFibo4Levels ? 1 : mHideColorIDX; + double fl5ColorIdx = showFibo5Levels ? 1 : mHideColorIDX; + + // + fl1ColorBuffer[bar_index] = fl1ColorIdx; + fl2ColorBuffer[bar_index] = fl2ColorIdx; + fl3ColorBuffer[bar_index] = fl3ColorIdx; + fl4ColorBuffer[bar_index] = fl4ColorIdx; + fl5ColorBuffer[bar_index] = fl5ColorIdx; +} + +// +// XSTR ... +bool CalculateXSTR( + const int rates_total, + const int prev_calculated, + const double &open[], + const double &high[], + const double &low[], + const double &close[] // +) +{ + // + bool result = false; + + // + int numOfRequiredAtrs; + if (prev_calculated > rates_total || prev_calculated < 0) + { + numOfRequiredAtrs = rates_total; + } + else + { + // + numOfRequiredAtrs = rates_total - prev_calculated; + if (prev_calculated > 0) + { + numOfRequiredAtrs++; + } + } + + // + // Checking for stop ... + if (IsStopped()) + { + return result; + } + + // + // Check Number of items Copy or not ... + int copiedATRs = CopyBuffer(atrHandler, 0, 0, numOfRequiredAtrs, atrBuffer); + if (copiedATRs <= 0) + { + return result; + } + + // + // + int limit; + + // + // checking for the limit start of calculation of an indicator ... + if (prev_calculated > rates_total || prev_calculated <= 0) + { + // + // starting index for calculation of all bars ... + limit = maxLength; + } + else + { + // + // starting number for calculation of new bars + limit = prev_calculated - 1; + } + + // + // Main Loop ... + for (int i = limit; i < rates_total && !IsStopped(); i++) + { + // + // Calculated Price ... + double price = GetAppliedPrice( + trendPriceAppliedTo, + open, + high, + low, + close, + i); + priceBuffer[i] = price; + + // + double atr = atrBuffer[i]; + + // + // Up ... + upBuffer[i] = price + (trendMultiplier * atr); + + // + // Down ... + downBuffer[i] = price - (trendMultiplier * atr); + + // + if (close[i] > upBuffer[i - 1]) + { + // + trendStateBuffer[i] = 1; + if (trendStateBuffer[i - 1] == -1) + { + changeOfTrend = 1; + } + } + else if (close[i] < downBuffer[i - 1]) + { + // + trendStateBuffer[i] = -1; + if (trendStateBuffer[i - 1] == 1) + { + changeOfTrend = 1; + } + } + else if (trendStateBuffer[i - 1] == 1) + { + // + trendStateBuffer[i] = 1; + changeOfTrend = 0; + } + else if (trendStateBuffer[i - 1] == -1) + { + // + trendStateBuffer[i] = -1; + changeOfTrend = 0; + } + + // + // Down Trend Starting ... + if (trendStateBuffer[i] < 0 && trendStateBuffer[i - 1] > 0) + { + startBearishTrend = 1; + } + else + { + startBearishTrend = 0; + } + + // + // Up Trend Starting ... + if (trendStateBuffer[i] > 0 && trendStateBuffer[i - 1] < 0) + { + startBullishTrend = 1; + } + else + { + startBullishTrend = 0; + } + + // + if (trendStateBuffer[i] > 0 && downBuffer[i] < downBuffer[i - 1]) + { + downBuffer[i] = downBuffer[i - 1]; + } + + // + if (trendStateBuffer[i] < 0 && upBuffer[i] > upBuffer[i - 1]) + { + upBuffer[i] = upBuffer[i - 1]; + } + + // + if (startBearishTrend == 1) + { + upBuffer[i] = priceBuffer[i] + (trendMultiplier * atr); + } + + // + if (startBullishTrend == 1) + { + downBuffer[i] = priceBuffer[i] - (trendMultiplier * atr); + } + + // + // Draw the indicator ... + + // + double colorIDX = 0; + double state = EMPTY_VALUE; + trendColorBuffer[i] = colorIDX; + + // + if (trendStateBuffer[i] == 1) + { + // + trendBuffer[i] = downBuffer[i]; + if (changeOfTrend == 1) + { + // + trendBuffer[i - 1] = trendBuffer[i - 2]; + changeOfTrend = 0; + + // + state = 2; + } + + // + colorIDX = 1; + } + else if (trendStateBuffer[i] == -1) + { + // + trendBuffer[i] = upBuffer[i]; + if (changeOfTrend == 1) + { + // + trendBuffer[i - 1] = trendBuffer[i - 2]; + changeOfTrend = 0; + + // + state = 3; + } + + // + colorIDX = 2; + } + + // + if (showTrends) + { + trendColorBuffer[i] = colorIDX; + } + strTrendStateBuffer[i] = state; + + // + // Filling ... + if (fillTrends) + { + // + fillUpBuffer[i] = trendBuffer[i]; + fillDownBuffer[i] = close[i]; + } + else + { + // + fillUpBuffer[i] = EMPTY_VALUE; + fillDownBuffer[i] = EMPTY_VALUE; + } + } + + // + result = true; + + // + return true; +} + +// +XMRBColorInfo GetRibbonColorIndex( + double value, + const double h, + const double l // +) +{ + // + XMRBColorInfo result; + + // + result.state = EMPTY_VALUE; + result.clr = mHideColorIDX; + + // + // Color Indexes ... + // 0 => HIDE + // 1 => NEUTURAL + // 2 => BULLISH + // 3 => BEARISH + + // + result.clr = 1; + + // + if (value < l && value < h) + { + result.clr = 2; + } + else if (value > h && value > l) + { + result.clr = 3; + } + else if (value < h && value > l) + { + result.clr = 1; + } + + // + result.state = result.clr; + + // + if (!showRibbons) + { + result.clr = mHideColorIDX; + } + + // + return result; +} + +// +// Calculate Ribbons Color ... +void CalculateRibbonsColors( + int bar_index, // Bar Index + const double &high[], + const double &low[] // +) +{ + // + double tmpVal; + XMRBColorInfo tmpColorIDX; + + // + double h = high[bar_index]; + double l = low[bar_index]; + + // + // RIBBON 1 ... + tmpVal = ribbon1Buffer[bar_index]; + tmpColorIDX = GetRibbonColorIndex( + tmpVal, + h, + l); + rb1StateBuffer[bar_index] = tmpColorIDX.state; + ribbon1ColorBuffer[bar_index] = tmpColorIDX.clr; + + // + // RIBBON 2 ... + tmpVal = ribbon2Buffer[bar_index]; + tmpColorIDX = GetRibbonColorIndex( + tmpVal, + h, + l); + rb2StateBuffer[bar_index] = tmpColorIDX.state; + ribbon2ColorBuffer[bar_index] = tmpColorIDX.clr; + + // + // RIBBON 3 ... + tmpVal = ribbon3Buffer[bar_index]; + tmpColorIDX = GetRibbonColorIndex( + tmpVal, + h, + l); + rb3StateBuffer[bar_index] = tmpColorIDX.state; + ribbon3ColorBuffer[bar_index] = tmpColorIDX.clr; + + // + // RIBBON 4 ... + tmpVal = ribbon4Buffer[bar_index]; + tmpColorIDX = GetRibbonColorIndex( + tmpVal, + h, + l); + rb4StateBuffer[bar_index] = tmpColorIDX.state; + ribbon4ColorBuffer[bar_index] = tmpColorIDX.clr; + + // + // RIBBON 5 ... + tmpVal = ribbon5Buffer[bar_index]; + tmpColorIDX = GetRibbonColorIndex( + tmpVal, + h, + l); + rb5StateBuffer[bar_index] = tmpColorIDX.state; + ribbon5ColorBuffer[bar_index] = tmpColorIDX.clr; + + // + // RIBBON 6 ... + tmpVal = ribbon6Buffer[bar_index]; + tmpColorIDX = GetRibbonColorIndex( + tmpVal, + h, + l); + rb6StateBuffer[bar_index] = tmpColorIDX.state; + ribbon6ColorBuffer[bar_index] = tmpColorIDX.clr; +} + +// +// Calculate SSL Channel ... +void CalculateSSLC( + int bar_index, // Selected Bar Index + int limit, + int ratesTotal, + int prevCalculated, + const double &close[]) +{ + // + double upMaValue = sslcUpMaBuffer[bar_index]; + double downMaValue = sslcDownMaBuffer[bar_index]; + + // + double closeValue = close[bar_index]; + + // + double kpiValue; + if (closeValue > upMaValue) + { + kpiValue = 1; + } + else if (closeValue < downMaValue) + { + kpiValue = -1; + } + else + { + kpiValue = sslcKpiBuffer[bar_index + 1]; + } + + // + sslcKpiBuffer[bar_index] = kpiValue; + + // + double upValue = kpiValue < 0 ? downMaValue : upMaValue; + sslcUpBuffer[bar_index] = upValue; + + // + double downValue = kpiValue < 0 ? upMaValue : downMaValue; + sslcDownBuffer[bar_index] = downValue; + + // + if (showSSLChannel) + { + // + sslcUpColorBuffer[bar_index] = 1; + sslcDownColorBuffer[bar_index] = 1; + } + else + { + // + sslcUpColorBuffer[bar_index] = mHideColorIDX; + sslcDownColorBuffer[bar_index] = mHideColorIDX; + } +} + +// +// Calculate XHULL ... +void CalculateHull( + int bar_index, // Selected Bar Index + int ratesTotal, // Total Rates + double upPrice, // Up Price ... + double downPrice // Down Price ... +) +{ + // + double upValue = mUpZHull.Calculate( + upPrice, + bar_index, + ratesTotal); + hullUpZoneBuffer[bar_index] = upValue; + double upColorIDX = (bar_index > 0) + ? (hullUpZoneBuffer[bar_index] > hullUpZoneBuffer[bar_index - 1]) + ? 2 + : (hullUpZoneBuffer[bar_index] < hullUpZoneBuffer[bar_index - 1]) + ? 3 + : hullUpZoneColorBuffer[bar_index - 1] + : 1; + + // + double downValue = mDownZHull.Calculate( + downPrice, + bar_index, + ratesTotal); + hullDownZoneBuffer[bar_index] = downValue; + double downColorIDX = (bar_index > 0) + ? (hullDownZoneBuffer[bar_index] > hullDownZoneBuffer[bar_index - 1]) + ? 2 + : (hullDownZoneBuffer[bar_index] < hullDownZoneBuffer[bar_index - 1]) + ? 3 + : hullDownZoneColorBuffer[bar_index - 1] + : 1; + + // + hullUpStateBuffer[bar_index] = upColorIDX == 0 ? 1 : upColorIDX; + hullDownStateBuffer[bar_index] = downColorIDX == 0 ? 1 : downColorIDX; + if (showHull) + { + // + hullUpZoneColorBuffer[bar_index] = upColorIDX; + hullDownZoneColorBuffer[bar_index] = downColorIDX; + } + else + { + // + hullUpZoneColorBuffer[bar_index] = mHideColorIDX; + hullDownZoneColorBuffer[bar_index] = mHideColorIDX; + } +} + +// +// Calculate HikenAshi Buffers ... +void CalculateHikenAshi( + int bar_index, // Selected Bar Index + const int prevCalculated, + const int ratesTotal, + const double &open[], + const double &high[], + const double &close[], + const double &low[]) +{ + // + double mPrevHKOpenValue; + double mPrevHKCloseValue; + + // + if (ArraySize(open) <= bar_index + 1) + { + // + mPrevHKOpenValue = 0; + mPrevHKCloseValue = 0; + } + else + { + // + mPrevHKOpenValue = hkOpenBuffer[bar_index + 1]; + mPrevHKCloseValue = hkCloseBuffer[bar_index + 1]; + } + + // + double mHKOpenValue = (mPrevHKOpenValue + mPrevHKCloseValue) / 2; + double mHKCloseValue = (open[bar_index] + high[bar_index] + close[bar_index] + low[bar_index]) / 4; + double mHKHighValue = MathMax(high[bar_index], MathMax(mHKOpenValue, mHKCloseValue)); + double mHKLowValue = MathMin(low[bar_index], MathMin(mHKOpenValue, mHKCloseValue)); + + // + hkOpenBuffer[bar_index] = mHKOpenValue; + hkHighBuffer[bar_index] = mHKHighValue; + hkLowBuffer[bar_index] = mHKLowValue; + hkCloseBuffer[bar_index] = mHKCloseValue; + + // + double candleColorValue = + mHKOpenValue < mHKCloseValue ? 1 : 2; + + // + hkStateBuffer[bar_index] = candleColorValue + 1; + hkCandleColorBuffer[bar_index] = showHKCandles ? candleColorValue : 0; +} + +// +// Calculate Candle Timer ... +void CalculateCandleTimer() +{ + // + if (!showCandleTimer) + { + return; + } + + // + XCandleRemains remainTime; + GetCandleRemainsTime( + remainTime, + _Symbol, + _Period, + 0); + + // + string msg = ToString( + remainTime, + "", + "", + "", + "", + "", + ":", + true); + + // + long mSpread = SymbolInfoInteger(Symbol(), SYMBOL_SPREAD); + + // + string _sp = ""; + if (mSpread < 10) + _sp = ".."; + else if (mSpread < 100) + _sp = "."; + + // + string objText = "Spread: " + IntegerToString(mSpread) + _sp + " Next Bar in: " + msg; + + // + ObjectSetString(0, ShortName, OBJPROP_TEXT, objText); + ObjectSetInteger(0, ShortName, OBJPROP_FONTSIZE, 10); + ObjectSetString(0, ShortName, OBJPROP_FONT, "Courier"); + ObjectSetInteger(0, ShortName, OBJPROP_COLOR, candleTimerColor); +} + +// +// Calculate Smoothed Hiken Ashi Candles ... +void CalculateSMHK( + int ratesTotal, // Total Bars + int prevCalculated // Calculated Bars +) +{ + // + // Open ... + int calculatedSMHKOpens = ExponentialMAOnBuffer( + ratesTotal, + prevCalculated, + 0, + mHKSmoothingLength, + hkOpenBuffer, + smhkOpenBuffer); + + // + // High ... + int calculatedSMHKHighs = ExponentialMAOnBuffer( + ratesTotal, + prevCalculated, + 0, + mHKSmoothingLength, + hkHighBuffer, + smhkHighBuffer); + + // + // Low ... + int calculatedSMHKLows = ExponentialMAOnBuffer( + ratesTotal, + prevCalculated, + 0, + mHKSmoothingLength, + hkLowBuffer, + smhkLowBuffer); + + // + // Close ... + int calculatedSMHKCloses = ExponentialMAOnBuffer( + ratesTotal, + prevCalculated, + 0, + mHKSmoothingLength, + hkCloseBuffer, + smhkCloseBuffer); + + // + // Find Calculated Items for Colors ... + int mNumberOfItems = MathMin(calculatedSMHKOpens, calculatedSMHKHighs); + mNumberOfItems = MathMin(mNumberOfItems, calculatedSMHKLows); + mNumberOfItems = MathMin(mNumberOfItems, calculatedSMHKCloses); + + // + // Create a Loop for Color of Candles ... + for (int i = 0; i < mNumberOfItems; i++) + { + // + bool isBearish = + // + smhkOpenBuffer[i] > smhkCloseBuffer[i] + // + ; + + // + if (showSMHKCandles) + { + // + smhkCandleColorBuffer[i] = isBearish + ? 2 + : 1; + } + else + { + // + smhkCandleColorBuffer[i] = mHideColorIDX; + } + } +} + +// +// END Calculation Parts ... +// + +// +// START Utilities ... +// + +// +// Create Candle Timer ... +void CreateIndicatorObject() +{ + // + if (!showCandleTimer) + { + return; + } + + // + ObjectCreate(0, ShortName, OBJ_LABEL, 0, 0, 0); + ObjectSetInteger(0, ShortName, OBJPROP_CORNER, candleTimerCorner); + ObjectSetInteger(0, ShortName, OBJPROP_XDISTANCE, 10); + ObjectSetInteger(0, ShortName, OBJPROP_YDISTANCE, 2); + + // + ENUM_ANCHOR_POINT Anchor = ANCHOR_LEFT_UPPER; + switch (candleTimerCorner) + { + case CORNER_LEFT_UPPER: + Anchor = ANCHOR_LEFT_UPPER; + break; + case CORNER_RIGHT_UPPER: + Anchor = ANCHOR_RIGHT_UPPER; + break; + case CORNER_LEFT_LOWER: + Anchor = ANCHOR_LEFT_LOWER; + break; + case CORNER_RIGHT_LOWER: + Anchor = ANCHOR_RIGHT_LOWER; + break; + } + + // + ObjectSetInteger(0, ShortName, OBJPROP_ANCHOR, Anchor); +} + +// +bool InitMaHandler( + int &handler, + int length, + ENUM_X_MA_METHOD mode, + ENUM_APPLIED_PRICE appliedTo) +{ + // + bool result = false; + + // + if (length <= 0) + { + return result; + } + + // + bool genericMethod = false; + ENUM_MA_METHOD method = NULL; + if (mode == X_MA_AMA) + { + // + handler = iAMA( + _Symbol, + _Period, + length, + mMRBAMAFast, + mMRBAMASlow, + 0, + appliedTo); + } + else if (mode == X_MA_EMA) + { + // + method = MODE_EMA; + genericMethod = true; + } + else if (mode == X_MA_LWMA) + { + // + method = MODE_LWMA; + genericMethod = true; + } + else if (mode == X_MA_SMA) + { + // + method = MODE_SMA; + genericMethod = true; + } + else if (mode == X_MA_SMMA) + { + // + method = MODE_SMMA; + genericMethod = true; + } + + // + if (genericMethod && handler == INVALID_HANDLE) + { + // + handler = iMA( + _Symbol, + _Period, + length, + 0, + method, + appliedTo); + } + + // + result = handler != INVALID_HANDLE; + + // + return result; +} + +// +// Retrieve Cycles Highest High ... +double GetCycleHH( + int bar_index, // Bar Index + ENUM_TIMEFRAMES period // Period +) +{ + // + datetime mCycleStartAt = GetPeriodStartTime( + _Symbol, + period); + + // + int mStartCycleBarIndex = iBarShift( + _Symbol, + _Period, + mCycleStartAt, + false); + + // + int mCycleCount = MathAbs(mStartCycleBarIndex - bar_index); + if (mCycleCount < 1) + { + mCycleCount = 1; + } + + // + // HIGH ... + int hhIndex = iHighest( + _Symbol, + _Period, + hhMode, + mCycleCount, + bar_index); + double result = GetAppliedPrice( + hhIndex, + hhMode); + + // + return result; +} + +// +// Retrieve Cycles Lowest Low ... +double GetCycleLL( + int bar_index, // Bar Index + ENUM_TIMEFRAMES period // Period +) +{ + // + datetime mCycleStartAt = GetPeriodStartTime( + _Symbol, + period); + + // + int mStartCycleBarIndex = iBarShift( + _Symbol, + _Period, + mCycleStartAt, + false); + + // + int mCycleCount = MathAbs(mStartCycleBarIndex - bar_index); + if (mCycleCount < 1) + { + mCycleCount = 1; + } + + // + // LOW ... + int llIndex = iLowest( + _Symbol, + _Period, + llMode, + mCycleCount, + bar_index); + double result = GetAppliedPrice( + llIndex, + llMode); + + // + return result; +} + +// +// Retrieve Cycles Highest High ... +double GetCycleHHC( + int bar_index, // Bar Index + ENUM_TIMEFRAMES period // Period +) +{ + // + int mCycleCount = 0; + if (period == mL1Period) + { + mCycleCount = mL1Candles; + } + else if (period == mL2Period) + { + mCycleCount = mL2Candles; + } + else if (period == mL3Period) + { + mCycleCount = mL3Candles; + } + else if (period == mL4Period) + { + mCycleCount = mL4Candles; + } + + // + // HIGH ... + int hhIndex = iHighest( + _Symbol, + _Period, + hhMode, + mCycleCount, + bar_index); + double result = GetAppliedPrice( + hhIndex, + hhMode); + + // + return result; +} + +// +// Retrieve Cycles Lowest Low ... +double GetCycleLLC( + int bar_index, // Bar Index + ENUM_TIMEFRAMES period // Period +) +{ + // + int mCycleCount = 0; + if (period == mL1Period) + { + mCycleCount = mL1Candles; + } + else if (period == mL2Period) + { + mCycleCount = mL2Candles; + } + else if (period == mL3Period) + { + mCycleCount = mL3Candles; + } + else if (period == mL4Period) + { + mCycleCount = mL4Candles; + } + + // + // LOW ... + int llIndex = iLowest( + _Symbol, + _Period, + llMode, + mCycleCount, + bar_index); + double result = GetAppliedPrice( + llIndex, + llMode); + + // + return result; +} + +// +string GenerateCyclesRepresentation() +{ + // + string result = ""; + + // + result += "C1: " + ToString(mL1Period) + "\n"; + result += "C2: " + ToString(mL2Period) + "\n"; + result += "C3: " + ToString(mL3Period) + "\n"; + result += "C4: " + ToString(mL4Period); + + // + return result; +} + +// +// Apply Custom Chart Style ... +void ApplyCustomChartStyle() +{ + // + // Read Current Chart Config and Store it ... + ReadChartStyle(); + + // + // After Reading Current Chart Style ... + // we have to Save Configs and Change Styles ... + clearStyle = chartStyle; + + // + clearStyle.upColor = CLR_NONE; + clearStyle.downColor = CLR_NONE; + clearStyle.lineColor = CLR_NONE; + clearStyle.bullishColor = CLR_NONE; + clearStyle.bearishColor = CLR_NONE; + + // + // Decide to Show or not Candles based on User Input ... + if (showCandles) + { + SetChartStyle(chartStyle); + } + else + { + SetChartStyle(clearStyle); + } +} + +// +// Read Previous Chart Style ... +void ReadChartStyle() +{ + // + // Retrieve Current Chart ID ... + long chartId = ChartID(); + chartStyle.chartId = chartId; + + // + // Retrieve Chart Mode ... + chartStyle.mode = (ENUM_CHART_MODE)ChartGetInteger(chartId, CHART_MODE); + + // + chartStyle.showBidLine = (bool)ChartGetInteger(chartId, CHART_SHOW_BID_LINE); + chartStyle.showAskLine = (bool)ChartGetInteger(chartId, CHART_SHOW_ASK_LINE); + chartStyle.showGrid = (bool)ChartGetInteger(chartId, CHART_SHOW_GRID); + chartStyle.showVolumes = (bool)ChartGetInteger(chartId, CHART_SHOW_VOLUMES); + chartStyle.showTradeLevels = (bool)ChartGetInteger(chartId, CHART_SHOW_TRADE_LEVELS); + chartStyle.autoScroll = (bool)ChartGetInteger(chartId, CHART_AUTOSCROLL); + chartStyle.quickNavigation = (bool)ChartGetInteger(chartId, CHART_QUICK_NAVIGATION); + + // + chartStyle.foreGroundColor = (color)ChartGetInteger(chartId, CHART_COLOR_FOREGROUND); + chartStyle.backGroundColor = (color)ChartGetInteger(chartId, CHART_COLOR_BACKGROUND); + chartStyle.upColor = (color)ChartGetInteger(chartId, CHART_COLOR_CHART_UP); + chartStyle.downColor = (color)ChartGetInteger(chartId, CHART_COLOR_CHART_DOWN); + chartStyle.bullishColor = (color)ChartGetInteger(chartId, CHART_COLOR_CANDLE_BULL); + chartStyle.bearishColor = (color)ChartGetInteger(chartId, CHART_COLOR_CANDLE_BEAR); + chartStyle.gridColor = (color)ChartGetInteger(chartId, CHART_COLOR_GRID); + chartStyle.bidLineColor = (color)ChartGetInteger(chartId, CHART_COLOR_BID); + chartStyle.askLineColor = (color)ChartGetInteger(chartId, CHART_COLOR_ASK); + chartStyle.stopColor = (color)ChartGetInteger(chartId, CHART_COLOR_STOP_LEVEL); + chartStyle.lineColor = (color)ChartGetInteger(chartId, CHART_COLOR_CHART_LINE); + chartStyle.volumesColor = (color)ChartGetInteger(chartId, CHART_COLOR_VOLUME); + + // + chartStyle.mode = chartMode; + chartStyle.upColor = upColor; + chartStyle.downColor = downColor; + chartStyle.lineColor = lineColor; + chartStyle.bearishColor = bearishColor; + chartStyle.bullishColor = bullishColor; + chartStyle.volumesColor = volumesColor; + + // + chartStyle.showGrid = false; + chartStyle.showAskLine = true; + chartStyle.showBidLine = true; +} + +// +// Set Chart Style ... +void SetChartStyle( + XChartStyle &mChartStyle // Chart Style to Apply +) +{ + // + ApplyChartStyle( + mChartStyle.chartId, + mChartStyle.mode, + mChartStyle.showBidLine, + mChartStyle.showAskLine, + mChartStyle.showGrid, + mChartStyle.showVolumes, + mChartStyle.showTradeLevels, + mChartStyle.autoScroll, + mChartStyle.quickNavigation, + mChartStyle.foreGroundColor, + mChartStyle.backGroundColor, + mChartStyle.upColor, + mChartStyle.downColor, + mChartStyle.bullishColor, + mChartStyle.bearishColor, + mChartStyle.gridColor, + mChartStyle.bidLineColor, + mChartStyle.askLineColor, + mChartStyle.lineColor, + mChartStyle.stopColor, + mChartStyle.volumesColor); +} + +// +// END Utilities ... +// + +// +// END Functions ... +// diff --git a/MQLTestWorkspace/BKPS/14030222/Indicators/x-saherelm.xchnl.ex5 b/MQLTestWorkspace/BKPS/14030222/Indicators/x-saherelm.xchnl.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..3afcc0edfbb6e5ced8e8a9d5505af8ce312be08a GIT binary patch literal 25152 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 2 && + mediumLength > shortLength && + longLength > mediumLength && + hindLength > longLength) + // + ; + + // + return result; +} + +// +// Retrieve all Exists Input Max Length ... +// use for Start Of Drawing ... +int ExtractMaxLengthOfInputs() +{ + // + int result = 0; + + // + // Peaks and Vales ... + result = MathMax(shortLength, mediumLength); + result = MathMax(result, longLength); + result = MathMax(result, hindLength); + + // + return result; +} + +// +// Set Indicator Short Name and also we can define Buffers Labels ... +void SetIndicatorName() +{ + // + IndicatorSetString(INDICATOR_SHORTNAME, ShortName); +} + +// +// Define Indexes and Styles ... +void DefineBuffers() +{ + // + ArraySetAsSeries(sHHBuffer, true); + SetIndexBuffer(sHHBufferIndex, sHHBuffer, INDICATOR_CALCULATIONS); + + // + ArraySetAsSeries(sLLBuffer, true); + SetIndexBuffer(sLLBufferIndex, sLLBuffer, INDICATOR_CALCULATIONS); + + // + ArraySetAsSeries(mHHBuffer, true); + SetIndexBuffer(mHHBufferIndex, mHHBuffer, INDICATOR_CALCULATIONS); + + // + ArraySetAsSeries(mLLBuffer, true); + SetIndexBuffer(mLLBufferIndex, mLLBuffer, INDICATOR_CALCULATIONS); + + // + ArraySetAsSeries(lHHBuffer, true); + SetIndexBuffer(lHHBufferIndex, lHHBuffer, INDICATOR_CALCULATIONS); + + // + ArraySetAsSeries(lLLBuffer, true); + SetIndexBuffer(lLLBufferIndex, lLLBuffer, INDICATOR_CALCULATIONS); + + // + ArraySetAsSeries(hHHBuffer, true); + SetIndexBuffer(hHHBufferIndex, hHHBuffer, INDICATOR_CALCULATIONS); + + // + ArraySetAsSeries(hLLBuffer, true); + SetIndexBuffer(hLLBufferIndex, hLLBuffer, INDICATOR_CALCULATIONS); +} + +// +// Calculate Buffers ... +void CalculateBuffers( + int bar_index // Selected Bar Index +) +{ + // + // Calculate ... + + // + // SHORT ... + + // + // HIGH ... + int sHHIndex = iHighest( + _Symbol, + _Period, + hhMode, + shortLength, + bar_index); + double sHHValue = GetAppliedPrice( + sHHIndex, + hhMode); + + // + sHHBuffer[bar_index] = sHHValue; + + // + // LOW ... + int sLLIndex = iLowest( + _Symbol, + _Period, + llMode, + shortLength, + bar_index); + double sLLValue = GetAppliedPrice( + sLLIndex, + llMode); + + // + sLLBuffer[bar_index] = sLLValue; + + // + // MEDIUM ... + + // + // HIGH ... + int mHHIndex = iHighest( + _Symbol, + _Period, + hhMode, + mediumLength, + bar_index); + double mHHValue = GetAppliedPrice( + mHHIndex, + hhMode); + + // + mHHBuffer[bar_index] = mHHValue; + + // + // LOW ... + int mLLIndex = iLowest( + _Symbol, + _Period, + llMode, + mediumLength, + bar_index); + double mLLValue = GetAppliedPrice( + mLLIndex, + llMode); + + // + mLLBuffer[bar_index] = mLLValue; + + // + // LONG ... + + // + // HIGH ... + int lHHIndex = iHighest( + _Symbol, + _Period, + hhMode, + longLength, + bar_index); + double lHHValue = GetAppliedPrice( + lHHIndex, + hhMode); + + // + lHHBuffer[bar_index] = lHHValue; + + // + // LOW ... + int lLLIndex = iLowest( + _Symbol, + _Period, + llMode, + longLength, + bar_index); + double lLLValue = GetAppliedPrice( + lLLIndex, + llMode); + + // + lLLBuffer[bar_index] = lLLValue; + + // + // HIND ... + + // + // HIGH ... + int hHHIndex = iHighest( + _Symbol, + _Period, + hhMode, + hindLength, + bar_index); + double hHHValue = GetAppliedPrice( + hHHIndex, + hhMode); + + // + hHHBuffer[bar_index] = hHHValue; + + // + // LOW ... + int hLLIndex = iLowest( + _Symbol, + _Period, + llMode, + hindLength, + bar_index); + double hLLValue = GetAppliedPrice( + hLLIndex, + llMode); + + // + hLLBuffer[bar_index] = hLLValue; + + // + // Find Swings ... + + // + // High ... + int hSwing1 = FindSwing( + _Symbol, + _Period, + MODE_HIGH, + numOfShoulder, + bar_index + 1); + + int hSwing2 = FindSwing( + _Symbol, + _Period, + MODE_HIGH, + numOfShoulder, + hSwing1 + 1); + + // + // High ... + int hSwing3 = FindSwing( + _Symbol, + _Period, + MODE_HIGH, + numOfShoulder, + hSwing2 + 1); + + // int hSwing4 = FindSwing( + // _Symbol, + // _Period, + // MODE_HIGH, + // numOfShoulder, + // hSwing3 + 1); + + // + // Low ... + int lSwing1 = FindSwing( + _Symbol, + _Period, + MODE_LOW, + numOfShoulder, + bar_index + 1); + + int lSwing2 = FindSwing( + _Symbol, + _Period, + MODE_LOW, + numOfShoulder, + lSwing1 + 1); + + int lSwing3 = FindSwing( + _Symbol, + _Period, + MODE_LOW, + numOfShoulder, + lSwing2 + 1); + + // int lSwing4 = FindSwing( + // _Symbol, + // _Period, + // MODE_LOW, + // numOfShoulder, + // lSwing3 + 1); + + // + if (bar_index < 50) + { + + // + bool isStrongResistance = + // + hHHBuffer[bar_index + 1] == hHHBuffer[bar_index + 2] && + hHHBuffer[bar_index + 2] == hHHBuffer[bar_index + 3] && + // + lHHBuffer[bar_index + 1] == lHHBuffer[bar_index + 2] && + lHHBuffer[bar_index + 2] == lHHBuffer[bar_index + 3] && + // + mHHBuffer[bar_index + 1] == mHHBuffer[bar_index + 2] && + mHHBuffer[bar_index + 2] == mHHBuffer[bar_index + 3] && + // + sHHBuffer[bar_index + 1] == sHHBuffer[bar_index + 2] && + sHHBuffer[bar_index + 2] == sHHBuffer[bar_index + 3] + // + ; + + // + bool isStrongSupport = + // + hLLBuffer[bar_index + 1] == hLLBuffer[bar_index + 2] && + hLLBuffer[bar_index + 2] == hLLBuffer[bar_index + 3] && + // + lLLBuffer[bar_index + 1] == lLLBuffer[bar_index + 2] && + lLLBuffer[bar_index + 2] == lLLBuffer[bar_index + 3] && + // + mLLBuffer[bar_index + 1] == mLLBuffer[bar_index + 2] && + mLLBuffer[bar_index + 2] == mLLBuffer[bar_index + 3] && + // + sLLBuffer[bar_index + 1] == sLLBuffer[bar_index + 2] && + sLLBuffer[bar_index + 2] == sLLBuffer[bar_index + 3] + // + ; + + // + if (isStrongResistance && showSRs) + { + // + DrawSupportResistance( + "R", + clrRed, + sHHBuffer[bar_index + 3], + bar_index + 3); + } + + // + if (isStrongSupport && showSRs) + { + // + DrawSupportResistance( + "S", + clrGreen, + sLLBuffer[bar_index + 3], + bar_index + 3); + } + } + + // + if (showTrend && bar_index < 20) + { + // + DrawSwing( + "High1", + MODE_HIGH, + clrAqua, + hSwing1, + hSwing2); + + // + DrawSwing( + "Low1", + MODE_LOW, + clrAqua, + lSwing1, + lSwing2); + + // + DrawSwing( + "High2", + MODE_HIGH, + clrMagenta, + hSwing2, + hSwing3); + + // + DrawSwing( + "Low2", + MODE_LOW, + clrMagenta, + lSwing2, + lSwing3); + } +} + +// +void DrawSwing( + string prefix, // Prefix ... + ENUM_SERIESMODE mode, // Swing Mode ... + color swingColor, // Color ... + int index1, // Index 1 ... + int index2 // Index 2 ... +) +{ + // + if (mode != MODE_HIGH && mode != MODE_LOW) + { + return; + } + + // + XOHCL c1 = GetCandle( + _Symbol, + _Period, + index1); + + // + datetime time1 = GetCandleTime( + _Symbol, + _Period, + index1); + + // + XOHCL c2 = GetCandle( + _Symbol, + _Period, + index2); + + // + datetime time2 = GetCandleTime( + _Symbol, + _Period, + index2); + + // + double value1 = -1; + double value2 = -1; + + // + switch (mode) + { + // + case MODE_HIGH: + value1 = c1.high; + value2 = c2.high; + break; + + // + case MODE_LOW: + value1 = c1.low; + value2 = c2.low; + break; + } + + // + if (value1 == -1 || value2 == -1) + { + return; + } + + // + long chartId = ChartID(); + string tlName = prefix + "_" + "TrendLine"; + + // // + // if (IsDrawExists(tlName)) { + // RemoveDraw(tlName); + // } + + // + DrawTrendLine( + chartId, + tlName, + 0, + time2, + value2, + time1, + value1, + swingColor, + STYLE_DOT, + 3, + false, + false, + true); +} + +// +// Draw Support and Resistance ... +void DrawSupportResistance( + string prefix, // Prefix ... + color lColor, // Color ... + double price, // Support or Resistance price ... + int bar_index // Start Bar Index ... +) +{ + // + datetime time1 = GetCandleTime( + _Symbol, + _Period, + bar_index); + + // + datetime time2 = GetCandleTime( + _Symbol, + _Period, + bar_index - 1); + + // + long chartId = ChartID(); + string tlName = prefix + "_" + "TL" + "_" + (string)(NormalizePrice(price, _Symbol)); + + // + DrawTrendLine( + chartId, + tlName, + 0, + time1, + price, + time2, + price, + lColor, + STYLE_DOT, + 3, + false, + false, + true); +} diff --git a/MQLTestWorkspace/BKPS/14030222/Indicators/x-saherelm.xdon.ex5 b/MQLTestWorkspace/BKPS/14030222/Indicators/x-saherelm.xdon.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..78a378e2b594fccac89bb4adeff1fa5490a7b93c GIT binary patch literal 10198 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 EKVLeUk^lez literal 0 HcmV?d00001 diff --git a/MQLTestWorkspace/BKPS/14030222/Indicators/x-saherelm.xdon.mq5 b/MQLTestWorkspace/BKPS/14030222/Indicators/x-saherelm.xdon.mq5 new file mode 100644 index 0000000..e479e65 --- /dev/null +++ b/MQLTestWorkspace/BKPS/14030222/Indicators/x-saherelm.xdon.mq5 @@ -0,0 +1,365 @@ +/////////////////////////////////////////////////////// +// SaherElm IT Center MQL5 Indicator +// ------------------------------------------- +// Name: XDON +// Description: DONCHAIN Channel ... +// +// Maintainer: +// ------------ +// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) +// +////////////////////////////////////////////////////// +// +// Global Properties ... +#property copyright "Copyright 2023, SaherElm IT Center" +#property link "https://saherelm.ir" +#property version "1.00" +#property description "SaherElm XDON Indicator" +#property strict + +// +#define ShortName "XDON" + +// +// INPUT ... + +// +input int length = 52; // Market Length +input double offset = 0; // Offset + +// +// BUFFERS ... + +// +#property indicator_chart_window + +// +#property indicator_buffers 8 +#property indicator_plots 8 + +// +#define upperOBufferIndex 0 +double upperOBuffer[]; + +// +#property indicator_label1 "XDON OU" +#property indicator_type1 DRAW_LINE +#property indicator_color1 clrCornflowerBlue +#property indicator_width1 2 + +// +#define lowerOBufferIndex 1 +double lowerOBuffer[]; + +// +#property indicator_label2 "XDON OL" +#property indicator_type2 DRAW_LINE +#property indicator_color2 clrCornflowerBlue +#property indicator_width2 2 + +// +#define upperCBufferIndex 2 +double upperCBuffer[]; + +// +#property indicator_label3 "XDON CU" +#property indicator_type3 DRAW_LINE +#property indicator_color3 clrCoral +#property indicator_width3 2 + +// +#define lowerCBufferIndex 3 +double lowerCBuffer[]; + +// +#property indicator_label4 "XDON CL" +#property indicator_type4 DRAW_LINE +#property indicator_color4 clrCoral +#property indicator_width4 2 + +// +#define upperHBufferIndex 4 +double upperHBuffer[]; + +// +#property indicator_label5 "XDON HU" +#property indicator_type5 DRAW_LINE +#property indicator_color5 clrAquamarine +#property indicator_width5 2 + +// +#define lowerHBufferIndex 5 +double lowerHBuffer[]; + +// +#property indicator_label6 "XDON HL" +#property indicator_type6 DRAW_LINE +#property indicator_color6 clrAquamarine +#property indicator_width6 2 + +// +#define upperLBufferIndex 6 +double upperLBuffer[]; + +// +#property indicator_label7 "XDON LU" +#property indicator_type7 DRAW_LINE +#property indicator_color7 clrDarkOrchid +#property indicator_width7 2 + +// +#define lowerLBufferIndex 7 +double lowerLBuffer[]; + +// +#property indicator_label8 "XDON LL" +#property indicator_type8 DRAW_LINE +#property indicator_color8 clrDarkOrchid +#property indicator_width8 2 + +// +// EVENT Handlers ... + +// +// Initialization ... +int OnInit() +{ + // + // Validate Inputs ... + if (!ValidateInputs()) + { + return INIT_PARAMETERS_INCORRECT; + } + + // + // Define Index Buffers ... + DefineBuffers(); + + // + // Set Indicator ShortName ... + SetIndicatorName(); + + // + // Init Succeed ... + return INIT_SUCCEEDED; +} + +// +// DeInitialization ... +void OnDeinit(const int reason) +{ + // + // REASON_PROGRAM 0 The EA has stopped working calling the ExpertRemove() function + // REASON_REMOVE 1 Program removed from a chart + // REASON_RECOMPILE 2 Program recompiled + // REASON_CHARTCHANGE 3 A symbol or a chart period is changed + // REASON_CHARTCLOSE 4 Chart closed + // REASON_PARAMETERS 5 Inputs changed by a user + // REASON_ACCOUNT 6 Another account has been activated or reconnection to the trade server has occurred due to changes in the account settings + // REASON_TEMPLATE 7 Another chart template applied + // REASON_INITFAILED 8 The OnInit() handler returned a non-zero value + // REASON_CLOSE 9 Terminal closed +} + +// +// Calculating what we want ... +int OnCalculate( + // + // total Candles on chart ... + const int rates_total, + // + // total calculated Candles on charts ... + const int prev_calculated, + // + // history of Candles Open Time ... + const datetime &time[], + // + // history of Candles Open Price ... + const double &open[], + // + // history of Candles High Price ... + const double &high[], + // + // history of Candles Low Price ... + const double &low[], + // + // history of Candles Close Price ... + const double &close[], + // + // history of Tick Volumes on Candle ... + const long &tick_volume[], + // + // history of Trade Volumes ... + const long &volume[], + // + // history of Candles Spread Price ... + const int &spread[]) +{ + // + if (rates_total < length - 1) + { + return prev_calculated; + } + + // + int start = prev_calculated == 0 + ? length + : prev_calculated - 1; + + // + // Main Loop ... + for (int barIndex = start; barIndex < rates_total; barIndex++) + { + // + // OPEN ... + + // + double upperOValue = open[ArrayMaximum(open, barIndex - length + 1, length)]; + double lowerOValue = open[ArrayMinimum(open, barIndex - length + 1, length)]; + + // + double oDelta = MathAbs(upperOValue - lowerOValue); + double oOffsetValue = oDelta * (offset) * 0.01; + + // + upperOBuffer[barIndex] = upperOValue - oOffsetValue; + lowerOBuffer[barIndex] = lowerOValue + oOffsetValue; + + // + // CLOSE ... + + // + double upperCValue = close[ArrayMaximum(close, barIndex - length + 1, length)]; + double lowerCValue = close[ArrayMinimum(close, barIndex - length + 1, length)]; + + // + double cDelta = MathAbs(upperCValue - lowerCValue); + double cOffsetValue = cDelta * (offset) * 0.01; + + // + upperCBuffer[barIndex] = upperCValue - cOffsetValue; + lowerCBuffer[barIndex] = lowerCValue + cOffsetValue; + + // + // HIGH ... + + // + double upperHValue = high[ArrayMaximum(high, barIndex - length + 1, length)]; + double lowerHValue = high[ArrayMinimum(high, barIndex - length + 1, length)]; + + // + double hDelta = MathAbs(upperHValue - lowerHValue); + double hOffsetValue = hDelta * (offset) * 0.01; + + // + upperHBuffer[barIndex] = upperHValue - hOffsetValue; + lowerHBuffer[barIndex] = lowerHValue + hOffsetValue; + + // + // LOW ... + + // + double upperLValue = low[ArrayMaximum(low, barIndex - length + 1, length)]; + double lowerLValue = low[ArrayMinimum(low, barIndex - length + 1, length)]; + + // + double lDelta = MathAbs(upperLValue - lowerLValue); + double lOffsetValue = lDelta * (offset) * 0.01; + + // + upperLBuffer[barIndex] = upperLValue - lOffsetValue; + lowerLBuffer[barIndex] = lowerLValue + lOffsetValue; + } + + // + return rates_total; +} + +// +// CUSTOM Functions ... + +// +// Validate Input Args for Initialization ... +bool ValidateInputs() +{ + // + bool result = false; + + // + result = length >= 7; + + // + return result; +} + +// +// Define Indexes and Styles ... +void DefineBuffers() +{ + // + // Open ... + + // + // UPPER ... + SetIndexBuffer(upperOBufferIndex, upperOBuffer, INDICATOR_DATA); + PlotIndexSetInteger(upperOBufferIndex, PLOT_SHOW_DATA, true); + PlotIndexSetDouble(upperOBufferIndex, PLOT_EMPTY_VALUE, EMPTY_VALUE); + + // + // LOWER ... + SetIndexBuffer(lowerOBufferIndex, lowerOBuffer, INDICATOR_DATA); + PlotIndexSetInteger(lowerOBufferIndex, PLOT_SHOW_DATA, true); + PlotIndexSetDouble(lowerOBufferIndex, PLOT_EMPTY_VALUE, EMPTY_VALUE); + + // + // Close ... + + // + // UPPER ... + SetIndexBuffer(upperCBufferIndex, upperCBuffer, INDICATOR_DATA); + PlotIndexSetInteger(upperCBufferIndex, PLOT_SHOW_DATA, true); + PlotIndexSetDouble(upperCBufferIndex, PLOT_EMPTY_VALUE, EMPTY_VALUE); + + // + // LOWER ... + SetIndexBuffer(lowerCBufferIndex, lowerCBuffer, INDICATOR_DATA); + PlotIndexSetInteger(lowerCBufferIndex, PLOT_SHOW_DATA, true); + PlotIndexSetDouble(lowerCBufferIndex, PLOT_EMPTY_VALUE, EMPTY_VALUE); + + // + // High ... + + // + // UPPER ... + SetIndexBuffer(upperHBufferIndex, upperHBuffer, INDICATOR_DATA); + PlotIndexSetInteger(upperHBufferIndex, PLOT_SHOW_DATA, true); + PlotIndexSetDouble(upperHBufferIndex, PLOT_EMPTY_VALUE, EMPTY_VALUE); + + // + // LOWER ... + SetIndexBuffer(lowerHBufferIndex, lowerHBuffer, INDICATOR_DATA); + PlotIndexSetInteger(lowerHBufferIndex, PLOT_SHOW_DATA, true); + PlotIndexSetDouble(lowerHBufferIndex, PLOT_EMPTY_VALUE, EMPTY_VALUE); + + // + // Low ... + + // + // UPPER ... + SetIndexBuffer(upperLBufferIndex, upperLBuffer, INDICATOR_DATA); + PlotIndexSetInteger(upperLBufferIndex, PLOT_SHOW_DATA, true); + PlotIndexSetDouble(upperLBufferIndex, PLOT_EMPTY_VALUE, EMPTY_VALUE); + + // + // LOWER ... + SetIndexBuffer(lowerLBufferIndex, lowerLBuffer, INDICATOR_DATA); + PlotIndexSetInteger(lowerLBufferIndex, PLOT_SHOW_DATA, true); + PlotIndexSetDouble(lowerLBufferIndex, PLOT_EMPTY_VALUE, EMPTY_VALUE); +} + +// +// Set Indicator Short Name and also we can define Buffers Labels ... +void SetIndicatorName() +{ + IndicatorSetString(INDICATOR_SHORTNAME, ShortName); +} diff --git a/MQLTestWorkspace/BKPS/14030222/Libraries/x-saherelm.alert.lib.mq5 b/MQLTestWorkspace/BKPS/14030222/Libraries/x-saherelm.alert.lib.mq5 new file mode 100644 index 0000000..429d830 --- /dev/null +++ b/MQLTestWorkspace/BKPS/14030222/Libraries/x-saherelm.alert.lib.mq5 @@ -0,0 +1,187 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Alert Library +// -------------------------------------- +// Name: XAlert +// Description: provides Alerts abilities ... +// +// +// 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 + +// +// START Inputs ... +// +input group "Alerts"; +input bool enableAlerts = true; // Enable Alerts +input bool logAlerts = true; // Log Alerts +input bool terminalAlerts = false; // Terminal Alerts +input bool mailAlerts = false; // Mail Alerts +input bool pushAlerts = false; // Push Alerts +// +// END Inputs ... +// + +// +#include "x-saherelm.log.lib.mq5" + +// +// START Global Definitions: Variables, Properties and etc ... +// +string alertPrefix = "X-Alert"; +// +// END Global Definitions: Variables, Properties and etc ... +// + +// +// START Provided Functions ... +// +// +// Initial Library if required ... +bool OnInInitAlertLibrary() +{ + return false; +} + +// +// DeInitial Library if required ... +void OnDeinitAlertLibrary() +{ +} + +// +// Attach Alert Prefix to Message ... +string PrepareAlertMessage(string message) +{ + // + StringReplace(message, "\n", " | "); + + // + StringConcatenate(message, alertPrefix, " > ", message); + + // + return message; +} + +// +// Logging an Alert ... +void LogAlert(string message) +{ + // + // Validate Args ... + if (!enableAlerts || !logAlerts) + { + return; + } + + // + LogMessage(alertPrefix, message); +} + +// +// Terminal Alert ... +void TerminalAlert(string message) +{ + // + // Validate Args ... + if (!enableAlerts || !terminalAlerts) + { + return; + } + + // + // Prepare Message ... + message = PrepareAlertMessage(message); + + // Send Terminal Alert ... + Alert(message); +} + +// +// Mail Alert ... +void MailAlert(string message) +{ + // + // Validate Args ... + if (!enableAlerts || !mailAlerts) + { + return; + } + + // + // Send Mail Alert ... + SendMail(alertPrefix, message); +} + +// +// Send Push Notification ... +void PushAlert(string message) +{ + // + // Validate Args ... + if (!enableAlerts || !pushAlerts) + { + return; + } + + // + // Prepare Message ... + message = PrepareAlertMessage(message); + + // + // Send Push Notification Alert ... + SendNotification(message); +} + +// +// Alert Sending ... +void SendAlert(string message) +{ + // + // Validate Args ... + if (!enableAlerts) + { + return; + } + + // + // Log ... + if (logAlerts) + { + LogAlert(message); + } + + // + // Terminal ... + if (terminalAlerts) + { + TerminalAlert(message); + } + + // + // Mail ... + if (mailAlerts) + { + MailAlert(message); + } + + // + // Push ... + if (pushAlerts) + { + PushAlert(message); + } +} +// +// END Provided Functions ... +// diff --git a/MQLTestWorkspace/BKPS/14030222/Libraries/x-saherelm.common.lib.ex5 b/MQLTestWorkspace/BKPS/14030222/Libraries/x-saherelm.common.lib.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..fed4ddd1d711e10e060d75e326abaf70b4d85b62 GIT binary patch literal 5834 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 E1tf$EQvd(} literal 0 HcmV?d00001 diff --git a/MQLTestWorkspace/BKPS/14030222/Libraries/x-saherelm.common.lib.mq5 b/MQLTestWorkspace/BKPS/14030222/Libraries/x-saherelm.common.lib.mq5 new file mode 100644 index 0000000..1045b4c --- /dev/null +++ b/MQLTestWorkspace/BKPS/14030222/Libraries/x-saherelm.common.lib.mq5 @@ -0,0 +1,5311 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Common Library +// -------------------------------------- +// Name: XCommon +// Description: provide all commonly used functions ... +// +// +// 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 + +// +// START Inputs ... +// + +// +// END Inputs ... +// + +// +// Include Models Library ... +#include "x-saherelm.models.lib.mq5" +#include "../Classes/x-saherelm.xmd5.class.mq5" + +// +// START Global Definitions: Variables, Properties and etc ... +// +// +// END Global Definitions: Variables, Properties and etc ... +// + +// +// START Provided Functions ... +// + +// +// Detect is new Candle or not ... +bool IsNewCandle() +{ + // + bool result = false; + + // + static int barsOnChart = 0; + int currentBarsOnChart = Bars(_Symbol, _Period); + result = currentBarsOnChart > barsOnChart; + if (!result) + { + return result; + } + + // + barsOnChart = currentBarsOnChart; + result = true; + + // + return result; +} +bool IsNewCandle( + string mSymbol, // Trading Symbol ... + ENUM_TIMEFRAMES mPeriod // Trading Time Frame ... +) +{ + // + bool result = false; + + // + static string mChartTags[]; + static int mChartBars[]; + + // + string chTag = mSymbol + "," + ToString(mPeriod); + + // + int currChTagIdx = -1; + int chCountedBars = 0; + int currentBars = Bars(mSymbol, mPeriod); + + // + if (ArraySize(mChartTags) > 0) + { + // + for (int i = 0; i < ArraySize(mChartTags); i++) + { + // + string iTag = mChartTags[i]; + if (iTag != chTag) + { + continue; + } + + // + currChTagIdx = i; + break; + } + + // + if (currChTagIdx > -1) + { + chCountedBars = mChartBars[currChTagIdx]; + } + } + + // + result = currentBars > chCountedBars; + if (result) + { + // + if (currChTagIdx > -1) + { + // + mChartTags[currChTagIdx] = chTag; + mChartBars[currChTagIdx] = currentBars; + } + else + { + // + Add(chTag, mChartTags); + Add(currentBars, mChartBars); + } + } + + // + return result; +} + +// +double XNZ(double check, double val = 0) +{ + if (check == EMPTY_VALUE || check == 0) + { + return val; + } + else + { + return check; + } +} + +// +// Retrive Ask Price ... +double GetAsk() +{ + return SymbolInfoDouble(_Symbol, SYMBOL_ASK); +} +double GetAsk( + string symbol // selected symbol for calculations +) +{ + // + double result = SymbolInfoDouble(symbol, SYMBOL_ASK); + + // + return result; +} + +// +// Retrieve Bid Price ... +double GetBid() +{ + return SymbolInfoDouble(_Symbol, SYMBOL_BID); +} +double GetBid( + string symbol // selected symbol for calculations +) +{ + // + double result = SymbolInfoDouble(symbol, SYMBOL_BID); + + // + return result; +} + +// +// Calculate and Retrieve Spread Price ... +double GetSpread() +{ + // + double ask = GetAsk(); + double bid = GetBid(); + double result = MathAbs(ask - bid); + + // + return result; +} +double GetSpread( + string symbol // selected symbol for calculations +) +{ + // + double ask = GetAsk(symbol); + double bid = GetBid(symbol); + double result = MathAbs(ask - bid); + + // + return result; +} + +// +// Get Points ... +double GetPoints() +{ + return _Point; +} +double GetPoints( + string symbol // selected symbol for calculations +) +{ + // + double result = SymbolInfoDouble(symbol, SYMBOL_POINT); + + // + return result; +} + +// +// Get Digits ... +int GetDigits() +{ + return _Digits; +} +int GetDigits( + string symbol // selected symbol for calculations +) +{ + // + int result = (int)SymbolInfoInteger(symbol, SYMBOL_DIGITS); + + // + return result; +} + +// +// Get Signal Entry ... +double GetEntry( + ENUM_POSITION_TYPE type // Get entry price for Which direction trade ... +) +{ + // + double result = 0; + + // + bool isLong = type == POSITION_TYPE_BUY; + result = isLong ? GetAsk() : GetBid(); + result = NormalizePrice(result); + + // + return result; +} +double GetEntry( + string symbol, // Specified Symbol + ENUM_POSITION_TYPE type // Get entry price for Which direction trade ... +) +{ + // + double result = 0; + + // + bool isLong = type == POSITION_TYPE_BUY; + result = isLong ? GetAsk(symbol) : GetBid(symbol); + result = NormalizePrice(result, symbol); + + // + return result; +} + +// +// Get Signal Exit ... +double GetExit( + ENUM_POSITION_TYPE type // Get entry price for Which direction trade ... +) +{ + // + double result = 0; + + // + bool isLong = type == POSITION_TYPE_BUY; + result = isLong ? GetBid() : GetAsk(); + result = NormalizePrice(result); + + // + return result; +} +double GetExit( + string symbol, // Specified Symbol + ENUM_POSITION_TYPE type // Get entry price for Which direction trade ... +) +{ + // + double result = 0; + + // + bool isLong = type == POSITION_TYPE_BUY; + result = isLong ? GetBid(symbol) : GetAsk(symbol); + result = NormalizePrice(result, symbol); + + // + return result; +} + +// +// Determine a Position type is Long or not ... +bool IsLong(ENUM_POSITION_TYPE type) +{ + // + bool result = type == POSITION_TYPE_BUY; + + // + return result; +} +bool IsLong(ENUM_ORDER_TYPE type) +{ + // + bool result = type == ORDER_TYPE_BUY; + + // + return result; +} + +// +// Determine a Position type is Short or not ... +bool IsShort(ENUM_POSITION_TYPE type) +{ + // + bool result = type == POSITION_TYPE_SELL; + + // + return result; +} +bool IsShort(ENUM_ORDER_TYPE type) +{ + // + bool result = type == ORDER_TYPE_SELL; + + // + return result; +} + +// +// Get 1 Pip in Price Value ... +double GetPipPrice() +{ + // + double result = _Point; + if (_Digits == 3 || _Digits == 5) + { + result *= 10; + } + + // + return result; +} +double GetPipPrice( + string symbol // selected symbol for calculations +) +{ + // + double symbolPoint = GetPoints(symbol); + int symbolDigits = GetDigits(symbol); + + // + double result = symbolPoint; + if (symbolDigits == 3 || symbolDigits == 5) + { + result *= 10; + } + + // + return result; +} + +// +// Converts Pips To Price ... +double PipsToPrice( + int pips // pips amount +) +{ + // + int digits = GetDigits(); + double pipValue = GetPipPrice(); + double result = pips * pipValue; + + // + result = NormalizeDouble(result, digits); + + // + return result; +} +double PipsToPrice( + double pips // pips amount +) +{ + // + int digits = GetDigits(); + double pipValue = GetPipPrice(); + double result = pips * pipValue; + + // + result = NormalizeDouble(result, digits); + + // + return result; +} +double PipsToPrice( + string symbol, // selected symbol for calculation + int pips // pips amount +) +{ + // + int digits = GetDigits(symbol); + double pipValue = GetPipPrice(symbol); + double result = pips * pipValue; + + // + result = NormalizeDouble(result, digits); + + // + return result; +} +double PipsToPrice( + string symbol, // selected symbol for calculation + double pips // pips amount +) +{ + // + int digits = GetDigits(symbol); + double pipValue = GetPipPrice(symbol); + double result = pips * pipValue; + + // + result = NormalizeDouble(result, digits); + + // + return result; +} + +// +// Converts Price to Pips ... +double PriceToPips( + double price // the price amount which required to calculate +) +{ + // + int digits = GetDigits(); + double pipPrice = GetPipPrice(); + + // + double result = price / pipPrice; + + // + result = NormalizeDouble(result, digits); + + // + return result; +} +double PriceToPips( + string symbol, // Selected Symbol + double price // the price amount which required to calculate +) +{ + // + int digits = GetDigits(symbol); + double pipPrice = GetPipPrice(symbol); + + // + double result = price / pipPrice; + + // + result = NormalizeDouble(result, digits); + + // + return result; +} + +// +// Convert Price to Point ... +double PriceToPoint( + double price // the price amount which required to calculate +) +{ + return PriceToPoint(_Symbol, price); +} +double PriceToPoint( + string symbol, // Selected Symbol + double price // the price amount which required to calculate +) +{ + // + double result = 0; + + // + double point = GetPoints(symbol); + result = price / point; + + // + return result; +} + +// +// Converts Point to Price ... +double PointToPrice( + double points // Points Size +) +{ + return PointToPrice(_Symbol, points); +} +double PointToPrice( + string symbol, // Selected Symbol + double points // Points Size +) +{ + // + double result = 0; + + // + double point = GetPoints(symbol); + result = points * point; + + // + return result; +} + +// +// CANDLES ... + +// +// Validate Candle ... +bool IsValid( + XOHCL &candle // specified candle +) +{ + // + bool result = false; + + // + result = + // + candle.open > 0 && + candle.close > 0 && + candle.high > 0 && + candle.low > 0 + // + ; + + // + return result; +} + +// +// Get a Candle Body ... +double GetCandleBody( + XOHCL &candle // specified candle +) +{ + // + double result = 0; + + // + bool isValid = IsValid(candle); + if (!isValid) + { + return result; + } + + // + result = MathAbs(candle.open - candle.close); + + // + return result; +} + +// +// Get a Candle Range ... +double GetCandleRange( + XOHCL &candle // specified candle +) +{ + // + double result = 0; + + // + bool isValid = IsValid(candle); + if (!isValid) + { + return result; + } + + // + result = MathAbs(candle.high - candle.low); + + // + return result; +} + +// +// Get a Candle Shadow ... +double GetCandleShadow( + XOHCL &candle // specified candle +) +{ + // + double result = 0; + + // + bool isValid = IsValid(candle); + if (!isValid) + { + return 0; + } + + // + double range = GetCandleRange(candle); + double body = GetCandleBody(candle); + + // + result = MathAbs(range - body); + + // + return result; +} + +// +// Retrieve High Shadow of Candle ... +double GetCandleHighShadow( + XOHCL &candle // specified candle +) +{ + // + double result = 0; + + // + bool isValid = IsValid(candle); + if (!isValid) + { + return result; + } + + // + double upPrice = MathMax(candle.open, candle.close); + + // + result = candle.high - upPrice; + + // + return result; +} + +// +// Retrieve Low Shadow of Candle ... +double GetCandleLowShadow( + XOHCL &candle // specified candle +) +{ + // + double result = 0; + + // + bool isValid = IsValid(candle); + if (!isValid) + { + return result; + } + + // + double downPrice = MathMin(candle.open, candle.close); + + // + result = downPrice - candle.low; + + // + return result; +} + +// +// Check a Candle is Base Candle for RTM or not ... +bool IsBaseCandle( + XOHCL &candle // specified candle +) +{ + // + double range = GetCandleRange(candle); + double body = GetCandleBody(candle); + + // + bool result = body > range; + + // + return result; +} + +// +// Check Candle Body Bigger Than it's Shadow ... +bool CandleHasStrongBody(XOHCL &candle) +{ + // + double bodySize = MathAbs(candle.open - candle.close); + double shadowSize = MathAbs(candle.high - candle.low) - bodySize; + + // + bool result = bodySize > (shadowSize * 1.5); + + // + return result; +} + +// +// Detect Doji Candle ... +bool IsDojiCandle( + XOHCL &candle, // Specified Candle + double detectFactor = 0.05 // Detect Factor +) +{ + // + bool result = false; + + // + bool isValid = IsValid(candle); + if ( + !isValid || + detectFactor <= 0 || + detectFactor > 1) + { + return result; + } + + // + // Retrieve Candle Parts ... + double body = GetCandleBody(candle); + double range = GetCandleRange(candle); + double shadows = GetCandleShadow(candle); + + // + // Calculate Candle Rate ... + double factor = range * detectFactor; + double shadowFactor = (1 - detectFactor) * range; + + // + result = + // + body > 0 && + range > 0 && + factor > 0 && + shadows > 0 && + body <= factor && + shadowFactor > 0 && + shadows >= shadowFactor + // + ; + + // + return result; +} + +// +// Detect Shadows of Specific Candles must be same .. +bool IsCrossShadowCandle( + XOHCL &candle, // Specified Candle + double smoothingFactor = 0.05 // Smoothing Factor +) +{ + // + bool result = false; + + // + bool isValid = IsValid(candle); + if (!isValid || + smoothingFactor <= 0 || + smoothingFactor >= 1) + { + return result; + } + + // + // Retrieve Candle Parts ... + double body = GetCandleBody(candle); + double range = GetCandleRange(candle); + double shadows = GetCandleShadow(candle); + + // + double upBody = MathMax(candle.open, candle.close); + double downBody = MathMin(candle.open, candle.close); + + // + double upShadow = candle.high - upBody; + double downShadow = downBody - candle.low; + + // + // Calculate Candle Rate ... + double factor = range * smoothingFactor; + + // + result = + upShadow > 0 && + downShadow > 0 && + body > 0 && + range > 0 && + shadows > 0 && + ((upShadow == downShadow) || + MathAbs(upShadow - downShadow) <= factor); + + // + return result; +} + +// +// Detect a Candle Shadow Hunt Specific price or not ... +bool IsShadowHuntCandle( + XOHCL &candle, // Specified Candle + double price // Specified Price +) +{ + // + bool result = false; + + // + // Validate Args ... + bool isValid = IsValid(candle); + if (!isValid || price <= 0) + { + return result; + } + + // + double upBody = MathMax(candle.open, candle.close); + double downBody = MathMin(candle.open, candle.close); + + // + double hShadow = GetCandleHighShadow(candle); + double lShadow = GetCandleLowShadow(candle); + + // + double range = GetCandleRange(candle); + double factor = range * 0.3; + + // + bool isStrongHShadow = hShadow >= factor; + bool isStrongLShadow = lShadow >= factor; + + // + bool isPriceUp = + price >= candle.high || + price >= upBody; + + // + result = + // + isPriceUp + // + ? + // + isStrongHShadow && + (price == candle.high || + (price > upBody && price < candle.high)) + // + : + // + isStrongLShadow && + (price == candle.low || + (price < downBody && price > candle.low)) + // + ; + + // + return result; +} + +// +// Check a Candle is Bullish or not ... +bool IsBullishCandle( + XOHCL &candle // specified candle +) +{ + // + bool result = false; + + // + bool isValid = IsValid(candle); + if (!isValid) + { + return result; + } + + // + result = candle.open < candle.close; + + // + return result; +} +bool IsBullishCandle( + int bar_index // candle index +) +{ + // + bool result = false; + + // + XOHCL candle = GetCandle(bar_index); + + // + result = IsBullishCandle(candle); + + // + return result; +} +bool IsBullishCandle( + string symbol, // specify symbol + ENUM_TIMEFRAMES mPeriod, // specify timeframe + int bar_index // candle index +) +{ + // + bool result = false; + + // + XOHCL candle = GetCandle( + symbol, + mPeriod, + bar_index); + + // + result = IsBullishCandle(candle); + + // + return result; +} + +// +// Check a Candle is Bullish or not ... +bool IsBearishCandle( + XOHCL &candle // specified candle +) +{ + // + bool result = false; + + // + bool isValid = IsValid(candle); + if (!isValid) + { + return result; + } + + // + result = candle.open > candle.close; + + // + return result; +} +bool IsBearishCandle( + int bar_index // candle index +) +{ + // + bool result = false; + + // + XOHCL candle = GetCandle(bar_index); + + // + result = IsBearishCandle(candle); + + // + return result; +} +bool IsBearishCandle( + string symbol, // specify symbol + ENUM_TIMEFRAMES mPeriod, // specify timeframe + int bar_index // candle index +) +{ + // + bool result = false; + + // + XOHCL candle = GetCandle( + symbol, + mPeriod, + bar_index); + + // + result = IsBearishCandle(candle); + + // + return result; +} + +// +// Retrieve Applied Price at Specific Candle ... +double GetAppliedPrice( + XOHCL &candle, // specified candle + ENUM_APPLIED_PRICE source = PRICE_CLOSE // specified Applied To +) +{ + // + double result = EMPTY_VALUE; + + // + switch (source) + { + // + // Open ... + case PRICE_OPEN: + result = candle.open; + break; + + // + // High ... + case PRICE_HIGH: + result = candle.high; + break; + + // + // Low ... + case PRICE_LOW: + result = candle.low; + break; + + // + // Median ((High + Low) / 2) ... + case PRICE_MEDIAN: + result = (candle.high + candle.low) / 2; + break; + + // + // Typical ((High + Low + Close)/3) ... + case PRICE_TYPICAL: + result = (candle.high + candle.low + candle.close) / 3; + break; + + // + // Weighted ((High + Low + Close + Close)/4) ... + case PRICE_WEIGHTED: + result = (candle.high + candle.low + (candle.close * 2)) / 4; + break; + + // + // Close ... + default: + case PRICE_CLOSE: + result = candle.close; + break; + } + + // + return result; +} +double GetAppliedPrice( + int bar_index, // specify candle index + ENUM_APPLIED_PRICE source = PRICE_CLOSE // specified Applied To +) +{ + // + double result = EMPTY_VALUE; + + // + XOHCL candle = GetCandle(bar_index); + result = GetAppliedPrice(candle, source); + + // + return result; +} +double GetAppliedPrice( + int bar_index, // specify candle index + ENUM_SERIESMODE mode // converts Series Mode to Applied Price ... +) +{ + // + double result = 0; + + // + ENUM_APPLIED_PRICE mAppliedTo = To(mode); + result = GetAppliedPrice( + bar_index, + mAppliedTo); + + // + return result; +} + +// +template +double GetAppliedPrice(ENUM_APPLIED_PRICE tprice, T &open[], T &high[], T &low[], T &close[], int i) +{ + switch (tprice) + { + case PRICE_CLOSE: + return (close[i]); + case PRICE_OPEN: + return (open[i]); + case PRICE_HIGH: + return (high[i]); + case PRICE_LOW: + return (low[i]); + case PRICE_MEDIAN: + return ((high[i] + low[i]) / 2.0); + case PRICE_TYPICAL: + return ((high[i] + low[i] + close[i]) / 3.0); + case PRICE_WEIGHTED: + return ((high[i] + low[i] + close[i] + close[i]) / 4.0); + } + return (0); +} + +// +// Converts ... +ENUM_APPLIED_PRICE To( + ENUM_SERIESMODE mode // converts Series Mode to Applied Price ... +) +{ + // + ENUM_APPLIED_PRICE result = PRICE_CLOSE; + + // + switch (mode) + { + // + // High ... + case MODE_HIGH: + result = PRICE_HIGH; + break; + + // + // Open ... + case MODE_OPEN: + result = PRICE_OPEN; + break; + + // + // Low ... + case MODE_LOW: + result = PRICE_LOW; + break; + + // + // Close ... + // Default ... + case MODE_CLOSE: + default: + result = PRICE_CLOSE; + break; + } + + // + return result; +} + +// +// Retrieve a Candel Data ... +XOHCL GetCandle(int bar_index) +{ + // + XOHCL result = {}; + + // + double open = iOpen(_Symbol, _Period, bar_index); + double high = iHigh(_Symbol, _Period, bar_index); + double close = iClose(_Symbol, _Period, bar_index); + double low = iLow(_Symbol, _Period, bar_index); + + // + result.low = low; + result.open = open; + result.high = high; + result.close = close; + + // + return result; +} +XOHCL GetCandle( + ENUM_TIMEFRAMES mPeriod, // specify timeframe + int bar_index // specify candle index +) +{ + // + XOHCL result = {}; + + // + double open = iOpen(_Symbol, mPeriod, bar_index); + double high = iHigh(_Symbol, mPeriod, bar_index); + double close = iClose(_Symbol, mPeriod, bar_index); + double low = iLow(_Symbol, mPeriod, bar_index); + + // + result.low = low; + result.open = open; + result.high = high; + result.close = close; + + // + return result; +} +XOHCL GetCandle( + string symbol, // specify symbol + ENUM_TIMEFRAMES mPeriod, // specify timeframe + int bar_index // specify candle index +) +{ + // + XOHCL result = {}; + + // + double open = iOpen(symbol, mPeriod, bar_index); + double high = iHigh(symbol, mPeriod, bar_index); + double close = iClose(symbol, mPeriod, bar_index); + double low = iLow(symbol, mPeriod, bar_index); + + // + result.low = low; + result.open = open; + result.high = high; + result.close = close; + + // + return result; +} + +// +// Get a Series Of Candles ... +bool GetCandles( + XOHCL &result[], // Hold Result ... + string mSymbol = NULL, // Specified Symbol ... + ENUM_TIMEFRAMES mPeriod = NULL, // Specified Period ... + int mStart = 0, // Start Bar Index ... + int mCount = 1 // Specified Number of Candles ... +) +{ + // + bool mResult = false; + + // + if (mStart < 0) + { + mStart = 0; + } + + // + if (mCount <= 0) + { + mCount = 1; + } + + // + Clean(result); + + // + for (int i = mStart; i < mStart + mCount; i++) + { + // + XOHCL iC = GetCandle( + mSymbol, + mPeriod, + i); + + // + Add( + iC, + result); + } + + // + mResult = ArraySize(result) > 0; + + // + return mResult; +} + +// +// Retrieve a candle index in current timeframe inside another timeframe ... +int GetCandleBarIndex( + int bar_index, // Specify Candle index in current timeframe + ENUM_TIMEFRAMES destPeriod // Specify destination timeframe +) +{ + // + int result = -1; + + // + datetime barTime = iTime(_Symbol, _Period, bar_index); + result = iBarShift(_Symbol, destPeriod, barTime); + + // + return result; +} + +// +// Retrieve a symbol candle index in source time frame inside dest timeframe ... +int GetCandleBarIndex( + int bar_index, // Specify Candle index in current timeframe + string symbol, // Specify desired Symbol + ENUM_TIMEFRAMES sourcePeriod, // Specify bar_index timeframe + ENUM_TIMEFRAMES destPeriod // Specify destination timeframe +) +{ + // + int result = -1; + + // + datetime barTime = iTime(symbol, sourcePeriod, bar_index); + result = iBarShift(symbol, destPeriod, barTime); + + // + return result; +} + +// +// Determines a cnadle is Swing High +// or Swing Low order block ... +ENUM_X_SWING_TYPE GetCandleSwing(int bar_index) +{ + // + ENUM_X_SWING_TYPE result = X_NO_SWING; + + // + // Reading Candle Models ... + XOHCL candles[3]; + candles[0] = GetCandle(bar_index + 1); + candles[1] = GetCandle(bar_index + 2); + candles[2] = GetCandle(bar_index + 3); + + // + // Check Swing Start Candle has Strong Body ... + bool isStrongBodyCandle = CandleHasStrongBody(candles[2]); + if (!isStrongBodyCandle) + { + return result; + } + + // + // Check Swing Low Conditions ... + bool isSwingLowOrderBlock = + candles[2].low < candles[1].low && + candles[1].low < candles[0].low && + candles[2].low < candles[0].low; + if (isSwingLowOrderBlock) + { + result = X_SWING_LOW; + } + + // + // Check Swing High Conditions ... + bool isSwingHighOrderBlock = + candles[2].high > candles[1].high && + candles[1].high > candles[0].high && + candles[2].high > candles[0].high; + if (isSwingHighOrderBlock) + { + result = X_SWING_HIGH; + } + + // + return result; +} +ENUM_X_SWING_TYPE GetCandleSwing( + ENUM_TIMEFRAMES mPeriod, // specify timeframe + int bar_index // specify candle index +) +{ + // + ENUM_X_SWING_TYPE result = X_NO_SWING; + + // + // Reading Candle Models ... + XOHCL candles[3]; + candles[0] = GetCandle(mPeriod, bar_index + 1); + candles[1] = GetCandle(mPeriod, bar_index + 2); + candles[2] = GetCandle(mPeriod, bar_index + 3); + + // + // Check Swing Start Candle has Strong Body ... + bool isStrongBodyCandle = CandleHasStrongBody(candles[2]); + if (!isStrongBodyCandle) + { + return result; + } + + // + // Check Swing Low Conditions ... + bool isSwingLowOrderBlock = + candles[2].low < candles[1].low && + candles[1].low < candles[0].low && + candles[2].low < candles[0].low; + if (isSwingLowOrderBlock) + { + result = X_SWING_LOW; + } + + // + // Check Swing High Conditions ... + bool isSwingHighOrderBlock = + candles[2].high > candles[1].high && + candles[1].high > candles[0].high && + candles[2].high > candles[0].high; + if (isSwingHighOrderBlock) + { + result = X_SWING_HIGH; + } + + // + return result; +} +ENUM_X_SWING_TYPE GetCandleSwing( + string symbol, // specify symbol + ENUM_TIMEFRAMES mPeriod, // specify timeframe + int bar_index // specify candle index +) +{ + // + ENUM_X_SWING_TYPE result = X_NO_SWING; + + // + // Reading Candle Models ... + XOHCL candles[3]; + candles[0] = GetCandle(symbol, mPeriod, bar_index + 1); + candles[1] = GetCandle(symbol, mPeriod, bar_index + 2); + candles[2] = GetCandle(symbol, mPeriod, bar_index + 3); + + // + // Check Swing Start Candle has Strong Body ... + bool isStrongBodyCandle = CandleHasStrongBody(candles[2]); + if (!isStrongBodyCandle) + { + return result; + } + + // + // Check Swing Low Conditions ... + bool isSwingLowOrderBlock = + candles[2].low < candles[1].low && + candles[1].low < candles[0].low && + candles[2].low < candles[0].low; + if (isSwingLowOrderBlock) + { + result = X_SWING_LOW; + } + + // + // Check Swing High Conditions ... + bool isSwingHighOrderBlock = + candles[2].high > candles[1].high && + candles[1].high > candles[0].high && + candles[2].high > candles[0].high; + if (isSwingHighOrderBlock) + { + result = X_SWING_HIGH; + } + + // + return result; +} + +// +// Find Swing Points ... +int FindSwing( + string mSymbol, // Trading Symbol ... + ENUM_TIMEFRAMES mPeriod, // Trading Period ... + ENUM_SERIESMODE mode, // Swing Based On Price mode ... + int mLength, // Loopback ... + int bar_index // BarIndex ... +) +{ + // + int result = -1; + + // + if (StringLen(mSymbol) == 0 || (mode != MODE_HIGH && mode != MODE_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_SERIESMODE 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; + } + + // + result = mode == MODE_HIGH + ? iHighest( + mSymbol, + mPeriod, + mode, + mLength, + bar_index) + : iLowest( + mSymbol, + mPeriod, + mode, + mLength, + bar_index); + + // + return result; +} + +// +// Retrieve Market Highest High ... +double GetHighestHigh( + int mLength, // Which market Length use + int bar_index // bar index +) +{ + // + double result = -1; + + // + int rIdx = iHighest( + _Symbol, + _Period, + MODE_HIGH, + mLength, + bar_index); + + // + result = iHigh( + _Symbol, + _Period, + rIdx); + + // + return result; +} +double GetHighestHigh( + int mLength, // Which market Length use + int bar_index, // bar index + ENUM_SERIESMODE mode // Calculation mode +) +{ + // + double result = -1; + + // + int rIdx = iHighest( + _Symbol, + _Period, + mode, + mLength, + bar_index); + + // + result = iHigh( + _Symbol, + _Period, + rIdx); + + // + return result; +} +double GetHighestHigh( + string symbol, // Specified Symbol + ENUM_TIMEFRAMES mPeriod, // Specified Period + int mLength, // Which market Length use + int bar_index // bar index +) +{ + // + double result = -1; + + // + int rIdx = iHighest( + symbol, + mPeriod, + MODE_HIGH, + mLength, + bar_index); + + // + result = iHigh( + symbol, + mPeriod, + rIdx); + + // + return result; +} +double GetHighestHigh( + string symbol, // Specified Symbol + ENUM_TIMEFRAMES mPeriod, // Specified Period + ENUM_SERIESMODE mode, // Calculation mode + int mLength, // Which market Length use + int bar_index // bar index +) +{ + // + double result = -1; + + // + int rIdx = iHighest( + symbol, + mPeriod, + mode, + mLength, + bar_index); + + // + result = iHigh( + symbol, + mPeriod, + rIdx); + + // + return result; +} + +// +// Retrieve Market Lowest Low ... +double GetLowestLow( + int mLength, // Which market Length use + int bar_index // bar index +) +{ + // + double result = -1; + + // + int rIdx = iLowest( + _Symbol, + _Period, + MODE_LOW, + mLength, + bar_index); + + // + result = iLow( + _Symbol, + _Period, + rIdx); + + // + return result; +} +double GetLowestLow( + int mLength, // Which market Length use + int bar_index, // bar index + ENUM_SERIESMODE mode // Calculation mode +) +{ + // + double result = -1; + + // + int rIdx = iLowest( + _Symbol, + _Period, + mode, + mLength, + bar_index); + + // + result = iLow( + _Symbol, + _Period, + rIdx); + + // + return result; +} +double GetLowestLow( + string symbol, // Specified Symbol + ENUM_TIMEFRAMES mPeriod, // Specified Period + int mLength, // Which market Length use + int bar_index // bar index +) +{ + // + double result = -1; + + // + int rIdx = iLowest( + symbol, + mPeriod, + MODE_LOW, + mLength, + bar_index); + + // + result = iLow( + symbol, + mPeriod, + rIdx); + + // + return result; +} +double GetLowestLow( + string symbol, // Specified Symbol + ENUM_TIMEFRAMES mPeriod, // Specified Period + ENUM_SERIESMODE mode, // Calculation mode + int mLength, // Which market Length use + int bar_index // bar index +) +{ + // + double result = -1; + + // + int rIdx = iLowest( + symbol, + mPeriod, + mode, + mLength, + bar_index); + + // + result = iLow( + symbol, + mPeriod, + rIdx); + + // + return result; +} + +// +// Find Support and Resistance for Specific Bar based on provided Buffer ... +XOHCLSupRes ExtractSupportAndResistance( + int barIndex, // Bar Index ... + const double &pivots[], // Provided Pivot Points ... + int count = 3, // Number of Requireds ... + double step = 0, // Distance between each item with it's Last Side ... + string mSymbol = NULL, // Trading Symbol ... + ENUM_TIMEFRAMES mPeriod = NULL // Trading Period ... +) +{ + // + if (StringLen(mSymbol) == 0 || mSymbol == NULL) + { + mSymbol = _Symbol; + } + + // + if (mPeriod == NULL) + { + mPeriod = _Period; + } + + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + XOHCLSupRes result; + Clean(result.res); + Clean(result.sup); + + // + int pivotsCount = ArraySize(pivots); + if (pivotsCount <= 0) + { + return result; + } + + // + if (count <= 0 || + count > pivotsCount - 1) + { + return result; + } + + // + XOHCL cBar = GetCandle( + mSymbol, + mPeriod, + barIndex); + + // + double lastR = 0; + double tmpR[]; + + // + double lastS = 0; + double tmpS[]; + + // + // Extract Supports ... + // which prices is under low of candle ... + // + // Extract Resistance ... + // which prices is over high of candle ... + for (int i = 0; i < pivotsCount; i++) + { + // + double iFlat = pivots[i]; + + // + if (iFlat > cBar.high) + { + // + bool canAdd = + step <= 0 + ? true + : lastR == 0 || MathAbs(iFlat - lastR) >= step; + if (canAdd) + { + // + Add( + iFlat, + tmpR); + + // + lastR = iFlat; + } + } + else if (iFlat < cBar.low) + { + // + bool canAdd = + step <= 0 + ? true + : lastS == 0 || MathAbs(iFlat - lastS) >= step; + if (canAdd) + { + // + Add( + iFlat, + tmpS); + + // + lastS = iFlat; + } + } + } + + // + // Sorting Founded Resistance and Supports ... + + // + // Since Resistance Levels must be Increasing ... + ArraySort(tmpR); + + // + // Since Support Levels must be Decreasing ... + ArraySort(tmpS); + ArrayReverse(tmpS); + + // + // Fill Resistance ... + int tmpRCount = ArraySize(tmpR); + if (tmpRCount > 0) + { + // + if (tmpRCount < count) + { + // + ArrayCopy( + result.res, + tmpR); + } + else + { + // + ArrayCopy( + result.res, + tmpR, + 0, + 0, + count); + } + } + + // + // Fill Supports ... + int tmpSCount = ArraySize(tmpS); + if (tmpSCount > 0) + { + // + if (tmpSCount < count) + { + // + ArrayCopy( + result.sup, + tmpS); + } + else + { + // + ArrayCopy( + result.sup, + tmpS, + 0, + 0, + count); + } + } + + // + return result; +} + +// +// Find Support and Resistance for Specific Price based on provided Buffer ... +XOHCLSupRes ExtractSupportAndResistance( + double price, // Price ... + const double &pivots[], // Provided Pivot Points ... + int count = 3, // Number of Requireds ... + double step = 0 // Distance between each item with it's Last Side ... +) +{ + // + XOHCLSupRes result; + Clean(result.res); + Clean(result.sup); + + // + if (price <= 0) + { + return result; + } + + // + int pivotsCount = ArraySize(pivots); + if (pivotsCount <= 0) + { + return result; + } + + // + if (count <= 0 || + count > pivotsCount - 1) + { + return result; + } + + // + double lastR = 0; + double tmpR[]; + + // + double lastS = 0; + double tmpS[]; + + // + // Extract Supports ... + // which prices is under low of candle ... + // + // Extract Resistance ... + // which prices is over high of candle ... + for (int i = 0; i < pivotsCount; i++) + { + // + double iFlat = pivots[i]; + + // + if (iFlat > price) + { + // + bool canAdd = + step <= 0 + ? true + : lastR == 0 || MathAbs(iFlat - lastR) >= step; + if (canAdd) + { + // + Add( + iFlat, + tmpR); + + // + lastR = iFlat; + } + } + else if (iFlat < price) + { + // + bool canAdd = + step <= 0 + ? true + : lastS == 0 || MathAbs(iFlat - lastS) >= step; + if (canAdd) + { + // + Add( + iFlat, + tmpS); + + // + lastS = iFlat; + } + } + } + + // + // Sorting Founded Resistance and Supports ... + + // + // Since Resistance Levels must be Increasing ... + ArraySort(tmpR); + + // + // Since Support Levels must be Decreasing ... + ArraySort(tmpS); + ArrayReverse(tmpS); + + // + // Fill Resistance ... + int tmpRCount = ArraySize(tmpR); + if (tmpRCount > 0) + { + // + if (tmpRCount < count) + { + // + ArrayCopy( + result.res, + tmpR); + } + else + { + // + ArrayCopy( + result.res, + tmpR, + 0, + 0, + count); + } + } + + // + // Fill Supports ... + int tmpSCount = ArraySize(tmpS); + if (tmpSCount > 0) + { + // + if (tmpSCount < count) + { + // + ArrayCopy( + result.sup, + tmpS); + } + else + { + // + ArrayCopy( + result.sup, + tmpS, + 0, + 0, + count); + } + } + + // + return result; +} + +// +// Find a Value less than Specified ... +double FindLesserThanValue( + double value, // Specified Value ... + const double &source[], // Source ... + bool isDescend = false // Find Biggest Lesser Value ... +) +{ + // + double result = -1; + + // + int itemsCount = ArraySize(source); + if (itemsCount <= 0) + { + return result; + } + + // + // Make a Copy of source ... + double tmp[]; + + // + ArrayResize( + tmp, + ArraySize(source)); + + // + ArrayCopy( + tmp, + source); + + // + // Sort Temp Buffer ... + ArraySort(tmp); + if (isDescend) + { + ArrayReverse(tmp); + } + + // + int tmpCount = ArraySize(tmp); + for (int i = 0; i < tmpCount; i++) + { + // + double iValue = tmp[i]; + + // + if (iValue < value) + { + // + result = iValue; + break; + } + } + + // + return result; +} + +// +// Find a Value less than Specified ... +double FindBiggerThanValue( + double value, // Specified Value ... + const double &source[], // Source ... + bool isDescend = false // Find Smallest Bigger Value ... +) +{ + // + double result = -1; + + // + int itemsCount = ArraySize(source); + if (itemsCount <= 0) + { + return result; + } + + // + // Make a Copy of source ... + double tmp[]; + + // + ArrayResize( + tmp, + ArraySize(source)); + + // + ArrayCopy( + tmp, + source); + + // + // Sort Temp Buffer ... + ArraySort(tmp); + if (!isDescend) + { + ArrayReverse(tmp); + } + + // + int tmpCount = ArraySize(tmp); + for (int i = 0; i < tmpCount; i++) + { + // + double iValue = tmp[i]; + + // + if (iValue > value) + { + // + result = iValue; + break; + } + } + + // + return result; +} + +// +// Calculate Fib Level ... +double GetFibonacciLevel( + double upPrice, + double downPrice, + double level, + int direction) +{ + // + double ling = upPrice - downPrice; + double pLevel = (ling / 100) * (level * 100); + + // + double result = direction > 0 ? upPrice - pLevel : downPrice + pLevel; + result = NormalizeDouble(result, _Digits); + + // + return result; +} + +// +// Check first Cross Over second at bar_index ... +bool IsCrossOver( + const double &first[], // the buffer which check crossing over second buffer + const double &second[], // first buffer checks based on this buffer + const int bar_index // check crosses in specific index +) +{ + // + bool result = false; + + // + ArraySetAsSeries(first, true); + ArraySetAsSeries(second, true); + + // + // Validate Args ... + if (ArraySize(first) < bar_index + 1 || ArraySize(second) < bar_index + 1) + { + return result; + } + + // + result = first[bar_index] > second[bar_index] && + !(first[bar_index + 1] > second[bar_index + 1]); + + // + return result; +} + +// +// Check first is Over second at bar_index ... +bool IsOver( + const double &first[], // the buffer which check over second buffer + const double &second[], // first buffer checks based on this buffer + const int bar_index // check crosses in specific index +) +{ + // + bool result = false; + + // + ArraySetAsSeries(first, true); + ArraySetAsSeries(second, true); + + // + // Validate Args ... + if (ArraySize(first) < bar_index + 1 || ArraySize(second) < bar_index + 1) + { + return result; + } + + // + result = first[bar_index] > second[bar_index] && + first[bar_index + 1] > second[bar_index + 1]; + + // + return result; +} + +// +// Check first Cross Under second at bar_index ... +bool IsCrossUnder( + const double &first[], // the buffer which check crossing under second buffer + const double &second[], // first buffer checks based on this buffer + const int bar_index // check crosses in specific index +) +{ + // + bool result = false; + + // + ArraySetAsSeries(first, true); + ArraySetAsSeries(second, true); + + // + // Validate Args ... + if (ArraySize(first) < bar_index + 1 || ArraySize(second) < bar_index + 1) + { + return result; + } + + // + result = first[bar_index] < second[bar_index] && + !(first[bar_index + 1] < second[bar_index + 1]); + + // + return result; +} + +// +// Check first is Under second at bar_index ... +bool IsUnder( + const double &first[], // the buffer which check under second buffer + const double &second[], // first buffer checks based on this buffer + const int bar_index // check crosses in specific index +) +{ + // + bool result = false; + + // + ArraySetAsSeries(first, true); + ArraySetAsSeries(second, true); + + // + // Validate Args ... + if (ArraySize(first) < bar_index + 1 || ArraySize(second) < bar_index + 1) + { + return result; + } + + // + result = first[bar_index] < second[bar_index] && + first[bar_index + 1] < second[bar_index + 1]; + + // + return result; +} + +// +// Calculate Slope of Specified Buffer at Specified Index ... +double GetSlope( + int from, // In Past Index ... + int to, // In Past Index ... + double &buffer[]) +{ + // + double result = 0; + + // + double toValue = buffer[to]; + double fromValue = buffer[from]; + double deltaValue = toValue - fromValue; + double deltaTime = from - to; + + // + result = deltaValue / deltaTime; + + // + return result; +} + +// +// Check if a Value Increasing in Loopback ... +bool IsIncreasing( + int from, // Last Time Index + int to, // Fisr Tima Index + double &buffer[] // the Buffer which required to search +) +{ + // + bool result = false; + + // + // Validate Args ... + if ( + from <= to || + ArraySize(buffer) < from + 1) + { + return result; + } + + // + // Loop through Items ... + double toValue = buffer[to]; + double fromValue = buffer[from]; + result = toValue > fromValue; + for (int i = to + 1; i <= from - 1; i++) + { + // + double iValue = buffer[i]; + bool isPassed = toValue >= iValue; + + // + bool isIIncreasing = IsIncreasing( + from, + i, + buffer); + + // + // Check Result ... + result = result && isPassed && isIIncreasing; + if (!result) + { + break; + } + } + + // + return result; +} + +// +// Check if a Value Decreasing in Loopback ... +bool IsDecreasing( + int from, // Last Time Index + int to, // Fisr Tima Index + double &buffer[] // the Buffer which required to search +) +{ + // + bool result = false; + + // + // Validate Args ... + if ( + from <= to || + ArraySize(buffer) < from + 1) + { + return result; + } + + // + // Loop through Items ... + double toValue = buffer[to]; + double fromValue = buffer[from]; + result = toValue < fromValue; + for (int i = to + 1; i <= from - 1; i++) + { + // + double iValue = buffer[i]; + bool isPassed = toValue <= iValue; + + // + bool isIDecreasing = IsDecreasing( + from, + i, + buffer); + + // + // Check Result ... + result = result && isPassed && isIDecreasing; + if (!result) + { + break; + } + } + + // + return result; +} + +// +// Get Max Value of Specific Loopback of a Buffer ... +double GetMaxValue( + int mLoopback, // loopback length + double &buffer[] // the Buffer which required to search +) +{ + // + double result = 0; + + // + // Validate Args ... + if ( + mLoopback < 2 || + ArraySize(buffer) < mLoopback) + { + return result; + } + + // + // Loop Through LoopBack ... + for (int i = 0; i < mLoopback; i++) + { + // + double iValue = buffer[i]; + + // + result = + // + result == 0 || result < iValue + // + ? iValue + // + : result + // + ; + } + + // + return result; +} + +// +// Get Min Value of Specific Loopback of a Buffer ... +double GetMinValue( + int mLoopback, // loopback length + double &buffer[] // the Buffer which required to search +) +{ + // + double result = 0; + + // + // Validate Args ... + if ( + mLoopback < 2 || + ArraySize(buffer) < mLoopback) + { + return result; + } + + // + // Loop Through LoopBack ... + for (int i = 0; i < mLoopback; i++) + { + // + double iValue = buffer[i]; + + // + result = + // + result == 0 || result > iValue + // + ? iValue + // + : result + // + ; + } + + // + return result; +} + +// +// Find Same Values in Array ... +void FindSameValueInBuffer( + double &result[], // Holds Result ... + double &source[], // Source ... + int verifications = 3 // Number of Consequence Repeat ... +) +{ + // + Clean(result); + + // + // TenkanSen Flats ... + int sourceCount = ArraySize(source); + if (sourceCount > verifications) + { + // + double mLast = 0; + int mVerified = 0; + for (int i = 0; i < sourceCount; i++) + { + // + double iVal = source[i]; + if (mLast == 0) + { + mLast = iVal; + } + else if (mLast == iVal) + { + mVerified++; + } + else + { + mLast = iVal; + mVerified = 0; + } + + // + if (iVal == mLast && mVerified >= verifications) + { + // + Add( + iVal, + result); + + // + mLast = 0; + mVerified = 0; + } + } + } +} + +// +bool IsInPeak( + int mLoopback, // loopback length + double &buffer[] // the Buffer which required to search +) +{ + // + bool result = false; + + // + // Validate Args ... + if ( + mLoopback < 2 || + ArraySize(buffer) < mLoopback + 1) + { + return result; + } + + // + int q1Length = mLoopback / 4; + int halfLength = mLoopback / 2; + int q2Length = halfLength + q1Length; + + // + double firstValue = buffer[1]; + double q1Value = buffer[q1Length]; + double q2Value = buffer[q2Length]; + double halfValue = buffer[halfLength]; + double lastValue = buffer[ArraySize(buffer) - 1]; + + // + // Peak ... + result = + // + firstValue > lastValue + // + && + // + ( + firstValue > q1Value && + firstValue > halfValue) + // + ; + + // + return result; +} + +// +bool IsInVale( + int mLoopback, // loopback length + double &buffer[] // the Buffer which required to search +) +{ + // + bool result = false; + + // + // Validate Args ... + if ( + mLoopback < 2 || + ArraySize(buffer) < mLoopback + 1) + { + return result; + } + + // + int q1Length = mLoopback / 4; + int halfLength = mLoopback / 2; + int q2Length = halfLength + q1Length; + + // + double firstValue = buffer[1]; + double q1Value = buffer[q1Length]; + double q2Value = buffer[q2Length]; + double halfValue = buffer[halfLength]; + double lastValue = buffer[ArraySize(buffer) - 1]; + + // + // Peak ... + result = + // + firstValue < lastValue + // + && + // + ( + firstValue < q1Value && + firstValue < halfValue) + // + ; + + // + return result; +} + +// +// Check Sharp Happens or not ... +bool IsSharpChanged( + double fromValue, // Past Value + double toValue, // Present Value + double maxValue, // Max in Range Value + double minValue // Min in Range Value +) +{ + // + bool result = false; + + // + // This Used In Increased or Decreased Sharp Detection ... + bool isIncreased = toValue > fromValue; + + // + double toFromDelta = MathAbs(toValue - fromValue); + double minMaxDelta = maxValue - minValue; + + // + result = toFromDelta >= (minMaxDelta / 3); + + // + return result; +} +bool IsSharpChanged( + int from, // Past Index in Series + int to, // Present Index in Series + double &buffer[] // the Buffer which required to search +) +{ + // + bool result = false; + + // + // Validate Args ... + if ( + from <= to || + ArraySize(buffer) < from + 1) + { + return result; + } + + // + // Loop through Items ... + double toValue = buffer[to]; + double fromValue = buffer[from]; + + // + // This Used In Increased or Decreased Sharp Detection ... + bool isIncreased = toValue > fromValue; + + // + double minValue = GetMinValue( + ArraySize(buffer) - 1, + buffer); + double maxValue = GetMaxValue( + ArraySize(buffer) - 1, + buffer); + double minMaxDelta = maxValue - minValue; + + // + // Sharp Detection ... + result = IsSharpChanged( + fromValue, + toValue, + maxValue, + minValue); + + // + return result; +} +bool IsSharpChanged( + int from, // Past Bar Index + int to, // Present Bar Index + ENUM_APPLIED_PRICE appliedPrice // Which Price Choose in From or To +) +{ + // + bool result = false; + + // + double toValue = GetAppliedPrice( + to, + appliedPrice); + double fromValue = GetAppliedPrice( + from, + appliedPrice); + + // + int hIdx = iHighest( + _Symbol, + _Period, + MODE_HIGH, + from, + to); + double maxValue = iHigh( + _Symbol, + _Period, + hIdx); + + // + int lIdx = iLowest( + _Symbol, + _Period, + MODE_LOW, + from, + to); + double minValue = iLow( + _Symbol, + _Period, + lIdx); + + // + result = IsSharpChanged( + fromValue, + toValue, + maxValue, + minValue); + + // + return result; +} + +// +// Check InCreased Sharp Happens or not ... +bool IsSharpIncreasedChanged( + double fromValue, // Past Value + double toValue, // Present Value + double maxValue, // Max in Range Value + double minValue // Min in Range Value +) +{ + // + bool result = false; + + // + // This Used In Increased or Decreased Sharp Detection ... + bool isIncreased = toValue > fromValue; + + // + double toFromDelta = MathAbs(toValue - fromValue); + double minMaxDelta = maxValue - minValue; + + // + result = + isIncreased && + toFromDelta >= (minMaxDelta / 3); + + // + return result; +} +bool IsSharpIncreasedChanged( + int from, // Past Index in Series + int to, // Present Index in Series + double &buffer[] // the Buffer which required to search +) +{ + // + bool result = false; + + // + // Validate Args ... + if ( + from <= to || + ArraySize(buffer) < from + 1) + { + return result; + } + + // + // Loop through Items ... + double toValue = buffer[to]; + double fromValue = buffer[from]; + + // + double minValue = GetMinValue( + ArraySize(buffer) - 1, + buffer); + double maxValue = GetMaxValue( + ArraySize(buffer) - 1, + buffer); + double minMaxDelta = maxValue - minValue; + + // + // Sharp Detection ... + result = IsSharpIncreasedChanged( + fromValue, + toValue, + maxValue, + minValue); + + // + return result; +} +bool IsSharpIncreasedChanged( + int from, // Past Bar Index + int to, // Present Bar Index + ENUM_APPLIED_PRICE appliedPrice // Which Price Choose in From or To +) +{ + // + bool result = false; + + // + double toValue = GetAppliedPrice( + to, + appliedPrice); + double fromValue = GetAppliedPrice( + from, + appliedPrice); + + // + int hIdx = iHighest( + _Symbol, + _Period, + MODE_HIGH, + from, + to); + double maxValue = iHigh( + _Symbol, + _Period, + hIdx); + + // + int lIdx = iLowest( + _Symbol, + _Period, + MODE_LOW, + from, + to); + double minValue = iLow( + _Symbol, + _Period, + lIdx); + + // + result = IsSharpIncreasedChanged( + fromValue, + toValue, + maxValue, + minValue); + + // + return result; +} + +// +// Check Decreased Sharp Happens or not ... +bool IsSharpDecreasedChanged( + double fromValue, // Past Value + double toValue, // Present Value + double maxValue, // Max in Range Value + double minValue // Min in Range Value +) +{ + // + bool result = false; + + // + // This Used In Increased or Decreased Sharp Detection ... + bool isIncreased = toValue > fromValue; + + // + double toFromDelta = MathAbs(toValue - fromValue); + double minMaxDelta = maxValue - minValue; + + // + result = + !isIncreased && + toFromDelta >= (minMaxDelta / 3); + + // + return result; +} +bool IsSharpDecreasedChanged( + int from, // Past Index in Series + int to, // Present Index in Series + double &buffer[] // the Buffer which required to search +) +{ + // + bool result = false; + + // + // Validate Args ... + if ( + from <= to || + ArraySize(buffer) < from + 1) + { + return result; + } + + // + // Loop through Items ... + double toValue = buffer[to]; + double fromValue = buffer[from]; + + // + double minValue = GetMinValue( + ArraySize(buffer) - 1, + buffer); + double maxValue = GetMaxValue( + ArraySize(buffer) - 1, + buffer); + double minMaxDelta = maxValue - minValue; + + // + // Sharp Detection ... + result = IsSharpDecreasedChanged( + fromValue, + toValue, + maxValue, + minValue); + + // + return result; +} +bool IsSharpDecreasedChanged( + int from, // Past Bar Index + int to, // Present Bar Index + ENUM_APPLIED_PRICE appliedPrice // Which Price Choose in From or To +) +{ + // + bool result = false; + + // + double toValue = GetAppliedPrice( + to, + appliedPrice); + double fromValue = GetAppliedPrice( + from, + appliedPrice); + + // + int hIdx = iHighest( + _Symbol, + _Period, + MODE_HIGH, + from, + to); + double maxValue = iHigh( + _Symbol, + _Period, + hIdx); + + // + int lIdx = iLowest( + _Symbol, + _Period, + MODE_LOW, + from, + to); + double minValue = iLow( + _Symbol, + _Period, + lIdx); + + // + result = IsSharpDecreasedChanged( + fromValue, + toValue, + maxValue, + minValue); + + // + return result; +} + +// +void Clean(int &buffer[]) +{ + // + ArrayFree(buffer); + ArrayResize(buffer, 0); +} +void Clean(ulong &buffer[]) +{ + // + ArrayFree(buffer); + ArrayResize(buffer, 0); +} +void Clean(string &buffer[]) +{ + // + ArrayFree(buffer); + ArrayResize(buffer, 0); +} +void Clean(double &buffer[]) +{ + // + ArrayFree(buffer); + ArrayResize(buffer, 0); +} + +// +template +bool GetLastItem( + T &item, // Holds Result + T &buffer[] // Specified Buffer +) +{ + // + bool result = false; + + // + int bufferSize = ArraySize(buffer); + if (bufferSize <= 0) + { + return result; + } + + // + item = buffer[bufferSize - 1]; + + // + result = true; + return result; +} + +// +void Add( + int item, // item want to add + int &buffer[] // Destination buffer +) +{ + // + ArrayResize( + buffer, + ArraySize(buffer) + 1); + + // + buffer[ArraySize(buffer) - 1] = item; +} +void Add( + ulong item, // item want to add + ulong &buffer[] // Destination buffer +) +{ + // + ArrayResize( + buffer, + ArraySize(buffer) + 1); + + // + buffer[ArraySize(buffer) - 1] = item; +} +void Add( + string item, // item want to add + string &buffer[] // Destination buffer +) +{ + // + ArrayResize( + buffer, + ArraySize(buffer) + 1); + + // + buffer[ArraySize(buffer) - 1] = item; +} +void Add( + double item, // item want to add + double &buffer[] // Destination buffer +) +{ + // + ArrayResize( + buffer, + ArraySize(buffer) + 1); + + // + buffer[ArraySize(buffer) - 1] = item; +} +void Add( + XOHCL &item, // item want to add + XOHCL &buffer[] // Destination buffer +) +{ + // + ArrayResize( + buffer, + ArraySize(buffer) + 1); + + // + buffer[ArraySize(buffer) - 1] = item; +} +void Add( + datetime &item, // item want to add + datetime &buffer[] // Destination buffer +) +{ + // + ArrayResize( + buffer, + ArraySize(buffer) + 1); + + // + buffer[ArraySize(buffer) - 1] = item; +} + +// +// Add an Item to a Buffer if not Exists ... +void AddIfNotExists( + double value, + double &values[], + double smoothingPoint = 3) +{ + // + double smoothingValue = smoothingPoint * GetPoints(_Symbol); + + // + int valuesCount = ArraySize(values); + if (valuesCount <= 0) + { + // + Add(value, + values); + } + else + { + // + bool isExists = false; + for (int i = 0; i < valuesCount; i++) + { + // + double iVal = values[i]; + + // + double diff = MathAbs(iVal - value); + + // + if (iVal == value || diff < smoothingValue) + { + // + isExists = true; + break; + } + } + + // + if (!isExists) + { + // + Add(value, + values); + } + } +} + +// +// Add a Buffers Child to another Buffer +// if it's not Contains them ... +void AddsIfNotExists( + double &source[], + double &dest[], + double smoothingPoint = 3) +{ + // + double smoothingValue = smoothingPoint * GetPoints(_Symbol); + + // + int sourceCount = ArraySize(source); + if (sourceCount <= 0) + { + return; + } + + // + for (int i = 0; i < sourceCount; i++) + { + // + double iSource = source[i]; + + // + AddIfNotExists( + iSource, + dest, + smoothingPoint); + } +} + +// +// Converts a Buffer to String Representation ... +string ToString( + const int &buffer[], // Specified Buffer + string separator = ",", // Specified Separator + bool addIndex = false, // Specified Add Items Indexes or Not + string indexLabel = "i:", // Specified Index Label + string indexSeparator = ">" // Specified Index Separator + +) +{ + // + string result = ""; + + // + int bufferSize = ArraySize(buffer); + if (bufferSize <= 0) + { + return result; + } + + // + for (int i = 0; i < bufferSize; i++) + { + // + if (addIndex) + { + // + if (StringLen(indexLabel) > 0) + { + result += indexLabel + " "; + } + + // + result += (string)i + " "; + + // + if (StringLen(indexSeparator) > 0) + { + result += indexSeparator + " "; + } + } + + // + string iItemString = (string)buffer[i]; + + // + result += iItemString; + + // + if (i < bufferSize - 1) + { + result += separator; + } + } + + // + return result; +} +string ToString( + const double &buffer[], // Specified Buffer + string separator = ",", // Specified Separator + bool addIndex = false, // Specified Add Items Indexes or Not + string indexLabel = "i:", // Specified Index Label + string indexSeparator = ">" // Specified Index Separator + +) +{ + // + string result = ""; + + // + int bufferSize = ArraySize(buffer); + if (bufferSize <= 0) + { + return result; + } + + // + for (int i = 0; i < bufferSize; i++) + { + // + if (addIndex) + { + // + if (StringLen(indexLabel) > 0) + { + result += indexLabel + " "; + } + + // + result += (string)i + " "; + + // + if (StringLen(indexSeparator) > 0) + { + result += indexSeparator + " "; + } + } + + // + string iItemString = (string)buffer[i]; + + // + result += iItemString; + + // + if (i < bufferSize - 1) + { + result += separator; + } + } + + // + return result; +} +string ToString( + const string &buffer[], // Specified Buffer + string separator = ",", // Specified Separator + bool addIndex = false, // Specified Add Items Indexes or Not + string indexLabel = "i:", // Specified Index Label + string indexSeparator = ">" // Specified Index Separator + +) +{ + // + string result = ""; + + // + int bufferSize = ArraySize(buffer); + if (bufferSize <= 0) + { + return result; + } + + // + for (int i = 0; i < bufferSize; i++) + { + // + if (addIndex) + { + // + if (StringLen(indexLabel) > 0) + { + result += indexLabel + " "; + } + + // + result += (string)i + " "; + + // + if (StringLen(indexSeparator) > 0) + { + result += indexSeparator + " "; + } + } + + // + string iItemString = (string)buffer[i]; + + // + result += iItemString; + + // + if (i < bufferSize - 1) + { + result += separator; + } + } + + // + return result; +} +string ToString( + const datetime &buffer[], // Specified Buffer + string separator = ",", // Specified Separator + bool addIndex = false, // Specified Add Items Indexes or Not + string indexLabel = "i:", // Specified Index Label + string indexSeparator = ">" // Specified Index Separator +) +{ + // + string result = ""; + + // + int bufferSize = ArraySize(buffer); + if (bufferSize <= 0) + { + return result; + } + + // + for (int i = 0; i < bufferSize; i++) + { + // + if (addIndex) + { + // + if (StringLen(indexLabel) > 0) + { + result += indexLabel + " "; + } + + // + result += (string)i + " "; + + // + if (StringLen(indexSeparator) > 0) + { + result += indexSeparator + " "; + } + } + + // + string iItemString = (string)buffer[i]; + + // + result += iItemString; + + // + if (i < bufferSize - 1) + { + result += separator; + } + } + + // + return result; +} +template +string ToString(T value) +{ + return (string)value; +} + +// +// Converts String to boolean ... +bool ToBoolean(string value) +{ + // + bool result = false; + + // + if (StringLen(value) <= 0) + { + return result; + } + + // + StringToLower(value); + result = value == "true"; + + // + return result; +} + +// +// Search Array For Specific Item ... +template +int FindIndex( + T item, // What is Search ... + T &buffer[] // Search in ... +) +{ + // + int result = -1; + + // + int count = ArraySize(buffer); + if (count <= 0) + { + return result; + } + + // + for (int i = 0; i < count; i++) + { + // + T iT = buffer[i]; + + // + if (iT == item) + { + // + result = i; + break; + } + } + + // + return result; +} + +// +template +bool Contains( + T item, // What is Search ... + T &buffer[] // Search in ... +) +{ + // + bool result = false; + + // + int idx = FindIndex( + item, + buffer); + result = idx > -1; + + // + return result; +} + +// +template +bool Remove( + T item, + T &buffer[]) +{ + // + bool result = false; + + // + int itemIndex = FindIndex( + item, + buffer); + if (itemIndex < 0) + { + return result; + } + + // + result = ArrayRemove( + buffer, + itemIndex, + 1); + + // + return result; +} + +// +// Split an String Representation of an Array ... +void SplitContent( + string &result[], // Hold Result ... + string content, // Source ... + string separator = ",", // Separator ... + bool forceCleanResult = true // Clean Result ... +) +{ + // + if (forceCleanResult) + { + Clean(result); + } + + // + if (separator == NULL || StringLen(separator) == 0) + { + separator = ","; + } + + // + if (StringLen(content) == 0) + { + return; + } + + // + StringSplit( + content, + StringGetCharacter( + separator, + 0), + result); +} + +// +// Extract Data from String ... +string ExtractString( + const string source, // Source String used for Extracting + const string startString, // Expression Start String must be Unique + const string endString // Where to End Extraction, usually a Sign +) +{ + // + string result = ""; + + // + // Validate String ... + if ( + StringLen(source) == 0 || + StringLen(endString) == 0 || + StringLen(startString) == 0) + { + return result; + } + + // + // Find Start String Position ... + int sPos = StringFind( + source, + startString); + if (sPos < 0) + { + return result; + } + + // + // Find End String Position after Start String ... + int searchEndFromPos = sPos + StringLen(startString); + int ePos = StringFind( + source, + endString, + searchEndFromPos); + if (ePos < 0) + { + return result; + } + + // + // Extract Data from Source ... + int dLength = ePos - searchEndFromPos; + result = StringSubstr( + source, + searchEndFromPos, + dLength); + + // + return result; +} + +// +// Extract an Array of Contents ... +int ExtractStrings( + string &result[], // Hold Result + const string source, // Source String used for Extracting + const string startString, // Expression Start String must be Unique + const string endString // Where to End Extraction, usually a Sign +) +{ + // + int mResult = 0; + + // + Clean(result); + + // + // Validate Args ... + int sourceLength = StringLen(source); + int startLength = StringLen(startString); + int endLength = StringLen(endString); + + // + int minRequiredLength = startLength + endLength; + + // + if ( + endLength <= 0 || + startLength <= 0 || + sourceLength <= 0 || + sourceLength < minRequiredLength) + { + return mResult; + } + + // + // Make a Copy of Source for Manipulating ... + string workStr = source; + + // + // Define a Loop ... + while (StringLen(workStr) > minRequiredLength) + { + // + // Find Item ... + string item = ExtractString( + workStr, + startString, + endString); + + // + // Breakout when couldn't find anymore item ... + int itemLength = StringLen(item); + if (itemLength <= 0) + { + break; + } + + // + // Prepare Item Source String for Replacing in Work String ... + string itemSource = startString + item + endString; + + // + // Add Item to Result Array ... + Add( + item, + result); + + // + // Replace Item Soure in Work String ... + StringReplace( + workStr, + itemSource, + ""); + } + + // + // Calculate Size of Array ... + mResult = ArraySize(result); + + // + return mResult; +} + +// +// Normalize a give Volume ... +double NormalizeVolume( + double volume, // desired volume to normalize + string symbol = NULL, // Specified Symbol for Normalization + int mLength = 2 // Length of Digits +) +{ + // + double result = volume; + + // + // Normalize Symbol ... + if (StringLen(symbol) == 0) + { + symbol = _Symbol; + } + + // + // Normalize Digits ... + int digits = GetDigits(symbol); + mLength = + mLength == 0 || mLength > digits + ? digits + : MathMin(mLength, digits); + + // + // Normalize Volume ... + result = NormalizeDouble(result, mLength); + + // + double maxAvailableVolume = SymbolInfoDouble(symbol, SYMBOL_VOLUME_MAX); + double minAvailableVolume = SymbolInfoDouble(symbol, SYMBOL_VOLUME_MIN); + + // + // Validate Result ... + if (result > maxAvailableVolume) + { + result = maxAvailableVolume; + } + else if (result < minAvailableVolume) + { + result = minAvailableVolume; + } + + // + return result; +} + +// +// Normallize Price ... +double NormalizePrice( + double price, // desired Price for normalization + string symbol = NULL // Specified Symbol for Normalization +) +{ + // + double result = 0; + + // + // Mormalize Symbol ... + if (StringLen(symbol) == 0) + { + symbol = _Symbol; + } + + // + double tickSize = 0; + result = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_SIZE, tickSize); + + // + int digits = GetDigits(symbol); + result = NormalizeDouble(MathRound(price / tickSize) * tickSize, digits); + + // + return result; +} + +// +// Check Expert Running in Testing Mode or not ... +bool IsRunningOnTestMode() +{ + // + bool result = false; + + // + // check programm mode ... + result = MQL5InfoInteger(MQL5_TESTING); + + // + return result; +} + +// +// Calculate Volume Weighted Moving Average ... +double iVWMA( + double price, + double volume, + int period, + int i, + int bars, + int instance = 0 // +) +{ +#define ¤ instance +#ifdef _averageInstances +#define _functionInstances _averageInstances +#else #define _functionInstances 1 +#endif + struct sVwmaArrayStruct + { + double price; + double volume; + double sump; + double sumv; + }; + static sVwmaArrayStruct m_array[][_functionInstances]; + static int m_arraySize = 0; + if (m_arraySize < bars) + { + int _res = ArrayResize(m_array, bars + 500); + if (_res <= bars) + return (0); + m_arraySize = _res; + } + + // + //--- + // + + if (volume == 0) + volume = 1; + m_array[i][¤].price = volume * price; + m_array[i][¤].volume = volume; + if (i > period) + { + m_array[i][¤].sump = m_array[i - 1][¤].sump + m_array[i][¤].price - m_array[i - period][¤].price; + m_array[i][¤].sumv = m_array[i - 1][¤].sumv + volume - m_array[i - period][¤].volume; + } + else + { + m_array[i][¤].sump = m_array[i][¤].price; + m_array[i][¤].sumv = m_array[i][¤].volume; + for (int k = 1; k < period && i >= k; k++) + { + m_array[i][¤].sump += m_array[i - k][¤].price; + m_array[i][¤].sumv += m_array[i - k][¤].volume; + } + } + return (m_array[i][¤].sump / m_array[i][¤].sumv); + + // + //--- + // + +#undef ¤ #undef _functionInstances +} + +// +// Date Time Manipulation Functions ... +// + +// +// Representation of Time Struct ... +// struct MqlDateTime +// { +// int year; // Year +// int mon; // Month +// int day; // Day +// int hour; // Hour +// int min; // Minutes +// int sec; // Seconds +// int day_of_week; // Day of week (0-Sunday, 1-Monday, ... ,6-Saturday) +// int day_of_year; // Day number of the year (January 1st is assigned the number value of zero) +// }; + +// +// Converts Time to Seconds ... +ulong TimeToSeconds( + datetime time // Specify time to Convert ... +) +{ + // + ulong result = (ulong)time; + + // + return result; +} +ulong TimeToSeconds( + MqlDateTime &time // Specify time to Convert ... +) +{ + // + datetime dTime = StructToTime(time); + + // + ulong result = TimeToSeconds(dTime); + + // + return result; +} + +// +// Converts Seconds To Time ... +datetime SecondsToTime( + ulong seconds // Specify Seconds to Convert ... +) +{ + // + datetime result = (datetime)seconds; + + // + return result; +} +MqlDateTime SecondsToStruct( + ulong seconds // Specify Seconds to Convert ... +) +{ + // + datetime dTime = SecondsToTime(seconds); + + // + MqlDateTime result = {}; + TimeToStruct( + dTime, + result); + + // + return result; +} + +// +// Converts Time to MilliSeconds ... +ulong TimeToMilliSeconds( + datetime time // Specify time to Convert ... +) +{ + // + ulong result = TimeToSeconds(time) * 1000; + + // + return result; +} +ulong TimeToMilliSeconds( + MqlDateTime &time // Specify time to Convert ... +) +{ + // + datetime dTime = StructToTime(time); + + // + ulong result = TimeToMilliSeconds(dTime); + + // + return result; +} + +// +// Converts MillisSeconds to Time ... +datetime MilliSecondsToTiem( + ulong milliSeconds // Specify MilliSeconds to Convert ... +) +{ + // + ulong seconds = milliSeconds / 1000; + + // + datetime result = SecondsToTime(seconds); + + // + return result; +} +MqlDateTime MilliSecondsToStruct( + ulong milliSeconds // Specify MilliSeconds to Convert ... +) +{ + // + datetime dTime = MilliSecondsToTiem(milliSeconds); + + // + MqlDateTime result = {}; + TimeToStruct( + dTime, + result); + + // + return result; +} + +// +// Retrieve DateTime Structure ... +MqlDateTime GetCurrentTime() +{ + // + MqlDateTime result = {}; + + // + TimeCurrent(result); + + // + return result; +} + +// +// Retrieve Current Time as Seconds ... +ulong GetCurrentTimeAsSeconds() +{ + // + datetime time = TimeCurrent(); + + // + ulong result = TimeToSeconds(time); + + // + return result; +} + +// +// Retrieve Current Time as MilliSeconds ... +ulong GetCurrentTimeAsMilliSeconds() +{ + // + datetime time = TimeCurrent(); + + // + ulong result = TimeToMilliSeconds(time); + + // + return result; +} + +// +// Retrieve Specified Candle Time ... +datetime GetCandleTime( + string symbol = "", // Specify Symbol + ENUM_TIMEFRAMES period = NULL, // Specify TimeFrame + int bar_index = 0 // Specify Bar Index +) +{ + // + // Validate and Normalize Args ... + + // + // Normalize Symbol ... + symbol = StringLen(symbol) == 0 + ? _Symbol + : symbol; + + // + // Normalize Period ... + period = period == NULL + ? _Period + : period; + + // + // Retrieve Bar Time ... + datetime result = iTime( + symbol, + period, + bar_index); + + // + return result; +} + +// +// Retrieve Specified Candle Time ... +ulong GetCandleTimeAsSeconds( + string symbol = "", // Specify Symbol + ENUM_TIMEFRAMES period = NULL, // Specify TimeFrame + int bar_index = 0 // Specify Bar Index +) +{ + // + // Retrieve Bar Time ... + datetime time = GetCandleTime( + symbol, + period, + bar_index); + + // + ulong result = TimeToSeconds(time); + + // + return result; +} + +// +// Retrieve Specified Candle Time ... +ulong GetCandleTimeAsMilliSeconds( + string symbol = "", // Specify Symbol + ENUM_TIMEFRAMES period = NULL, // Specify TimeFrame + int bar_index = 0 // Specify Bar Index +) +{ + // + // Retrieve Bar Time ... + datetime time = GetCandleTime( + symbol, + period, + bar_index); + + // + ulong result = TimeToMilliSeconds(time); + + // + return result; +} + +// +// Retrieve a Candle Time Structure ... +MqlDateTime GetCandleTimeStruct( + string symbol = "", // Specify Symbol + ENUM_TIMEFRAMES period = NULL, // Specify TimeFrame + int bar_index = 0 // Specify Bar Index +) +{ + // + MqlDateTime result = {}; + + // + // Retrieve Bar Time ... + datetime barTime = GetCandleTime( + symbol, + period, + bar_index); + + // + // Convert to Structure ... + TimeToStruct(barTime, result); + + // + return result; +} + +// +// Retrieve Number of Candles in a Day ... +int GetDailyCandleCount(ENUM_TIMEFRAMES mPeriod) +{ + // + int seconds = PeriodSeconds(mPeriod); + + // + int daySeconds = 24 * 60 * 60; + + // + int result = daySeconds / seconds; + + // + return result; +} + +int GetDailyCandleCount() +{ + // + int result = GetDailyCandleCount(_Period); + + // + return result; +} + +// +// +// + +// +// Holds Month ... +static int xMonth = -1; + +// +// Holds Day Of Week ... +static int xDayOfWeek = -1; +static int xForWeekDay = -1; + +// +// Holds Day ... +static int xDay = -1; + +// +// Holds Hour ... +static int xHour = -1; + +// +// Reset Timing Variables ... +void ResetTiming() +{ + // + xHour = -1; + xDay = -1; + xDayOfWeek = -1; + xMonth = -1; +} + +// +// Detecting New Houre ... +bool IsNewHour() +{ + // + bool result = false; + + // + // Retrieve Current Time as Struct ... + MqlDateTime timeStruct = GetCurrentTime(); + + // + // Check Houre ... + result = timeStruct.hour != xHour; + if (result) + { + xHour = timeStruct.hour; + } + + // + return result; +} + +// +// Detecting New Day ... +bool IsNewDay() +{ + // + bool result = false; + + // + // Retrieve Current Time as Struct ... + MqlDateTime timeStruct = GetCurrentTime(); + + // + // Check Houre ... + result = timeStruct.day_of_year != xDay; + if (result) + { + xDay = timeStruct.day_of_year; + } + + // + return result; +} + +// +// Detecting New Week ... +bool IsNewWeek() +{ + // + bool result = false; + + // + // Retrieve Current Time as Struct ... + MqlDateTime timeStruct = GetCurrentTime(); + + // + // Check Week ... + // Since Week Starts From Monday in Forex World ... + // we Calculate Start of Week by 1-Monday ... + result = + xDayOfWeek == -1 && + xForWeekDay == -1 + ? true + : timeStruct.day_of_week == 1 && + timeStruct.day_of_year > xForWeekDay; + + // + xForWeekDay = timeStruct.day_of_year; + xDayOfWeek = timeStruct.day_of_week; + + // + return result; +} + +// +// Detecting End Of Week ... +bool IsWeekEnd() +{ + // + bool result = false; + + // + // Retrieve Current Time as Struct ... + MqlDateTime timeStruct = GetCurrentTime(); + + // + // Check WeekEnd ... + // Since Week Starts From Monday in Forex World ... + // we Calculate End of Week by 5-Friday ... + result = + xDayOfWeek != -1 && + timeStruct.day_of_week == 5 && + timeStruct.hour == 23 && + timeStruct.min == 59 && + timeStruct.sec == 59; + + // + return result; +} + +// +// Detecting New Month ... +bool IsNewMonth() +{ + // + bool result = false; + + // + // Retrieve Current Time as Struct ... + MqlDateTime timeStruct = GetCurrentTime(); + + // + // Check Houre ... + result = timeStruct.mon != xMonth; + if (result) + { + xMonth = timeStruct.mon; + } + + // + return result; +} + +// +// Find Hindmost Time Frame ... +ENUM_TIMEFRAMES GetHindmostTimeFrame( + ENUM_TIMEFRAMES mPeriod // Specified Period +) +{ + // + ENUM_TIMEFRAMES result = NULL; + + // + // Normalize Period ... + if ( + mPeriod < 0 || + mPeriod == NULL) + { + mPeriod = _Period; + } + + // + switch (mPeriod) + { + // + case PERIOD_M1: + case PERIOD_M2: + case PERIOD_M3: + case PERIOD_M4: + result = PERIOD_H4; + break; + + // + case PERIOD_M5: + case PERIOD_M6: + case PERIOD_M10: + case PERIOD_M12: + result = PERIOD_H8; + break; + + // + case PERIOD_M15: + case PERIOD_M20: + result = PERIOD_H12; + break; + + // + case PERIOD_M30: + result = PERIOD_D1; + break; + + // + case PERIOD_H1: + case PERIOD_H2: + case PERIOD_H3: + result = PERIOD_W1; + break; + + // + case PERIOD_H4: + case PERIOD_H6: + case PERIOD_H8: + result = PERIOD_MN1; + break; + + // + case PERIOD_H12: + result = PERIOD_MN1; + break; + + // + case PERIOD_D1: + result = PERIOD_MN1; + break; + + // + case PERIOD_W1: + result = PERIOD_MN1; + break; + + // + default: + result = PERIOD_MN1; + break; + } + + // + return result; +} + +// +// Find Farest Time Frame ... +ENUM_TIMEFRAMES GetFarestTimeFrame( + ENUM_TIMEFRAMES mPeriod // Specified Period +) +{ + // + ENUM_TIMEFRAMES result = NULL; + + // + // Normalize Period ... + if ( + mPeriod < 0 || + mPeriod == NULL) + { + mPeriod = _Period; + } + + // + switch (mPeriod) + { + // + case PERIOD_M1: + case PERIOD_M2: + case PERIOD_M3: + case PERIOD_M4: + result = PERIOD_H1; + break; + + // + case PERIOD_M5: + case PERIOD_M6: + case PERIOD_M10: + case PERIOD_M12: + result = PERIOD_H2; + break; + + // + case PERIOD_M15: + case PERIOD_M20: + result = PERIOD_H3; + break; + + // + case PERIOD_M30: + result = PERIOD_H4; + break; + + // + case PERIOD_H1: + case PERIOD_H2: + case PERIOD_H3: + result = PERIOD_H8; + break; + + // + case PERIOD_H4: + case PERIOD_H6: + case PERIOD_H8: + result = PERIOD_D1; + break; + + // + case PERIOD_H12: + result = PERIOD_MN1; + break; + + // + case PERIOD_D1: + result = PERIOD_MN1; + break; + + // + case PERIOD_W1: + result = PERIOD_MN1; + break; + + // + default: + result = PERIOD_MN1; + break; + } + + // + return result; +} + +// +// Find Medium Time Frame ... +ENUM_TIMEFRAMES GetMediestTimeFrame( + ENUM_TIMEFRAMES mPeriod // Specified Period +) +{ + // + ENUM_TIMEFRAMES result = NULL; + + // + // Normalize Period ... + if ( + mPeriod < 0 || + mPeriod == NULL) + { + mPeriod = _Period; + } + + // + switch (mPeriod) + { + // + case PERIOD_M1: + case PERIOD_M2: + case PERIOD_M3: + case PERIOD_M4: + result = PERIOD_M12; + break; + + // + case PERIOD_M5: + case PERIOD_M6: + case PERIOD_M10: + case PERIOD_M12: + result = PERIOD_M30; + break; + + // + case PERIOD_M15: + case PERIOD_M20: + result = PERIOD_H1; + break; + + // + case PERIOD_M30: + result = PERIOD_H2; + break; + + // + case PERIOD_H1: + case PERIOD_H2: + case PERIOD_H3: + result = PERIOD_H6; + break; + + // + case PERIOD_H4: + case PERIOD_H6: + case PERIOD_H8: + result = PERIOD_H12; + break; + + // + case PERIOD_H12: + result = PERIOD_W1; + break; + + // + case PERIOD_D1: + result = PERIOD_MN1; + break; + + // + case PERIOD_W1: + result = PERIOD_MN1; + break; + + // + default: + result = PERIOD_MN1; + break; + } + + // + return result; +} + +// +// Find Nearest Time Frame ... +ENUM_TIMEFRAMES GetNearestTimeFrame( + ENUM_TIMEFRAMES mPeriod // Specified Period +) +{ + // + ENUM_TIMEFRAMES result = NULL; + + // + // Normalize Period ... + if ( + mPeriod < 0 || + mPeriod == NULL) + { + mPeriod = _Period; + } + + // + switch (mPeriod) + { + // + case PERIOD_M1: + case PERIOD_M2: + case PERIOD_M3: + case PERIOD_M4: + result = PERIOD_M5; + break; + + // + case PERIOD_M5: + case PERIOD_M6: + case PERIOD_M10: + case PERIOD_M12: + result = PERIOD_M15; + break; + + // + case PERIOD_M15: + case PERIOD_M20: + result = PERIOD_M30; + break; + + // + case PERIOD_M30: + result = PERIOD_H1; + break; + + // + case PERIOD_H1: + case PERIOD_H2: + case PERIOD_H3: + result = PERIOD_H4; + break; + + // + case PERIOD_H4: + case PERIOD_H6: + case PERIOD_H8: + result = PERIOD_H12; + break; + + // + case PERIOD_H12: + result = PERIOD_D1; + break; + + // + case PERIOD_D1: + result = PERIOD_W1; + break; + + // + case PERIOD_W1: + result = PERIOD_MN1; + break; + + // + default: + result = PERIOD_MN1; + break; + } + + // + return result; +} + +// +// Get Specific Time Frame Start Candle Time ... +datetime GetPeriodStartTime( + string mSymbol = NULL, // Specified Symbol ... + ENUM_TIMEFRAMES mPeriod = NULL, // Specified Period ... + datetime mTime = NULL // Specified Bar Time ... +) +{ + // + // Normalize Arg ... + + // + if ( + mSymbol == NULL || + StringLen(mSymbol) == 0) + { + mSymbol = _Symbol; + } + + // + if ( + mPeriod < 0 || + mPeriod == NULL) + { + mPeriod = _Period; + } + + // + if ( + mTime < 0 || + mTime == NULL) + { + mTime = TimeCurrent(); + } + + // + int barIndex = iBarShift( + mSymbol, + mPeriod, + mTime, + false); + + // + datetime result = iTime( + mSymbol, + mPeriod, + barIndex); + + // + return result; +} + +// +struct XCandleRemains +{ + // + int days; + int hours; + int minutes; + int seconds; +}; + +// +string ToString( + XCandleRemains &item, + string dayId = "d", + string hourId = "h", + string minuteId = "m", + string secondId = "s", + string idSeparator = ": ", + string separator = ", ", + bool ignoreZeroValues = true) +{ + // + string result = ""; + + // + // Days ... + if (!ignoreZeroValues || item.days > 0) + { + result += dayId + idSeparator + (string)item.days + separator; + } + + // + // Hours ... + if (!ignoreZeroValues || item.hours > 0) + { + // + string strHour = ToString(item.hours); + if (StringLen(strHour) == 1) + { + strHour = "0" + strHour; + } + + // + result += hourId + idSeparator + strHour + separator; + } + + // + // Minutes ... + if (!ignoreZeroValues || item.minutes > 0) + { + // + string strMinute = ToString(item.minutes); + if (StringLen(strMinute) == 1) + { + strMinute = "0" + strMinute; + } + + // + result += minuteId + idSeparator + strMinute + separator; + } + + // + // Seconds ... + if (!ignoreZeroValues || item.seconds > 0) + { + // + string strSec = ToString(item.seconds); + if (StringLen(strSec) == 1) + { + strSec = "0" + strSec; + } + + // + result += secondId + idSeparator + strSec; + } + + // + return result; +} + +// +// Retrieve Specific Candles Ramained Time ... +void GetCandleRemainsTime( + XCandleRemains &result, // Holds Result ... + string mSymbol = NULL, // Specified Symbol ... + ENUM_TIMEFRAMES mPeriod = NULL, // Specified Period ... + int mBarIndex = 0 // Specified Bar Index ... +) +{ + // + int minuteSecoonds = 60; + int hourSeconds = minuteSecoonds * 60; + int daySeconds = 24 * hourSeconds; + + // + int periodSeconds = PeriodSeconds( + mPeriod); + datetime startTime = GetCandleTime( + mSymbol, + mPeriod, + mBarIndex); + + // + int secondsDiff = (int)startTime + periodSeconds - (int)TimeCurrent(); + + // + int days = 0; + int hours = 0; + int minutes = 0; + int seconds = 0; + + // + int mWorkingSecondsDiff = secondsDiff; + if (mWorkingSecondsDiff > daySeconds) + { + // + days = mWorkingSecondsDiff / daySeconds; + mWorkingSecondsDiff -= days * daySeconds; + } + if (mWorkingSecondsDiff > hourSeconds) + { + // + hours = mWorkingSecondsDiff / hourSeconds; + mWorkingSecondsDiff -= hours * hourSeconds; + } + if (mWorkingSecondsDiff > minuteSecoonds) + { + // + minutes = mWorkingSecondsDiff / minuteSecoonds; + mWorkingSecondsDiff -= minutes * minuteSecoonds; + } + seconds = mWorkingSecondsDiff; + + // + result.days = days; + result.hours = hours; + result.minutes = minutes; + result.seconds = seconds; +} + +// +// Converts an String to TimeFrame ... +ENUM_TIMEFRAMES ToPeriod(string value) +{ + // + if (StringLen(value) == 0) + { + return _Period; + } + + // + StringTrimLeft(value); + StringTrimRight(value); + + // + ENUM_TIMEFRAMES result = _Period; + + // + if (value == "M1") + { + result = PERIOD_M1; + } + else if (value == "M2") + { + result = PERIOD_M2; + } + else if (value == "M3") + { + result = PERIOD_M3; + } + else if (value == "M4") + { + result = PERIOD_M4; + } + else if (value == "M5") + { + result = PERIOD_M5; + } + else if (value == "M6") + { + result = PERIOD_M6; + } + else if (value == "M10") + { + result = PERIOD_M10; + } + else if (value == "M12") + { + result = PERIOD_M12; + } + else if (value == "M15") + { + result = PERIOD_M15; + } + else if (value == "M20") + { + result = PERIOD_M20; + } + else if (value == "M30") + { + result = PERIOD_M30; + } + else if (value == "H1") + { + result = PERIOD_H1; + } + else if (value == "H2") + { + result = PERIOD_H2; + } + else if (value == "H3") + { + result = PERIOD_H3; + } + else if (value == "H4") + { + result = PERIOD_H4; + } + else if (value == "H6") + { + result = PERIOD_H6; + } + else if (value == "H8") + { + result = PERIOD_H8; + } + else if (value == "H12") + { + result = PERIOD_H12; + } + else if (value == "D1") + { + result = PERIOD_D1; + } + else if (value == "W1") + { + result = PERIOD_W1; + } + else if (value == "MN1") + { + result = PERIOD_MN1; + } + + // + return result; +} + +// +// Converts Period to String ... +string ToString(ENUM_TIMEFRAMES period) +{ + // + string result = ""; + + // + string mPStr = EnumToString(period); + + string mPStrParts[]; + int partsCount = StringSplit( + mPStr, + StringGetCharacter("_", 0), + mPStrParts); + if (partsCount <= 0) + { + return result; + } + + // + result = mPStrParts[1]; + + // + return result; +} + +// +// TYPES ... +// + +// +// Retrieve Specific Object Types Name ... +template +string GetTypeName(const T &t) +{ + return typename(T); +} + +// +// TAGGING ... +template +string GenerateTag( + T &model +) { + // + string result = ""; + + // + string tag = model.ToString(); + if (StringLen(tag) == 0) { + return result; + } + + // + static XSCMD5 md5; + + // + result = md5.Hash(tag); + + // + return result; +} + +// +// SIGNAL ... + +// +// Do All Normalization on Specific Signal ... +void NormalizeSignal(XSignal &signal) +{ + // + // ENTRY ... + if (signal.entry > 0) + { + signal.entry = NormalizePrice(signal.entry, signal.symbol); + } + + // + // TP ... + if (signal.tp > 0) + { + signal.tp = NormalizePrice(signal.tp, signal.symbol); + } + + // + // SL ... + if (signal.sl > 0) + { + signal.sl = NormalizePrice(signal.sl, signal.symbol); + } + + // + // VOLUME ... + if (signal.volume > 0) + { + signal.volume = NormalizeVolume(signal.volume, signal.symbol); + } +} + +// +// Prepare Base Signal ... +XSignal CreateSignal( + string symbol, // Trading Symbol ... + ENUM_TIMEFRAMES period, // Trading Time Frame ... + ENUM_POSITION_TYPE type, // Position Type ... + ENUM_X_ORDER_MODES mode, // Order Execution Mode ...Ù‘ + double entry, // Signal Entry Execution ... + double volume, // Volume ... + double tp = 0, // TP ... + double sl = 0 // SL ... +) +{ + // + XSignal result; + Clean(result); + + // + result.tp = tp; + result.sl = sl; + result.mode = mode; + result.entry = entry; + result.period = period; + result.symbol = symbol; + result.volume = volume; + + // + NormalizeSignal(result); + + // + return result; +} + +// +// Find Changes ... +bool HandleValueChanged( + XValueChanged &holder[], // Change Holder Buffer ... + const double &state[], // Data State Buffer ... + const double &source[], // Data Source Buffer ... + datetime time = 0, // Checking Time ... + int resizeHolder = 100 // Resize Holder if had More than it ... +) +{ + // + bool result = false; + + // + if (time <= 0) + { + time = TimeCurrent(); + } + + // + if (ArraySize(source) <= 1) + { + return result; + } + + // + double from = source[1]; + double to = source[0]; + + // + result = + to != from && to != EMPTY_VALUE && + state[0] != state[1] && state[0] != EMPTY_VALUE; + if (result) + { + return result; + } + + // + XValueChanged lastChange; + bool hasLastChange = + GetLastItem( + lastChange, + holder); + result = + !hasLastChange + ? true + : lastChange.at < time && + lastChange.to != to && + lastChange.from != from; + if (!result) + { + return result; + } + + // + // Handle Resizing ... + if (resizeHolder > 0) + { + // + int holderCount = ArraySize(holder); + if (holderCount >= resizeHolder) + { + // + Clean(holder); + + // + Add( + lastChange, + holder); + } + } + + // + // Create a Model for add ... + lastChange.to = to; + lastChange.at = time; + lastChange.from = from; + + // + Add( + lastChange, + holder); + + // + return result; +} + +// +// END Provided Functions ... +// diff --git a/MQLTestWorkspace/BKPS/14030222/Libraries/x-saherelm.draw.lib.ex5 b/MQLTestWorkspace/BKPS/14030222/Libraries/x-saherelm.draw.lib.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..524f07148918f664525173b8b1a264667f5bd7d3 GIT binary patch literal 7670 zcmdT|Wl$Wo9?v# z&Hu0df9~-?1OWaS{|U6Bd1O;Q&x~1&mP|haVr}2py41oj^nI)X<%4ZNl%PFzEZ%R^ zLRSBr6$dy2TmZfRH-Ig`8ejwP0FVLL04#q8JAmPDtPU{!%Ub@;O9C7Kj(-_hfX3fh z{4eM9clSS;|IheGvB%#ExC8hA%zw@MU&i!z{cqit|I*F$w?6;BmHy{0u>zR>cAMot zC;ty@BMVf0gf5AqQ@&8lOy}Bd0KLzNl4lyvA(?-VvWw69&#ETk5uHAaq7C7$ zhtk4Xp_9sLLN7Z}92a%DiSR8RKa(>lJ*7DaBsg9KVVe3_p*<0tzBlBoW$&iNG^I*Y zt@vSZ@`Ma2i2*7-I`{Z&Z4XL^Et9hEsnct_Y~B0>ZIx_Jvhq{jXk?xdy9bOa@h`y# zkumrQC~(8k9&{Gp>HF+21SR(pY>l~2qB3kBHOF@vGaxpW4)G+XA4XX5ZFC^%t9g>! zlMPCKa1!=D{^TqJgOKhJ&!LZb?pLE_5x_+iY{X>FBIGC>XV#$PCbp?QWZ(lDBB@ay zWQ+E6`RKw+BesOj{~?DAi(pGC)F0hJb)O|5DY6QoQ*hHrIJxwY#JJ>~)iiYvTQ=eQ zIk`zZd!$jD;QI|M=i;qhK?`_sF^g;o>VtU9wI0<@;vg&Q+4AQis-}RRr~*u}P9&iQ z)F4VfH;EKWS^iAycr=ZU?li50J|<*=(PV?uTHL{phRK5B>GpMzv9LVzZIe-(qZM<> z#E4{TVkz{H_T`^UR+XomzSXPr2B{lf;Ie&ne0$3$)El0w#`XZg9N3haP8kZgTG4RM zpikN_p}$wRWD%LCf1_h{8GxU@ewwW8A(}1I4W=zv74>Y)B4<1$cN;o~**y&PViVAN zKcx+fmZzwdZARn*(w4*!u~UJZYp2N{DHWeTeEjy}jJ%`{JoKUQ&5&k#&Z}n%r9Nc7 zqv+e)L656?xmAms$vl!X)`>YD$p)2*y!1p}TdKc`rz1F<*uz*zT!$WZUfPD{O7uy` zh^uJ$LzgU`O&mQ!eu@7H9%}67y1bs*pOoY-3`%Zpd->%6CL*_2S?;x?$5#4mlBA5F z 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 WhtWK%K>9-->^QCnSt4QZ(tiO-gqCOk literal 0 HcmV?d00001 diff --git a/MQLTestWorkspace/BKPS/14030222/Libraries/x-saherelm.draw.lib.mq5 b/MQLTestWorkspace/BKPS/14030222/Libraries/x-saherelm.draw.lib.mq5 new file mode 100644 index 0000000..004db22 --- /dev/null +++ b/MQLTestWorkspace/BKPS/14030222/Libraries/x-saherelm.draw.lib.mq5 @@ -0,0 +1,3586 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Draw Library +// -------------------------------------- +// Name: XDraw +// Description: provides Draw abilities ... +// +// +// 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 + +// +// START Inputs ... +// +// +// END Inputs ... +// + +// +// Include Logger Library ... +#include "x-saherelm.log.lib.mq5" +#include "x-saherelm.common.lib.mq5" +#include "../Classes/x-saherelm.xmd5.class.mq5" + +// +// START Global Definitions: Variables, Properties and etc ... +// + +// +string drawPrefix = "X-OBJ"; + +// +// END Global Definitions: Variables, Properties and etc ... +// + +// +// START Provided Functions ... +// + +// +// DeInitial Library if required ... +void OnDeinitDrawLibrary() +{ + RemoveDraws(); +} + +// +// remove drawn objects ... +void RemoveDraws( + string tag = NULL, + long chartId = -1, + int subWindow = -1) +{ + // + // Normalize Args ... + // + if (tag == NULL) + { + tag = drawPrefix; + } + + // + if (chartId == -1) + { + chartId = 0; + } + + // + if (subWindow == -1) + { + subWindow = 0; + } + + // + for (int iObj = ObjectsTotal(chartId, subWindow) - 1; iObj >= 0; iObj--) + { + // + string on = ObjectName(chartId, iObj, subWindow); + if (StringFind(on, tag) >= 0) + { + ObjectDelete(chartId, on); + } + } + + // + // Redraw Chart ... + ChartRedraw(); +} + +// +bool RemoveDraw( + string name, + long chartId = -1, + int subWindow = -1) +{ + // + bool result = false; + + // + if (chartId == -1) + { + chartId = 0; + } + + // + if (subWindow == -1) + { + subWindow = 0; + } + + // + string objName = ""; + for (int iObj = ObjectsTotal(chartId, subWindow) - 1; iObj >= 0; iObj--) + { + // + string on = ObjectName(chartId, iObj, subWindow); + if (StringFind(on, name) >= 0) + { + // + objName = on; + break; + } + } + + // + if (StringLen(objName) > 0) + { + result = ObjectDelete(chartId, objName); + } + + // + return result; +} + +// +// Deselect All Draws ... +void DeselectAllDraws() +{ + // + int objs = ObjectsTotal(ChartID(), 0); + for (int o = 0; o < objs; o++) + { + ObjectSetInteger(ChartID(), ObjectName(ChartID(), o, 0), OBJPROP_SELECTED, false); + } + + // + ChartRedraw(); +} + +// +// Check Object Exists ... +bool IsDrawExists( + string name, + long chartId = -1, + int subWindow = -1) +{ + // + bool result = false; + + // + if (chartId == -1) + { + chartId = 0; + } + + // + if (subWindow == -1) + { + subWindow = 0; + } + + // + for (int iObj = ObjectsTotal(chartId, subWindow) - 1; iObj >= 0; iObj--) + { + // + string on = ObjectName(chartId, iObj, subWindow); + result = StringFind(on, name) >= 0; + if (result) + { + break; + } + } + + // + return result; +} + +// +// END Provided Functions ... +// + +// +// START Regular Draws ... +// + +// +// START Arrow Functions ... +// + +// +// Draw an Arrow Object on Chart ... +bool DrawArrow( + const long chartID = 0, // chart's ID + const string name = "Arrow", // arrow name + const int subWindow = 0, // subwindow index + datetime time = 0, // anchor point time + double price = 0, // anchor point price + const uchar arrowCode = 252, // arrow code + const ENUM_ARROW_ANCHOR anchor = ANCHOR_BOTTOM, // anchor point position + const color clr = clrAqua, // arrow color + const ENUM_LINE_STYLE style = STYLE_SOLID, // border line style + const int width = 3, // arrow size + const bool back = false, // in the background + const bool selection = false, // highlight to move + const bool hidden = false, // hidden in the object list + const long zOrder = 0 // Order Object ... +) +{ + // + // set anchor point coordinates if they are not set ... + ChangeArrowEmptyPoint(time, price); + + // + // reset the error value ... + ResetLastError(); + + // + // Normalize Name ... + string objName = drawPrefix + "_" + name; + + // + // create an arrow ... + if (!ObjectCreate(chartID, objName, OBJ_ARROW, subWindow, time, price)) + { + // + string message = + __FUNCTION__ + + ": failed to create an arrow! Error code = " + + (string)GetLastError(); + + // + LogMessage(message); + + // + return false; + } + + // + // set the arrow code ... + ObjectSetInteger(chartID, objName, OBJPROP_ARROWCODE, arrowCode); + + // + // set anchor type ... + ObjectSetInteger(chartID, objName, OBJPROP_ANCHOR, anchor); + + // + // set the arrow color ... + ObjectSetInteger(chartID, objName, OBJPROP_COLOR, clr); + + // + // set the border line style ... + ObjectSetInteger(chartID, objName, OBJPROP_STYLE, style); + + // + // set the arrow's size ... + ObjectSetInteger(chartID, objName, OBJPROP_WIDTH, width); + + // + // display in the foreground false or background true ... + ObjectSetInteger(chartID, objName, OBJPROP_BACK, back); + + // + // enable true or disable false the mode of moving the arrow by mouse + // when creating a graphical object using ObjectCreate function, the object cannot be + // highlighted and moved by default. Inside this method, selection parameter + // is false by default, if you want making it possible to highlight and move the object + // change it to true ... + ObjectSetInteger(chartID, objName, OBJPROP_SELECTABLE, true); + ObjectSetInteger(chartID, objName, OBJPROP_SELECTED, selection); + + // + // hide true or display false graphical object name in the object list ... + ObjectSetInteger(chartID, objName, OBJPROP_HIDDEN, hidden); + + // + // set the priority for receiving the event of a mouse click in the chart ... + ObjectSetInteger(chartID, objName, OBJPROP_ZORDER, zOrder); + + // + // successful execution ... + return true; +} + +// +// Move the anchor point of Arrow ... +bool MoveArrow( + const long chartID = 0, // chart's ID + const string name = "Arrow", // object name + datetime time = 0, // anchor point time coordinate + double price = 0 // anchor point price coordinate +) +{ + // + // if point position is not set, move it to the current bar having Bid price ... + if (!time) + { + time = TimeCurrent(); + } + + // + if (!price) + { + price = SymbolInfoDouble(_Symbol, SYMBOL_BID); + } + + // + // reset the error value + ResetLastError(); + + // + // move the anchor point ... + if (!ObjectMove(chartID, name, 0, time, price)) + { + // + string message = + __FUNCTION__ + + ": failed to move the anchor point! Error code = " + + (string)GetLastError(); + + // + LogMessage(message); + + // + return false; + } + + // + // successful execution ... + return true; +} + +// +// Delete an arrow ... +bool DeleteArrow( + const long chartID = 0, // chart's ID + const string name = "Arrow" // arrow name +) +{ + // + // reset the error value ... + ResetLastError(); + + // + // delete an arrow ... + if (!ObjectDelete(chartID, name)) + { + // + string message = + __FUNCTION__ + + ": failed to delete an arrow! Error code = " + + (string)GetLastError(); + + // + LogMessage(message); + + // + return false; + } + + // + // successful execution ... + return true; +} + +// +// Change the arrow code ... +bool ArrowCodeChange( + const long chartID = 0, // chart's ID + const string name = "Arrow", // object name + const uchar code = 252 // arrow code +) +{ + // + // reset the error value ... + ResetLastError(); + + // + // change the arrow code ... + if (!ObjectSetInteger(chartID, name, OBJPROP_ARROWCODE, code)) + { + // + string message = + __FUNCTION__ + + ": failed to change the arrow code! Error code = " + + (string)GetLastError(); + + // + LogMessage(message); + + // + return false; + } + + // + // successful execution ... + return true; +} + +// +// Change anchor type ... +bool ArrowAnchorChange( + const long chartID = 0, // chart's ID + const string name = "Arrow", // object name + const ENUM_ARROW_ANCHOR anchor = ANCHOR_TOP // anchor type +) +{ + // + // reset the error value ... + ResetLastError(); + + // + // change anchor type ... + if (!ObjectSetInteger(chartID, name, OBJPROP_ANCHOR, anchor)) + { + // + string message = + __FUNCTION__ + + ": failed to change anchor type! Error code = " + + (string)GetLastError(); + + // + LogMessage(message); + + // + return false; + } + + // + // successful execution ... + return true; +} + +// +// Check anchor point values and set default values +// for empty ones ... +void ChangeArrowEmptyPoint( + datetime &time, + double &price) +{ + // + // if the point's time is not set, it will be on the current bar ... + if (!time) + { + time = TimeCurrent(); + } + + // + // if the point's price is not set, it will have Bid value ... + if (!price) + { + price = SymbolInfoDouble(_Symbol, SYMBOL_BID); + } +} + +// +// END Arrow Functions ... +// + +// +// START Horizontal Line Functions ... +// + +// +// Create, Draw the horizontal line ... +bool DrawHorizontalLine( + const long chartID = 0, // chart's ID + const string name = "HLine", // line name + const int subWindow = 0, // subwindow index + double price = 0, // line price + const color clr = clrRed, // line color + const ENUM_LINE_STYLE style = STYLE_SOLID, // line style + const int width = 1, // line width + const bool back = false, // in the background + const bool selection = false, // highlight to move + const bool hidden = false, // hidden in the object list + const long zOrder = 0 // priority for mouse click +) +{ + // + // if the price is not set, set it at the current Bid price level ... + if (!price) + { + price = SymbolInfoDouble(Symbol(), SYMBOL_BID); + } + + // + // reset the error value ... + ResetLastError(); + + // + // Normalize Name ... + string objName = drawPrefix + "_" + name; + + // + // create a horizontal line ... + if (!ObjectCreate(chartID, objName, OBJ_HLINE, subWindow, 0, price)) + { + // + string message = + __FUNCTION__ + + ": failed to create a horizontal line! Error code = " + + (string)GetLastError(); + + // + LogMessage(message); + + // + return false; + } + + // + // set line color ... + ObjectSetInteger(chartID, objName, OBJPROP_COLOR, clr); + + // + // set line display style ... + ObjectSetInteger(chartID, objName, OBJPROP_STYLE, style); + + // + // set line width ... + ObjectSetInteger(chartID, objName, OBJPROP_WIDTH, width); + + // + // display in the foreground false or background true ... + ObjectSetInteger(chartID, objName, OBJPROP_BACK, back); + + // + // enable true or disable false the mode of moving the line by mouse + // when creating a graphical object using ObjectCreate function, the object cannot be + // highlighted and moved by default. Inside this method, selection parameter + // is true by default making it possible to highlight and move the object + ObjectSetInteger(chartID, objName, OBJPROP_SELECTABLE, selection); + ObjectSetInteger(chartID, objName, OBJPROP_SELECTED, selection); + + // + // hide true or display false graphical object name in the object list ... + ObjectSetInteger(chartID, objName, OBJPROP_HIDDEN, hidden); + + // + // set the priority for receiving the event of a mouse click in the chart ... + ObjectSetInteger(chartID, objName, OBJPROP_ZORDER, zOrder); + + // + // successful execution ... + return true; +} + +// +// Move horizontal line ... +bool MoveHorizontalLine( + const long chartID = 0, // chart's ID + const string name = "HLine", // line name + double price = 0 // line price +) +{ + // + // if the line price is not set, move it to the current Bid price level ... + if (!price) + { + price = SymbolInfoDouble(Symbol(), SYMBOL_BID); + } + + // + // reset the error value ... + ResetLastError(); + + // + // move a horizontal line ... + if (!ObjectMove(chartID, name, 0, 0, price)) + { + // + string message = + __FUNCTION__ + + ": failed to move the horizontal line! Error code = " + + (string)GetLastError(); + + // + LogMessage(message); + + // + return false; + } + + // + // successful execution ... + return true; +} + +// +// Delete a horizontal line ... +bool DeleteHorizontalLine( + const long chartID = 0, // chart's ID + const string name = "HLine" // line name +) +{ + // + // reset the error value ... + ResetLastError(); + + // + // delete a horizontal line ... + if (!ObjectDelete(chartID, name)) + { + // + string message = + __FUNCTION__ + + ": failed to delete a horizontal line! Error code = " + + (string)GetLastError(); + + // + LogMessage(message); + + // + return false; + } + + // + // successful execution ... + return true; +} + +// +// END Horizontal Line Functions ... +// + +// +// START Vertical Line Functions ... +// + +// +// Create the vertical line ... +bool DrawVerticalLine( + const long chartID = 0, // chart's ID + const string name = "VLine", // line name + const int subWindow = 0, // subwindow index + datetime time = 0, // line time + const color clr = clrRed, // line color + const ENUM_LINE_STYLE style = STYLE_SOLID, // line style + const int width = 1, // line width + const bool back = false, // in the background + const bool selection = false, // highlight to move + const bool hidden = false, // hidden in the object list + const long zOrder = 0 // priority for mouse click +) +{ + // + // if the line time is not set, draw it via the last bar ... + if (!time) + { + time = TimeCurrent(); + } + + // + // reset the error value + ResetLastError(); + + // + // Normalize Name ... + string objName = drawPrefix + "_" + name; + + // + // create a vertical line ... + if (!ObjectCreate(chartID, objName, OBJ_VLINE, subWindow, time, 0)) + { + // + string message = + __FUNCTION__ + + ": failed to create a vertical line! Error code = " + + (string)GetLastError(); + + // + LogMessage(message); + + // + return false; + } + + // + // set line color ... + ObjectSetInteger(chartID, objName, OBJPROP_COLOR, clr); + + // + // set line display style ... + ObjectSetInteger(chartID, objName, OBJPROP_STYLE, style); + + // + // set line width ... + ObjectSetInteger(chartID, objName, OBJPROP_WIDTH, width); + + // + // display in the foreground false or background true ... + ObjectSetInteger(chartID, objName, OBJPROP_BACK, back); + + // + // enable true or disable false the mode of moving the line by mouse + // when creating a graphical object using ObjectCreate function, the object cannot be + // highlighted and moved by default. Inside this method, selection parameter + // is true by default making it possible to highlight and move the object ... + ObjectSetInteger(chartID, objName, OBJPROP_SELECTABLE, true); + ObjectSetInteger(chartID, objName, OBJPROP_SELECTED, selection); + + // + // hide true or display false graphical object name in the object list ... + ObjectSetInteger(chartID, objName, OBJPROP_HIDDEN, hidden); + + // + // set the priority for receiving the event of a mouse click in the chart + ObjectSetInteger(chartID, objName, OBJPROP_ZORDER, zOrder); + + // + // successful execution ... + return true; +} + +// +// Move the vertical line ... +bool MoveVerticalLine( + const long chartID = 0, // chart's ID + const string name = "VLine", // line name + datetime time = 0 // line time +) +{ + // + // if line time is not set, move the line to the last bar ... + if (!time) + { + time = TimeCurrent(); + } + + // + // reset the error value ... + ResetLastError(); + + // + // move the vertical line ... + if (!ObjectMove(chartID, name, 0, time, 0)) + { + // + string message = + __FUNCTION__ + + ": failed to move the vertical line! Error code = " + + (string)GetLastError(); + + // + LogMessage(message); + + // + return false; + } + + // + // successful execution ... + return true; +} + +// +// Delete the vertical line ... +bool DeleteVerticalLine( + const long chartID = 0, // chart's ID + const string name = "VLine" // line name +) +{ + // + // reset the error value ... + ResetLastError(); + + // + // delete the vertical line ... + if (!ObjectDelete(chartID, name)) + { + // + string message = + __FUNCTION__ + + ": failed to delete the vertical line! Error code = " + + (string)GetLastError(); + + // + LogMessage(message); + + // + return false; + } + + // + // successful execution ... + return true; +} + +// +// END Vertical Line Functions ... +// + +// +// START Rectangle Functions ... +// + +// +// Create rectangle by the given coordinates ... +bool DrawRectangle( + const long chartID = 0, // chart's ID + const string name = "Rectangle", // rectangle name + const int subWindow = 0, // subwindow index + datetime time1 = 0, // first point time + double price1 = 0, // first point price + datetime time2 = 0, // second point time + double price2 = 0, // second point price + const color clr = clrRed, // rectangle color + const ENUM_LINE_STYLE style = STYLE_SOLID, // style of rectangle lines + const int width = 1, // width of rectangle lines + const bool fill = false, // filling rectangle with color + const bool back = false, // in the background + const bool selection = true, // highlight to move + const bool hidden = true, // hidden in the object list + const long zOrder = 0 // priority for mouse click +) +{ + // + bool result = false; + + // + // Set anchor points' coordinates if they are not set ... + ChangeRectangleEmptyPoints(time1, price1, time2, price2); + + // + // Create a rectangle by the given coordinates ... + result = ObjectCreate(chartID, name, OBJ_RECTANGLE, subWindow, time1, price1, time2, price2); + if (!result) + { + return result; + } + + // + // Set rectangle color ... + ObjectSetInteger(chartID, name, OBJPROP_COLOR, clr); + + // + // Set the style of rectangle lines + ObjectSetInteger(chartID, name, OBJPROP_STYLE, style); + + // + // Set width of the rectangle lines ... + ObjectSetInteger(chartID, name, OBJPROP_WIDTH, width); + + // + // Enable (true) or disable (false) the mode of filling the rectangle ... + ObjectSetInteger(chartID, name, OBJPROP_FILL, fill); + + // + // Display in the foreground (false) or background (true) ... + ObjectSetInteger(chartID, name, OBJPROP_BACK, back); + + // + // Enable (true) or disable (false) the mode of highlighting the rectangle for moving + // when creating a graphical object using ObjectCreate function, the object cannot be + // highlighted and moved by default. Inside this method, selection parameter + // is true by default making it possible to highlight and move the object + ObjectSetInteger(chartID, name, OBJPROP_SELECTABLE, selection); + + // + ObjectSetInteger(chartID, name, OBJPROP_SELECTED, selection); + + // + // Hide (true) or display (false) graphical object name in the object list ... + ObjectSetInteger(chartID, name, OBJPROP_HIDDEN, hidden); + + // + // Set the priority for receiving the event of a mouse click in the chart ... + ObjectSetInteger(chartID, name, OBJPROP_ZORDER, zOrder); + + // + // Successful execution + return result; +} + +// +// Move the rectangle anchor point ...s +bool RectanglePointChange( + const long chartID = 0, // chart's ID + const string name = "Rectangle", // rectangle name + const int pointIndex = 0, // anchor point index + datetime time = 0, // anchor point time coordinate + double price = 0 // anchor point price coordinate +) +{ + // + bool result = false; + + // + // if point position is not set, move it to the current bar having Bid price ... + if (!time) + { + time = TimeCurrent(); + } + + // + if (!price) + { + price = SymbolInfoDouble(Symbol(), SYMBOL_BID); + } + + // + // Move the anchor point ... + result = ObjectMove(chartID, name, pointIndex, time, price); + if (!result) + { + return result; + } + + // + // Successful execution + return result; +} + +// +// Delete the rectangle ... +bool DeleteRectangle( + const long chartID = 0, // chart's ID + const string name = "Rectangle" // rectangle name +) +{ + // + bool result = false; + + // + result = ObjectDelete(chartID, name); + + // + return result; +} + +// +// Check the values of rectangle's anchor points and set default +// values for empty ones +void ChangeRectangleEmptyPoints( + datetime &time1, double &price1, + datetime &time2, double &price2) +{ + // + // if the first point's time is not set, it will be on the current bar ... + if (!time1) + { + time1 = TimeCurrent(); + } + + // + // if the first point's price is not set, it will have Bid value ... + if (!price1) + { + price1 = SymbolInfoDouble(Symbol(), SYMBOL_BID); + } + + // + // if the second point's time is not set, it is located 9 bars left from the second one ... + if (!time2) + { + // + // array for receiving the open time of the last 10 bars ... + datetime temp[10]; + CopyTime(Symbol(), Period(), time1, 10, temp); + + // + // set the second point 9 bars left from the first one ... + time2 = temp[0]; + } + + // + // if the second point's price is not set, move it 300 points lower than the first one ... + if (!price2) + { + price2 = price1 - 300 * SymbolInfoDouble(Symbol(), SYMBOL_POINT); + } +} + +// +// END Rectangle Functions ... +// + +// +// START RectangleLabel Functions ... +// + +// +// Create Rectangle Label Object ... +bool DrawRectangleLabel( + const long chartID = 0, // chart's ID + const string name = "RectLabel", // label name + const int subWindow = 0, // subwindow index + const int x = 0, // X coordinate + const int y = 0, // Y coordinate + const int width = 50, // width + const int height = 18, // height + const color bgColor = clrWhiteSmoke, // background color + const ENUM_BORDER_TYPE border = BORDER_SUNKEN, // border type + const ENUM_BASE_CORNER corner = CORNER_LEFT_UPPER, // chart corner for anchoring + const color clr = clrRed, // flat border color (Flat) + const ENUM_LINE_STYLE style = STYLE_SOLID, // flat border style + const int lineWidth = 1, // flat border width + const bool back = false, // in the background + const bool selection = false, // highlight to move + const bool hidden = false, // hidden in the object list + const long zOrder = 0 // priority for mouse click +) +{ + // + // reset the error value ... + ResetLastError(); + + // + // Normalize Name ... + string objName = drawPrefix + "_" + name; + + // + // + // create a rectangle label + if (!ObjectCreate(chartID, objName, OBJ_RECTANGLE_LABEL, subWindow, 0, 0)) + { + // + string message = + __FUNCTION__ + + ": failed to create a rectangle label! Error code = " + + (string)GetLastError(); + + // + LogMessage(message); + + // + return false; + } + + // + // set label coordinates ... + ObjectSetInteger(chartID, objName, OBJPROP_XDISTANCE, x); + ObjectSetInteger(chartID, objName, OBJPROP_YDISTANCE, y); + + // + // set label size ... + ObjectSetInteger(chartID, objName, OBJPROP_XSIZE, width); + ObjectSetInteger(chartID, objName, OBJPROP_YSIZE, height); + + // + // set background color ... + ObjectSetInteger(chartID, objName, OBJPROP_BGCOLOR, bgColor); + + // + // set border type ... + ObjectSetInteger(chartID, objName, OBJPROP_BORDER_TYPE, border); + + // + // set the chart's corner, relative to which point coordinates are defined ... + ObjectSetInteger(chartID, objName, OBJPROP_CORNER, corner); + + // + // set flat border color (in Flat mode) ... + ObjectSetInteger(chartID, objName, OBJPROP_COLOR, clr); + + // + // set flat border line style ... + ObjectSetInteger(chartID, objName, OBJPROP_STYLE, style); + + // + // set flat border width ... + ObjectSetInteger(chartID, objName, OBJPROP_WIDTH, lineWidth); + + // + // display in the foreground false or background true ... + ObjectSetInteger(chartID, objName, OBJPROP_BACK, back); + + // + // enable true or disable false the mode of moving the label by mouse ... + ObjectSetInteger(chartID, objName, OBJPROP_SELECTABLE, selection); + ObjectSetInteger(chartID, objName, OBJPROP_SELECTED, selection); + + // + // hide true or display false graphical object name in the object list ... + ObjectSetInteger(chartID, objName, OBJPROP_HIDDEN, hidden); + + // + // set the priority for receiving the event of a mouse click in the chart ... + ObjectSetInteger(chartID, objName, OBJPROP_ZORDER, zOrder); + + // + // successful execution ... + return true; +} + +// +// Move Rectangle Label .. +bool MoveRectangleLabel( + const long chartID = 0, // chart's ID + const string name = "RectLabel", // label name + const int x = 0, // X coordinate + const int y = 0 // Y coordinate +) +{ + // + // reset the error value ... + ResetLastError(); + + // + // move the rectangle label ... + if (!ObjectSetInteger(chartID, name, OBJPROP_XDISTANCE, x)) + { + // + string message = + __FUNCTION__ + + ": failed to move X coordinate of the label! Error code = " + + (string)GetLastError(); + + // + LogMessage(message); + + // + return false; + } + + // + if (!ObjectSetInteger(chartID, name, OBJPROP_YDISTANCE, y)) + { + // + string message = + __FUNCTION__ + + ": failed to move Y coordinate of the label! Error code = " + + (string)GetLastError(); + + // + return false; + } + + // + // successful execution ... + return true; +} + +// +// Delete the rectangle label ... +bool DeleteRectangleLabel( + const long chartID = 0, // chart's ID + const string name = "RectLabel" // label name +) +{ + // + // reset the error value ... + ResetLastError(); + + // + // delete the label ... + if (!ObjectDelete(chartID, name)) + { + // + string message = + __FUNCTION__ + + ": failed to delete a rectangle label! Error code = " + + (string)GetLastError(); + + // + LogMessage(message); + + // + return false; + } + + // + // successful execution ... + return true; +} + +// +// Change Rectangle Label Size ... +bool ChangeSizeRectangleLabel( + const long chartID = 0, // chart's ID + const string name = "RectLabel", // label name + const int width = 50, // label width + const int height = 18 // label height +) +{ + // + // reset the error value ... + ResetLastError(); + + // + // change label size ... + if (!ObjectSetInteger(chartID, name, OBJPROP_XSIZE, width)) + { + // + string message = + __FUNCTION__ + + ": failed to change the label's width! Error code = " + + (string)GetLastError(); + + // + LogMessage(message); + + // + return false; + } + + // + if (!ObjectSetInteger(chartID, name, OBJPROP_YSIZE, height)) + { + // + string message = + __FUNCTION__ + + ": failed to change the label's height! Error code = " + + (string)GetLastError(); + + // + LogMessage(message); + + // + return false; + } + + // + // successful execution ... + return true; +} + +// +// Change rectangle label border type ... +bool RectLabelChangeBorderType( + const long chartID = 0, // chart's ID + const string name = "RectLabel", // label name + const ENUM_BORDER_TYPE border = BORDER_SUNKEN // border type +) +{ + // + // reset the error value ... + ResetLastError(); + + // + // change border type ... + if (!ObjectSetInteger(chartID, name, OBJPROP_BORDER_TYPE, border)) + { + // + string message = + __FUNCTION__ + + ": failed to change the border type! Error code = " + + (string)GetLastError(); + + // + LogMessage(message); + + // + return false; + } + + // + // successful execution ... + return true; +} + +// +// END RectangleLabel Functions ... +// + +// +// START TrendLine Funcions ... +// + +// +// Create a trend line by the given coordinates ... +bool DrawTrendLine( + const long chartID = 0, // chart's ID + const string name = "TrendLine", // line name + const int subWindow = 0, // subwindow index + datetime time1 = 0, // first point time + double price1 = 0, // first point price + datetime time2 = 0, // second point time + double price2 = 0, // second point price + const color clr = clrYellow, // line color + const ENUM_LINE_STYLE style = STYLE_SOLID, // line style + const int width = 1, // line width + const bool back = false, // in the background + const bool selection = false, // highlight to move + const bool rayRight = false, // line's continuation to the right + const bool hidden = false, // hidden in the object list + const long zOrder = 0 // priority for mouse click +) +{ + // + // set anchor points' coordinates if they are not set ... + ChangeTrendLineEmptyPoints( + time1, + price1, + time2, + price2); + + // + // reset the error value ... + ResetLastError(); + + // + // Normalize Name ... + string objName = drawPrefix + "_" + name; + + // + // create a trend line by the given coordinates ... + if (!ObjectCreate(chartID, objName, OBJ_TREND, subWindow, time1, price1, time2, price2)) + { + // + string message = + __FUNCTION__ + + ": failed to create a trend line! Error code = " + + (string)GetLastError(); + + // + LogMessage(message); + + // + return false; + } + + // + // set line color ... + ObjectSetInteger(chartID, objName, OBJPROP_COLOR, clr); + + // + // set line display style ... + ObjectSetInteger(chartID, objName, OBJPROP_STYLE, style); + + // + // set line width ... + ObjectSetInteger(chartID, objName, OBJPROP_WIDTH, width); + + // + // display in the foreground false or background true ... + ObjectSetInteger(chartID, objName, OBJPROP_BACK, back); + + // + // enable true or disable false the mode of moving the line by mouse + // when creating a graphical object using ObjectCreate function, the object cannot be + // highlighted and moved by default. Inside this method, selection parameter + // is true by default making it possible to highlight and move the object ... + ObjectSetInteger(chartID, objName, OBJPROP_SELECTABLE, true); + ObjectSetInteger(chartID, objName, OBJPROP_SELECTED, selection); + + // + // enable true or disable false the mode of continuation of the line's display to the right ... + ObjectSetInteger(chartID, objName, OBJPROP_RAY_RIGHT, rayRight); + + // + // hide true or display false graphical object name in the object list ... + ObjectSetInteger(chartID, objName, OBJPROP_HIDDEN, hidden); + + // + // set the priority for receiving the event of a mouse click in the chart ... + ObjectSetInteger(chartID, objName, OBJPROP_ZORDER, zOrder); + + // + // successful execution ... + return true; +} + +// +// Move trend line anchor point ... | +bool ChangeTrendLinePoint( + const long chartID = 0, // chart's ID + const string name = "TrendLine", // line name + const int pointindex = 0, // anchor point index + datetime time = 0, // anchor point time coordinate + double price = 0 // anchor point price coordinate +) +{ + // + // if point position is not set, move it to the current bar having Bid price ... + if (!time) + { + time = TimeCurrent(); + } + + // + if (!price) + { + price = SymbolInfoDouble(Symbol(), SYMBOL_BID); + } + + // + // reset the error value ... + ResetLastError(); + + // + // move trend line's anchor point ... + if (!ObjectMove(chartID, name, pointindex, time, price)) + { + // + string message = + __FUNCTION__ + + ": failed to move the anchor point! Error code = " + + (string)GetLastError(); + + // + LogMessage(message); + + // + return false; + } + + // + // successful execution ... + return true; +} + +// +// The function deletes the trend line from the chart ... +bool DeleteTrendLine( + const long chartID = 0, // chart's ID + const string name = "TrendLine" // line name +) +{ + // + // reset the error value ... + ResetLastError(); + + // + // delete a trend line ... + if (!ObjectDelete(chartID, name)) + { + // + string message = + __FUNCTION__ + + ": failed to delete a trend line! Error code = " + + (string)GetLastError(); + + // + LogMessage(message); + + // + return false; + } + + // + // successful execution ... + return true; +} + +// +// Check the values of trend line's anchor points and set default ... +// values for empty ones ... +void ChangeTrendLineEmptyPoints( + datetime &time1, + double &price1, + datetime &time2, + double &price2) +{ + // + // if the first point's time is not set, it will be on the current bar ... + if (!time1) + { + time1 = TimeCurrent(); + } + + // + // if the first point's price is not set, it will have Bid value ... + if (!price1) + { + price1 = SymbolInfoDouble(Symbol(), SYMBOL_BID); + } + + // + // if the second point's time is not set, it is located 9 bars left from the second one ... + if (!time2) + { + // + // array for receiving the open time of the last 10 bars ... + datetime temp[10]; + CopyTime(Symbol(), Period(), time1, 10, temp); + + // + // set the second point 9 bars left from the first one ... + time2 = temp[0]; + } + + // + // if the second point's price is not set, it is equal to the first point's one ... + if (!price2) + { + price2 = price1; + } +} + +// +// END TrendLine Functions ... +// + +// +// START Text Functions ... +// + +// +// Create and Draw a Text Object ... +bool DrawText( + const long chartID = 0, // chart's ID + const string name = "Text", // object name + const int subWindow = 0, // subwindow index + datetime time = 0, // anchor point time + double price = 0, // anchor point price + const string text = "Text", // the text itself + const string font = "Arial", // font + const int fontSize = 10, // font size + const color clr = clrRed, // color + const double angle = 0.0, // text slope + const ENUM_ANCHOR_POINT anchor = ANCHOR_CENTER, // anchor type + const bool back = false, // in the background + const bool selection = false, // highlight to move + const bool hidden = true, // hidden in the object list + const long zOrder = 0 // priority for mouse click +) +{ + // + // set anchor point coordinates if they are not set ... + ChangeTextEmptyPoint(time, price); + + // + // reset the error value ... + ResetLastError(); + + // + // Normalize Name ... + string objName = drawPrefix + "_" + name; + + // + // + // create Text object + if (!ObjectCreate(chartID, objName, OBJ_TEXT, subWindow, time, price)) + { + // + string message = + __FUNCTION__ + + ": failed to create \"Text\" object! Error code = " + + (string)GetLastError(); + + // + LogMessage(message); + + // + return false; + } + + // + // set the text ... + ObjectSetString(chartID, objName, OBJPROP_TEXT, text); + + // + // set text font ... + ObjectSetString(chartID, objName, OBJPROP_FONT, font); + + // + // set font size ... + ObjectSetInteger(chartID, objName, OBJPROP_FONTSIZE, fontSize); + + // + // set the slope angle of the text ... + ObjectSetDouble(chartID, objName, OBJPROP_ANGLE, angle); + + // + // set anchor type ... + ObjectSetInteger(chartID, objName, OBJPROP_ANCHOR, anchor); + + // + // set color ... + ObjectSetInteger(chartID, objName, OBJPROP_COLOR, clr); + + // + // display in the foreground false or background true ... + ObjectSetInteger(chartID, objName, OBJPROP_BACK, back); + + // + // enable true or disable false the mode of moving the object by mouse ... + ObjectSetInteger(chartID, objName, OBJPROP_SELECTABLE, true); + ObjectSetInteger(chartID, objName, OBJPROP_SELECTED, selection); + + // + // hide true or display false graphical object name in the object list ... + ObjectSetInteger(chartID, objName, OBJPROP_HIDDEN, hidden); + + // + // set the priority for receiving the event of a mouse click in the chart ... + ObjectSetInteger(chartID, objName, OBJPROP_ZORDER, zOrder); + + // + // successful execution ... + return true; +} + +// +// Move the anchor point ... +bool MoveText( + const long chartID = 0, // chart's ID + const string name = "Text", // object name + datetime time = 0, // anchor point time coordinate + double price = 0 // anchor point price coordinate +) +{ + // + // + // if point position is not set, move it to the current bar having Bid price + if (!time) + { + time = TimeCurrent(); + } + + // + if (!price) + { + price = SymbolInfoDouble(_Symbol, SYMBOL_BID); + } + + // + // reset the error value ... + ResetLastError(); + + // + // move the anchor point .. + if (!ObjectMove(chartID, name, 0, time, price)) + { + // + string message = + __FUNCTION__ + + ": failed to move the anchor point! Error code = " + + (string)GetLastError(); + + // + LogMessage(message); + + // + return false; + } + + // + // successful execution ... + return true; +} + +// +// Change the object text ... +bool ChangeText( + const long chartID = 0, // chart's ID + const string name = "Text", // object name + const string text = "Text" // text +) +{ + // + // reset the error value ... + ResetLastError(); + + // + // change object text ... + if (!ObjectSetString(chartID, name, OBJPROP_TEXT, text)) + { + // + string message = + __FUNCTION__ + + ": failed to change the text! Error code = " + + (string)GetLastError(); + + // + LogMessage(message); + + // + return false; + } + + // + // successful execution ... + return true; +} + +// +// Delete Text object ... +bool DeleteText( + const long chartID = 0, // chart's ID + const string name = "Text" // object name +) +{ + // + // reset the error value ... + ResetLastError(); + + // + // delete the object ... + if (!ObjectDelete(chartID, name)) + { + // + string message = + __FUNCTION__ + + ": failed to delete \"Text\" object! Error code = " + + (string)GetLastError(); + + // + LogMessage(message); + + // + return false; + } + + // + // successful execution + return true; +} + +// +// Check anchor point values and set default values +// for empty ones ... +void ChangeTextEmptyPoint( + datetime &time, + double &price) +{ + // + // if the point's time is not set, it will be on the current bar ... + if (!time) + { + time = TimeCurrent(); + } + + // + // if the point's price is not set, it will have Bid value ... + if (!price) + { + price = SymbolInfoDouble(_Symbol, SYMBOL_BID); + } +} + +// +// END Text Functions ... +// + +// +// START Fibonacchi Functions ... +// + +// +// Create Fibonacci Retracement by the given coordinates ... +bool DrawFibonacci( + const long chartID = 0, // chart's ID + const string name = "Fibonacci", // object name + const int subWindow = 0, // subwindow index + datetime time1 = 0, // first point time + double price1 = 0, // first point price + datetime time2 = 0, // second point time + double price2 = 0, // second point price + const color clr = clrRed, // object color + const ENUM_LINE_STYLE style = STYLE_SOLID, // object line style + const int width = 1, // object line width + const bool back = false, // in the background + const bool selection = true, // highlight to move + const bool rayRight = false, // object's continuation to the right + const bool hidden = true, // hidden in the object list + const long zOrder = 0 // priority for mouse click +) +{ + // + // set anchor points' coordinates if they are not set ... + ChangeFibonacciEmptyPoints(time1, price1, time2, price2); + + // + // reset the error value ... + ResetLastError(); + + // + // Normalize Name ... + string objName = drawPrefix + "_" + name; + + // + // Create Fibonacci Retracement by the given coordinates ... + if (!ObjectCreate(chartID, objName, OBJ_FIBO, subWindow, time1, price1, time2, price2)) + { + // + string message = + __FUNCTION__ + + ": failed to create \"Fibonacci Retracement\"! Error code = " + + (string)GetLastError(); + + // + LogMessage(message); + + // + return false; + } + + // + // set color ... + ObjectSetInteger(chartID, objName, OBJPROP_COLOR, clr); + + // + // set line style ... + ObjectSetInteger(chartID, objName, OBJPROP_STYLE, style); + + // + // set line width ... + ObjectSetInteger(chartID, objName, OBJPROP_WIDTH, width); + + // + // display in the foreground false or background true ... + ObjectSetInteger(chartID, objName, OBJPROP_BACK, back); + + // + // enable true or disable false the mode of highlighting the channel for moving + // when creating a graphical object using ObjectCreate function, the object cannot be + // highlighted and moved by default. Inside this method, selection parameter + // is true by default making it possible to highlight and move the object ... + ObjectSetInteger(chartID, objName, OBJPROP_SELECTABLE, true); + ObjectSetInteger(chartID, objName, OBJPROP_SELECTED, selection); + + // + // enable true or disable false the mode of continuation of the object's display to the right ... + ObjectSetInteger(chartID, objName, OBJPROP_RAY_RIGHT, rayRight); + + // + // hide true or display false graphical object name in the object list ... + ObjectSetInteger(chartID, objName, OBJPROP_HIDDEN, hidden); + + // + // set the priority for receiving the event of a mouse click in the chart ... + ObjectSetInteger(chartID, objName, OBJPROP_ZORDER, zOrder); + + // + // successful execution ... + return true; +} + +// +// Create Fibonacci Retracement by the given coordinates ... +bool DrawCustomFibonacci( + // + int levels, // number of level lines + double &values[], // values of level lines + color &colors[], // color of level lines + ENUM_LINE_STYLE &styles[], // style of level lines + int &widths[], // width of level lines + string &descriptions[], // level Descriptions + // + const long chartID = 0, // chart's ID + const string name = "Fibonacci", // object name + const int subWindow = 0, // subwindow index + datetime time1 = 0, // first point time + double price1 = 0, // first point price + datetime time2 = 0, // second point time + double price2 = 0, // second point price + const color clr = clrAqua, // object color + const ENUM_LINE_STYLE style = STYLE_DOT, // object line style + const int width = 1, // object line width + const bool back = false, // in the background + const bool selection = true, // highlight to move + const bool rayRight = false, // object's continuation to the right + const bool hidden = true, // hidden in the object list + const long zOrder = 0 // priority for mouse click +) +{ + // + // set anchor points' coordinates if they are not set ... + ChangeFibonacciEmptyPoints(time1, price1, time2, price2); + + // + // reset the error value ... + ResetLastError(); + + // + // Normalize Name ... + string objName = drawPrefix + "_" + name; + + // + // Create Fibonacci Retracement by the given coordinates ... + if (!ObjectCreate(chartID, name, OBJ_FIBO, subWindow, time1, price1, time2, price2)) + { + // + string message = + __FUNCTION__ + + ": failed to create \"Fibonacci Retracement\"! Error code = " + + (string)GetLastError(); + + // + LogMessage(message); + + // + return false; + } + + // + // set color ... + ObjectSetInteger(chartID, objName, OBJPROP_COLOR, clr); + + // + // set line style ... + ObjectSetInteger(chartID, objName, OBJPROP_STYLE, style); + + // + // set line width ... + ObjectSetInteger(chartID, objName, OBJPROP_WIDTH, width); + + // + // display in the foreground false or background true ... + ObjectSetInteger(chartID, objName, OBJPROP_BACK, back); + + // + // enable true or disable false the mode of highlighting the channel for moving + // when creating a graphical object using ObjectCreate function, the object cannot be + // highlighted and moved by default. Inside this method, selection parameter + // is true by default making it possible to highlight and move the object ... + ObjectSetInteger(chartID, objName, OBJPROP_SELECTABLE, true); + ObjectSetInteger(chartID, objName, OBJPROP_SELECTED, selection); + + // + // enable true or disable false the mode of continuation of the object's display to the right ... + ObjectSetInteger(chartID, objName, OBJPROP_RAY_RIGHT, rayRight); + + // + // hide true or display false graphical object name in the object list ... + ObjectSetInteger(chartID, objName, OBJPROP_HIDDEN, hidden); + + // + // set the priority for receiving the event of a mouse click in the chart ... + ObjectSetInteger(chartID, objName, OBJPROP_ZORDER, zOrder); + + // + // Change Levels Of Fibonacci ... + bool result = FibonacciLevelsSet( + levels, + values, + colors, + styles, + widths, + descriptions, + chartID, + objName); + + // + // successful execution ... + return result; +} + +// +// Set number of levels and their parameters ... +bool FibonacciLevelsSet( + int levels, // number of level lines + double &values[], // values of level lines + color &colors[], // color of level lines + ENUM_LINE_STYLE &styles[], // style of level lines + int &widths[], // width of level lines + string &descriptions[], // level Descriptions + const long chartID = 0, // chart's ID + const string name = "Fibonacci" // object name +) +{ + // + // check array sizes ... + if ( + levels != ArraySize(colors) || + levels != ArraySize(styles) || + levels != ArraySize(widths) || + levels != ArraySize(widths)) + { + // + string message = + __FUNCTION__ + + ": array length does not correspond to the number of levels, error!"; + + // + LogMessage(message); + + // + return false; + } + + // + // set the number of levels ... + ObjectSetInteger(chartID, name, OBJPROP_LEVELS, levels); + + // + // set the properties of levels in the loop ... + for (int i = 0; i < levels; i++) + { + // + // level value ... + ObjectSetDouble(chartID, name, OBJPROP_LEVELVALUE, i, values[i]); + + // + // level color ... + ObjectSetInteger(chartID, name, OBJPROP_LEVELCOLOR, i, colors[i]); + + // + // level style ... + ObjectSetInteger(chartID, name, OBJPROP_LEVELSTYLE, i, styles[i]); + + // + // level width ... + ObjectSetInteger(chartID, name, OBJPROP_LEVELWIDTH, i, widths[i]); + + // + // level description ... + // ObjectSetString(chartID, name, OBJPROP_LEVELTEXT, i, DoubleToString(100 * values[i], 1)); + ObjectSetString(chartID, name, OBJPROP_LEVELTEXT, i, descriptions[i]); + } + + // + // successful execution ... + return true; +} + +// +// Move Fibonacci Retracement anchor point ... +bool FibonacciPointChange( + const long chartID = 0, // chart's ID + const string name = "Fibonacci", // object name + const int pointIndex = 0, // anchor point index + datetime time = 0, // anchor point time coordinate + double price = 0 // anchor point price coordinate +) +{ + // + // if point position is not set, move it to the current bar having Bid price ... + if (!time) + { + time = TimeCurrent(); + } + + // + if (!price) + { + price = SymbolInfoDouble(_Symbol, SYMBOL_BID); + } + + // + // reset the error value ... + ResetLastError(); + + // + // move the anchor point ... + if (!ObjectMove(chartID, name, pointIndex, time, price)) + { + // + string message = + __FUNCTION__ + + ": failed to move the anchor point! Error code = " + + (string)GetLastError(); + + // + LogMessage(message); + + // + return false; + } + + // + // successful execution ... + return true; +} + +// +// Delete Fibonacci Retracement ... +bool DeleteFibonachi( + const long chartID = 0, // chart's ID + const string name = "Fibonacci" // object name +) +{ + // + // reset the error value ... + ResetLastError(); + + // + // delete the object ... + if (!ObjectDelete(chartID, name)) + { + // + string message = + __FUNCTION__ + + ": failed to delete \"Fibonacci Retracement\"! Error code = " + + (string)GetLastError(); + + // + LogMessage(message); + + // + return false; + } + + // + // successful execution ... + return true; +} + +// +// Check the values of Fibonacci Retracement anchor points and set +// default values for empty ones ... +void ChangeFibonacciEmptyPoints( + datetime &time1, + double &price1, + datetime &time2, + double &price2) +{ + // + // if the second point's time is not set, it will be on the current bar ... + if (!time2) + { + time2 = TimeCurrent(); + } + + // + // if the second point's price is not set, it will have Bid value ... + if (!price2) + { + price2 = SymbolInfoDouble(_Symbol, SYMBOL_BID); + } + + // + // if the first point's time is not set, it is located 9 bars left from the second one ... + if (!time1) + { + // + // array for receiving the open time of the last 10 bars ... + datetime temp[10]; + CopyTime(Symbol(), Period(), time2, 10, temp); + + // + // set the first point 9 bars left from the second one ... + time1 = temp[0]; + } + + // + // if the first point's price is not set, move it 200 points below the second one ... + if (!price1) + { + price1 = price2 - 200 * SymbolInfoDouble(_Symbol, SYMBOL_POINT); + } +} + +// +// END Fibonacci Functions ... +// + +// +// START Event Functions ... +// + +// +// Create an Event ... +bool EventCreate( + const long chartID = 0, // chart's ID + const string name = "Event", // object name + const int subWindow = 0, // subwindow index + const string text = "Content", // event text + datetime time = 0, // anchor point time + const color clr = clrRed, // color + const int width = 1, // point width when highlighted + const bool back = false, // in the background + const bool selection = false, // highlight to move + const bool hidden = true, // hidden in the object list + const long zOrder = 0 // priority for mouse click +) +{ + // + if (!time) + { + time = TimeCurrent(); + } + + // + ResetLastError(); + + // + if (!ObjectCreate(chartID, name, OBJ_EVENT, subWindow, time, 0)) + { + // + string message = + __FUNCTION__ + + ": failed to create \"Event\" object! Error code = " + + (string)GetLastError(); + + // + LogMessage(message); + + // + return false; + } + + // + // set event text + ObjectSetString(chartID, name, OBJPROP_TEXT, text); + + // + // set color + ObjectSetInteger(chartID, name, OBJPROP_COLOR, clr); + + // + // set anchor point width if the object is highlighted + ObjectSetInteger(chartID, name, OBJPROP_WIDTH, width); + + // + // display in the foreground false or background true + ObjectSetInteger(chartID, name, OBJPROP_BACK, back); + + // + // enable true or disable false the mode of moving event by mouse + ObjectSetInteger(chartID, name, OBJPROP_SELECTABLE, selection); + ObjectSetInteger(chartID, name, OBJPROP_SELECTED, selection); + + // + // hide true or display false graphical object name in the object list + ObjectSetInteger(chartID, name, OBJPROP_HIDDEN, hidden); + + // + // set the priority for receiving the event of a mouse click in the chart + ObjectSetInteger(chartID, name, OBJPROP_ZORDER, zOrder); + + // + // successful execution + return true; +} + +// +// Change Event object text +bool EventTextChange( + const long chartID = 0, // chart's ID + const string name = "Event", // event name + const string text = "Content" // text +) +{ + // + // reset the error value + ResetLastError(); + + // + // change object text + if (!ObjectSetString(chartID, name, OBJPROP_TEXT, text)) + { + // + string message = + __FUNCTION__ + + ": failed to change the text! Error code = " + + (string)GetLastError(); + + // + LogMessage(message); + + // + return false; + } + + // + // successful execution + return true; +} + +// +// Move Event object +bool EventMove( + const long chartID = 0, // chart's ID + const string name = "Event", // event name + datetime time = 0 // time +) +{ + // + // if time is not set, move event to the last bar + if (!time) + { + time = TimeCurrent(); + } + + // + // reset the error value + ResetLastError(); + + // + // move the object + if (!ObjectMove(chartID, name, 0, time, 0)) + { + // + string message = + __FUNCTION__ + + ": failed to move \"Event\" object! Error code = " + + (string)GetLastError(); + + // + LogMessage(message); + + // + return false; + } + + // + // successful execution + return true; +} + +// +// Delete Event object +bool EventDelete( + const long chartID = 0, // chart's ID + const string name = "Event" // event name +) +{ + // + // reset the error value + ResetLastError(); + + // + // delete the object + if (!ObjectDelete(chartID, name)) + { + // + string message = + __FUNCTION__ + + ": failed to delete \"Event\" object! Error code = " + + (string)GetLastError(); + + // + LogMessage(message); + + // + return false; + } + + // + // successful execution + return true; +} + +// +// END Event Functions ... +// + +// +// START Button Functions ... +// + +// +// Create the button ... +bool ButtonCreate( + const long chartID = 0, // chart's ID + const string name = "Button", // button name + const int subWindow = 0, // subwindow index + const int x = 0, // X coordinate + const int y = 0, // Y coordinate + const int width = 50, // button width + const int height = 15, // button height + const ENUM_BASE_CORNER corner = CORNER_LEFT_UPPER, // chart corner for anchoring + const string text = "Button", // text + const string font = "Arial", // font + const int fontSize = 8, // font size + const color clr = clrBlack, // text color + const color bgColor = clrLightGray, // background color + const color borderColor = clrNONE, // border color + const bool state = false, // pressed/released + const bool back = false, // in the background + const bool selection = false, // highlight to move + const bool hidden = true, // hidden in the object list + const long zOrder = 0 // priority for mouse click +) +{ + // + bool result = false; + + // + // create the button + result = ObjectCreate(chartID, name, OBJ_BUTTON, subWindow, 0, 0); + if (!result) + { + return result; + } + + // + // set button coordinates + ObjectSetInteger(chartID, name, OBJPROP_XDISTANCE, x); + ObjectSetInteger(chartID, name, OBJPROP_YDISTANCE, y); + + // + // set button size + ObjectSetInteger(chartID, name, OBJPROP_XSIZE, width); + ObjectSetInteger(chartID, name, OBJPROP_YSIZE, height); + + // + // set the chart's corner, relative to which point coordinates are defined + ObjectSetInteger(chartID, name, OBJPROP_CORNER, corner); + + // + // set the text + ObjectSetString(chartID, name, OBJPROP_TEXT, text); + + // + // set text font + ObjectSetString(chartID, name, OBJPROP_FONT, font); + + // + // set font size + ObjectSetInteger(chartID, name, OBJPROP_FONTSIZE, fontSize); + + // + // set text color + ObjectSetInteger(chartID, name, OBJPROP_COLOR, clr); + + // + // set background color + ObjectSetInteger(chartID, name, OBJPROP_BGCOLOR, bgColor); + + // + // set border color + ObjectSetInteger(chartID, name, OBJPROP_BORDER_COLOR, borderColor); + + // + // display in the foreground false or background true + ObjectSetInteger(chartID, name, OBJPROP_BACK, back); + + // + // set button state + ObjectSetInteger(chartID, name, OBJPROP_STATE, state); + + // + // enable true or disable false the mode of moving the button by mouse + ObjectSetInteger(chartID, name, OBJPROP_SELECTABLE, selection); + ObjectSetInteger(chartID, name, OBJPROP_SELECTED, selection); + + // + // hide true or display false graphical object name in the object list + ObjectSetInteger(chartID, name, OBJPROP_HIDDEN, hidden); + + // + // set the priority for receiving the event of a mouse click in the chart + ObjectSetInteger(chartID, name, OBJPROP_ZORDER, zOrder); + + // + return result; +} + +// +// Move the button ... +bool ButtonMove( + const long chartID = 0, // chart's ID + const string name = "Button", // button name + const int x = 0, // X coordinate + const int y = 0 // Y coordinate +) +{ + // + bool result = false; + + // + // move the button + + // + result = ObjectSetInteger(chartID, name, OBJPROP_XDISTANCE, x); + if (!result) + { + return result; + } + + // + result = ObjectSetInteger(chartID, name, OBJPROP_YDISTANCE, y); + + // + return result; +} + +// +// Change button size ... +bool ButtonChangeSize( + const long chartID = 0, // chart's ID + const string name = "Button", // button name + const int width = 50, // button width + const int height = 18 // button height +) +{ + // + bool result = false; + + // + // change the button size + + // + result = ObjectSetInteger(chartID, name, OBJPROP_XSIZE, width); + if (!result) + { + return result; + } + + // + result = ObjectSetInteger(chartID, name, OBJPROP_YSIZE, height); + + // + return result; +} + +// +// Change corner of the chart for binding the button ... +bool ButtonChangeCorner( + const long chartID = 0, // chart's ID + const string name = "Button", // button name + const ENUM_BASE_CORNER corner = CORNER_LEFT_UPPER // chart corner for anchoring +) +{ + // + bool result = false; + + // + // change anchor corner + + // + result = ObjectSetInteger(chartID, name, OBJPROP_CORNER, corner); + + // + return result; +} + +// +// Change button text ... +bool ButtonTextChange( + const long chartID = 0, // chart's ID + const string name = "Button", // button name + const string text = "Text" // text +) +{ + // + bool result = false; + + // + // change object text + result = ObjectSetString(chartID, name, OBJPROP_TEXT, text); + + // + return result; +} + +// +// Delete the button ... +bool ButtonDelete( + const long chartID = 0, // chart's ID + const string name = "Button" // button name +) +{ + // + bool result = false; + + // + // delete the button + result = ObjectDelete(chartID, name); + + // + return result; +} + +// +// END Button Functions ... +// + +// +// END Regular Draws ... +// + +// +// START Chart Style Drawers ... +// + +// +// Apply Styles On Chart ... +void ApplyChartStyle( + long mChartId = -1, // chart's ID + ENUM_CHART_MODE mMode = CHART_CANDLES, // chart's mMode + bool mShowBidLine = true, // show bid line + bool mShowAskLine = true, // show ask line + bool mShowGrid = false, // show grids on chart + bool mShowVolumes = false, // show volumes + bool mShowTradeLevels = true, // Displaying trade levels in the chart (levels of open positions, Stop Loss, Take Profit and pending orders) + bool mAutoScroll = true, // chart autoscroll + bool mQuickNavigation = true, // chart quick navigation state + color mForeGroundColor = clrWhite, // chart's foreground color + color mBackGroundColor = clrBlack, // chart's background color + color mUpColor = clrGreen, // Up Color + color mDownColor = clrRed, // Down Color + color mBullishColor = clrGreen, // Bullish color + color mBearishColor = clrRed, // Bearish color + color mGridColor = clrGray, // grid color + color mBidLineColor = clrGray, // bid line color + color mAskLineColor = clrRed, // ask line color + color mLineColor = clrLime, // line mMode and doji candlestick color + color mStopColor = clrGold, // Color of stop order levels (Stop Loss and Take Profit) + color mVolumesColor = clrGreen // volumes color +) +{ + // + // Validate Args ... + if (mChartId == -1) + { + mChartId = 0; + } + + // + ChartSetInteger(mChartId, CHART_MODE, mMode); + ChartSetInteger(mChartId, CHART_SHOW_BID_LINE, mShowBidLine); + ChartSetInteger(mChartId, CHART_SHOW_ASK_LINE, mShowAskLine); + ChartSetInteger(mChartId, CHART_SHOW_GRID, mShowGrid); + ChartSetInteger(mChartId, CHART_SHOW_VOLUMES, mShowVolumes); + ChartSetInteger(mChartId, CHART_SHOW_TRADE_LEVELS, mShowTradeLevels); + ChartSetInteger(mChartId, CHART_AUTOSCROLL, mAutoScroll); + ChartSetInteger(mChartId, CHART_QUICK_NAVIGATION, mQuickNavigation); + ChartSetInteger(mChartId, CHART_COLOR_FOREGROUND, mForeGroundColor); + ChartSetInteger(mChartId, CHART_COLOR_BACKGROUND, mBackGroundColor); + ChartSetInteger(mChartId, CHART_COLOR_CHART_UP, mUpColor); + ChartSetInteger(mChartId, CHART_COLOR_CHART_DOWN, mDownColor); + ChartSetInteger(mChartId, CHART_COLOR_CANDLE_BULL, mBullishColor); + ChartSetInteger(mChartId, CHART_COLOR_CANDLE_BEAR, mBearishColor); + ChartSetInteger(mChartId, CHART_COLOR_GRID, mGridColor); + ChartSetInteger(mChartId, CHART_COLOR_BID, mBidLineColor); + ChartSetInteger(mChartId, CHART_COLOR_ASK, mAskLineColor); + ChartSetInteger(mChartId, CHART_COLOR_STOP_LEVEL, mStopColor); + ChartSetInteger(mChartId, CHART_COLOR_CHART_LINE, mLineColor); + ChartSetInteger(mChartId, CHART_COLOR_VOLUME, mVolumesColor); +} + +// +// Retrieve Chart Size in Pixel ... +struct XSize +{ + long width; + long height; + + // + int x; + int y; + int w; + int h; + + // + int wStep; + int hStep; +}; + +// +// Retrieve Chart Size ... +bool GetChartSize( + XSize &result, // Holds Result ... + long chartID = 0 // Specified Chart ID ... +) +{ + // + bool mResult = false; + + // + mResult = ChartGetInteger(0, CHART_WIDTH_IN_PIXELS, 0, result.width); + if (!mResult) + { + return mResult; + } + + // + mResult = ChartGetInteger(0, CHART_HEIGHT_IN_PIXELS, 0, result.height); + + // + return mResult; +} + +// +// END Chart Style Drawers ... +// + +// +// START Custom Drawings ... +// + +// +// Define a Draw Specifications ... +struct XDrawSpecifications +{ + // + // Props ... + + // + bool draw; // Draw or Not ... + + // + int width; // Draw Witdth ... + color clr; // Draw Color ... + ENUM_LINE_STYLE style; // Draw Style ... + + // + bool back; // in the background + bool fill; // fill object if supported + bool selection; // highlight to move + bool rayRight; // line's continuation to the right + bool hidden; // hidden in the object list + long zOrder; // priority for mouse click + + // + string label; // Label ... + color labelColor; // Label Color ... + double labelAngel; // Label Angle ... + string labelFont; // Label Font ... + int labelFontSize; // Label Font Size ... + ENUM_ANCHOR_POINT labelAnchor; // Label Anchor Point ... + + // + // Constructor ... + XDrawSpecifications() + { + Clean(); + } + + // + // Operator ... + void operator=(const XDrawSpecifications &value) + { + // + clr = value.clr; + draw = value.draw; + width = value.width; + style = value.style; + + // + back = value.back; + hidden = value.hidden; + zOrder = value.zOrder; + rayRight = value.rayRight; + selection = value.selection; + + // + fill = value.fill; + + // + label = value.label; + labelColor = value.labelColor; + labelAngel = value.labelAngel; + labelFont = value.labelFont; + labelFontSize = value.labelFontSize; + labelAnchor = value.labelAnchor; + } + + // + // Functions ... + + // + void Clean() + { + // + draw = false; + width = 1; + clr = CLR_NONE; + style = STYLE_SOLID; + + // + back = false; + hidden = false; + rayRight = false; + selection = false; + fill = false; + + // + zOrder = 0; + + // + label = ""; + labelColor = CLR_NONE; + labelAngel = 0; + labelFont = "Arial"; + labelFontSize = 20; + labelAnchor = ANCHOR_LEFT_UPPER; + } + + // + void Label( + string mLabel = "", // Label ... + color mLabelColor = CLR_NONE, // Label Color ... + string mLabelFont = "Arial", // Label Font ... + int mLabelFontSize = 20, // Label Font Size ... + ENUM_ANCHOR_POINT mLabelAnchor = ANCHOR_LEFT_UPPER, // Label Anchor Point ... + double mLabelAngel = 0 // Label Angle ... + ) + { + // + label = mLabel; + labelFont = mLabelFont; + labelColor = mLabelColor; + labelAngel = mLabelAngel; + labelAnchor = mLabelAnchor; + labelFontSize = mLabelFontSize; + } +}; + +// +// Candle Draw Specifications ... +struct XOHCLDrawSpecification +{ + // + // Props ... + XDrawSpecifications openStyle; + XDrawSpecifications highStyle; + XDrawSpecifications closeStyle; + XDrawSpecifications lowStyle; + + // + // Constructors ... + XOHCLDrawSpecification() + { + Clean(); + } + + // + // Operators ... + void operator=(const XOHCLDrawSpecification &value) + { + // + lowStyle = value.lowStyle; + openStyle = value.openStyle; + highStyle = value.highStyle; + closeStyle = value.closeStyle; + } + + // + // Functions ... + + // + void Clean() + { + // + lowStyle.Clean(); + openStyle.Clean(); + highStyle.Clean(); + closeStyle.Clean(); + } + + // + void Default() + { + // + // Open ... + openStyle.width = 1; + openStyle.draw = true; + openStyle.clr = clrLime; + openStyle.style = STYLE_SOLID; + openStyle.Label( + "O", + openStyle.clr); + + // + // High ... + highStyle.width = 1; + highStyle.draw = true; + highStyle.clr = clrAqua; + highStyle.style = STYLE_SOLID; + highStyle.Label( + "H", + highStyle.clr); + + // + // Close ... + closeStyle.width = 1; + closeStyle.draw = true; + closeStyle.clr = clrRed; + closeStyle.style = STYLE_SOLID; + closeStyle.Label( + "C", + closeStyle.clr); + + // + // Low ... + lowStyle.width = 1; + lowStyle.draw = true; + lowStyle.clr = clrMagenta; + lowStyle.style = STYLE_SOLID; + lowStyle.Label( + "L", + lowStyle.clr); + } + + // + void Width(int value) + { + // + lowStyle.width = value; + openStyle.width = value; + highStyle.width = value; + closeStyle.width = value; + } + + // + void Style(ENUM_LINE_STYLE value) + { + // + lowStyle.style = value; + openStyle.style = value; + highStyle.style = value; + closeStyle.style = value; + } + + // + void Color(color value) + { + // + lowStyle.clr = value; + openStyle.clr = value; + highStyle.clr = value; + closeStyle.clr = value; + } + + // + void RayRight(bool value) + { + // + lowStyle.rayRight = value; + openStyle.rayRight = value; + highStyle.rayRight = value; + closeStyle.rayRight = value; + } + + // + void Draw(bool value) + { + // + lowStyle.draw = value; + openStyle.draw = value; + highStyle.draw = value; + closeStyle.draw = value; + } + + // + void Back(bool value) + { + // + lowStyle.back = value; + openStyle.back = value; + highStyle.back = value; + closeStyle.back = value; + } + + // + void Fill(bool value) + { + // + lowStyle.fill = value; + openStyle.fill = value; + highStyle.fill = value; + closeStyle.fill = value; + } + + // + void SetLabelPrefix(string value) + { + // + lowStyle.label = value + " " + lowStyle.label; + openStyle.label = value + " " + openStyle.label; + highStyle.label = value + " " + highStyle.label; + closeStyle.label = value + " " + closeStyle.label; + } +}; + +// +bool RemoveCandle( + XOHCL &c, + long chartId = 0, + int subWindow = 0 // +) +{ + // + bool result = false; + + // + string cTag = GenerateTag(c); + + // + result = IsDrawExists( + cTag, + chartId, + subWindow); + if (!result) + { + return result; + } + + // + RemoveDraws( + cTag, + chartId, + subWindow); + + // + return result; +} + +// +// XOHCL ... +void DrawCandleAsLine( + long chartId, // Chart ID ... + int subWindow, // SubWindow ... + XOHCL &c, // the Candle Which required to Draw ... + const datetime time, // Candle Time ... + XOHCLDrawSpecification &config, // Draw Specifications ... + string tag = "", // Draw Tag ... + bool update = true, // Update Draw if Exists ... + bool drawMidLine = true // Draw Open Close Middle Line ... +) +{ + // + datetime cTime = TimeCurrent(); + XDrawSpecifications specs; + + // + string baseTag = tag + GenerateTag(c); + + // + // Open ... + specs = config.openStyle; + if (specs.draw) + { + // + double value = c.open; + string valueTag = "|O|"; + + // + string mTag = baseTag + valueTag + ToString(value); + string mLblTag = baseTag + valueTag + "_lbl"; + + // + // Check if Object Exists Delete it ... + bool isExists = IsDrawExists( + mTag, + chartId, + subWindow // + ); + bool canDraw = !isExists || (isExists && update); + + // + if (isExists && canDraw) + { + // + DeleteText( + chartId, + mLblTag // + ); + + // + DeleteTrendLine( + chartId, + mTag // + ); + } + + // + if (canDraw) + { + // + // Draw Label ... + DrawText( + chartId, + mLblTag, + subWindow, + cTime, + value, + specs.label, + specs.labelFont, + specs.labelFontSize, + specs.labelColor, + specs.labelAngel, + specs.labelAnchor, + specs.back, + specs.selection, + specs.hidden, + specs.zOrder // + ); + + // + // Draw ... + DrawTrendLine( + chartId, + mTag, + subWindow, + time, + value, + cTime, + value, + specs.clr, + specs.style, + specs.width, + specs.back, + specs.selection, + specs.rayRight, + specs.hidden, + specs.zOrder // + ); + } + } + + // + // High ... + specs = config.highStyle; + if (specs.draw) + { + // + double value = c.high; + string valueTag = "|H|"; + + // + string mTag = baseTag + valueTag + ToString(value); + string mLblTag = baseTag + valueTag + "_lbl"; + + // + // Check if Object Exists Delete it ... + bool isExists = IsDrawExists( + mTag, + chartId, + subWindow // + ); + bool canDraw = !isExists || (isExists && update); + + // + if (isExists && canDraw) + { + // + DeleteText( + chartId, + mLblTag // + ); + + // + DeleteTrendLine( + chartId, + mTag // + ); + } + + // + if (canDraw) + { + // + // Draw Label ... + DrawText( + chartId, + mLblTag, + subWindow, + cTime, + value, + specs.label, + specs.labelFont, + specs.labelFontSize, + specs.labelColor, + specs.labelAngel, + specs.labelAnchor, + specs.back, + specs.selection, + specs.hidden, + specs.zOrder // + ); + + // + // Draw ... + DrawTrendLine( + chartId, + mTag, + subWindow, + time, + value, + cTime, + value, + specs.clr, + specs.style, + specs.width, + specs.back, + specs.selection, + specs.rayRight, + specs.hidden, + specs.zOrder // + ); + } + } + + // + // Close ... + specs = config.closeStyle; + if (specs.draw) + { + // + double value = c.close; + string valueTag = "|C|"; + + // + string mTag = baseTag + valueTag + ToString(value); + string mLblTag = baseTag + valueTag + "_lbl"; + + // + // Check if Object Exists Delete it ... + bool isExists = IsDrawExists( + mTag, + chartId, + subWindow // + ); + bool canDraw = !isExists || (isExists && update); + + // + if (isExists && canDraw) + { + // + DeleteText( + chartId, + mLblTag // + ); + + // + DeleteTrendLine( + chartId, + mTag); + } + + // + if (canDraw) + { + // + // Draw Label ... + DrawText( + chartId, + mLblTag, + subWindow, + cTime, + value, + specs.label, + specs.labelFont, + specs.labelFontSize, + specs.labelColor, + specs.labelAngel, + specs.labelAnchor, + specs.back, + specs.selection, + specs.hidden, + specs.zOrder // + ); + + // + // Draw ... + DrawTrendLine( + chartId, + mTag, + subWindow, + time, + value, + cTime, + value, + specs.clr, + specs.style, + specs.width, + specs.back, + specs.selection, + specs.rayRight, + specs.hidden, + specs.zOrder // + ); + } + } + + // + // Low ... + specs = config.lowStyle; + if (specs.draw) + { + // + double value = c.low; + string valueTag = "|L|"; + + // + string mTag = baseTag + valueTag + ToString(value); + string mLblTag = baseTag + valueTag + "_lbl"; + + // + // Check if Object Exists Delete it ... + bool isExists = IsDrawExists( + mTag, + chartId, + subWindow // + ); + bool canDraw = !isExists || (isExists && update); + + // + if (isExists && canDraw) + { + // + DeleteText( + chartId, + mLblTag // + ); + + // + DeleteTrendLine( + chartId, + mTag); + } + + // + if (canDraw) + { + // + // Draw Label ... + DrawText( + chartId, + mLblTag, + subWindow, + cTime, + value, + specs.label, + specs.labelFont, + specs.labelFontSize, + specs.labelColor, + specs.labelAngel, + specs.labelAnchor, + specs.back, + specs.selection, + specs.hidden, + specs.zOrder // + ); + + // + // Draw ... + DrawTrendLine( + chartId, + mTag, + subWindow, + time, + value, + cTime, + value, + specs.clr, + specs.style, + specs.width, + specs.back, + specs.selection, + specs.rayRight, + specs.hidden, + specs.zOrder // + ); + } + } +} + +// +void DrawCandleAsBox( + long chartId, // Chart ID ... + int subWindow, // SubWindow ... + XOHCL &c, // the Candle Which required to Draw ... + const datetime time, // Candle Time ... + XOHCLDrawSpecification &config, // Draw Specifications ... + string tag = "", // Draw Tag ... + bool drawBody = true, // Draw Body ... + bool drawShadows = true, // Draw Shadows ... + bool update = true // Update Draw if Exists ... +) +{ + // + datetime cTime = TimeCurrent(); + + // + // First Check all Styles Must Be Draw true ... + bool canDraw = + // + config.openStyle.draw && + config.highStyle.draw && + config.closeStyle.draw && + config.lowStyle.draw + // + ; + + // + if (!canDraw) + { + return; + } + + // + // Next we have to determine Candle is Bullish or Bearish ... + // + bool isBullish = + c.open < c.close; + + // + bool isBearish = + c.open > c.close; + + // + XDrawSpecifications bodySpec; + if (isBullish) + { + bodySpec = config.openStyle; + } + else if (isBearish) + { + bodySpec = config.closeStyle; + } + else + { + // + bodySpec.clr = clrGray; + } + + // + // Now We have to Draw 3 Rectangle ... + // 1- Up Shadow + // 2- Candle Body + // 3- Down Shadow + + // + double upPrice = MathMax(c.open, c.close); + double downPrice = MathMin(c.open, c.close); + double upShadowSize = c.high - upPrice; + double downShadowSize = downPrice - c.low; + + // + string mTag = GenerateTag(c); + + // + // Draw Up Shadow ... + if (drawShadows) + { + // + string upShadowTag = mTag + "|US|"; + + XDrawSpecifications spec = config.highStyle; + + // + // Check if Object Exists Delete it ... + bool isExists = IsDrawExists( + upShadowTag, + chartId, + subWindow // + ); + + // + bool canDraw = !isExists || (isExists && update); + + // + if (isExists && canDraw) + { + // + DeleteRectangle( + chartId, + upShadowTag // + ); + } + + // + if (canDraw) + { + // + // New ... + DrawRectangle( + chartId, + upShadowTag, + subWindow, + time, + c.high, + cTime, + upPrice, + spec.clr, + spec.style, + spec.width, + spec.fill, + spec.back, + spec.selection, + spec.hidden, + spec.zOrder // + ); + } + } + + // + // Draw Body ... + if (drawBody) + { + // + string bodyTag = mTag + "|BDY|"; + + // + // Check if Object Exists Delete it ... + bool isExists = IsDrawExists( + bodyTag, + chartId, + subWindow // + ); + + // + bool canDraw = !isExists || (isExists && update); + + // + if (isExists && canDraw) + { + // + DeleteRectangle( + chartId, + bodyTag // + ); + } + + // + if (canDraw) + { + // + // New ... + DrawRectangle( + chartId, + bodyTag, + subWindow, + time, + upPrice, + cTime, + downPrice, + bodySpec.clr, + bodySpec.style, + bodySpec.width, + bodySpec.fill, + bodySpec.back, + bodySpec.selection, + bodySpec.hidden, + bodySpec.zOrder // + ); + } + } + + // + // Draw Down Shadow ... + if (drawShadows) + { + // + string downShadowTag = mTag + "|DS|"; + + XDrawSpecifications spec = config.lowStyle; + + // + // Check if Object Exists Delete it ... + bool isExists = IsDrawExists( + downShadowTag, + chartId, + subWindow // + ); + + // + bool canDraw = !isExists || (isExists && update); + + // + if (isExists && canDraw) + { + // + DeleteRectangle( + chartId, + downShadowTag // + ); + } + + // + if (canDraw) + { + // + // New ... + DrawRectangle( + chartId, + downShadowTag, + subWindow, + time, + downPrice, + cTime, + downPrice + downShadowSize, + spec.clr, + spec.style, + spec.width, + spec.fill, + spec.back, + spec.selection, + spec.hidden, + spec.zOrder // + ); + } + } +} + +// +// END Custom Drawings ... +// diff --git a/MQLTestWorkspace/BKPS/14030222/Libraries/x-saherelm.http.lib.ex5 b/MQLTestWorkspace/BKPS/14030222/Libraries/x-saherelm.http.lib.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..88d09e1a8c024017d21aa7615e822b0ff5ce423f GIT binary patch literal 4424 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 literal 0 HcmV?d00001 diff --git a/MQLTestWorkspace/BKPS/14030222/Libraries/x-saherelm.http.lib.mq5 b/MQLTestWorkspace/BKPS/14030222/Libraries/x-saherelm.http.lib.mq5 new file mode 100644 index 0000000..97f7ac0 --- /dev/null +++ b/MQLTestWorkspace/BKPS/14030222/Libraries/x-saherelm.http.lib.mq5 @@ -0,0 +1,177 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Http Library +// ------------------------------------------ +// Name: XHttp +// Description: provide http communication +// abilities ... +// +// +// 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 + +// +// START Model Definition ... +// +enum X_HTTP_METHOD +{ + X_HTTP_GET, + X_HTTP_POST +}; +// +// END Model Definition ... +// + +// +// START Inputs ... +// +// +// END Inputs ... +// + +// +// START Global Definitions: Variables, Properties and etc ... +// +// +// END Global Definitions: Variables, Properties and etc ... +// + +// +// START Provided Functions ... +// +// +// Initial Library if required ... +bool OnInInitHttpLibrary() +{ + return false; +} + +// +// DeInitial Library if required ... +void OnDeinitHttpLibrary() +{ +} + +// +// Convert enum to String ... +string ToString(X_HTTP_METHOD method) +{ + // + string result = ""; + + // + switch (method) + { + // + case X_HTTP_GET: + result = "GET"; + break; + + // + case X_HTTP_POST: + result = "POST"; + break; + } + + // + return result; +} + +// +// Send Global Request ... +int SendRequest( + X_HTTP_METHOD method, // Httm Request Method + const string url, // Server Address + const string headers, // Headers providing + const char &payload[], // the Data which needs to Send + char &response[], // Response of request + string responseHeaders, // Response Headers + int timeout = 500 // Timeout for response default is 500 +) +{ + // + int result = -1; + + // + string strMethod = ToString(method); + if (StringLen(strMethod) == 0) { + return result; + } + + // + result = WebRequest( + strMethod, + url, + headers, + timeout, + payload, + response, + responseHeaders + ); + + // + return result; +} + +// +// Get Request ... +int GetRequest( + const string url, // Server Address + const string headers, // Headers providing + const char &payload[], // the Data which needs to Send + char &response[], // Response of request + string responseHeaders, // Response Headers + int timeout = 500 // Timeout for response default is 500 +) { + // + int result = SendRequest( + X_HTTP_GET, + url, + headers, + payload, + response, + responseHeaders, + timeout + ); + + // + return result; +} + +// +// Post Request ... +int PostRequest( + const string url, // Server Address + const string headers, // Headers providing + const char &payload[], // the Data which needs to Send + char &response[], // Response of request + string responseHeaders, // Response Headers + int timeout = 500 // Timeout for response default is 500 +) { + // + int result = SendRequest( + X_HTTP_POST, + url, + headers, + payload, + response, + responseHeaders, + timeout + ); + + // + return result; +} +// +// END Provided Functions ... +// diff --git a/MQLTestWorkspace/BKPS/14030222/Libraries/x-saherelm.log.lib.mq5 b/MQLTestWorkspace/BKPS/14030222/Libraries/x-saherelm.log.lib.mq5 new file mode 100644 index 0000000..3e30eb9 --- /dev/null +++ b/MQLTestWorkspace/BKPS/14030222/Libraries/x-saherelm.log.lib.mq5 @@ -0,0 +1,1088 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Logger Library +// --------------------------------------- +// Name: XLogger +// Description: provides Logging abilities ... +// +// +// 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 + +// +// START Inputs ... +// +// input group "Logging"; +// input bool enableLogging = true; // Enable Logging +bool enableLogging = true; // Enable Logging +// +// END Inputs ... +// + +// +// Including Models ... +#include "x-saherelm.models.lib.mq5" + +// +// START Global Definitions: Variables, Properties and etc ... +// +string logTag = "X-Logger"; // LogTag +// +// END Global Definitions: Variables, Properties and etc ... +// + +// +// START Provided Functions ... +// +// +// Logging a Message ... +void LogMessage(string message) +{ + // + if (!enableLogging) + { + return; + } + + // + Print(logTag, " > ", message); +} +void LogMessage(string tag, string message) +{ + // + if (!enableLogging) + { + return; + } + + // + Print(tag, " > ", message); +} + +// +void LogEmptyLine() +{ + LogMessage(" "); +} + +// +void LogError( + int error = -1 // Specific Error +) { + // + if (error <= -1) { + error = GetLastError(); + } + + // + string errorMsg = GetErrorDescription(error); + + // + LogMessage("Error: " + errorMsg); +} + +// +// Logging an Array ... +void LogArray(int &array[]) +{ + // + if (!enableLogging) + { + return; + } + + // + Print(logTag, ">"); + ArrayPrint(array); +} +void LogArray(double &array[]) +{ + // + if (!enableLogging) + { + return; + } + + // + Print(logTag, ">"); + ArrayPrint(array); +} +void LogArray(string &array[]) +{ + // + if (!enableLogging) + { + return; + } + + // + Print(logTag, ">"); + ArrayPrint(array); +} +// +// END Provided Functions ... +// + + +// +// Error Descriptions Functions ... +// + +// +// Retrieve Specified Error Code Description ... +string GetErrorDescription(int err_code) +{ + // + string result = ""; + + // + switch (err_code) + { + // + //--- Constant Description + + // + case ERR_SUCCESS: + result = "The operation completed successfully"; + break; + + // + case ERR_INTERNAL_ERROR: + result = "Unexpected internal error"; + break; + + // + case ERR_WRONG_INTERNAL_PARAMETER: + result = "Wrong parameter in the inner call of the client terminal function"; + break; + + // + case ERR_INVALID_PARAMETER: + result = "Wrong parameter when calling the system function"; + break; + + // + case ERR_NOT_ENOUGH_MEMORY: + result = "Not enough memory to perform the system function"; + break; + + // + case ERR_STRUCT_WITHOBJECTS_ORCLASS: + result = "The structure contains objects of strings and/or dynamic arrays and/or structure of such objects and/or classes"; + break; + + // + case ERR_INVALID_ARRAY: + result = "Array of a wrong type, wrong size, or a damaged object of a dynamic array"; + break; + + // + case ERR_ARRAY_RESIZE_ERROR: + result = "Not enough memory for the relocation of an array, or an attempt to change the size of a static array"; + break; + + // + case ERR_STRING_RESIZE_ERROR: + result = "Not enough memory for the relocation of string"; + break; + + // + case ERR_NOTINITIALIZED_STRING: + result = "Not initialized string"; + break; + + // + case ERR_INVALID_DATETIME: + result = "Invalid date and/or time"; + break; + + // + case ERR_ARRAY_BAD_SIZE: + result = "Requested array size exceeds 2 GB"; + break; + + // + case ERR_INVALID_POINTER: + result = "Wrong pointer"; + break; + + // + case ERR_INVALID_POINTER_TYPE: + result = "Wrong type of pointer"; + break; + + // + case ERR_FUNCTION_NOT_ALLOWED: + result = "System function is not allowed to call"; + break; + + // + //--- Charts + + // + case ERR_CHART_WRONG_ID: + result = "Wrong chart ID"; + break; + + // + case ERR_CHART_NO_REPLY: + result = "Chart does not respond"; + break; + + // + case ERR_CHART_NOT_FOUND: + result = "Chart not found"; + break; + + // + case ERR_CHART_NO_EXPERT: + result = "No Expert Advisor in the chart that could handle the event"; + break; + + // + case ERR_CHART_CANNOT_OPEN: + result = "Chart opening error"; + break; + + // + case ERR_CHART_CANNOT_CHANGE: + result = "Failed to change chart symbol and period"; + break; + + // + case ERR_CHART_CANNOT_CREATE_TIMER: + result = "Failed to create timer"; + break; + + // + case ERR_CHART_WRONG_PROPERTY: + result = "Wrong chart property ID"; + break; + + // + case ERR_CHART_SCREENSHOT_FAILED: + result = "Error creating screenshots"; + break; + + // + case ERR_CHART_NAVIGATE_FAILED: + result = "Error navigating through chart"; + break; + + // + case ERR_CHART_TEMPLATE_FAILED: + result = "Error applying template"; + break; + + // + case ERR_CHART_WINDOW_NOT_FOUND: + result = "Subwindow containing the indicator was not found"; + break; + + // + case ERR_CHART_INDICATOR_CANNOT_ADD: + result = "Error adding an indicator to chart"; + break; + + // + case ERR_CHART_INDICATOR_CANNOT_DEL: + result = "Error deleting an indicator from the chart"; + break; + + // + case ERR_CHART_INDICATOR_NOT_FOUND: + result = "Indicator not found on the specified chart"; + break; + + // + //--- Graphical Objects + case ERR_OBJECT_ERROR: + result = "Error working with a graphical object"; + break; + + // + case ERR_OBJECT_NOT_FOUND: + result = "Graphical object was not found"; + break; + + // + case ERR_OBJECT_WRONG_PROPERTY: + result = "Wrong ID of a graphical object property"; + break; + + // + case ERR_OBJECT_GETDATE_FAILED: + result = "Unable to get date corresponding to the value"; + break; + + // + case ERR_OBJECT_GETVALUE_FAILED: + result = "Unable to get value corresponding to the date"; + break; + + // + //--- MarketInfo + + // + case ERR_MARKET_UNKNOWN_SYMBOL: + result = "Unknown symbol"; + break; + + // + case ERR_MARKET_NOT_SELECTED: + result = "Symbol is not selected in MarketWatch"; + break; + + // + case ERR_MARKET_WRONG_PROPERTY: + result = "Wrong identifier of a symbol property"; + break; + + // + case ERR_MARKET_LASTTIME_UNKNOWN: + result = "Time of the last tick is not known (no ticks)"; + break; + + // + case ERR_MARKET_SELECT_ERROR: + result = "Error adding or deleting a symbol in MarketWatch"; + break; + + // + //--- History Access + + // + case ERR_HISTORY_NOT_FOUND: + result = "Requested history not found"; + break; + + // + case ERR_HISTORY_WRONG_PROPERTY: + result = "Wrong ID of the history property"; + break; + + // + //--- Global_Variables + + // + case ERR_GLOBALVARIABLE_NOT_FOUND: + result = "Global variable of the client terminal is not found"; + break; + + // + case ERR_GLOBALVARIABLE_EXISTS: + result = "Global variable of the client terminal with the same name already exists"; + break; + + // + case ERR_MAIL_SEND_FAILED: + result = "Email sending failed"; + break; + + // + case ERR_PLAY_SOUND_FAILED: + result = "Sound playing failed"; + break; + + // + case ERR_MQL5_WRONG_PROPERTY: + result = "Wrong identifier of the program property"; + break; + + // + case ERR_TERMINAL_WRONG_PROPERTY: + result = "Wrong identifier of the terminal property"; + break; + + // + case ERR_FTP_SEND_FAILED: + result = "File sending via ftp failed"; + break; + + // + case ERR_NOTIFICATION_SEND_FAILED: + result = "Error in sending notification"; + break; + + // + //--- Custom Indicator Buffers + + // + case ERR_BUFFERS_NO_MEMORY: + result = "Not enough memory for the distribution of indicator buffers"; + break; + + // + case ERR_BUFFERS_WRONG_INDEX: + result = "Wrong indicator buffer index"; + break; + + // + //--- Custom Indicator Properties + + // + case ERR_CUSTOM_WRONG_PROPERTY: + result = "Wrong ID of the custom indicator property"; + break; + + // + //--- Account + + // + case ERR_ACCOUNT_WRONG_PROPERTY: + result = "Wrong account property ID"; + break; + + // + case ERR_TRADE_WRONG_PROPERTY: + result = "Wrong trade property ID"; + break; + + // + case ERR_TRADE_DISABLED: + result = "Trading by Expert Advisors prohibited"; + break; + + // + case ERR_TRADE_POSITION_NOT_FOUND: + result = "Position not found"; + break; + + // + case ERR_TRADE_ORDER_NOT_FOUND: + result = "Order not found"; + break; + + // + case ERR_TRADE_DEAL_NOT_FOUND: + result = "Deal not found"; + break; + + // + case ERR_TRADE_SEND_FAILED: + result = "Trade request sending failed"; + break; + + // + //--- Indicators + + // + case ERR_INDICATOR_UNKNOWN_SYMBOL: + result = "Unknown symbol"; + break; + + // + case ERR_INDICATOR_CANNOT_CREATE: + result = "Indicator cannot be created"; + break; + + // + case ERR_INDICATOR_NO_MEMORY: + result = "Not enough memory to add the indicator"; + break; + + // + case ERR_INDICATOR_CANNOT_APPLY: + result = "The indicator cannot be applied to another indicator"; + break; + + // + case ERR_INDICATOR_CANNOT_ADD: + result = "Error applying an indicator to chart"; + break; + + // + case ERR_INDICATOR_DATA_NOT_FOUND: + result = "Requested data not found"; + break; + + // + case ERR_INDICATOR_WRONG_HANDLE: + result = "Wrong indicator handle"; + break; + + // + case ERR_INDICATOR_WRONG_PARAMETERS: + result = "Wrong number of parameters when creating an indicator"; + break; + + // + case ERR_INDICATOR_PARAMETERS_MISSING: + result = "No parameters when creating an indicator"; + break; + + // + case ERR_INDICATOR_CUSTOM_NAME: + result = "The first parameter in the array must be the name of the custom indicator"; + break; + + // + case ERR_INDICATOR_PARAMETER_TYPE: + result = "Invalid parameter type in the array when creating an indicator"; + break; + + // + case ERR_INDICATOR_WRONG_INDEX: + result = "Wrong index of the requested indicator buffer"; + break; + + // + //--- Depth of Market + + // + case ERR_BOOKS_CANNOT_ADD: + result = "Depth Of Market can not be added"; + break; + + // + case ERR_BOOKS_CANNOT_DELETE: + result = "Depth Of Market can not be removed"; + break; + + // + case ERR_BOOKS_CANNOT_GET: + result = "The data from Depth Of Market can not be obtained"; + break; + + // + case ERR_BOOKS_CANNOT_SUBSCRIBE: + result = "Error in subscribing to receive new data from Depth Of Market"; + break; + + // + //--- File Operations + + // + case ERR_TOO_MANY_FILES: + result = "More than 64 files cannot be opened at the same time"; + break; + + // + case ERR_WRONG_FILENAME: + result = "Invalid file name"; + break; + + // + case ERR_TOO_LONG_FILENAME: + result = "Too long file name"; + break; + + // + case ERR_CANNOT_OPEN_FILE: + result = "File opening error"; + break; + + // + case ERR_FILE_CACHEBUFFER_ERROR: + result = "Not enough memory for cache to read"; + break; + + // + case ERR_CANNOT_DELETE_FILE: + result = "File deleting error"; + break; + + // + case ERR_INVALID_FILEHANDLE: + result = "A file with this handle was closed, or was not opening at all"; + break; + + // + case ERR_WRONG_FILEHANDLE: + result = "Wrong file handle"; + break; + + // + case ERR_FILE_NOTTOWRITE: + result = "The file must be opened for writing"; + break; + + // + case ERR_FILE_NOTTOREAD: + result = "The file must be opened for reading"; + break; + + // + case ERR_FILE_NOTBIN: + result = "The file must be opened as a binary one"; + break; + + // + case ERR_FILE_NOTTXT: + result = "The file must be opened as a text"; + break; + + // + case ERR_FILE_NOTTXTORCSV: + result = "The file must be opened as a text or CSV"; + break; + + // + case ERR_FILE_NOTCSV: + result = "The file must be opened as CSV"; + break; + + // + case ERR_FILE_READERROR: + result = "File reading error"; + break; + + // + case ERR_FILE_BINSTRINGSIZE: + result = "String size must be specified, because the file is opened as binary"; + break; + + // + case ERR_INCOMPATIBLE_FILE: + result = "A text file must be for string arrays, for other arrays - binary"; + break; + + // + case ERR_FILE_IS_DIRECTORY: + result = "This is not a file, this is a directory"; + break; + + // + case ERR_FILE_NOT_EXIST: + result = "File does not exist"; + break; + + // + case ERR_FILE_CANNOT_REWRITE: + result = "File can not be rewritten"; + break; + + // + case ERR_WRONG_DIRECTORYNAME: + result = "Wrong directory name"; + break; + + // + case ERR_DIRECTORY_NOT_EXIST: + result = "Directory does not exist"; + break; + + // + case ERR_FILE_ISNOT_DIRECTORY: + result = "This is a file, not a directory"; + break; + + // + case ERR_CANNOT_DELETE_DIRECTORY: + result = "The directory cannot be removed"; + break; + + // + case ERR_CANNOT_CLEAN_DIRECTORY: + result = "Failed to clear the directory (probably one or more files are blocked and removal operation failed)"; + break; + + // + case ERR_FILE_WRITEERROR: + result = "Failed to write a resource to a file"; + break; + + // + //--- String Casting + + // + case ERR_NO_STRING_DATE: + result = "No date in the string"; + break; + + // + case ERR_WRONG_STRING_DATE: + result = "Wrong date in the string"; + break; + + // + case ERR_WRONG_STRING_TIME: + result = "Wrong time in the string"; + break; + + // + case ERR_STRING_TIME_ERROR: + result = "Error converting string to date"; + break; + + // + case ERR_STRING_OUT_OF_MEMORY: + result = "Not enough memory for the string"; + break; + + // + case ERR_STRING_SMALL_LEN: + result = "The string length is less than expected"; + break; + + // + case ERR_STRING_TOO_BIGNUMBER: + result = "Too large number, more than ULONG_MAX"; + break; + + // + case ERR_WRONG_FORMATSTRING: + result = "Invalid format string"; + break; + + // + case ERR_TOO_MANY_FORMATTERS: + result = "Amount of format specifiers more than the parameters"; + break; + + // + case ERR_TOO_MANY_PARAMETERS: + result = "Amount of parameters more than the format specifiers"; + break; + + // + case ERR_WRONG_STRING_PARAMETER: + result = "Damaged parameter of string type"; + break; + + // + case ERR_STRINGPOS_OUTOFRANGE: + result = "Position outside the string"; + break; + + // + case ERR_STRING_ZEROADDED: + result = "0 added to the string end, a useless operation"; + break; + + // + case ERR_STRING_UNKNOWNTYPE: + result = "Unknown data type when converting to a string"; + break; + + // + case ERR_WRONG_STRING_OBJECT: + result = "Damaged string object"; + break; + + // + //--- Operations with Arrays + + // + case ERR_INCOMPATIBLE_ARRAYS: + result = "Copying incompatible arrays. String array can be copied only to a string array, and a numeric array - in numeric array only"; + break; + + // + case ERR_SMALL_ASSERIES_ARRAY: + result = "The receiving array is declared as AS_SERIES, and it is of insufficient size"; + break; + + // + case ERR_SMALL_ARRAY: + result = "Too small array, the starting position is outside the array"; + break; + + // + case ERR_ZEROSIZE_ARRAY: + result = "An array of zero length"; + break; + + // + case ERR_NUMBER_ARRAYS_ONLY: + result = "Must be a numeric array"; + break; + + // + case ERR_ONEDIM_ARRAYS_ONLY: + result = "Must be a one-dimensional array"; + break; + + // + case ERR_SERIES_ARRAY: + result = "Timeseries cannot be used"; + break; + + // + case ERR_DOUBLE_ARRAY_ONLY: + result = "Must be an array of type double"; + break; + + // + case ERR_FLOAT_ARRAY_ONLY: + result = "Must be an array of type float"; + break; + + // + case ERR_LONG_ARRAY_ONLY: + result = "Must be an array of type long"; + break; + + // + case ERR_INT_ARRAY_ONLY: + result = "Must be an array of type int"; + break; + + // + case ERR_SHORT_ARRAY_ONLY: + result = "Must be an array of type short"; + break; + + // + case ERR_CHAR_ARRAY_ONLY: + result = "Must be an array of type char"; + break; + + // + //--- Operations with OpenCL + + // + case ERR_OPENCL_NOT_SUPPORTED: + result = "OpenCL functions are not supported on this computer"; + break; + + // + case ERR_OPENCL_INTERNAL: + result = "Internal error occurred when running OpenCL"; + break; + + // + case ERR_OPENCL_INVALID_HANDLE: + result = "Invalid OpenCL handle"; + break; + + // + case ERR_OPENCL_CONTEXT_CREATE: + result = "Error creating the OpenCL context"; + break; + + // + case ERR_OPENCL_QUEUE_CREATE: + result = "Failed to create a run queue in OpenCL"; + break; + + // + case ERR_OPENCL_PROGRAM_CREATE: + result = "Error occurred when compiling an OpenCL program"; + break; + + // + case ERR_OPENCL_TOO_LONG_KERNEL_NAME: + result = "Too long kernel name (OpenCL kernel)"; + break; + + // + case ERR_OPENCL_KERNEL_CREATE: + result = "Error creating an OpenCL kernel"; + break; + + // + case ERR_OPENCL_SET_KERNEL_PARAMETER: + result = "Error occurred when setting parameters for the OpenCL kernel"; + break; + + // + case ERR_OPENCL_EXECUTE: + result = "OpenCL program runtime error"; + break; + + // + case ERR_OPENCL_WRONG_BUFFER_SIZE: + result = "Invalid size of the OpenCL buffer"; + break; + + // + case ERR_OPENCL_WRONG_BUFFER_OFFSET: + result = "Invalid offset in the OpenCL buffer"; + break; + + // + case ERR_OPENCL_BUFFER_CREATE: + result = "Failed to create and OpenCL buffer"; + break; + + // + //--- User-Defined Errors + default: + result = "UNKNOWN Erro ..."; + break; + } + + // + return result; +} + +// +// Retrieve Specified Error Code Description ... +string GetTradeServerReturnCodeDescription(int return_code) +{ + // + string result = ""; + + // + switch (return_code) + { + // + case TRADE_RETCODE_REQUOTE: + result = "Requote"; + break; + + // + case TRADE_RETCODE_REJECT: + result = "Request rejected"; + break; + + // + case TRADE_RETCODE_CANCEL: + result = "Request canceled by trader"; + break; + + // + case TRADE_RETCODE_PLACED: + result = "Order placed"; + break; + + // + case TRADE_RETCODE_DONE: + result = "Request completed"; + break; + + // + case TRADE_RETCODE_DONE_PARTIAL: + result = "Only part of the request was completed"; + break; + + // + case TRADE_RETCODE_ERROR: + result = "Request processing error"; + break; + + // + case TRADE_RETCODE_TIMEOUT: + result = "Request canceled by timeout"; + break; + + // + case TRADE_RETCODE_INVALID: + result = "Invalid request"; + break; + + // + case TRADE_RETCODE_INVALID_VOLUME: + result = "Invalid volume in the request"; + break; + + // + case TRADE_RETCODE_INVALID_PRICE: + result = "Invalid price in the request"; + break; + + // + case TRADE_RETCODE_INVALID_STOPS: + result = "Invalid stops in the request"; + break; + + // + case TRADE_RETCODE_TRADE_DISABLED: + result = "Trade is disabled"; + break; + + // + case TRADE_RETCODE_MARKET_CLOSED: + result = "Market is closed"; + break; + + // + case TRADE_RETCODE_NO_MONEY: + result = "There is not enough money to complete the request"; + break; + + // + case TRADE_RETCODE_PRICE_CHANGED: + result = "Prices changed"; + break; + + // + case TRADE_RETCODE_PRICE_OFF: + result = "There are no quotes to process the request"; + break; + + // + case TRADE_RETCODE_INVALID_EXPIRATION: + result = "Invalid order expiration date in the request"; + break; + + // + case TRADE_RETCODE_ORDER_CHANGED: + result = "Order state changed"; + break; + + // + case TRADE_RETCODE_TOO_MANY_REQUESTS: + result = "Too frequent requests"; + break; + + // + case TRADE_RETCODE_NO_CHANGES: + result = "No changes in request"; + break; + + // + case TRADE_RETCODE_SERVER_DISABLES_AT: + result = "Autotrading disabled by server"; + break; + + // + case TRADE_RETCODE_CLIENT_DISABLES_AT: + result = "Autotrading disabled by client terminal"; + break; + + // + case TRADE_RETCODE_LOCKED: + result = "Request locked for processing"; + break; + + // + case TRADE_RETCODE_FROZEN: + result = "Order or position frozen"; + break; + + // + case TRADE_RETCODE_INVALID_FILL: + result = "Invalid order filling type"; + break; + + // + case TRADE_RETCODE_CONNECTION: + result = "No connection with the trade server"; + break; + + // + case TRADE_RETCODE_ONLY_REAL: + result = "Operation is allowed only for live accounts"; + break; + + // + case TRADE_RETCODE_LIMIT_ORDERS: + result = "The number of pending orders has reached the limit"; + break; + + // + case TRADE_RETCODE_LIMIT_VOLUME: + result = "The volume of orders and positions for the symbol has reached the limit"; + break; + + // + default: + result = "Invalid return code of the trade server"; + break; + } + + // + return result; +} diff --git a/MQLTestWorkspace/BKPS/14030222/Libraries/x-saherelm.models.lib.ex5 b/MQLTestWorkspace/BKPS/14030222/Libraries/x-saherelm.models.lib.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..db736108b91b6bf83ef75996beb0587e28dee632 GIT binary patch literal 5280 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 +void Add( + T &item, + T &buffer[]) +{ + // + ArrayResize( + buffer, + ArraySize(buffer) + 1); + + // + buffer[ArraySize(buffer) - 1] = item; +} + +template +void Clean(T &buffer[]) +{ + // + ArrayFree(buffer); + ArrayResize(buffer, 0); +} + +template +void Copy( + T &source[], // Source Buffer ... + T &dest[], // Dest Buffer ... + bool cleanDest = true // Force Clen Dest Buffer ... +) +{ + // + if (cleanDest) + { + Clean(dest); + } + + // + int sourceCount = ArraySize(source); + if (sourceCount <= 0) + { + return; + } + + // + for (int i = 0; i < sourceCount; i++) + { + // + T iSource = source[i]; + + // + Add( + iSource, + dest); + } +} + +// +// END Provided Functions ... +// diff --git a/MQLTestWorkspace/BKPS/14030222/Libraries/x-saherelm.seriallizer.lib.mq5 b/MQLTestWorkspace/BKPS/14030222/Libraries/x-saherelm.seriallizer.lib.mq5 new file mode 100644 index 0000000..c1fdd52 --- /dev/null +++ b/MQLTestWorkspace/BKPS/14030222/Libraries/x-saherelm.seriallizer.lib.mq5 @@ -0,0 +1,1326 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Seriallize Library +// --------------------------------------- +// Name: XSeriallizer +// Description: provides Seriallizing EA abilities ... +// +// +// Maintainer: +// ------------ +// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) +// +////////////////////////////////////////////////////// +// +// Global Properties ... +#property library +#property copyright "Copyright 2023, SaherElm IT Center" +#property link "https://www.saherelm.ir" +#property version "1.00" +#property strict + +// +#include "../Libraries/x-saherelm.models.lib.mq5" +#include "../Libraries/x-saherelm.common.lib.mq5" +#include "../Classes/x-saherelm.xtrade.class.mq5" +#include "../Classes/x-saherelm.x121.provider.class.mq5" + +// +string XProviderToken = "PRV"; +string XSupportToken = "SP"; +string XSLTrailToken = "SLT"; +string XPeriodToken = "PR"; + +// +string XConfigToken = "XPV"; +string XItemSeparator = "|"; +string XItemContentSeparator = ","; + +// +string XFirstGenToken = "0"; + +// +// PERIOD ... + +// +// Detect a Comment has period or not ... +bool HasPeriod(string comment) +{ + // + bool result = false; + + // + if (StringLen(comment) == 0) + { + return result; + } + + // + int tokenPos = StringFind( + comment, + XPeriodToken); + result = tokenPos >= 0; + + // + return result; +} + +// +// Extract Period String ... +string ExtractPeriodString(string comment) +{ + // + string result = ""; + + // + bool hasPeriod = HasPeriod(comment); + if (!hasPeriod) + { + return result; + } + + // + result = ExtractString( + comment, + XPeriodToken + "(", + ")"); + + // + return result; +} + +// +// Extract Time Frame From Comment ... +ENUM_TIMEFRAMES ExtractPeriod(string comment) +{ + // + ENUM_TIMEFRAMES result = NULL; + + // + if (StringLen(comment) <= 0) + { + return result; + } + + // + string periodStr = ExtractPeriodString(comment); + if (StringLen(periodStr) <= 0) + { + return result; + } + + // + result = ToPeriod(periodStr); + + // + return result; +} + +// +// PROVIDER ... + +// +// Extract a Provider name if exists from a Comment ... +string ExtractProvider(string comment) +{ + // + string result = ""; + if (StringLen(comment) <= 0) + { + return result; + } + + // + result = ExtractString( + comment, + XProviderToken + "(", + ")"); + + // + return result; +} + +// +// Generate Provider String for Using in Positions Comment ... +// NOTE: if there is more than One Provider, it takes first +// provider as main and the others used to increase volume ... +string GenerateProvidersString(XSignal &signal) +{ + // + string result = ""; + + // + int providersCount = ArraySize(signal.providers); + if (providersCount <= 0) + { + return result; + } + + // + result = XProviderToken + "(" + signal.providers[0] + ")"; + + // + return result; +} + +// +// SLTRAIL ... + +// +string GenerateSLTrailComment(int level) +{ + // + string result = ""; + + // + if (level <= 0) + { + return result; + } + + // + result = XSLTrailToken + "(" + ToString(level) + ")"; + + // + return result; +} + +// +int ExtractSLTrailLevel(string comment) +{ + // + int result = 0; + + // + if (StringLen(comment) == 0) + { + return result; + } + + // + string levelStr = ExtractString( + comment, + XSLTrailToken + "(", + ")"); + if (StringLen(levelStr) == 0) + { + return result; + } + + // + result = (int)levelStr; + + // + return result; +} + +// +string PrepareSLTrailComment( + const string comment // Original Position Comment ... +) +{ + // + string result = ""; + + // + if (StringLen(comment) == 0) + { + return result; + } + + // + int level = 0; + result = comment; + + // + // Check Comment Contains SL Trailing or not ... + int lastTrailLevel = ExtractSLTrailLevel(comment); + if (lastTrailLevel <= 0) + { + level++; + } + else + { + // + level = lastTrailLevel + 1; + string lastLevelStr = GenerateSLTrailComment(lastTrailLevel); + StringReplace( + result, + lastLevelStr, + ""); + } + + // + // Generate level Comment ... + string levelStr = GenerateSLTrailComment(level); + result += levelStr; + + // + return result; +} + +// +// SUPPORT ... + +// +// Generate Specific Position's Support Comment +// index is number of Supports ... +string GenerateSupportSignalComment( + ulong ticket, // Position/Order Ticket + int index // Support Index ... +) +{ + // + string result = ""; + + // + result = XSupportToken + "(" + (string)ticket + "," + ToString(index) + ")"; + + // + return result; +} + +// +// Extract Support Parameters String from specified Comment ... +string ExtractSupportParam(string comment) +{ + // + string result = ""; + if (StringLen(comment) <= 0) + { + return result; + } + + // + result = ExtractString( + comment, + XSupportToken + "(", + ")"); + + // + return result; +} + +// +// Extract Support Info as String array for Specific Comment ... +bool ExtractSupportParams( + string comment, // Specified Comment ... + string ¶ms[] // Hold Result ... +) +{ + // + bool result = false; + + // + string supParam = ExtractSupportParam(comment); + if (StringLen(supParam) == 0) + { + return result; + } + + // + SplitContent( + params, + supParam); + int paramsCount = ArraySize(params); + + // + result = paramsCount == 2; + + // + return result; +} + +// +// Extract Support Parent Ticket ... +ulong ExtractParentTicket(string comment) +{ + // + ulong result = 0; + + // + string params[]; + bool isSupport = ExtractSupportParams( + comment, + params); + if (!isSupport) + { + return result; + } + + // + result = (ulong)params[0]; + + // + return result; +} + +// +// Extract Support Index ... +int ExtractSupportIndex(string comment) +{ + // + int result = -1; + + // + string params[]; + bool isSupport = ExtractSupportParams( + comment, + params); + if (!isSupport) + { + return result; + } + + // + result = (int)params[1]; + + // + return result; +} + +// +// XCONFIG X121Provider Struct ... + +// +// Extract Signallers from User Input ... +int ExtractSignallers( + string &result[], // Hold Result + const string source // Source Content +) +{ + // + int mResult = 0; + + // + Clean(result); + + // + SplitContent( + result, + source); + + // + mResult = ArraySize(result); + + // + return mResult; +} + +// +// Validate Specified Provider Descriptor Model ... +bool IsValid(X121SignalProvider &item) +{ + // + bool result = false; + + // + result = + // + StringLen(item.symbol) > 0 && + item.period != NULL && + item.riskAmount > 0 + // + ; + + // + return result; +} + +// +// Compare Source item with Dest item to check their Same or not ... +bool IsSame( + X121SignalProvider &source, // Source Item + X121SignalProvider &dest // Dest Item +) +{ + // + bool result = false; + + // + bool isValidDest = IsValid(dest); + bool isValidSource = IsValid(source); + if (!isValidDest || + !isValidSource) + { + return result; + } + + // + result = + // + source.symbol == dest.symbol && + source.period == dest.period && + source.riskAmount == dest.riskAmount && + source.useRiskAmountAsStaticVolume == dest.useRiskAmountAsStaticVolume + // + ; + + // + return result; +} + +// +// Check Specified Provider Exists in a Collection or not ... +bool Contains( + X121SignalProvider &item, // Specified Item + X121SignalProvider &items[] // Given Collection +) +{ + // + bool result = false; + + // + int itemsCount = ArraySize(items); + if (itemsCount <= 0) + { + return result; + } + + // + for (int i = 0; i < itemsCount; i++) + { + // + X121SignalProvider iProvider = items[i]; + + // + result = IsSame(item, iProvider); + if (result) + { + // + break; + } + } + + // + return result; +} + +// +// Extract Provider Descriptor Parts from given Source Input ... +int ExtractProviderDescriptorItems( + string &result[], // Hold Result + const string source // Source Descriptor +) +{ + // + int mResult = 0; + + // + Clean(result); + + // + SplitContent( + result, + source, + XItemSeparator); + + // + mResult = ArraySize(result); + + // + return mResult; +} + +// +// Extract Provider Descriptor Items Content from given Source Input ... +int ExtractProviderDescriptorItemsContent( + string &result[], // Hold Result + const string source // Source Descriptor +) +{ + // + int mResult = 0; + + // + Clean(result); + + // + SplitContent( + result, + source, + XItemContentSeparator); + + // + mResult = ArraySize(result); + + // + return mResult; +} + +// +// Validate and add provider to providers if not exists ... +bool AddProviderDescriptor( + X121SignalProvider &item, + X121SignalProvider &items[]) +{ + // + bool result = false; + + // + // Validate and add ... + result = IsValid(item); + if (!result) + { + return result; + } + + // + bool isExists = Contains( + item, + items); + if (isExists) + { + return result; + } + + // + result = true; + + // + Add( + item, + items); + + // + return result; +} + +// +// Extract Provider Descriptors from given Source Input ... +int ExtractProviderConfigurations( + X121SignalProvider &result[], // Hold Result + const string source, // Source String + const string defaultSignallers, // Default Available Signallers for Each Providers + const double defaultRiskAmount, // Default Risk Amount per Trade for Each Provider + const bool useRiskAmountAsStaticVolume = true // Use Provided Risk Amount as Static Volume +) +{ + // + int mResult = 0; + + // + Clean(result); + + // + // if there is no Pairs ... + // Check as One Model ... + string descriptors[]; + mResult = ExtractStrings( + descriptors, + source, + XConfigToken + "(", + ")"); + + // + // Retrieve Signallers ... + string defaultSignallersArr[]; + ExtractSignallers( + defaultSignallersArr, + defaultSignallers); + + // + if (mResult == 0) + { + // + // Here we Check given source String Length ... + // if it is bigger than zero we assuem it is one line descriptor ... + if (StringLen(source) > 0) + { + // + // One Model ... + Add( + source, + descriptors); + } + } + + // + // Each Provider Must Contains at least two things : + // - Asset; + int descriptorsCount = ArraySize(descriptors); + if (descriptorsCount > 0) + { + // + // Loop through descriptors to parse models ... + for (int i = 0; i < descriptorsCount; i++) + { + // + string iDescriptor = descriptors[i]; + + // + X121SignalProvider iProviderDescriptor; + iProviderDescriptor.symbol = ""; + iProviderDescriptor.period = NULL; + iProviderDescriptor.riskAmount = 0; + Clean(iProviderDescriptor.providers); + + // + string iParts[]; + int iPartsCount = ExtractProviderDescriptorItems( + iParts, + iDescriptor); + + // + // Check Parts Count ... + // Now we have to Decide How to Config Signal Providers using Parts ... + + // + // asset => default; + // period => default; + // risk amount => default; + // signallers => default; + // use as static volume => default; + if (iPartsCount == 0) + { + // + // Here we Instance as Current Config Descriptor ... + iProviderDescriptor.symbol = _Symbol; + iProviderDescriptor.period = _Period; + iProviderDescriptor.riskAmount = defaultRiskAmount; + iProviderDescriptor.useRiskAmountAsStaticVolume = useRiskAmountAsStaticVolume; + + // + // Add Default Signallers ... + Copy( + defaultSignallersArr, + iProviderDescriptor.providers); + + // + AddProviderDescriptor( + iProviderDescriptor, + result); + + // + continue; + } + + // + // asset => provided; + // period => default; + // risk amount => default; + // signallers => default; + // use as static volume => default; + if (iPartsCount == 1) + { + + // + iProviderDescriptor.period = _Period; + iProviderDescriptor.riskAmount = defaultRiskAmount; + iProviderDescriptor.useRiskAmountAsStaticVolume = useRiskAmountAsStaticVolume; + + // + // Add Default Signallers ... + Copy( + defaultSignallersArr, + iProviderDescriptor.providers); + + // + // Extract Provided Assets ... + string symbols[]; + int symbolsCount = ExtractProviderDescriptorItemsContent( + symbols, + iParts[0]); + for (int j = 0; j < symbolsCount; j++) + { + // + string jSymbol = symbols[j]; + + // + iProviderDescriptor.symbol = jSymbol; + + // + AddProviderDescriptor( + iProviderDescriptor, + result); + } + + // + continue; + } + + // + // asset => provided; + // period => provided; + // risk amount => default; + // signallers => default; + // use as static volume => default; + if (iPartsCount == 2) + { + // + iProviderDescriptor.riskAmount = defaultRiskAmount; + iProviderDescriptor.useRiskAmountAsStaticVolume = useRiskAmountAsStaticVolume; + + // + // Add Default Signallers ... + Copy( + defaultSignallersArr, + iProviderDescriptor.providers); + + // + // Extract Provided Assets ... + string symbols[]; + int symbolsCount = ExtractProviderDescriptorItemsContent( + symbols, + iParts[0]); + for (int j = 0; j < symbolsCount; j++) + { + // + string jSymbol = symbols[j]; + + // + iProviderDescriptor.symbol = jSymbol; + + // + // Extract Periods ... + string periods[]; + int periodsCount = ExtractProviderDescriptorItemsContent( + periods, + iParts[1]); + for (int k = 0; k < periodsCount; k++) + { + // + string kPeriodStr = periods[k]; + ENUM_TIMEFRAMES kPeriod = ToPeriod(kPeriodStr); + + // + iProviderDescriptor.period = kPeriod; + + // + AddProviderDescriptor( + iProviderDescriptor, + result); + } + } + + // + continue; + } + + // + // asset => provided; + // period => provided; + // risk amount => provided; + // signallers => default; + // use as static volume => default; + if (iPartsCount == 3) + { + // + iProviderDescriptor.useRiskAmountAsStaticVolume = useRiskAmountAsStaticVolume; + + // + // Add Default Signallers ... + Copy( + defaultSignallersArr, + iProviderDescriptor.providers); + + // + // Extract Provided Assets ... + string symbols[]; + int symbolsCount = ExtractProviderDescriptorItemsContent( + symbols, + iParts[0]); + + // + string riskAmounts[]; + int riskAmountsCount = ExtractProviderDescriptorItemsContent( + riskAmounts, + iParts[2]); + + // + for (int j = 0; j < symbolsCount; j++) + { + // + string jSymbol = symbols[j]; + + // + iProviderDescriptor.symbol = jSymbol; + + // + // Extract Periods ... + string periods[]; + int periodsCount = ExtractProviderDescriptorItemsContent( + periods, + iParts[1]); + for (int k = 0; k < periodsCount; k++) + { + // + string kPeriodStr = periods[k]; + ENUM_TIMEFRAMES kPeriod = ToPeriod(kPeriodStr); + + // + iProviderDescriptor.period = kPeriod; + + // + string selectedRiskAmount = + riskAmountsCount == 0 + ? ToString(defaultRiskAmount) + : riskAmountsCount == periodsCount + ? riskAmounts[k] + : riskAmounts[0]; + double riskAmount = (double)selectedRiskAmount; + iProviderDescriptor.riskAmount = riskAmount; + + // + AddProviderDescriptor( + iProviderDescriptor, + result); + } + } + + // + continue; + } + + // + // asset => provided; + // period => provided; + // risk amount => provided; + // signallers => provided; + // use as static volume => default; + if (iPartsCount == 4) + { + // + iProviderDescriptor.useRiskAmountAsStaticVolume = useRiskAmountAsStaticVolume; + + // + // Extract Signallers ... + string signallers[]; + int signallersCount = ExtractSignallers( + signallers, + iParts[3]); + if (signallersCount <= 0) + { + // + Copy( + defaultSignallersArr, + signallers); + } + + // + // Set Extracted Signallers in Provider Descriptor ... + Copy( + signallers, + iProviderDescriptor.providers); + + // + // + // Extract Provided Assets ... + string symbols[]; + int symbolsCount = ExtractProviderDescriptorItemsContent( + symbols, + iParts[0]); + + // + string riskAmounts[]; + int riskAmountsCount = ExtractProviderDescriptorItemsContent( + riskAmounts, + iParts[2]); + + // + for (int j = 0; j < symbolsCount; j++) + { + // + string jSymbol = symbols[j]; + + // + iProviderDescriptor.symbol = jSymbol; + + // + // Extract Periods ... + string periods[]; + int periodsCount = ExtractProviderDescriptorItemsContent( + periods, + iParts[1]); + for (int k = 0; k < periodsCount; k++) + { + // + string kPeriodStr = periods[k]; + ENUM_TIMEFRAMES kPeriod = ToPeriod(kPeriodStr); + + // + iProviderDescriptor.period = kPeriod; + + // + string selectedRiskAmount = + riskAmountsCount == 0 + ? ToString(defaultRiskAmount) + : riskAmountsCount == periodsCount + ? riskAmounts[k] + : riskAmounts[0]; + double riskAmount = (double)selectedRiskAmount; + iProviderDescriptor.riskAmount = riskAmount; + + // + AddProviderDescriptor( + iProviderDescriptor, + result); + } + } + + // + continue; + } + + // + // asset => provided; + // period => provided; + // risk amount => provided; + // signallers => provided; + // use as static volume => provided; + if (iPartsCount == 5) + { + // + // Extract Signallers ... + string signallers[]; + int signallersCount = ExtractSignallers( + signallers, + iParts[3]); + if (signallersCount <= 0) + { + // + Copy( + defaultSignallersArr, + signallers); + } + + // + // Set Extracted Signallers in Provider Descriptor ... + Copy( + signallers, + iProviderDescriptor.providers); + + // + // + // Extract Provided Assets ... + string symbols[]; + int symbolsCount = ExtractProviderDescriptorItemsContent( + symbols, + iParts[0]); + + // + string riskAmounts[]; + int riskAmountsCount = ExtractProviderDescriptorItemsContent( + riskAmounts, + iParts[2]); + + // + string useRiskAmountAsStaticVolumes[]; + int useRiskAmountAsStaticVolumesCount = ExtractProviderDescriptorItemsContent( + useRiskAmountAsStaticVolumes, + iParts[4]); + + // + for (int j = 0; j < symbolsCount; j++) + { + // + string jSymbol = symbols[j]; + + // + iProviderDescriptor.symbol = jSymbol; + + // + // Extract Periods ... + string periods[]; + int periodsCount = ExtractProviderDescriptorItemsContent( + periods, + iParts[1]); + for (int k = 0; k < periodsCount; k++) + { + // + string kPeriodStr = periods[k]; + ENUM_TIMEFRAMES kPeriod = ToPeriod(kPeriodStr); + + // + iProviderDescriptor.period = kPeriod; + + // + string selectedRiskAmount = + riskAmountsCount == 0 + ? ToString(defaultRiskAmount) + : riskAmountsCount == periodsCount + ? riskAmounts[k] + : riskAmounts[0]; + double riskAmount = (double)selectedRiskAmount; + iProviderDescriptor.riskAmount = riskAmount; + + // + string selectedUseRiskAmountAsStaticVolume = + useRiskAmountAsStaticVolumesCount == 0 + ? ToString(useRiskAmountAsStaticVolume) + : useRiskAmountAsStaticVolumesCount == periodsCount + ? useRiskAmountAsStaticVolumes[k] + : useRiskAmountAsStaticVolumes[0]; + bool useRiskAmountAsStaticVolume = ToBoolean(selectedUseRiskAmountAsStaticVolume); + iProviderDescriptor.useRiskAmountAsStaticVolume = useRiskAmountAsStaticVolume; + + // + AddProviderDescriptor( + iProviderDescriptor, + result); + } + } + + // + continue; + } + } + } + else + { + // + // Use All Defaults to Create One Instance ... + X121SignalProvider iProviderDescriptor; + iProviderDescriptor.symbol = ""; + iProviderDescriptor.period = NULL; + iProviderDescriptor.riskAmount = 0; + Clean(iProviderDescriptor.providers); + + // + iProviderDescriptor.symbol = _Symbol; + iProviderDescriptor.period = _Period; + iProviderDescriptor.riskAmount = defaultRiskAmount; + iProviderDescriptor.useRiskAmountAsStaticVolume = useRiskAmountAsStaticVolume; + + // + // Add Default Signallers ... + Copy( + defaultSignallersArr, + iProviderDescriptor.providers); + + // + AddProviderDescriptor( + iProviderDescriptor, + result); + } + + // + mResult = ArraySize(result); + + // + return mResult; +} + +// +// START XEQM Support ... +// + +// +string XEQMSupportToken = "XEQM"; + +// +// Generate String Tag for EQM Support Signals ... +string GenerateXEQMSupportComment() +{ + // + string result = XEQMSupportToken; + + // + return result; +} + +// +// Check a Comment belongs to a EQM Support or not ... +bool IsEQMSupport(string comment) +{ + // + bool result = false; + + // + if (StringLen(comment) <= 0) + { + return result; + } + + // + int tokenPosition = StringFind( + comment, + XEQMSupportToken); + result = tokenPosition >= 0; + + // + return result; +} + +// +// Select EQM Support Orders ... +int GetEQMSupportOrders( + XOrder &supports[], // Hold Result ... + XOrder &orders[], // List of All Orders ... + ENUM_TIMEFRAMES period = NULL // Specified Period ... +) +{ + // + int result = 0; + + // + // Cleanup Array ... + Clean(supports); + + // + // Count Orders ... + int ordersCount = ArraySize(orders); + if (ordersCount <= 0) + { + return result; + } + + // + // Loop through Orders ... + for (int i = 0; i < ordersCount; i++) + { + // + // Select Indexed Order ... + XOrder iOrder = orders[i]; + + // + // Check Order is Support or not ... + bool isSupport = IsEQMSupport(iOrder.comment); + if (!isSupport) + { + continue; + } + + // + // Check Order is not Triggered ... + if (iOrder.state != ORDER_STATE_PLACED) + { + continue; + } + + // + // Check Period ... + if (period != NULL && iOrder.period != period) + { + continue; + } + + // + // we now sure this order is EQM Support ... + Add( + iOrder, + supports); + } + + // + // Count Result ... + result = ArraySize(supports); + + // + return result; +} + +// +// Select EQM Support Positions ... +int GetEQMSupportPositions( + XPosition &supports[], // Hold Result ... + XPosition &positions[], // List of All Positions ... + ENUM_TIMEFRAMES period = NULL // Specified Period ... +) +{ + // + int result = 0; + + // + // Cleanup Array ... + Clean(supports); + + // + // Count Positions ... + int positionsCount = ArraySize(positions); + if (positionsCount <= 0) + { + return result; + } + + // + // Loop through Positions ... + for (int i = 0; i < positionsCount; i++) + { + // + // Select Indexed Position ... + XPosition iPosition = positions[i]; + + // + // Check Position is Support or not ... + bool isSupport = IsEQMSupport(iPosition.comment); + if (!isSupport) + { + continue; + } + + // + // Check Period ... + if (period != NULL && iPosition.period != period) + { + continue; + } + + // + // we now sure this order is EQM Support ... + Add( + iPosition, + supports); + } + + // + // Count Result ... + result = ArraySize(supports); + + // + return result; +} + +// +// END XEQM Support ... +// + +// +// START FirstGen ... +// + +// +string GenerateFirstGenIdentifier(const string signaller) +{ + // + string result = ""; + + // + if (StringLen(signaller) <= 0) + { + return result; + } + + // + return signaller + XFirstGenToken; + + // + return result; +} + +// +bool IsFirstGenOf( + const string signaller, // Specified Signaller + const string comment // Comment +) +{ + // + bool result = false; + + // + string id = GenerateFirstGenIdentifier(signaller); + + // + int idPos = StringFind( + comment, + id + ); + result = idPos >= 0; + + // + return result; +} + +// +// END FirstGen ... +// \ No newline at end of file diff --git a/MQLTestWorkspace/BKPS/14030222/Libraries/x-saherelm.x121.condition.parser.lib.mq5 b/MQLTestWorkspace/BKPS/14030222/Libraries/x-saherelm.x121.condition.parser.lib.mq5 new file mode 100644 index 0000000..8bb775b --- /dev/null +++ b/MQLTestWorkspace/BKPS/14030222/Libraries/x-saherelm.x121.condition.parser.lib.mq5 @@ -0,0 +1,3841 @@ +//////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 X12 Conditions Parser Library +// ----------------------------------------------------- +// Name: X121ConditionsParser +// Description: provides Market Conditions +// Parsing Requirements ... +// +// +// Maintainer: +// ------------ +// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) +// +////////////////////////////////////////////////////// +// +// Global Properties ... +#property library +#property copyright "Copyright 2023, SaherElm IT Center" +#property link "https://www.saherelm.ir" +#property version "1.00" +#property strict + +// +#include "../Libraries/x-saherelm.common.lib.mq5" +#include "../Libraries/x-saherelm.models.lib.mq5" +#include "../Classes/x-saherelm.x121.provider.class.mq5" + +// +// START Functions ... +// + +// +// PARSE STATES ... +// + +// +// SSLC ... +// + +// +bool IsSSLCBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + conditions.xmanInfo.sslcUps[index] > conditions.xmanInfo.sslcDowns[index] + // + ; + + // + return result; +} + +// +bool IsSSLCSwitchedToBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsSSLCBullish(conditions, index) && + !IsSSLCBullish(conditions, index + 1) + // + ; + + // + return result; +} + +// +bool IsSSLCBearish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + conditions.xmanInfo.sslcUps[index] < conditions.xmanInfo.sslcDowns[index] + // + ; + + // + return result; +} + +// +bool IsSSLCSwitchedToBearish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsSSLCBearish(conditions, index) && + !IsSSLCBearish(conditions, index + 1) + // + ; + + // + return result; +} + +// +// HULL ... +// + +// +bool IsHullBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsHullUpBullish(conditions, index) && + IsHullDownBullish(conditions, index) + // + ; + + // + return result; +} + +// +bool IsHullSwitchedBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsHullBullish(conditions, index) && + !IsHullBullish(conditions, index + 1) + // + ; + + // + return result; +} + +// +bool IsHullBearish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsHullUpBearish(conditions, index) && + IsHullDownBearish(conditions, index) + // + ; + + // + return result; +} + +// +bool IsHullSwitchedBearish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsHullBearish(conditions, index) && + !IsHullBearish(conditions, index + 1) + // + ; + + // + return result; +} + +// +// UP ... + +// +// BULLISH ... + +// +bool IsHullUpBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + conditions.xmanInfo.hullUps[index] > conditions.xmanInfo.hullUps[index + 1] + // + ; + + // + return result; +} + +// +bool IsHullUpSwitchedToBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsHullUpBullish(conditions, index) && + !IsHullUpBullish(conditions, index + 1) + // + ; + + // + return result; +} + +// +// BEARISH ... + +// +bool IsHullUpBearish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + conditions.xmanInfo.hullUps[index] < conditions.xmanInfo.hullUps[index + 1] + // + ; + + // + return result; +} + +// +bool IsHullUpSwitchedToBearish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsHullUpBearish(conditions, index) && + !IsHullUpBearish(conditions, index + 1) + // + ; + + // + return result; +} + +// +// DOWN ... + +// +// BULLISH ... + +// +bool IsHullDownBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + conditions.xmanInfo.hullDowns[index] > conditions.xmanInfo.hullDowns[index + 1] + // + ; + + // + return result; +} + +// +bool IsHullDownSwitchedToBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsHullDownBullish(conditions, index) && + !IsHullDownBullish(conditions, index + 1) + // + ; + + // + return result; +} + +// +// BEARISH ... + +// +bool IsHullDownBearish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + conditions.xmanInfo.hullDowns[index] < conditions.xmanInfo.hullDowns[index + 1] + // + ; + + // + return result; +} + +// +bool IsHullDownSwitchedToBearish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsHullDownBearish(conditions, index) && + !IsHullDownBearish(conditions, index + 1) + // + ; + + // + return result; +} + +// +// TREND ... +// + +// +// Check Trend Bullish ... +bool IsTrendBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + conditions.candles[index].low > conditions.xmanInfo.trends[index] + // + ; + + // + return result; +} + +// +// Check Trend Switched To Bullish ... +bool IsTrendSwitchedToBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsTrendBullish(conditions, index) && + !IsTrendBullish(conditions, index + 1) + // + ; + + // + return result; +} + +// +// Check Trend Bearish ... +bool IsTrendBearish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + conditions.candles[index].high < conditions.xmanInfo.trends[index] + // + ; + + // + return result; +} + +// +// Check Trend Switched To Bearish ... +bool IsTrendSwitchedToBearish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsTrendBearish(conditions, index) && + !IsTrendBearish(conditions, index + 1) + // + ; + + // + return result; +} + +// +// RIBBON ... +// + +// +double GetRibbonMax( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + double result = 0; + + // + result = MathMax(conditions.xmanInfo.ribbon1s[index], conditions.xmanInfo.ribbon2s[index]); + result = MathMax(result, conditions.xmanInfo.ribbon3s[index]); + result = MathMax(result, conditions.xmanInfo.ribbon4s[index]); + result = MathMax(result, conditions.xmanInfo.ribbon5s[index]); + result = MathMax(result, conditions.xmanInfo.ribbon6s[index]); + + // + return result; +} + +// +double GetRibbonMin( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + double result = 0; + + // + result = MathMin(conditions.xmanInfo.ribbon1s[index], conditions.xmanInfo.ribbon2s[index]); + result = MathMin(result, conditions.xmanInfo.ribbon3s[index]); + result = MathMin(result, conditions.xmanInfo.ribbon4s[index]); + result = MathMin(result, conditions.xmanInfo.ribbon5s[index]); + result = MathMin(result, conditions.xmanInfo.ribbon6s[index]); + + // + return result; +} + +// +// Check Ribbon States ... +// Working With Price and Ribbon Values ... +bool IsRibbonBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + conditions.candles[index].low > conditions.xmanInfo.ribbon1s[index] && + conditions.candles[index].low > conditions.xmanInfo.ribbon2s[index] && + conditions.candles[index].low > conditions.xmanInfo.ribbon3s[index] && + conditions.candles[index].low > conditions.xmanInfo.ribbon4s[index] && + conditions.candles[index].low > conditions.xmanInfo.ribbon5s[index] && + conditions.candles[index].low > conditions.xmanInfo.ribbon6s[index] + // + ; + + // + return result; +} + +// +// Check Ribbons Sequntial Statements ... +// Working with Price and Ribbon Values and also Ribbon Orders +bool IsRibbonOrderBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsRibbonBullish(conditions, index) + // + && + // + GetRibbonMax(conditions, index) == conditions.xmanInfo.ribbon1s[index] + // + && + // + GetRibbonMin(conditions, index) == conditions.xmanInfo.ribbon6s[index] + // + ; + + // + return result; +} + +// +bool IsRibbonSwitchedToBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsRibbonBullish(conditions, index) && + !IsRibbonBullish(conditions, index + 1) + // + ; + + // + return result; +} + +// +// Check Ribbons Sequntial Statements ... +bool IsRibbonOrderSwitchedToBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsRibbonOrderBullish(conditions, index) && + !IsRibbonOrderBullish(conditions, index + 1) + // + ; + + // + return result; +} + +// +// Check Ribbon States ... +// Working With Price and Ribbon Values ... +bool IsRibbonBearish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + conditions.candles[index].high < conditions.xmanInfo.ribbon1s[index] && + conditions.candles[index].high < conditions.xmanInfo.ribbon2s[index] && + conditions.candles[index].high < conditions.xmanInfo.ribbon3s[index] && + conditions.candles[index].high < conditions.xmanInfo.ribbon4s[index] && + conditions.candles[index].high < conditions.xmanInfo.ribbon5s[index] && + conditions.candles[index].high < conditions.xmanInfo.ribbon6s[index] + // + ; + + // + return result; +} + +// +// Check Ribbons Sequntial Statements ... +// Working with Price and Ribbon Values and also Ribbon Orders +bool IsRibbonOrderBearish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsRibbonBearish(conditions, index) + // + && + // + GetRibbonMax(conditions, index) == conditions.xmanInfo.ribbon1s[index] + // + && + // + GetRibbonMin(conditions, index) == conditions.xmanInfo.ribbon6s[index] + // + ; + + // + return result; +} + +// +bool IsRibbonSwitchedToBearish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsRibbonBearish(conditions, index) && + !IsRibbonBearish(conditions, index + 1) + // + ; + + // + return result; +} + +// +// Check Ribbons Sequntial Statements ... +bool IsRibbonOrderSwitchedToBearish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsRibbonOrderBearish(conditions, index) && + !IsRibbonOrderBearish(conditions, index + 1) + // + ; + + // + return result; +} + +// +// PEAKS and VALES and Levels ... +// + +// +// Check Peak Same as Last ... +bool IsPeakSameAs( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0, // Array Index + int length = 5 // Comparing Period +) +{ + // + bool result = false; + + // + if (length <= 0) + { + return result; + } + + // + double selected = conditions.xmanInfo.peaks[index]; + + // + int start = index + 1; + int end = start + length; + + // + int verified = 0; + for (int i = start; i < end; i++) + { + // + double iValue = conditions.xmanInfo.peaks[i]; + + // + if (iValue == selected) + { + verified++; + } + } + + // + result = verified == length; + + // + return result; +} + +// +// Check New Peaks Happens ... +bool IsNewPeak( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + conditions.xmanInfo.peaks[index] != EMPTY_VALUE && + conditions.xmanInfo.peaks[index] != conditions.xmanInfo.peaks[index + 1] + // + ; + + // + return result; +} + +// +// Check New Peaks Happens Over Last ... +bool IsNewPeakOverLast( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsNewPeak(conditions, index) && + conditions.xmanInfo.peaks[index] > conditions.xmanInfo.peaks[index + 1] + // + ; + + // + return result; +} + +// +// Check New Peaks Happens Under Last ... +bool IsNewPeakUnderLast( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsNewPeak(conditions, index) && + conditions.xmanInfo.peaks[index] < conditions.xmanInfo.peaks[index + 1] + // + ; + + // + return result; +} + +// +// Check Valse Same as Last ... +bool IsValeSameAs( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0, // Array Index + int length = 5 // Comparing Period +) +{ + // + bool result = false; + + // + if (length <= 0) + { + return result; + } + + // + double selected = conditions.xmanInfo.vales[index]; + + // + int start = index + 1; + int end = start + length; + + // + int verified = 0; + for (int i = start; i < end; i++) + { + // + double iValue = conditions.xmanInfo.vales[i]; + + // + if (iValue == selected) + { + verified++; + } + } + + // + result = verified == length; + + // + return result; +} + +// +// Check New Vales Happens ... +bool IsNewVale( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + conditions.xmanInfo.vales[index] != EMPTY_VALUE && + conditions.xmanInfo.vales[index] != conditions.xmanInfo.vales[index + 1] + // + ; + + // + return result; +} + +// +// Check New Vales Happens Over Last ... +bool IsNewValeOverLast( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsNewVale(conditions, index) && + conditions.xmanInfo.vales[index] > conditions.xmanInfo.vales[index + 1] + // + ; + + // + return result; +} + +// +// Check New Vales Happens Under Last ... +bool IsNewValeUnderLast( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsNewVale(conditions, index) && + conditions.xmanInfo.vales[index] < conditions.xmanInfo.vales[index + 1] + // + ; + + // + return result; +} + +// +// Check Finbonacci Increased ... +bool IsFiboIncreased( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + conditions.xmanInfo.fibLevel1s[index] > conditions.xmanInfo.fibLevel1s[index + 1] && + conditions.xmanInfo.fibLevel2s[index] > conditions.xmanInfo.fibLevel2s[index + 1] && + conditions.xmanInfo.fibLevel3s[index] > conditions.xmanInfo.fibLevel3s[index + 1] && + conditions.xmanInfo.fibLevel4s[index] > conditions.xmanInfo.fibLevel4s[index + 1] && + conditions.xmanInfo.fibLevel5s[index] > conditions.xmanInfo.fibLevel5s[index + 1] + // + ; + + // + return result; +} + +// +// Check Fibonacci Decreased ... +bool IsFiboDecreased( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + conditions.xmanInfo.fibLevel1s[index] < conditions.xmanInfo.fibLevel1s[index + 1] && + conditions.xmanInfo.fibLevel2s[index] < conditions.xmanInfo.fibLevel2s[index + 1] && + conditions.xmanInfo.fibLevel3s[index] < conditions.xmanInfo.fibLevel3s[index + 1] && + conditions.xmanInfo.fibLevel4s[index] < conditions.xmanInfo.fibLevel4s[index + 1] && + conditions.xmanInfo.fibLevel5s[index] < conditions.xmanInfo.fibLevel5s[index + 1] + // + ; + + // + return result; +} + +// +// Check Fibonacci Crossed ... +bool IsFiboCrossed( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + conditions.xmanInfo.fibLevel1s[index] == conditions.xmanInfo.fibLevel2s[index] || + conditions.xmanInfo.fibLevel1s[index] == conditions.xmanInfo.fibLevel3s[index] || + conditions.xmanInfo.fibLevel1s[index] == conditions.xmanInfo.fibLevel4s[index] || + conditions.xmanInfo.fibLevel1s[index] == conditions.xmanInfo.fibLevel5s[index] || + conditions.xmanInfo.fibLevel2s[index] == conditions.xmanInfo.fibLevel3s[index] || + conditions.xmanInfo.fibLevel2s[index] == conditions.xmanInfo.fibLevel4s[index] || + conditions.xmanInfo.fibLevel2s[index] == conditions.xmanInfo.fibLevel5s[index] || + conditions.xmanInfo.fibLevel3s[index] == conditions.xmanInfo.fibLevel4s[index] || + conditions.xmanInfo.fibLevel3s[index] == conditions.xmanInfo.fibLevel5s[index] || + conditions.xmanInfo.fibLevel4s[index] == conditions.xmanInfo.fibLevel5s[index] + // + ; + + // + return result; +} + +// +// Check Fibonacci Section Changes ... +bool IsFiboSectionChanged( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + (IsNewPeakUnderLast(conditions, index) && + IsFiboDecreased(conditions, index)) + // + || + // + (IsNewValeOverLast(conditions, index) && + IsFiboIncreased(conditions, index)) + // + ; + + // + return result; +} + +// +// Market Cycles ... + +// +// ALL Cycles ... + +// +bool IsCyclesBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsSCBullish(conditions, index) && + IsMCBullish(conditions, index) && + IsLCBullish(conditions, index) && + IsHCBullish(conditions, index) + // + ; + + // + return result; +} + +// +bool IsCyclesSwitchedToBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsCyclesBullish(conditions, index) && + !IsCyclesBullish(conditions, index + 1) + // + ; + + // + return result; +} + +// +bool IsCyclesBearish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsSCBearish(conditions, index) && + IsMCBearish(conditions, index) && + IsLCBearish(conditions, index) && + IsHCBearish(conditions, index) + // + ; + + // + return result; +} + +// +bool IsCyclesSwitchedToBearish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsCyclesBearish(conditions, index) && + !IsCyclesBearish(conditions, index + 1) + // + ; + + // + return result; +} + +// +bool IsCyclesLowBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsSCLowBullish(conditions, index) && + IsMCLowBullish(conditions, index) && + IsLCLowBullish(conditions, index) && + IsHCLowBullish(conditions, index) + // + ; + + // + return result; +} + +// +bool IsCyclesLowSwitchedToBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsCyclesLowBullish(conditions, index) && + !IsCyclesLowBullish(conditions, index + 1) + // + ; + + // + return result; +} + +// +bool IsCyclesLowBearish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsSCLowBearish(conditions, index) && + IsMCLowBearish(conditions, index) && + IsLCLowBearish(conditions, index) && + IsHCLowBearish(conditions, index) + // + ; + + // + return result; +} + +// +bool IsCyclesLowSwitchedToBearish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsCyclesLowBearish(conditions, index) && + !IsCyclesLowBearish(conditions, index + 1) + // + ; + + // + return result; +} + +// +bool IsCyclesHighBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsSCHighBullish(conditions, index) && + IsMCHighBullish(conditions, index) && + IsLCHighBullish(conditions, index) && + IsHCHighBullish(conditions, index) + // + ; + + // + return result; +} + +// +bool IsCyclesHighSwitchedToBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsCyclesHighBullish(conditions, index) && + !IsCyclesHighBullish(conditions, index + 1) + // + ; + + // + return result; +} + +// +bool IsCyclesHighBearish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsSCHighBearish(conditions, index) && + IsMCHighBearish(conditions, index) && + IsLCHighBearish(conditions, index) && + IsHCHighBearish(conditions, index) + // + ; + + // + return result; +} + +// +bool IsCyclesHighSwitchedToBearish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsCyclesHighBearish(conditions, index) && + !IsCyclesHighBearish(conditions, index + 1) + // + ; + + // + return result; +} + +// +// INHIND Cycles ... + +// +bool IsInHindCyclesBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsSCBullish(conditions, index) && + IsMCBullish(conditions, index) && + IsLCBullish(conditions, index) + // + ; + + // + return result; +} + +// +bool IsInHindCyclesSwitchedToBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsInHindCyclesBullish(conditions, index) && + !IsInHindCyclesBullish(conditions, index + 1) + // + ; + + // + return result; +} + +// +bool IsInHindCyclesBearish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsSCBearish(conditions, index) && + IsMCBearish(conditions, index) && + IsLCBearish(conditions, index) + // + ; + + // + return result; +} + +// +bool IsInHindCyclesSwitchedToBearish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsInHindCyclesBearish(conditions, index) && + !IsInHindCyclesBearish(conditions, index + 1) + // + ; + + // + return result; +} + +// +bool IsInHindCyclesLowBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsSCLowBullish(conditions, index) && + IsMCLowBullish(conditions, index) && + IsLCLowBullish(conditions, index) + // + ; + + // + return result; +} + +// +bool IsInHindCyclesLowSwitchedToBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsInHindCyclesLowBullish(conditions, index) && + !IsInHindCyclesLowBullish(conditions, index + 1) + // + ; + + // + return result; +} + +// +bool IsInHindCyclesHighBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsSCHighBullish(conditions, index) && + IsMCHighBullish(conditions, index) && + IsLCHighBullish(conditions, index) + // + ; + + // + return result; +} + +// +bool IsInHindCyclesHighSwitchedToBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsInHindCyclesHighBullish(conditions, index) && + !IsInHindCyclesHighBullish(conditions, index + 1) + // + ; + + // + return result; +} + +// +// INLONG Cycles ... + +// +bool IsInLongCyclesBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsSCBullish(conditions, index) && + IsMCBullish(conditions, index) + // + ; + + // + return result; +} + +// +bool IsInLongCyclesSwitchedToBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsInLongCyclesBullish(conditions, index) && + !IsInLongCyclesBullish(conditions, index + 1) + // + ; + + // + return result; +} + +// +bool IsInLongCyclesBearish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsSCBearish(conditions, index) && + IsMCBearish(conditions, index) + // + ; + + // + return result; +} + +// +bool IsInLongCyclesSwitchedToBearish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsInLongCyclesBearish(conditions, index) && + !IsInLongCyclesBearish(conditions, index + 1) + // + ; + + // + return result; +} + +// +// SHORT ... + +// +bool IsSCBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsSCHighBullish(conditions, index) && + IsSCLowBullish(conditions, index) + // + ; + + // + return result; +} + +// +bool IsSCSwitchedToBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsSCBullish(conditions, index) && + !IsSCBullish(conditions, index + 1) + // + ; + + // + return result; +} + +// +bool IsSCBearish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsSCHighBearish(conditions, index) && + IsSCLowBearish(conditions, index) + // + ; + + // + return result; +} + +// +bool IsSCSwitchedToBearish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsSCBearish(conditions, index) && + !IsSCBearish(conditions, index + 1) + // + ; + + // + return result; +} + +// +// SHORT HIGH ... + +// +bool IsSCHighBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + conditions.xmanInfo.sHHs[index] > conditions.xmanInfo.sHHs[index + 1] + // + ; + + // + return result; +} + +// +bool IsSCHighSwitchedBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsSCHighBullish(conditions, index) && + !IsSCHighBullish(conditions, index + 1) + // + ; + + // + return result; +} + +// +bool IsSCHighBearish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + conditions.xmanInfo.sHHs[index] < conditions.xmanInfo.sHHs[index + 1] + // + ; + + // + return result; +} + +// +bool IsSCHighSwitchedToBearish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsSCHighBearish(conditions, index) && + !IsSCHighBearish(conditions, index + 1) + // + ; + + // + return result; +} + +// +// SHORT LOW ... + +// +bool IsSCLowBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + conditions.xmanInfo.sLLs[index] > conditions.xmanInfo.sLLs[index + 1] + // + ; + + // + return result; +} + +// +bool IsSCLowSwitchedBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsSCLowBullish(conditions, index) && + !IsSCLowBullish(conditions, index + 1) + // + ; + + // + return result; +} + +// +bool IsSCLowBearish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + conditions.xmanInfo.sLLs[index] < conditions.xmanInfo.sLLs[index + 1] + // + ; + + // + return result; +} + +// +bool IsSCLowSwitchedToBearish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsSCLowBearish(conditions, index) && + !IsSCLowBearish(conditions, index + 1) + // + ; + + // + return result; +} + +// +// MEDIUM ... + +// +bool IsMCBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsMCHighBullish(conditions, index) && + IsMCLowBullish(conditions, index) + // + ; + + // + return result; +} + +// +bool IsMCSwitchedToBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsMCBullish(conditions, index) && + !IsMCBullish(conditions, index + 1) + // + ; + + // + return result; +} + +// +bool IsMCBearish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsMCHighBearish(conditions, index) && + IsMCLowBearish(conditions, index) + // + ; + + // + return result; +} + +// +bool IsMCSwitchedToBearish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsMCBearish(conditions, index) && + !IsMCBearish(conditions, index + 1) + // + ; + + // + return result; +} + +// +// MEDIUM HIGH ... + +// +bool IsMCHighBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + conditions.xmanInfo.mHHs[index] > conditions.xmanInfo.mHHs[index + 1] + // + ; + + // + return result; +} + +// +bool IsMCHighSwitchedBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsMCHighBullish(conditions, index) && + !IsMCHighBullish(conditions, index + 1) + // + ; + + // + return result; +} + +// +bool IsMCHighBearish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + conditions.xmanInfo.mHHs[index] < conditions.xmanInfo.mHHs[index + 1] + // + ; + + // + return result; +} + +// +bool IsMCHighSwitchedToBearish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsMCHighBearish(conditions, index) && + !IsMCHighBearish(conditions, index + 1) + // + ; + + // + return result; +} + +// +// MEDIUM LOW ... + +// +bool IsMCLowBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + conditions.xmanInfo.mLLs[index] > conditions.xmanInfo.mLLs[index + 1] + // + ; + + // + return result; +} + +// +bool IsMCLowSwitchedBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsMCLowBullish(conditions, index) && + !IsMCLowBullish(conditions, index + 1) + // + ; + + // + return result; +} + +// +bool IsMCLowBearish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + conditions.xmanInfo.mLLs[index] < conditions.xmanInfo.mLLs[index + 1] + // + ; + + // + return result; +} + +// +bool IsMCLowSwitchedToBearish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsMCLowBearish(conditions, index) && + !IsMCLowBearish(conditions, index + 1) + // + ; + + // + return result; +} + +// +// LONG ... + +// +bool IsLCBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsLCHighBullish(conditions, index) && + IsLCLowBullish(conditions, index) + // + ; + + // + return result; +} + +// +bool IsLCSwitchedToBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsLCBullish(conditions, index) && + !IsLCBullish(conditions, index + 1) + // + ; + + // + return result; +} + +// +bool IsLCBearish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsLCHighBearish(conditions, index) && + IsLCLowBearish(conditions, index) + // + ; + + // + return result; +} + +// +bool IsLCSwitchedToBearish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsLCBearish(conditions, index) && + !IsLCBearish(conditions, index + 1) + // + ; + + // + return result; +} + +// +// LONG HIGH ... + +// +bool IsLCHighBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + conditions.xmanInfo.lHHs[index] > conditions.xmanInfo.lHHs[index + 1] + // + ; + + // + return result; +} + +// +bool IsLCHighSwitchedBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsLCHighBullish(conditions, index) && + !IsLCHighBullish(conditions, index + 1) + // + ; + + // + return result; +} + +// +bool IsLCHighBearish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + conditions.xmanInfo.lHHs[index] < conditions.xmanInfo.lHHs[index + 1] + // + ; + + // + return result; +} + +// +bool IsLCHighSwitchedToBearish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsLCHighBearish(conditions, index) && + !IsLCHighBearish(conditions, index + 1) + // + ; + + // + return result; +} + +// +// LONG LOW ... + +// +bool IsLCLowBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + conditions.xmanInfo.lLLs[index] > conditions.xmanInfo.lLLs[index + 1] + // + ; + + // + return result; +} + +// +bool IsLCLowSwitchedBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsLCLowBullish(conditions, index) && + !IsLCLowBullish(conditions, index + 1) + // + ; + + // + return result; +} + +// +bool IsLCLowBearish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + conditions.xmanInfo.lLLs[index] < conditions.xmanInfo.lLLs[index + 1] + // + ; + + // + return result; +} + +// +bool IsLCLowSwitchedToBearish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsLCLowBearish(conditions, index) && + !IsLCLowBearish(conditions, index + 1) + // + ; + + // + return result; +} + +// +// HIND ... + +// +bool IsHCBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsHCHighBullish(conditions, index) && + IsHCLowBullish(conditions, index) + // + ; + + // + return result; +} + +// +bool IsHCSwitchedToBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsHCBullish(conditions, index) && + !IsHCBullish(conditions, index + 1) + // + ; + + // + return result; +} + +// +bool IsHCBearish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsHCHighBearish(conditions, index) && + IsHCLowBearish(conditions, index) + // + ; + + // + return result; +} + +// +bool IsHCSwitchedToBearish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsHCBearish(conditions, index) && + !IsHCBearish(conditions, index + 1) + // + ; + + // + return result; +} + +// +// HIND HIGH ... + +// +bool IsHCHighBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + conditions.xmanInfo.hHHs[index] > conditions.xmanInfo.hHHs[index + 1] + // + ; + + // + return result; +} + +// +bool IsHCHighSwitchedBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsHCHighBullish(conditions, index) && + !IsHCHighBullish(conditions, index + 1) + // + ; + + // + return result; +} + +// +bool IsHCHighBearish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + conditions.xmanInfo.hHHs[index] < conditions.xmanInfo.hHHs[index + 1] + // + ; + + // + return result; +} + +// +bool IsHCHighSwitchedToBearish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsHCHighBearish(conditions, index) && + !IsHCHighBearish(conditions, index + 1) + // + ; + + // + return result; +} + +// +// HIND LOW ... + +// +bool IsHCLowBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + conditions.xmanInfo.hLLs[index] > conditions.xmanInfo.hLLs[index + 1] + // + ; + + // + return result; +} + +// +bool IsHCLowSwitchedBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsHCLowBullish(conditions, index) && + !IsHCLowBullish(conditions, index + 1) + // + ; + + // + return result; +} + +// +bool IsHCLowBearish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + conditions.xmanInfo.hLLs[index] < conditions.xmanInfo.hLLs[index + 1] + // + ; + + // + return result; +} + +// +bool IsHCLowSwitchedToBearish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsHCLowBearish(conditions, index) && + !IsHCLowBearish(conditions, index + 1) + // + ; + + // + return result; +} + +// +// XHK XSMHK ... + +// +double GetHKMax( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0, // Array Index + bool ignoreShadows = false // Ignore Shaddows +) +{ + // + double result = 0; + + // + result = MathMax(conditions.xmanInfo.hkOpens[index], conditions.xmanInfo.hkCloses[index]); + if (!ignoreShadows) + { + // + double selectedShadow = MathMax(conditions.xmanInfo.hkHighs[index], conditions.xmanInfo.hkLows[index]); + + // + result = MathMax(result, selectedShadow); + } + + // + return result; +} + +// +double iHKHighest( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0, // Array Index + int count = 5, // Count + ENUM_X_PRICE appliedPrice = X_PRICE_HIGH // Price Type +) +{ + // + double result = 0; + + // + // Validate Args ... + if (index < 0 || + count <= 0) + { + return result; + } + + // + int idx = -1; + double tmpArray[]; + + // + switch (appliedPrice) + { + // + case X_PRICE_HIGH: + // + ArrayCopy( + tmpArray, + conditions.xmanInfo.hkHighs, + 0, + index, + count // + ); + break; + + // + case X_PRICE_OPEN: + // + ArrayCopy( + tmpArray, + conditions.xmanInfo.hkOpens, + 0, + index, + count // + ); + break; + + // + case X_PRICE_CLOSE: + // + ArrayCopy( + tmpArray, + conditions.xmanInfo.hkCloses, + 0, + index, + count // + ); + break; + + // + case X_PRICE_LOW: + // + ArrayCopy( + tmpArray, + conditions.xmanInfo.hkLows, + 0, + index, + count // + ); + break; + } + + // + idx = ArrayMaximum(tmpArray); + if (idx < 0) + { + return result; + } + + // + result = tmpArray[idx]; + + // + return result; +} + +// +double iHKLowest( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0, // Array Index + int count = 5, // Count + ENUM_X_PRICE appliedPrice = X_PRICE_LOW // Price Type +) +{ + // + double result = 0; + + // + // Validate Args ... + if (index < 0 || + count <= 0) + { + return result; + } + + // + int idx = -1; + double tmpArray[]; + + // + switch (appliedPrice) + { + // + case X_PRICE_HIGH: + // + ArrayCopy( + tmpArray, + conditions.xmanInfo.hkHighs, + 0, + index, + count // + ); + break; + + // + case X_PRICE_OPEN: + // + ArrayCopy( + tmpArray, + conditions.xmanInfo.hkOpens, + 0, + index, + count // + ); + break; + + // + case X_PRICE_CLOSE: + // + ArrayCopy( + tmpArray, + conditions.xmanInfo.hkCloses, + 0, + index, + count // + ); + break; + + // + case X_PRICE_LOW: + // + ArrayCopy( + tmpArray, + conditions.xmanInfo.hkLows, + 0, + index, + count // + ); + break; + } + + // + idx = ArrayMinimum(tmpArray); + if (idx < 0) + { + return result; + } + + // + result = tmpArray[idx]; + + // + return result; +} + +// +double GetHKMin( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0, // Array Index + bool ignoreShadows = false // Ignore Shaddows +) +{ + // + double result = 0; + + // + result = MathMin(conditions.xmanInfo.hkOpens[index], conditions.xmanInfo.hkCloses[index]); + if (!ignoreShadows) + { + // + double selectedShadow = MathMin(conditions.xmanInfo.hkHighs[index], conditions.xmanInfo.hkLows[index]); + + // + result = MathMin(result, selectedShadow); + } + + // + return result; +} + +// +double GetSMHKMax( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0, // Array Index + bool ignoreShadows = false // Ignore Shaddows +) +{ + // + double result = 0; + + // + result = MathMax(conditions.xmanInfo.smhkOpens[index], conditions.xmanInfo.smhkCloses[index]); + if (!ignoreShadows) + { + // + double selectedShadow = MathMax(conditions.xmanInfo.smhkHighs[index], conditions.xmanInfo.smhkLows[index]); + + // + result = MathMax(result, selectedShadow); + } + + // + return result; +} + +// +double GetSMHKMin( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0, // Array Index + bool ignoreShadows = false // Ignore Shaddows +) +{ + // + double result = 0; + + // + result = MathMin(conditions.xmanInfo.smhkOpens[index], conditions.xmanInfo.smhkCloses[index]); + if (!ignoreShadows) + { + // + double selectedShadow = MathMin(conditions.xmanInfo.smhkHighs[index], conditions.xmanInfo.smhkLows[index]); + + // + result = MathMin(result, selectedShadow); + } + + // + return result; +} + +// +double iSMHKHighest( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0, // Array Index + int count = 5, // Count + ENUM_X_PRICE appliedPrice = X_PRICE_HIGH // Price Type +) +{ + // + double result = 0; + + // + // Validate Args ... + if (index < 0 || + count <= 0) + { + return result; + } + + // + int idx = -1; + double tmpArray[]; + + // + switch (appliedPrice) + { + // + case X_PRICE_HIGH: + // + ArrayCopy( + tmpArray, + conditions.xmanInfo.smhkHighs, + 0, + index, + count // + ); + break; + + // + case X_PRICE_OPEN: + // + ArrayCopy( + tmpArray, + conditions.xmanInfo.smhkOpens, + 0, + index, + count // + ); + break; + + // + case X_PRICE_CLOSE: + // + ArrayCopy( + tmpArray, + conditions.xmanInfo.smhkCloses, + 0, + index, + count // + ); + break; + + // + case X_PRICE_LOW: + // + ArrayCopy( + tmpArray, + conditions.xmanInfo.smhkLows, + 0, + index, + count // + ); + break; + } + + // + idx = ArrayMaximum(tmpArray); + if (idx < 0) + { + return result; + } + + // + result = tmpArray[idx]; + + // + return result; +} + +// +double iSMHKLowest( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0, // Array Index + int count = 5, // Count + ENUM_X_PRICE appliedPrice = X_PRICE_LOW // Price Type +) +{ + // + double result = 0; + + // + // Validate Args ... + if (index < 0 || + count <= 0) + { + return result; + } + + // + int idx = -1; + double tmpArray[]; + + // + switch (appliedPrice) + { + // + case X_PRICE_HIGH: + // + ArrayCopy( + tmpArray, + conditions.xmanInfo.smhkHighs, + 0, + index, + count // + ); + break; + + // + case X_PRICE_OPEN: + // + ArrayCopy( + tmpArray, + conditions.xmanInfo.smhkOpens, + 0, + index, + count // + ); + break; + + // + case X_PRICE_CLOSE: + // + ArrayCopy( + tmpArray, + conditions.xmanInfo.smhkCloses, + 0, + index, + count // + ); + break; + + // + case X_PRICE_LOW: + // + ArrayCopy( + tmpArray, + conditions.xmanInfo.smhkLows, + 0, + index, + count // + ); + break; + } + + // + idx = ArrayMinimum(tmpArray); + if (idx < 0) + { + return result; + } + + // + result = tmpArray[idx]; + + // + return result; +} + +// +bool IsHKBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + conditions.xmanInfo.hkOpens[index] < conditions.xmanInfo.hkCloses[index] + // + ; + + // + return result; +} + +// +bool IsHKBearish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + conditions.xmanInfo.hkOpens[index] > conditions.xmanInfo.hkCloses[index] + // + ; + + // + return result; +} + +// +bool IsSMHKBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + conditions.xmanInfo.smhkOpens[index] < conditions.xmanInfo.smhkCloses[index] + // + ; + + // + return result; +} + +// +bool IsSMHKBullishAs( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0, // Array Index + int count = 5 // Count +) +{ + // + bool result = false; + + // + int verified = 0; + for (int i = index; i < index + count; i++) + { + // + bool isTrue = IsSMHKBullish(conditions, i); + if (isTrue) + { + verified++; + } + } + + // + result = verified >= count; + + // + return result; +} + +// +bool IsSMHKChangedIn( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0, // Array Index + int length = 5 // Length +) +{ + // + bool result = false; + + // + bool isCurrentBullish = IsSMHKBullish(conditions, index); + + // + int numberOfChanges = 0; + bool isLastBullish = isCurrentBullish; + for (int i = index + 1; i < index + length; i++) + { + // + bool isBullish = IsSMHKBullish(conditions, i); + bool isBearish = IsSMHKBearish(conditions, i); + + // + if ((isBullish && isLastBullish) || (!isBullish && !isLastBullish)) + { + continue; + } + else if ((isBullish && !isLastBullish) || (isBearish && isLastBullish)) + { + numberOfChanges++; + } + } + + // + result = numberOfChanges > 0; + + // + return result; +} + +// +bool IsSMHKBearish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + conditions.xmanInfo.smhkOpens[index] > conditions.xmanInfo.smhkCloses[index] + // + ; + + // + return result; +} + +// +bool IsSMHKBearishAs( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0, // Array Index + int count = 5 // Count +) +{ + // + bool result = false; + + // + int verified = 0; + for (int i = index; i < index + count; i++) + { + // + bool isTrue = IsSMHKBearish(conditions, i); + if (isTrue) + { + verified++; + } + } + + // + result = verified >= count; + + // + return result; +} + +// +// END Functions ... +// + +// +// START Combination .... +// + +// +bool IsMarketBullish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsHullBullish(conditions, index) && + IsSSLCBullish(conditions, index) && + IsTrendBullish(conditions, index) && + IsRibbonBullish(conditions, index) + // + ; + + // + return result; +} + +// +bool IsMarketBearish( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + result = + // + IsHullBearish(conditions, index) && + IsSSLCBearish(conditions, index) && + IsTrendBearish(conditions, index) && + IsRibbonBearish(conditions, index) + // + ; + + // + return result; +} + +// +// END Combination .... +// + +// +// START EQM Supports ... +// + +// +// Generate a Collection Of Fib Signals ... +int GenerateSequentialSignals( + XSignal &signals[], // Hold Result ... + double &pivots[], // Required Values For Generate Signals ... + string symbol, // Trading Symbol ... + ENUM_TIMEFRAMES period, // Trading Time Frame ... + double price, // Current Price Execution ... + double volume, // Volume ... + bool placeSL = false, // Place SL for Signals ... + bool placeTP = false, // Place TP for Signals ... + bool useBoundaryForTPSL = false, // Use Boundary Max Min for TP SL ... + double staticTP = 0, // Static TP ... + bool staticTPAsPoint = false, // Detect Static TP as Point ... + double staticSL = 0, // Static SL ... + bool staticSLAsPoint = false, // Detect Static SL as Point ... + bool longSupport = true, // Generate Long Support Signals ... + bool shortSupport = true, // Generate Short Support Signals ... + bool forceCleanSignalsArray = false // Clean Result Array ... +) +{ + // + int result = 0; + + // + if (forceCleanSignalsArray) + { + Clean(signals); + } + int beforeSize = ArraySize(signals); + + // + // Validate Input States ... + int pivotsCount = ArraySize(pivots); + if ( + // + price <= 0 || + volume <= 0 || + pivotsCount <= 0 + // + ) + { + return result; + } + + // + if (pivotsCount == 1) + { + // + bool isValidSL = + !placeSL + ? true + : staticSL > 0 + ? true + : false; + + // + bool isValidTP = + !placeTP + ? true + : staticTP > 0 + ? true + : false; + + // + if (!isValidTP && !isValidSL) + { + return result; + } + } + else if ((placeSL || placeTP) && pivotsCount < 3) + { + return result; + } + + // + if (!longSupport && !shortSupport) + { + return result; + } + + // + double slValue = !placeSL + ? 0 + : staticSLAsPoint + ? PointToPrice( + symbol, + staticSL) + : staticSL + // + ; + + // + double tpValue = !placeTP + ? 0 + : staticTPAsPoint + ? PointToPrice( + symbol, + staticTP) + : staticTP + // + ; + + // + // Do Signal Generation ... + double tp = 0; + double sl = 0; + XSignal signal; + double entry = 0; + ENUM_X_ORDER_MODES mode = NULL; + ENUM_POSITION_TYPE type = NULL; + + // + double boundaryMax = pivots[ArrayMaximum(pivots)]; + double boundaryMin = pivots[ArrayMinimum(pivots)]; + + // + double tmp[]; + Copy( + pivots, + tmp); + ArraySort(tmp); + + // + double biggerThanPrice[]; + Copy( + pivots, + biggerThanPrice); + ArraySort(biggerThanPrice); + double lesserThanPrice[]; + + // + bool breaking = false; + while (!breaking) + { + // + double lesser = -1; + lesser = FindLesserThanValue( + price, + biggerThanPrice, + true); + if (lesser > -1) + { + // + Add( + lesser, + lesserThanPrice); + + // + Remove( + lesser, + biggerThanPrice); + } + + // + breaking = ArraySize(biggerThanPrice) == 0 || lesser == -1; + } + + // + // Here we have act based on Biggers and Lessers ... + // - Lessers sorted from Large to Small ... + // this means Lesser[0] is Biggest Lesser value ... + // - Biggers sort Ordered Small to Large ... + // this means Bigger[0] is Smallest Bigger Value ... + + // + int biggersCount = ArraySize(biggerThanPrice); + int lessersCount = ArraySize(lesserThanPrice); + + // + if (longSupport) + { + // + // Directional ... + if (biggersCount > 0) + { + // + for (int i = 0; i < biggersCount; i++) + { + // + double iVal = biggerThanPrice[i]; + + // + // We have to Filter Boundary Max ... + if (iVal == boundaryMax) + { + // + // TODO: + // Also we can Do Support based on Previus Support and Resistances ... + continue; + } + + // + // Now we Sure the iVal is not the Boundary Max ... + + // + entry = iVal; + + // + // TP ... + if (placeTP) + { + // + // this means Static TP Provided ... + if (tpValue > 0) + { + tp = entry + tpValue; + } + // + // Use Boundary Max for TP ... + else if (useBoundaryForTPSL) + { + tp = boundaryMax; + } + // + // Find Biggest then Entry Value and Set it as TP ... + else + { + // + tp = FindBiggerThanValue( + entry, + tmp, + true); + if (tp <= 0) + { + tp = 0; + } + } + } + else + { + tp = 0; + } + + // + // SL ... + if (placeSL) + { + // + // this means Static SL Provided ... + if (slValue > 0) + { + sl = entry - slValue; + } + // + // Use Boundary Min for SL ... + if (useBoundaryForTPSL) + { + sl = boundaryMin; + } + // + // Else Find Lesser Than Entry Value and Set it as SL ... + else + { + // + sl = FindLesserThanValue( + entry, + tmp, + true); + if (sl <= 0) + { + sl = 0; + } + } + } + else + { + sl = 0; + } + + // + // Prepare to Create Signal ... + mode = X_ORDER_MODE_STOP; + type = POSITION_TYPE_BUY; + + // + signal = CreateSignal( + symbol, + period, + type, + mode, + entry, + volume, + tp, + sl); + + // + Add( + signal, + signals); + + // + Clean(signal); + } + } + + // + // TODO Reversal ... + if (shortSupport) + { + } + } + + // + if (shortSupport) + { + // + // Directional ... + if (lessersCount > 0) + { + // + for (int i = 0; i < lessersCount; i++) + { + // + double iVal = lesserThanPrice[i]; + + // + // We Have to Filter Boundary Min ... + if (iVal == boundaryMin) + { + // + // TODO: + // Also we can Do Support based on Previus Support and Resistances ... + continue; + } + + // + // Now we sure the iVal is not the Boundary Min ... + + // + entry = iVal; + + // + // TP ... + if (placeTP) + { + // + // this means static tp provider ... + if (tpValue > 0) + { + tp = entry - tpValue; + } + // + // Use Boundary Min for TP ... + else if (useBoundaryForTPSL) + { + tp = boundaryMin; + } + // + // Find Lesser than Entry Vlue and Set it as TP ... + else + { + tp = FindLesserThanValue( + entry, + tmp, + true); + if (tp <= 0) + { + tp = 0; + } + } + } + else + { + tp = 0; + } + + // + // SL ... + if (placeSL) + { + // + // this means Static SL provided ... + if (slValue > 0) + { + sl = entry + slValue; + } + // + // Use Boundary Max for SL ... + if (useBoundaryForTPSL) + { + sl = boundaryMax; + } + // + // Find Bigger Than Entry Vakue and Set it as SL ... + else + { + // + sl = FindBiggerThanValue( + entry, + tmp, + true); + if (sl <= 0) + { + sl = 0; + } + } + } + else + { + sl = 0; + } + + // + // Prepare to Create Signal ... + mode = X_ORDER_MODE_STOP; + type = POSITION_TYPE_SELL; + + // + signal = CreateSignal( + symbol, + period, + type, + mode, + entry, + volume, + tp, + sl); + + // + Add( + signal, + signals); + + // + Clean(signal); + } + } + + // + // TODO: Reversal ... + if (longSupport) + { + } + } + + // + int afterSize = ArraySize(signals); + result = afterSize - beforeSize; + + // + return result; +} + +// +int GenerateSupportAndResistanceSignals( + XSignal &supports[], // Holds Result ... + XOHCLSupRes &supRes, // Provided Support and Resistances ... + string symbol, // Trading Symbol ... + ENUM_TIMEFRAMES period, // Trading Time Frame ... + double price, // Current Price Execution ... + double volume, // Volume ... + bool placeSL = false, // Place SL for Signals ... + bool placeTP = false, // Place TP for Signals ... + bool useBoundaryForTPSL = false, // Use Boundary Max Min for TP SL ... + double staticTP = 0, // Static TP ... + bool staticTPAsPoint = false, // Detect Static TP as Point ... + double staticSL = 0, // Static SL ... + bool staticSLAsPoint = false, // Detect Static SL as Point ... + bool forceClean = false // Clean Result Array ... +) +{ + // + int result = 0; + + // + if (forceClean) + { + Clean(supports); + } + + // + int beforeSize = ArraySize(supports); + + // + // Try to Copy all Values in same array ... + + // + double tmpPivots[]; + Copy( + supRes.sup, + tmpPivots, + false // + ); + Copy( + supRes.res, + tmpPivots, + false // + ); + + // + // Sort Temp Pivots Array ... + ArraySort(tmpPivots); + + // + GenerateSequentialSignals( + supports, + tmpPivots, + symbol, + period, + price, + volume, + placeSL, + placeTP, + useBoundaryForTPSL, + staticTP, + staticTPAsPoint, + staticSL, + staticSLAsPoint // + ); + + // + int afterSize = ArraySize(supports); + + // + result = afterSize - beforeSize; + + // + return result; +} + +// +// END EQM Supports ... +// diff --git a/MQLTestWorkspace/BKPS/14030222/Libraries/x-saherelm.x121.draw.lib.ex5 b/MQLTestWorkspace/BKPS/14030222/Libraries/x-saherelm.x121.draw.lib.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..7acbad83ddb884ecbc9ac9cce244bedbb2dc0277 GIT binary patch literal 7026 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 0 || ArraySize(iSignal.supportResistances.res) > 0; + if (drawSupportAndResistances && isValidSupRes) + { + DrawSupportResistance(0, iSignal.supportResistances); + } + } +} + +// +// Draw Support and Resistance ... +void DrawSupportResistance( + int bar_index, + XOHCLSupRes &data, + string prefix = "", + color supportColor = clrOrange, + color resistanceColor = clrOrange) +{ + // + datetime barTime = GetCandleTime( + _Symbol, + _Period, + bar_index); + + // + datetime prevBarTime = GetCandleTime( + _Symbol, + _Period, + bar_index + 5); + + // + long chID = ChartID(); + int subWindiw = 0; + int lineWidth = 1; + + // + string mPrefix = prefix + "_" + (string)barTime + "_"; + + // + // SUPPORTS ... + + // + int supCount = ArraySize(data.sup); + if (supCount > 0) + { + // + for (int i = 0; i < supCount; i++) + { + // + double iSup = data.sup[i]; + + // + string supTlName = mPrefix + "SUP[" + (string)(i + 1) + "]_(" + (string)iSup + ")"; + + // + // Draw Support ... + DrawTrendLine( + chID, + supTlName, + subWindiw, + prevBarTime, + iSup, + barTime, + iSup, + supportColor, + STYLE_DOT, + lineWidth, + true); + } + } + + // + // RESISTANCES ... + + // + int resCount = ArraySize(data.res); + if (resCount > 0) + { + // + for (int i = 0; i < resCount; i++) + { + // + double iRes = data.res[i]; + + // + string resTlName = mPrefix + "RES[" + (string)(i + 1) + "]_(" + (string)iRes + ")"; + + // + // Draw Support ... + DrawTrendLine( + chID, + resTlName, + subWindiw, + prevBarTime, + iRes, + barTime, + iRes, + resistanceColor, + STYLE_DOT, + lineWidth, + true); + } + } +} + +// +// END Draw Functions ... +// diff --git a/MQLTestWorkspace/BKPS/14030222/Libraries/x-saherelm.x121.x786.lib.mq5 b/MQLTestWorkspace/BKPS/14030222/Libraries/x-saherelm.x121.x786.lib.mq5 new file mode 100644 index 0000000..f10d173 --- /dev/null +++ b/MQLTestWorkspace/BKPS/14030222/Libraries/x-saherelm.x121.x786.lib.mq5 @@ -0,0 +1,436 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Class Library +// ---------------------------------------------- +// Name: XSCX121X786 +// Description: X121 X786 Signal Provider ... +// +// +// Maintainer: +// ------------ +// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) +// +////////////////////////////////////////////////////// +// +// Global Properties ... +#property library +#property copyright "Copyright 2023, SaherElm IT Center" +#property link "https://www.saherelm.ir" +#property version "1.00" +#property strict + +// +#include "../Libraries/x-saherelm.x121.condition.parser.lib.mq5" + +// +// CONDITIONS ... + +// +// Longs ... +bool IsX786HasLongSignal( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + bool long1 = + // + IsHKBullish(conditions) && + IsSMHKBullish(conditions) && + IsHullBullish(conditions, index) && + IsSSLCBullish(conditions, index) && + IsTrendBullish(conditions, index) && + IsRibbonBullish(conditions, index) && + IsBullishCandle(conditions.candles[1]) + // + ; + + // + bool long2 = + // + IsTrendBullish(conditions) && + IsNewPeakOverLast(conditions) && + // + ( + // + IsSCLowBullish(conditions) && + ( + // + IsMCLowBullish(conditions) || + IsLCLowBullish(conditions) || + IsHCLowBullish(conditions) + // + ) + // + ) + // + ; + + // + result = + // + long1 + // + || + // + long2 + // + ; + + // + return result; +} + +// +// Shorts ... +bool IsX786HasShortSignal( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + bool short1 = + // + IsHKBearish(conditions) && + IsSMHKBearish(conditions) && + IsHullBearish(conditions, index) && + IsSSLCBearish(conditions, index) && + IsTrendBearish(conditions, index) && + IsRibbonBearish(conditions, index) && + IsBearishCandle(conditions.candles[1]) + // + ; + + // + bool short2 = + // + IsTrendBearish(conditions, index) && + IsNewValeUnderLast(conditions) && + // + ( + // + IsSCHighBearish(conditions) && + ( + // + IsMCHighBearish(conditions) || + IsLCHighBearish(conditions) || + IsHCHighBearish(conditions) + // + ) + // + ) + // + ; + + // + result = + // + short1 + // + || + // + short2 + // + ; + + // + return result; +} + +// +// CALCULATIONS ... + +// +// Calculate Long Stop ... +double CalculateX786LongStop(const X121MarketConditions &conditions) +{ + // + double result = 0; + + // + double vale = conditions.xmanInfo.vales[0]; + double med = (conditions.xmanInfo.sLLs[0] + conditions.xmanInfo.mLLs[0]) / 2; + double fl1 = conditions.xmanInfo.fibLevel1s[0]; + + // + result = + // + 0 + // + ; + + // + return result; +} + +// +// Calculate Long Take Profits ... +double CalculateX786LongTarget(const X121MarketConditions &conditions, double sl, double entry, double r2r = 1) +{ + // + double result = 0; + + // + if (sl > 0 && entry > 0 && r2r > 0) + { + // + double riskPrice = MathAbs(entry - sl); + double rewardPrice = riskPrice * r2r; + + // + result = entry + rewardPrice; + } + else + { + result = entry + PointToPrice(conditions.symbol, 60); + } + + // + return result; +} + +// +// Calculate Short Stop ... +double CalculateX786ShortStop(const X121MarketConditions &conditions) +{ + // + double result = 0; + + // + return result; +} + +// +// Calculate Short Take Profits ... +double CalculateX786ShortTarget(const X121MarketConditions &conditions, double sl, double entry, double r2r = 1) +{ + // + double result = 0; + + // + if (sl > 0 && entry > 0 && r2r > 0) + { + // + double riskPrice = MathAbs(entry - sl); + double rewardPrice = riskPrice * r2r; + + // + result = entry - rewardPrice; + } + else + { + result = entry - PointToPrice(conditions.symbol, 60); + } + + // + return result; +} + +// +// SIGNALS ... + +// +// Generate Signal ... +bool GenerateX786Signal( + X121MarketConditions &conditions, // Specified Conditions which Holds Signal also ... + const XOHCLSupRes &supportAndResistances, // Specified Support and Resistances ... + ENUM_POSITION_TYPE type, // Specified Which Signal Type must be Generated ... + bool generateSupports = false // Specified Support Signals also Generated and Attached or not ... +) +{ + // + bool result = false; + + // + bool isLong = IsLong(type); + + // + // Retrieve Entry Price ... + double entry = GetEntry( + conditions.symbol, + type); + + // + result = + // + isLong + ? IsX786HasLongSignal(conditions) + : IsX786HasShortSignal(conditions) + // + ; + + // + if (result) + { + // + Add( + ToString(X786), + conditions.signal.providers); + + // + double sl = + // + isLong + ? CalculateX786LongStop(conditions) + : CalculateX786ShortStop(conditions) + // + ; + + // + double r2r = 3; + + // + double tp = + // + isLong + ? CalculateX786LongTarget(conditions, sl, entry, r2r) + : CalculateX786ShortTarget(conditions, sl, entry, r2r) + // + ; + + // + double volume = 0.01; + + // + conditions.hasSignal = true; + + // + conditions.signal.type = type; + conditions.signal.symbol = conditions.symbol; + conditions.signal.period = conditions.period; + conditions.signal.supportResistances = supportAndResistances; + + // + conditions.signal.sl = sl; + conditions.signal.tp = tp; + conditions.signal.r2r = r2r; + conditions.signal.entry = entry; + conditions.signal.volume = volume; + conditions.signal.mode = X_ORDER_MODE_MARKET; + + // + if (generateSupports) + { + // + // Generate Required Support Signals ... + GenerateX786SignalSupports(conditions); + } + } + + // + return result; +} + +// +// SUPPORTS ... + +// +// Generate Required Support Signals and Attached Them into +// Exists Signal of Conditions ... +int GenerateX786SignalSupports( + X121MarketConditions &conditions) +{ + // + int result = 0; + + // + return result; +} + +// +// GUARDS ... + +// +// Check Can Force Close All X786 Long Signals or not ... +bool CanX786ForceCloseLongs(const X121MarketConditions &conditions) +{ + // + bool result = false; + + // + // 1- HK Min above FL 1 ... + // 2- Trend Changed From Bullish To Bearish ... + + // + double minHK = GetHKMin(conditions); + bool isMinHKOverFL1 = minHK > conditions.xmanInfo.fibLevel1s[0]; + bool isTrendSwitchedToBearish = IsTrendSwitchedToBearish(conditions); + + // + result = + // + // isMinHKOverFL1 && + isTrendSwitchedToBearish + // + ; + // if (result) { + // LogMessage("Test"); + // } + + // + return result; +} + +// +// Check for Trailing Long Positions Stops ... +bool CanX786TrailLongsStop( + const X121MarketConditions &conditions, + double &newSL // +) +{ + // + bool result = false; + + // + double prev = GetRibbonMin(conditions, 1); + double current = GetRibbonMin(conditions); + + // + result = current > prev; + if (result) + { + newSL = current; + } + else + { + newSL = -1; + } + + // + return result; +} + +// +// Check For Trailing Short Positions Stops ... +bool CanX786TrailShortsStop( + const X121MarketConditions &conditions, + double &newSL // +) +{ + // + bool result = false; + + // + double prev = GetRibbonMax(conditions, 1); + double current = GetRibbonMax(conditions); + + // + result = current < prev; + if (result) + { + newSL = current; + } + else + { + newSL = -1; + } + + // + return result; +} diff --git a/MQLTestWorkspace/BKPS/14030222/Libraries/x-saherelm.x121.x92.lib.mq5 b/MQLTestWorkspace/BKPS/14030222/Libraries/x-saherelm.x121.x92.lib.mq5 new file mode 100644 index 0000000..ce2270d --- /dev/null +++ b/MQLTestWorkspace/BKPS/14030222/Libraries/x-saherelm.x121.x92.lib.mq5 @@ -0,0 +1,430 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Class Library +// ---------------------------------------------- +// Name: XSCX121X92 +// Description: X121 X92 Signal Provider ... +// +// +// Maintainer: +// ------------ +// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) +// +////////////////////////////////////////////////////// +// +// Global Properties ... +#property library +#property copyright "Copyright 2023, SaherElm IT Center" +#property link "https://www.saherelm.ir" +#property version "1.00" +#property strict + +// +#include "../Libraries/x-saherelm.x121.condition.parser.lib.mq5" + +// +// CONDITIONS ... + +// +// Longs ... +bool IsX92HasLongSignal( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + bool long1 = + // + IsNewPeak(conditions) && + IsValeSameAs(conditions) && + IsNewPeakUnderLast(conditions) + // + ; + + // + bool long2 = + // + IsSMHKBullish(conditions, index) && + IsTrendBullish(conditions, index) && + IsBullishCandle(conditions.candles[index + 1]) + // + && + // + (conditions.candles[index + 1].low > GetSMHKMax(conditions, index) || + conditions.candles[index + 1].close > GetSMHKMax(conditions, index)) + // + && + // + conditions.xmanInfo.smhkHighs[index] == iSMHKHighest(conditions, index) + // + && + // + IsSCLowBullish(conditions, index) + // + ; + + // + result = + // + long1 + // + || + // + long2 + // + ; + + // + return result; +} + +// +// Shorts ... +bool IsX92HasShortSignal( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + bool short1 = + // + IsNewVale(conditions) && + IsPeakSameAs(conditions) && + IsNewValeOverLast(conditions) + // + ; + + // + bool short2 = + // + IsSMHKBearish(conditions, index) && + IsTrendBearish(conditions, index) && + IsBearishCandle(conditions.candles[index + 1]) + // + && + // + (conditions.candles[index + 1].high < GetSMHKMin(conditions, index) || + conditions.candles[index + 1].open < GetSMHKMin(conditions, index)) + // + && + // + conditions.xmanInfo.smhkHighs[index] == iSMHKLowest(conditions, index) + // + && + // + IsSCHighBearish(conditions, index) + // + ; + + // + result = + // + short1 + // + || + // + short2 + // + ; + + // + return result; +} + +// +// CALCULATIONS ... + +// +// Calculate Long Stop ... +double CalculateX92LongStop(const X121MarketConditions &conditions) +{ + // + double result = 0; + + // + double vale = conditions.xmanInfo.vales[0]; + double med = (conditions.xmanInfo.sLLs[0] + conditions.xmanInfo.mLLs[0]) / 2; + double fl1 = conditions.xmanInfo.fibLevel1s[0]; + + // + result = + // + 0 + // + ; + + // + return result; +} + +// +// Calculate Long Take Profits ... +double CalculateX92LongTarget(const X121MarketConditions &conditions, double sl, double entry, double r2r = 1) +{ + // + double result = 0; + + // + if (sl > 0 && entry > 0 && r2r > 0) + { + // + double riskPrice = MathAbs(entry - sl); + double rewardPrice = riskPrice * r2r; + + // + result = entry + rewardPrice; + } + else + { + result = entry + PointToPrice(conditions.symbol, 60); + } + + // + return result; +} + +// +// Calculate Short Stop ... +double CalculateX92ShortStop(const X121MarketConditions &conditions) +{ + // + double result = 0; + + // + return result; +} + +// +// Calculate Short Take Profits ... +double CalculateX92ShortTarget(const X121MarketConditions &conditions, double sl, double entry, double r2r = 1) +{ + // + double result = 0; + + // + if (sl > 0 && entry > 0 && r2r > 0) + { + // + double riskPrice = MathAbs(entry - sl); + double rewardPrice = riskPrice * r2r; + + // + result = entry - rewardPrice; + } + else + { + result = entry - PointToPrice(conditions.symbol, 60); + } + + // + return result; +} + +// +// SIGNALS ... + +// +// Generate Signal ... +bool GenerateX92Signal( + X121MarketConditions &conditions, // Specified Conditions which Holds Signal also ... + const XOHCLSupRes &supportAndResistances, // Specified Support and Resistances ... + ENUM_POSITION_TYPE type, // Specified Which Signal Type must be Generated ... + bool generateSupports = false // Specified Support Signals also Generated and Attached or not ... +) +{ + // + bool result = false; + + // + bool isLong = IsLong(type); + + // + // Retrieve Entry Price ... + double entry = GetEntry( + conditions.symbol, + type); + + // + result = + // + isLong + ? IsX92HasLongSignal(conditions) + : IsX92HasShortSignal(conditions) + // + ; + + // + if (result) + { + // + Add( + ToString(X92), + conditions.signal.providers); + + // + double sl = + // + isLong + ? CalculateX92LongStop(conditions) + : CalculateX92ShortStop(conditions) + // + ; + + // + double r2r = 3; + + // + double tp = + // + isLong + ? CalculateX92LongTarget(conditions, sl, entry, r2r) + : CalculateX92ShortTarget(conditions, sl, entry, r2r) + // + ; + + // + double volume = 0.01; + + // + conditions.hasSignal = true; + + // + conditions.signal.type = type; + conditions.signal.symbol = conditions.symbol; + conditions.signal.period = conditions.period; + conditions.signal.supportResistances = supportAndResistances; + + // + conditions.signal.sl = sl; + conditions.signal.tp = tp; + conditions.signal.r2r = r2r; + conditions.signal.entry = entry; + conditions.signal.volume = volume; + conditions.signal.mode = X_ORDER_MODE_MARKET; + + // + if (generateSupports) + { + // + // Generate Required Support Signals ... + GenerateX92SignalSupports(conditions); + } + } + + // + return result; +} + +// +// SUPPORTS ... + +// +// Generate Required Support Signals and Attached Them into +// Exists Signal of Conditions ... +int GenerateX92SignalSupports( + X121MarketConditions &conditions) +{ + // + int result = 0; + + // + return result; +} + +// +// GUARDS ... + +// +// Check Can Force Close All X92 Long Signals or not ... +bool CanX92ForceCloseLongs(const X121MarketConditions &conditions) +{ + // + bool result = false; + + // + // 1- HK Min above FL 1 ... + // 2- Trend Changed From Bullish To Bearish ... + + // + double minHK = GetHKMin(conditions); + bool isMinHKOverFL1 = minHK > conditions.xmanInfo.fibLevel1s[0]; + bool isTrendSwitchedToBearish = IsTrendSwitchedToBearish(conditions); + + // + result = + // + // isMinHKOverFL1 && + isTrendSwitchedToBearish + // + ; + // if (result) { + // LogMessage("Test"); + // } + + // + return result; +} + +// +// Check for Trailing Long Positions Stops ... +bool CanX92TrailLongsStop( + const X121MarketConditions &conditions, + double &newSL // +) +{ + // + bool result = false; + + // + double prev = GetRibbonMin(conditions, 1); + double current = GetRibbonMin(conditions); + + // + result = current > prev; + if (result) + { + newSL = current; + } + else + { + newSL = -1; + } + + // + return result; +} + +// +// Check For Trailing Short Positions Stops ... +bool CanX92TrailShortsStop( + const X121MarketConditions &conditions, + double &newSL // +) +{ + // + bool result = false; + + // + double prev = GetRibbonMax(conditions, 1); + double current = GetRibbonMax(conditions); + + // + result = current < prev; + if (result) + { + newSL = current; + } + else + { + newSL = -1; + } + + // + return result; +} diff --git a/MQLTestWorkspace/BKPS/14030222/Libraries/x-saherelm.x121.xtest.lib.mq5 b/MQLTestWorkspace/BKPS/14030222/Libraries/x-saherelm.x121.xtest.lib.mq5 new file mode 100644 index 0000000..ee752f4 --- /dev/null +++ b/MQLTestWorkspace/BKPS/14030222/Libraries/x-saherelm.x121.xtest.lib.mq5 @@ -0,0 +1,354 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Class Library +// ---------------------------------------------- +// Name: XSCX121XTEST +// Description: X121 XTEST Signal Provider ... +// +// +// Maintainer: +// ------------ +// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) +// +////////////////////////////////////////////////////// +// +// Global Properties ... +#property library +#property copyright "Copyright 2023, SaherElm IT Center" +#property link "https://www.saherelm.ir" +#property version "1.00" +#property strict + +// +#include "../Libraries/x-saherelm.x121.condition.parser.lib.mq5" + +// +// CONDITIONS ... + +// +// Longs ... +bool IsXTESTHasLongSignal( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + bool isTrendBullish = IsTrendBullish(conditions, index); + bool isCandleBullish = IsBullishCandle(conditions.candles[1]); + bool isValidTrend = ArraySize(conditions.xmanInfo.trendChanges) > 2 && + conditions.xmanInfo.trends[0] > conditions.xmanInfo.trends[1] && + conditions.xmanInfo.trends[0] > conditions.xmanInfo.trendChanges[0].from; + + // + result = + // + isValidTrend && + isTrendBullish && + isCandleBullish + // + ; + + // + return result; +} + +// +// Shorts ... +bool IsXTESTHasShortSignal( + const X121MarketConditions &conditions, // Specified Conditions + int index = 0 // Array Index +) +{ + // + bool result = false; + + // + bool isTrendBearish = IsTrendBearish(conditions, index); + bool isCandleBearish = IsBearishCandle(conditions.candles[1]); + bool isValidTrend = ArraySize(conditions.xmanInfo.trendChanges) > 2 && + conditions.xmanInfo.trends[0] < conditions.xmanInfo.trends[1] && + conditions.xmanInfo.trends[0] < conditions.xmanInfo.trendChanges[0].from; + + // + result = + // + isValidTrend && + isTrendBearish && + isCandleBearish + // + ; + + // + return result; +} + +// +// CALCULATIONS ... + +// +// Calculate Long Stop ... +double CalculateXTESTLongStop(const X121MarketConditions &conditions) +{ + // + double result = 0; + + // + result = + // + conditions.xmanInfo.vales[0] + // + ; + + // + return result; +} + +// +// Calculate Long Take Profits ... +double CalculateXTESTLongTarget(const X121MarketConditions &conditions, double sl, double entry, double r2r = 1) +{ + // + double result = 0; + + // + if (sl > 0 && entry > 0 && r2r > 0) + { + // + double riskPrice = MathAbs(entry - sl); + double rewardPrice = riskPrice * r2r; + + // + result = entry + rewardPrice; + } + else + { + result = entry + PointToPrice(conditions.symbol, 60); + } + + // + double peak = conditions.xmanInfo.peaks[1]; + result = + entry >= peak + ? entry + PointToPrice(conditions.symbol, 60) + : peak; + + // + return result; +} + +// +// Calculate Short Stop ... +double CalculateXTESTShortStop(const X121MarketConditions &conditions) +{ + // + double result = 0; + + // + result = + // + conditions.xmanInfo.peaks[0] + // + ; + + // + return result; +} + +// +// Calculate Short Take Profits ... +double CalculateXTESTShortTarget(const X121MarketConditions &conditions, double sl, double entry, double r2r = 1) +{ + // + double result = 0; + + // + if (sl > 0 && entry > 0 && r2r > 0) + { + // + double riskPrice = MathAbs(entry - sl); + double rewardPrice = riskPrice * r2r; + + // + result = entry - rewardPrice; + } + else + { + result = entry - PointToPrice(conditions.symbol, 60); + } + + // + double vale = conditions.xmanInfo.vales[1]; + result = + entry <= vale + ? entry - PointToPrice(conditions.symbol, 60) + : vale; + + // + return result; +} + +// +// SIGNALS ... + +// +// Generate Signal ... +bool GenerateXTESTSignal( + X121MarketConditions &conditions, // Specified Conditions which Holds Signal also ... + const XOHCLSupRes &supportAndResistances, // Specified Support and Resistances ... + ENUM_POSITION_TYPE type, // Specified Which Signal Type must be Generated ... + bool generateSupports = false // Specified Support Signals also Generated and Attached or not ... +) +{ + // + bool result = false; + + // + bool isLong = IsLong(type); + + // + // Retrieve Entry Price ... + double entry = GetEntry( + conditions.symbol, + type); + + // + result = + // + isLong + ? IsXTESTHasLongSignal(conditions) + : IsXTESTHasShortSignal(conditions) + // + ; + + // + if (result) + { + // + Add( + ToString(XTEST), + conditions.signal.providers); + + // + double sl = + // + isLong + ? CalculateXTESTLongStop(conditions) + : CalculateXTESTShortStop(conditions) + // + ; + + // + double r2r = 1.5; + + // + double tp = + // + isLong + ? CalculateXTESTLongTarget(conditions, sl, entry, r2r) + : CalculateXTESTShortTarget(conditions, sl, entry, r2r) + // + ; + + // + double volume = 0.01; + + // + conditions.hasSignal = true; + + // + conditions.signal.type = type; + conditions.signal.symbol = conditions.symbol; + conditions.signal.period = conditions.period; + conditions.signal.supportResistances = supportAndResistances; + + // + conditions.signal.sl = 0; // sl; + conditions.signal.tp = tp; + conditions.signal.r2r = r2r; + conditions.signal.entry = entry; + conditions.signal.volume = volume; + conditions.signal.mode = X_ORDER_MODE_MARKET; + + // + if (generateSupports) + { + // + // Generate Required Support Signals ... + GenerateXTESTSignalSupports(conditions); + } + } + + // + return result; +} + +// +// SUPPORTS ... + +// +// Generate Required Support Signals and Attached Them into +// Exists Signal of Conditions ... +int GenerateXTESTSignalSupports( + X121MarketConditions &conditions) +{ + // + int result = 0; + + // + return result; +} + +// +// GUARDS ... + +// +// Check Can Force Close All XTEST Long Signals or not ... +bool CanXTESTForceCloseLongs(const X121MarketConditions &conditions) +{ + // + bool result = false; + + // + bool isTrendSwitchedToBearish = IsTrendSwitchedToBearish(conditions); + + // + result = + // + false + // + ; + + // + return result; +} + +// +// Check for Trailing Long Positions Stops ... +bool CanXTESTTrailLongsStop( + const X121MarketConditions &conditions, + double &newSL // +) +{ + // + bool result = false; + + // + return result; +} + +// +// Check For Trailing Short Positions Stops ... +bool CanXTESTTrailShortsStop( + const X121MarketConditions &conditions, + double &newSL // +) +{ + // + bool result = false; + + // + return result; +} diff --git a/MQLTestWorkspace/BKPS/14030222/Libraries/x-saherelm.xman.parser.lib.ex5 b/MQLTestWorkspace/BKPS/14030222/Libraries/x-saherelm.xman.parser.lib.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..39de5768a5bb79aefcbb9b5f8b799205b46239d6 GIT binary patch literal 9940 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 D=P(JW literal 0 HcmV?d00001 diff --git a/MQLTestWorkspace/BKPS/14030222/Libraries/x-saherelm.xman.parser.lib.mq5 b/MQLTestWorkspace/BKPS/14030222/Libraries/x-saherelm.xman.parser.lib.mq5 new file mode 100644 index 0000000..bf6639e --- /dev/null +++ b/MQLTestWorkspace/BKPS/14030222/Libraries/x-saherelm.xman.parser.lib.mq5 @@ -0,0 +1,1674 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 XMAN Parser Library +// ----------------------------------------------- +// Name: XMANParser +// Description: Parsing XMAN Config ... +// +// +// 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 + +// +// Candle Timer Config ... +// candleTimerColor(clrGold)candleTimerCorner(2) +// +// Chrt Style ... +// upColor(clrLime) downColor(clrRed) lineColor(clrLime) bearishColor(clrRed) bullishColor(clrLime) volumesColor(clrGreen) chartMode(1) +// +// Market Cycles ... +// +// Short ... +// l1Method(1)l1Period(NULL) +// +// Medium ... +// l2Method(1)l2Period(NULL) +// +// Long ... +// l3Method(1)l3Period(NULL) +// +// Hind ... +// l4Method(1)l4Period(NULL) +// +// Fibonacci ... +// fiboLevel1(0.236)fiboLevel2(0.382)fiboLevel3(0.5)fiboLevel4(0.618)fiboLevel5(0.764) +// +// Boundary Detection Mode ... +// hhMode(2)llMode(1) +// +// Trend Detection ... +// trendMultiplier(3)trendPriceAppliedTo(4) +// +// Ribbon Detection ... +// ribbonMode(5) +// +// Hull Trend Detection ... +// hullDivisor(2.0)hullUpAppliedTo(3)hullDownAppliedTo(4) +// +// SSL Channel ... +// sslcMode(1)sslcUpAppliedTo(3)sslcDownAppliedTo(4) +// +// Style Presentation Config ... +// showCandleTimer(true)showCandles(true)showHKCandles(false)showSMHKCandles(false) +// +// +// PV Presentation Config ... +// showPeaksAndVales(true)showLevels(false)showConsolidations(false) +// +// +// Trend Presentation Config ... +// showHull(false)showTrends(false)fillTrends(false)showRibbons(false)showSSLChannel(false) +// +// +// Fibo Presentation Config ... +// showFibo1Levels(false)showFibo2Levels(false)showFibo3Levels(false)showFibo4Levels(false)showFibo5Levels(false) +// +#include "../Libraries/x-saherelm.models.lib.mq5" +#include "../Libraries/x-saherelm.common.lib.mq5" + +// +// XPERIOD Calculation Method ... +// USED For Multiple Time Frames ... +enum ENUM_X_PERIOD_METHOD +{ + // + X_PERIOD_NOTHING, // Nothing + X_PERIOD_AUTO, // Auto Select + X_PERIOD_MANUALLY // Manually +}; + +// +enum ENUM_X_MA_METHOD +{ + X_MA_NOTHING, // Nothing + X_MA_SMA, // Simple + X_MA_EMA, // Expotential + X_MA_SMMA, // Smoothed Simple + X_MA_LWMA, // Linear Weighted + X_MA_AMA // Adaptive +}; + +// +// PARSERS ... + +// +// CTIMER ... + +// +string candleTimerColorToken = "candleTimerColor"; +string candleTimerCornerToken = "candleTimerCorner"; + +// +struct XCTimerConfig +{ + color candleTimerColor; // Text Color + ENUM_BASE_CORNER candleTimerCorner; // Text Position +}; + +// +string GenerateCTimerConfig( + color mCandleTimerColor = clrGold, // Text Color + ENUM_BASE_CORNER mCandleTimerCorner = CORNER_RIGHT_UPPER // Text Position +) +{ + // + string result = + candleTimerColorToken + "(" + ToString(mCandleTimerColor) + ")" + + candleTimerCornerToken + "(" + ToString((int)mCandleTimerCorner) + ")"; + + // + return result; +} + +// +string ToString(XCTimerConfig &config) +{ + // + return GenerateCTimerConfig( + config.candleTimerColor, + config.candleTimerCorner); +} + +// +XCTimerConfig ParseCTimerConfig( + string config // Source Config +) +{ + // + XCTimerConfig result; + + // + // CandleTimerColor ... + string candleTimerColorStr = + // + ExtractString( + config, + candleTimerColorToken + "(", + ")"); + // + ; + if (StringLen(candleTimerColorStr) > 0) + { + // + color mCandleTimerColor = (color)candleTimerColorStr; + result.candleTimerColor = mCandleTimerColor; + } + + // + // CandleTimerCorner ... + string candleTimerCornerStr = + // + ExtractString( + config, + candleTimerCornerToken + "(", + ")"); + // + ; + if (StringLen(candleTimerCornerStr) > 0) + { + // + ENUM_BASE_CORNER mCandleTimerCorner = (ENUM_BASE_CORNER)((int)candleTimerCornerStr); + result.candleTimerCorner = mCandleTimerCorner; + } + + // + return result; +} + +// +// CHARTSTYLE ... + +// +string upColorToken = "upColor"; +string downColorToken = "downColor"; +string lineColorToken = "lineColor"; +string bearishColorToken = "bearishColor"; +string bullishColorToken = "bullishColor"; +string volumesColorToken = "volumesColor"; +string chartModeToken = "chartMode"; + +// +struct XChartStyleConfig +{ + color upColor; // Up Color + color downColor; // Down Color + color lineColor; // Line mode and Doji candlestick Color + color bearishColor; // Bullish Color + color bullishColor; // Bearish Color + color volumesColor; // Volumes Color + ENUM_CHART_MODE chartMode; // Chart Mode +}; + +// +string GenerateChartStyleConfig( + color mUpColor = clrLime, // Up Color + color mDownColor = clrRed, // Down Color + color mLineColor = clrLime, // Line mode and Doji candlestick Color + color mBearishColor = clrRed, // Bullish Color + color mBullishColor = clrLime, // Bearish Color + color mVolumesColor = clrGreen, // Volumes Color + ENUM_CHART_MODE mChartMode = CHART_CANDLES // Chart Mode +) +{ + // + string result = ""; + + // + result = + // + upColorToken + "(" + ToString(mUpColor) + ")" + + downColorToken + "(" + ToString(mDownColor) + ")" + + lineColorToken + "(" + ToString(mLineColor) + ")" + + bearishColorToken + "(" + ToString(mBearishColor) + ")" + + bullishColorToken + "(" + ToString(mBullishColor) + ")" + + volumesColorToken + "(" + ToString(mVolumesColor) + ")" + + chartModeToken + "(" + ToString((int)mChartMode) + ")" + // + ; + + // + return result; +} + +// +string ToString(XChartStyleConfig &config) +{ + return GenerateChartStyleConfig( + config.upColor, + config.downColor, + config.lineColor, + config.bearishColor, + config.bullishColor, + config.volumesColor, + config.chartMode); +} + +// +XChartStyleConfig ParseChartStyleConfig(string config) +{ + // + XChartStyleConfig result; + + // + string upColorStr = + // + ExtractString( + config, + upColorToken + "(", + ")") + // + ; + if (StringLen(upColorStr) > 0) + { + // + color mUpColor = (color)upColorStr; + result.upColor = mUpColor; + } + + // + string downColorStr = + // + ExtractString( + config, + downColorToken + "(", + ")") + // + ; + if (StringLen(downColorStr) > 0) + { + // + color mDownColor = (color)downColorStr; + result.downColor = mDownColor; + } + + // + string lineColorStr = + // + ExtractString( + config, + lineColorToken + "(", + ")") + // + ; + if (StringLen(lineColorStr) > 0) + { + // + color mLineColor = (color)lineColorStr; + result.lineColor = mLineColor; + } + + // + string bearishColorStr = + // + ExtractString( + config, + bearishColorToken + "(", + ")") + // + ; + if (StringLen(bearishColorStr) > 0) + { + // + color mBearishColor = (color)bearishColorStr; + result.bearishColor = mBearishColor; + } + + // + string bullishColorStr = + // + ExtractString( + config, + bullishColorToken + "(", + ")") + // + ; + if (StringLen(bullishColorStr) > 0) + { + // + color mBullishColor = (color)bullishColorStr; + result.bullishColor = mBullishColor; + } + + // + string volumesColorStr = + // + ExtractString( + config, + volumesColorToken + "(", + ")") + // + ; + if (StringLen(volumesColorStr) > 0) + { + // + color mVolumesColor = (color)volumesColorStr; + result.volumesColor = mVolumesColor; + } + + // + string chartModeStr = + // + ExtractString( + config, + chartModeToken + "(", + ")") + // + ; + if (StringLen(chartModeStr) > 0) + { + // + ENUM_CHART_MODE mChartMode = (ENUM_CHART_MODE)((int)chartModeStr); + result.chartMode = mChartMode; + } + + // + return result; +} + +// +// MARKETCYCLES ... + +// +// SHORT ... + +// +string l1MethodToken = "l1Method"; +string l1PeriodToken = "l1Period"; + +// +struct XSCConfig +{ + ENUM_X_PERIOD_METHOD l1Method; // How to Find Period + ENUM_TIMEFRAMES l1Period; // Time Period +}; + +// +string GenerateSCConfig( + ENUM_X_PERIOD_METHOD mML1Method = X_PERIOD_AUTO, // How to Find Period + ENUM_TIMEFRAMES mML1Period = NULL // Time Period +) +{ + // + string result = ""; + + // + result = + // + l1MethodToken + "(" + ToString(mML1Method) + ")" + + l1PeriodToken + "(" + ToString(mML1Period) + ")" + // + ; + + // + return result; +} + +// +string ToString(XSCConfig &config) +{ + return GenerateSCConfig( + config.l1Method, + config.l1Period); +} + +// +XSCConfig PrseSCConfig(string config) +{ + // + XSCConfig result; + + // + string l1MethodStr = ExtractString( + config, + l1MethodToken + "(", + ")"); + if (StringLen(l1MethodStr) > 0) + { + // + ENUM_X_PERIOD_METHOD mML1Method = (ENUM_X_PERIOD_METHOD)((int)l1MethodStr); + result.l1Method = mML1Method; + } + + // + string l1PeriodStr = ExtractString( + config, + l1PeriodToken + "(", + ")"); + if (StringLen(l1PeriodStr) > 0) + { + // + ENUM_TIMEFRAMES mML1Period = (ENUM_TIMEFRAMES)((int)l1PeriodStr); + result.l1Period = mML1Period; + } + + // + return result; +} + +// +// MEDIUM ... + +// +string l2MethodToken = "l2Method"; +string l2PeriodToken = "l2Period"; + +// +struct XMCConfig +{ + ENUM_X_PERIOD_METHOD l2Method; // How to Find Period + ENUM_TIMEFRAMES l2Period; // Time Period +}; + +// +string GenerateMCConfig( + ENUM_X_PERIOD_METHOD mML2Method = X_PERIOD_AUTO, // How to Find Period + ENUM_TIMEFRAMES mML2Period = NULL // Time Period +) +{ + // + string result = ""; + + // + result = + // + l2MethodToken + "(" + ToString(mML2Method) + ")" + + l2PeriodToken + "(" + ToString(mML2Period) + ")" + // + ; + + // + return result; +} + +// +string ToString(XMCConfig &config) +{ + return GenerateSCConfig( + config.l2Method, + config.l2Period); +} + +// +XMCConfig PrseMCConfig(string config) +{ + // + XMCConfig result; + + // + string l2MethodStr = ExtractString( + config, + l2MethodToken + "(", + ")"); + if (StringLen(l2MethodStr) > 0) + { + // + ENUM_X_PERIOD_METHOD mML2Method = (ENUM_X_PERIOD_METHOD)((int)l2MethodStr); + result.l2Method = mML2Method; + } + + // + string l2PeriodStr = ExtractString( + config, + l2PeriodToken + "(", + ")"); + if (StringLen(l2PeriodStr) > 0) + { + // + ENUM_TIMEFRAMES mML2Period = (ENUM_TIMEFRAMES)((int)l2PeriodStr); + result.l2Period = mML2Period; + } + + // + return result; +} + +// +// LONG ... + +// +string l3MethodToken = "l3Method"; +string l3PeriodToken = "l3Period"; + +// +struct XLCConfig +{ + ENUM_X_PERIOD_METHOD l3Method; // How to Find Period + ENUM_TIMEFRAMES l3Period; // Time Period +}; + +// +string GenerateLCConfig( + ENUM_X_PERIOD_METHOD mML3Method = X_PERIOD_AUTO, // How to Find Period + ENUM_TIMEFRAMES mML3Period = NULL // Time Period +) +{ + // + string result = ""; + + // + result = + // + l3MethodToken + "(" + ToString(mML3Method) + ")" + + l3PeriodToken + "(" + ToString(mML3Period) + ")" + // + ; + + // + return result; +} + +// +string ToString(XLCConfig &config) +{ + return GenerateSCConfig( + config.l3Method, + config.l3Period); +} + +// +XLCConfig PrseLCConfig(string config) +{ + // + XLCConfig result; + + // + string l3MethodStr = ExtractString( + config, + l3MethodToken + "(", + ")"); + if (StringLen(l3MethodStr) > 0) + { + // + ENUM_X_PERIOD_METHOD mML3Method = (ENUM_X_PERIOD_METHOD)((int)l3MethodStr); + result.l3Method = mML3Method; + } + + // + string l3PeriodStr = ExtractString( + config, + l3PeriodToken + "(", + ")"); + if (StringLen(l3PeriodStr) > 0) + { + // + ENUM_TIMEFRAMES mML3Period = (ENUM_TIMEFRAMES)((int)l3PeriodStr); + result.l3Period = mML3Period; + } + + // + return result; +} + +// +// HIND ... + +// +string l4MethodToken = "l4Method"; +string l4PeriodToken = "l4Period"; + +// +struct XHCConfig +{ + ENUM_X_PERIOD_METHOD l4Method; // How to Find Period + ENUM_TIMEFRAMES l4Period; // Time Period +}; + +// +string GenerateHCConfig( + ENUM_X_PERIOD_METHOD mML4Method = X_PERIOD_AUTO, // How to Find Period + ENUM_TIMEFRAMES mML4Period = NULL // Time Period +) +{ + // + string result = ""; + + // + result = + // + l4MethodToken + "(" + ToString(mML4Method) + ")" + + l4PeriodToken + "(" + ToString(mML4Period) + ")" + // + ; + + // + return result; +} + +// +string ToString(XHCConfig &config) +{ + return GenerateSCConfig( + config.l4Method, + config.l4Period); +} + +// +XHCConfig PrseHCConfig(string config) +{ + // + XHCConfig result; + + // + string l4MethodStr = ExtractString( + config, + l4MethodToken + "(", + ")"); + if (StringLen(l4MethodStr) > 0) + { + // + ENUM_X_PERIOD_METHOD mML4Method = (ENUM_X_PERIOD_METHOD)((int)l4MethodStr); + result.l4Method = mML4Method; + } + + // + string l4PeriodStr = ExtractString( + config, + l4PeriodToken + "(", + ")"); + if (StringLen(l4PeriodStr) > 0) + { + // + ENUM_TIMEFRAMES mML4Period = (ENUM_TIMEFRAMES)((int)l4PeriodStr); + result.l4Period = mML4Period; + } + + // + return result; +} + +// +// XFIBONACCI ... + +// +string fiboLevel1Token = "fiboLevel1"; +string fiboLevel2Token = "fiboLevel2"; +string fiboLevel3Token = "fiboLevel3"; +string fiboLevel4Token = "fiboLevel4"; +string fiboLevel5Token = "fiboLevel5"; + +// +struct XFiboConfig +{ + double fiboLevel1; // Fibio 1st Level + double fiboLevel2; // Fibio 2st Level + double fiboLevel3; // Fibio 3rd Level + double fiboLevel4; // Fibio 4th Level + double fiboLevel5; // Fibio 5th Level +}; + +// +string GenerateFibonacciConfig( + double mFiboLevel1 = 0.236, // Fibio 1st Level + double mFiboLevel2 = 0.382, // Fibio 2st Level + double mFiboLevel3 = 0.5, // Fibio 3rd Level + double mFiboLevel4 = 0.618, // Fibio 4th Level + double mFiboLevel5 = 0.764 // Fibio 5th Level +) +{ + // + string result = ""; + + // + result = + // + fiboLevel1Token + "(" + ToString(mFiboLevel1) + ")" + + fiboLevel2Token + "(" + ToString(mFiboLevel2) + ")" + + fiboLevel3Token + "(" + ToString(mFiboLevel3) + ")" + + fiboLevel4Token + "(" + ToString(mFiboLevel4) + ")" + + fiboLevel5Token + "(" + ToString(mFiboLevel5) + ")" + // + ; + + // + return result; +} + +// +string ToString(XFiboConfig &config) +{ + return GenerateFibonacciConfig( + config.fiboLevel1, + config.fiboLevel2, + config.fiboLevel3, + config.fiboLevel4, + config.fiboLevel5); +} + +// +XFiboConfig PrseFiboConfig(string config) +{ + // + XFiboConfig result; + + // + string fiboLevel1Str = ExtractString( + config, + fiboLevel1Token + "(", + ")"); + if (StringLen(fiboLevel1Str) > 0) + { + // + double mFiboLevel1 = (double)fiboLevel1Str; + result.fiboLevel1 = mFiboLevel1; + } + + // + string fiboLevel2Str = ExtractString( + config, + fiboLevel2Token + "(", + ")"); + if (StringLen(fiboLevel2Str) > 0) + { + // + double mFiboLevel2 = (double)fiboLevel2Str; + result.fiboLevel2 = mFiboLevel2; + } + + // + string fiboLevel3Str = ExtractString( + config, + fiboLevel3Token + "(", + ")"); + if (StringLen(fiboLevel3Str) > 0) + { + // + double mFiboLevel3 = (double)fiboLevel3Str; + result.fiboLevel3 = mFiboLevel3; + } + + // + string fiboLevel4Str = ExtractString( + config, + fiboLevel4Token + "(", + ")"); + if (StringLen(fiboLevel4Str) > 0) + { + // + double mFiboLevel4 = (double)fiboLevel4Str; + result.fiboLevel4 = mFiboLevel4; + } + + // + string fiboLevel5Str = ExtractString( + config, + fiboLevel5Token + "(", + ")"); + if (StringLen(fiboLevel5Str) > 0) + { + // + double mFiboLevel5 = (double)fiboLevel5Str; + result.fiboLevel5 = mFiboLevel5; + } + + // + return result; +} + +// +// BOUNDARYDETECTION ... + +// +string hhModeToken = "hhMode"; +string llModeToken = "llMode"; + +// +struct XBDConfig +{ + ENUM_SERIESMODE hhMode; // Highest High Calculation Method + ENUM_SERIESMODE llMode; // Lowest Low Calculation Method +}; + +// +string GenerateBDConfig( + ENUM_SERIESMODE mHhMode = MODE_HIGH, // Highest High Calculation Method + ENUM_SERIESMODE mLlMode = MODE_LOW // Lowest Low Calculation Method +) +{ + // + string result = ""; + + // + result = + // + hhModeToken + "(" + ToString((int)mHhMode) + ")" + + llModeToken + "(" + ToString((int)mLlMode) + ")" + // + ; + + // + return result; +} + +// +string ToString(XBDConfig &config) +{ + return GenerateBDConfig( + config.hhMode, + config.llMode); +} + +// +XBDConfig ParseBDConfig(string config) +{ + // + XBDConfig result; + + // + string hhModeStr = ExtractString( + config, + hhModeToken + "(", + ")"); + if (StringLen(hhModeStr) > 0) + { + // + ENUM_SERIESMODE mHhMode = (ENUM_SERIESMODE)((int)hhModeStr); + result.hhMode = mHhMode; + } + + // + string llModeStr = ExtractString( + config, + llModeToken + "(", + ")"); + if (StringLen(llModeStr) > 0) + { + // + ENUM_SERIESMODE mLlMode = (ENUM_SERIESMODE)((int)llModeStr); + result.llMode = mLlMode; + } + + // + return result; +} + +// +// TREND ... + +// +string trendMultiplierToken = "trendMultiplier"; +string trendPriceAppliedToToken = "trendPriceAppliedTo"; + +// +struct XTDConfig +{ + double trendMultiplier; // Multiplier + ENUM_APPLIED_PRICE trendPriceAppliedTo; // Applied To +}; + +// +string GenerateTDConfig( + double mTrendMultiplier = 3, // Multiplier + ENUM_APPLIED_PRICE mTrendPriceAppliedTo = PRICE_MEDIAN // Applied To +) +{ + // + string result = ""; + + // + result = + // + trendMultiplierToken + "(" + ToString(mTrendMultiplier) + ")" + + trendPriceAppliedToToken + "(" + ToString(mTrendPriceAppliedTo) + ")" + // + ; + + // + return result; +} + +// +string ToString(XTDConfig &config) +{ + return GenerateTDConfig( + config.trendMultiplier, + config.trendPriceAppliedTo); +} + +// +XTDConfig ParseTDConfig(string config) +{ + // + XTDConfig result; + + // + string trendMultiplierStr = ExtractString( + config, + trendMultiplierToken + "(", + ")"); + if (StringLen(trendMultiplierStr) > 0) + { + // + double mTrendMultiplier = (double)trendMultiplierStr; + result.trendMultiplier = mTrendMultiplier; + } + + // + string trendPriceAppliedToStr = ExtractString( + config, + trendPriceAppliedToToken + "(", + ")"); + if (StringLen(trendPriceAppliedToStr) > 0) + { + // + ENUM_APPLIED_PRICE mTrendPriceAppliedTo = (ENUM_APPLIED_PRICE)((int)trendPriceAppliedToStr); + // + result.trendPriceAppliedTo = mTrendPriceAppliedTo; + } + + // + return result; +} + +// +// RIBBON RB ... + +// +string ribbonModeToken = "ribbonMode"; + +// +struct XRBConfig +{ + ENUM_X_MA_METHOD ribbonMode; // How to Calculate +}; + +// +string GenerateRBConfig( + ENUM_X_MA_METHOD mRibbonMode = X_MA_AMA // How to Calculate +) +{ + // + string result = ""; + + // + result = + // + ribbonModeToken + "(" + ToString(mRibbonMode) + ")" + // + ; + + // + return result; +} + +// +string ToString(XRBConfig &config) +{ + // + return GenerateRBConfig( + config.ribbonMode); +} + +// +XRBConfig ParseRBConfig(string config) +{ + // + XRBConfig result; + + // + string ribbonModeStr = ExtractString( + config, + ribbonModeToken + "(", + ")"); + if (StringLen(ribbonModeStr) > 0) + { + // + ENUM_X_MA_METHOD mRibbonMode = (ENUM_X_MA_METHOD)((int)ribbonModeStr); + result.ribbonMode = mRibbonMode; + } + + // + return result; +} + +// +// HULL ... + +// +string hullDivisorToken = "hullDivisor"; +string hullUpAppliedToToken = "hullUpAppliedTo"; +string hullDownAppliedToToken = "hullDownAppliedTo"; + +// +struct XHullConfig +{ + double hullDivisor; // Divisor (Speed) + ENUM_APPLIED_PRICE hullUpAppliedTo; // Up Zone Applied to + ENUM_APPLIED_PRICE hullDownAppliedTo; // Down Zone Applied to +}; + +// +string GenerateHullConfig( + double mHullDivisor = 2.0, // Divisor (Speed) + ENUM_APPLIED_PRICE mHullUpAppliedTo = PRICE_HIGH, // Up Zone Applied to + ENUM_APPLIED_PRICE mHullDownAppliedTo = PRICE_LOW // Down Zone Applied to +) +{ + // + string result = ""; + + // + result = + // + hullDivisorToken + "(" + ToString(mHullDivisor) + ")" + + hullUpAppliedToToken + "(" + ToString(mHullUpAppliedTo) + ")" + + hullDownAppliedToToken + "(" + ToString(mHullDownAppliedTo) + ")" + // + ; + + // + return result; +} + +// +string ToString(XHullConfig &config) +{ + // + return GenerateHullConfig( + config.hullDivisor, + config.hullUpAppliedTo, + config.hullDownAppliedTo); +} + +// +XHullConfig ParseHullConfig(string config) +{ + // + XHullConfig result; + + // + string hullDivisorStr = ExtractString( + config, + hullDivisorToken + "(", + ")"); + if (StringLen(hullDivisorStr) > 0) + { + // + double mHullDivisor = (double)hullDivisorStr; + result.hullDivisor = mHullDivisor; + } + + // + string hullUpAppliedToStr = ExtractString( + config, + hullUpAppliedToToken + "(", + ")"); + if (StringLen(hullUpAppliedToStr) > 0) + { + // + ENUM_APPLIED_PRICE mHullUpAppliedTo = (ENUM_APPLIED_PRICE)((int)hullUpAppliedToStr); + result.hullUpAppliedTo = mHullUpAppliedTo; + } + + // + string hullDownAppliedToStr = ExtractString( + config, + hullDownAppliedToToken + "(", + ")"); + if (StringLen(hullDownAppliedToStr) > 0) + { + // + ENUM_APPLIED_PRICE mHullDownAppliedTo = (ENUM_APPLIED_PRICE)((int)hullDownAppliedToStr); + result.hullDownAppliedTo = mHullDownAppliedTo; + } + + // + return result; +} + +// +// SSLC ... + +// +string sslcModeToken = "sslcMode"; +string sslcUpAppliedToToken = "sslcUpAppliedTo"; +string sslcDownAppliedToToken = "sslcDownAppliedTo"; + +// +struct XSSLCConfig +{ + ENUM_X_MA_METHOD sslcMode; // How to Calculate + ENUM_APPLIED_PRICE sslcUpAppliedTo; // Up Applied To + ENUM_APPLIED_PRICE sslcDownAppliedTo; // Down Applied To +}; + +// +string GenerateSSLCConfig( + ENUM_X_MA_METHOD mSslcMode = X_MA_SMA, // How to Calculate + ENUM_APPLIED_PRICE mSslcUpAppliedTo = PRICE_HIGH, // Up Applied To + ENUM_APPLIED_PRICE mSslcDownAppliedTo = PRICE_LOW // Down Applied To +) +{ + // + string result; + + // + result = + // + sslcModeToken + "(" + ToString(mSslcMode) + ")" + + sslcUpAppliedToToken + "(" + ToString(mSslcUpAppliedTo) + ")" + + sslcDownAppliedToToken + "(" + ToString(mSslcDownAppliedTo) + ")" + // + ; + + // + return result; +} + +// +string ToString(XSSLCConfig &config) +{ + return GenerateSSLCConfig( + config.sslcMode, + config.sslcUpAppliedTo, + config.sslcDownAppliedTo); +} + +// +XSSLCConfig ParseSSLCConfig(string config) +{ + // + XSSLCConfig result; + + // + string sslcModeStr = ExtractString( + config, + sslcModeToken + "(", + ")"); + if (StringLen(sslcModeStr) > 0) + { + // + ENUM_X_MA_METHOD mSslcMode = (ENUM_X_MA_METHOD)((int)sslcModeStr); + result.sslcMode = mSslcMode; + } + + // + string sslcUpAppliedToStr = ExtractString( + config, + sslcUpAppliedToToken + "(", + ")"); + if (StringLen(sslcUpAppliedToStr) > 0) + { + // + ENUM_APPLIED_PRICE mSslcUpAppliedTo = (ENUM_APPLIED_PRICE)((int)sslcUpAppliedToStr); + result.sslcUpAppliedTo = mSslcUpAppliedTo; + } + + // + string sslcDownAppliedToStr = ExtractString( + config, + sslcDownAppliedToToken + "(", + ")"); + if (StringLen(sslcDownAppliedToStr) > 0) + { + // + ENUM_APPLIED_PRICE mSslcDownAppliedTo = (ENUM_APPLIED_PRICE)((int)sslcDownAppliedToStr); + result.sslcDownAppliedTo = mSslcDownAppliedTo; + } + + // + return result; +} + +// +// PRESENTATION ... + +// +string showCandleTimerToken = "showCandleTimer"; +string showCandlesToken = "showCandles"; +string showHKCandlesToken = "showHKCandles"; +string showSMHKCandlesToken = "showSMHKCandles"; +string showPeaksAndValesToken = "showPeaksAndVales"; +string showTrendsToken = "showTrends"; +string fillTrendsToken = "fillTrends"; +string showLevelsToken = "showLevels"; +string showConsolidationsToken = "showConsolidations"; +string showRibbonsToken = "showRibbons"; +string showHullToken = "showHull"; +string showSSLChannelToken = "showSSLChannel"; +string showFibo1LevelsToken = "showFibo1Levels"; +string showFibo2LevelsToken = "showFibo2Levels"; +string showFibo3LevelsToken = "showFibo3Levels"; +string showFibo4LevelsToken = "showFibo4Levels"; +string showFibo5LevelsToken = "showFibo5Levels"; + +// +struct XStylePresentationConfig +{ + bool showCandleTimer; // Show Candle Time + bool showCandles; // Show Candles + bool showHKCandles; // Draw Hiken Ashi Candle + bool showSMHKCandles; // Draw Smoothed Hiken Ashi Candle +}; + +// +string GenerateStylePresentationConfig( + bool mShowCandleTimer = true, // Show Candle Time + bool mShowCandles = true, // Show Candles + bool mShowHKCandles = false, // Draw Hiken Ashi Candle + bool mShowSMHKCandles = false // Draw Smoothed Hiken Ashi Candle +) +{ + // + string result = ""; + + // + result = + // + showCandleTimerToken + "(" + ToString(mShowCandleTimer) + ")" + + showCandlesToken + "(" + ToString(mShowCandles) + ")" + + showHKCandlesToken + "(" + ToString(mShowHKCandles) + ")" + + showSMHKCandlesToken + "(" + ToString(mShowSMHKCandles) + ")" + // + ; + + // + return result; +} + +// +XStylePresentationConfig ParseStylePresentationConfig(string config) +{ + // + XStylePresentationConfig result; + + // + string showCandleTimerStr = ExtractString( + config, + showCandleTimerToken + "(", + ")"); + if (StringLen(showCandleTimerStr) > 0) + { + // + bool mShowCandleTimer = ToBoolean(showCandleTimerStr); + result.showCandleTimer = mShowCandleTimer; + } + + // + string showCandlesStr = ExtractString( + config, + showCandlesToken + "(", + ")"); + if (StringLen(showCandlesStr) > 0) + { + // + bool mShowCandles = ToBoolean(showCandlesStr); + result.showCandles = mShowCandles; + } + + // + string showHKCandlesStr = ExtractString( + config, + showHKCandlesToken + "(", + ")"); + if (StringLen(showHKCandlesStr) > 0) + { + // + bool mShowHKCandles = ToBoolean(showHKCandlesStr); + result.showHKCandles = mShowHKCandles; + } + + // + string showSMHKCandlesStr = ExtractString( + config, + showSMHKCandlesToken + "(", + ")"); + if (StringLen(showSMHKCandlesStr) > 0) + { + // + bool mShowSMHKCandles = ToBoolean(showSMHKCandlesStr); + result.showSMHKCandles = mShowSMHKCandles; + } + + // + return result; +} + +// +string ToString(XStylePresentationConfig &config) +{ + // + return GenerateStylePresentationConfig( + config.showCandleTimer, + config.showCandles, + config.showHKCandles, + config.showSMHKCandles); +} + +// +struct XPVPresentationConfig +{ + bool showPeaksAndVales; // Show Peaks and Vales + bool showLevels; // Show Levels + bool showConsolidations; // Show Consolidations +}; + +// +string GeneratePVPresentationConfig( + bool mShowPeaksAndVales = true, // Show Peaks and Vales + bool mShowLevels = false, // Show Levels + bool mShowConsolidations = false // Show Consolidations +) +{ + // + string result; + + // + result = + // + showPeaksAndValesToken + "(" + ToString(mShowPeaksAndVales) + ")" + + showLevelsToken + "(" + ToString(mShowLevels) + ")" + + showConsolidationsToken + "(" + ToString(mShowConsolidations) + ")" + // + ; + + // + return result; +} + +// +string ToString(XPVPresentationConfig &config) +{ + // + return GeneratePVPresentationConfig( + config.showPeaksAndVales, + config.showLevels, + config.showConsolidations); +} + +// +XPVPresentationConfig ParsePVPresentationConfig(string config) +{ + // + XPVPresentationConfig result; + + // + string showPeaksAndValesStr = ExtractString( + config, + showPeaksAndValesToken + "(", + ")"); + if (StringLen(showPeaksAndValesStr) > 0) + { + // + bool mShowPeaksAndVales = ToBoolean(showPeaksAndValesStr); + result.showPeaksAndVales = mShowPeaksAndVales; + } + + // + string showLevelsStr = ExtractString( + config, + showLevelsToken + "(", + ")"); + if (StringLen(showLevelsStr) > 0) + { + // + bool mShowLevels = ToBoolean(showLevelsStr); + result.showLevels = mShowLevels; + } + + // + string showConsolidationsStr = ExtractString( + config, + showConsolidationsToken + "(", + ")"); + if (StringLen(showConsolidationsStr) > 0) + { + // + bool mShowConsolidations = ToBoolean(showConsolidationsStr); + result.showConsolidations = mShowConsolidations; + } + + // + return result; +} + +// +struct XTrendPresentationConfig +{ + bool showHull; // Show Hull + bool showTrends; // Show Trends + bool fillTrends; // Fill Trends + bool showRibbons; // Show Ribbons + bool showSSLChannel; // Show SSL Channel +}; + +// +string GenerateTrendPresentationConfig( + bool mShowTrends = true, // Show Trends + bool mFillTrends = false, // Fill Trends + bool mShowRibbons = false, // Show Ribbons + bool mShowHull = false, // Show Hull + bool mShowSSLChannel = false // Show SSL Channel +) +{ + // + string result; + + // + result = + // + showTrendsToken + "(" + ToString(mShowTrends) + ")" + + fillTrendsToken + "(" + ToString(mFillTrends) + ")" + + showRibbonsToken + "(" + ToString(mShowRibbons) + ")" + + showHullToken + "(" + ToString(mShowHull) + ")" + + showSSLChannelToken + "(" + ToString(mShowSSLChannel) + ")" + // + ; + + // + return result; +} + +// +string ToString(XTrendPresentationConfig &config) +{ + // + return GenerateTrendPresentationConfig( + config.showHull, + config.showTrends, + config.fillTrends, + config.showRibbons, + config.showSSLChannel); +} + +// +XTrendPresentationConfig ParseTrendPresentationConfig(string config) +{ + // + XTrendPresentationConfig result; + + // + string showTrendsStr = ExtractString( + config, + showTrendsToken + "(", + ")"); + if (StringLen(showTrendsStr) > 0) + { + // + bool mShowTrends = ToBoolean(showTrendsStr); + result.showTrends = mShowTrends; + } + + // + string fillTrendsStr = ExtractString( + config, + fillTrendsToken + "(", + ")"); + if (StringLen(fillTrendsStr) > 0) + { + // + bool mFillTrends = ToBoolean(fillTrendsStr); + result.fillTrends = mFillTrends; + } + + // + string showRibbonsStr = ExtractString( + config, + showRibbonsToken + "(", + ")"); + if (StringLen(showRibbonsStr) > 0) + { + // + bool mShowRibbons = ToBoolean(showRibbonsStr); + result.showRibbons = mShowRibbons; + } + + // + string showHullStr = ExtractString( + config, + showHullToken + "(", + ")"); + if (StringLen(showHullStr) > 0) + { + // + bool mShowHull = ToBoolean(showHullStr); + result.showHull = mShowHull; + } + + // + string showSSLChannelStr = ExtractString( + config, + showSSLChannelToken + "(", + ")"); + if (StringLen(showSSLChannelStr) > 0) + { + // + bool mShowSSLChannel = ToBoolean(showSSLChannelStr); + result.showSSLChannel = mShowSSLChannel; + } + + // + return result; +} + +// +struct XFiboPresentationConfig +{ + bool showFibo1Levels; // Show Fibo 1st Level + bool showFibo2Levels; // Show Fibo 2nd Level + bool showFibo3Levels; // Show Fibo 3rd Level + bool showFibo4Levels; // Show Fibo 4th Level + bool showFibo5Levels; // Show Fibo 5th Level +}; + +// +string GenerateFiboPresentationConfig( + bool mShowFibo1Levels = false, // Show Fibo 1st Level + bool mShowFibo2Levels = false, // Show Fibo 2nd Level + bool mShowFibo3Levels = false, // Show Fibo 3rd Level + bool mShowFibo4Levels = false, // Show Fibo 4th Level + bool mShowFibo5Levels = false // Show Fibo 5th Level +) +{ + // + string result = ""; + + // + result = + // + showFibo1LevelsToken + "(" + ToString(mShowFibo1Levels) + ")" + + showFibo2LevelsToken + "(" + ToString(mShowFibo2Levels) + ")" + + showFibo3LevelsToken + "(" + ToString(mShowFibo3Levels) + ")" + + showFibo4LevelsToken + "(" + ToString(mShowFibo4Levels) + ")" + + showFibo5LevelsToken + "(" + ToString(mShowFibo5Levels) + ")" + // + ; + + // + return result; +} + +// +string ToString(XFiboPresentationConfig &config) +{ + // + return GenerateFiboPresentationConfig( + config.showFibo1Levels, + config.showFibo2Levels, + config.showFibo3Levels, + config.showFibo4Levels, + config.showFibo5Levels); +} + +// +XFiboPresentationConfig ParePresentationConfig(string config) +{ + // + XFiboPresentationConfig result; + + // + string showFibo1LevelsStr = ExtractString( + config, + showFibo1LevelsToken + "(", + ")"); + if (StringLen(showFibo1LevelsStr) > 0) + { + // + bool mShowFibo1Levels = ToBoolean(showFibo1LevelsStr); + result.showFibo1Levels = mShowFibo1Levels; + } + + // + string showFibo2LevelsStr = ExtractString( + config, + showFibo2LevelsToken + "(", + ")"); + if (StringLen(showFibo2LevelsStr) > 0) + { + // + bool mShowFibo2Levels = ToBoolean(showFibo2LevelsStr); + result.showFibo2Levels = mShowFibo2Levels; + } + + // + string showFibo3LevelsStr = ExtractString( + config, + showFibo3LevelsToken + "(", + ")"); + if (StringLen(showFibo3LevelsStr) > 0) + { + // + bool mShowFibo3Levels = ToBoolean(showFibo3LevelsStr); + result.showFibo3Levels = mShowFibo3Levels; + } + + // + string showFibo4LevelsStr = ExtractString( + config, + showFibo4LevelsToken + "(", + ")"); + if (StringLen(showFibo4LevelsStr) > 0) + { + // + bool mShowFibo4Levels = ToBoolean(showFibo4LevelsStr); + result.showFibo4Levels = mShowFibo4Levels; + } + + // + string showFibo5LevelsStr = ExtractString( + config, + showFibo5LevelsToken + "(", + ")"); + if (StringLen(showFibo5LevelsStr) > 0) + { + // + bool mShowFibo5Levels = ToBoolean(showFibo5LevelsStr); + result.showFibo5Levels = mShowFibo5Levels; + } + + // + return result; +} + +// +// +// diff --git a/MQLTestWorkspace/BKPS/BKP/eqm.support.management.mq5 b/MQLTestWorkspace/BKPS/BKP/eqm.support.management.mq5 new file mode 100644 index 0000000..6422ce0 --- /dev/null +++ b/MQLTestWorkspace/BKPS/BKP/eqm.support.management.mq5 @@ -0,0 +1,459 @@ +// +// EQUITYMANAGEMENT ... +// + +// +// All available Equity Actions Implemented here ... +void HandleEquityManagement() +{ + // + // TODO: Complete this ... + + // + // Here we Must first Check Number of Trades ... + XPosition positions[]; + int positionsCount = GetPositions(positions); + if (positionsCount <= 0) + { + return; + } + + // + double profit = CalculatePositionsProfit(positions); + double requiredProfit = CalculatePositionsProfit(positions); + + // + if (profit > 0 && + positionsCount >= mMaxAllowedPositions) + { + // + // TODO: + // Wait for Max Profit for Closing all Open Positions ... + // Also Support Orders ... + + // + // here we have to Multiply requirement profit for hedging ... + bool canHedge = profit >= (requiredProfit * 1.5); + string comment = "EQM Hedge ..."; + int closed = mTrader.ClosePositions( + positions, + comment); + if (closed > 0) + { + // + // Cancel All Placed Support Orders ... + CancelAllEQMOrders(); + + // + string message = "EQM Closed (" + ToString(positionsCount) + ") due Hedge by: " + ToString(profit); + + // + LogMessage(message); + } + + // + return; + } + else if (profit > 0 && positionsCount > 1) + { + // + // Here we can Hedge Positions in regular Senario ... + bool canHedge = profit >= requiredProfit; + string comment = "EQM Hedge ..."; + int closed = mTrader.ClosePositions( + positions, + comment); + if (closed > 0) + { + // + // Cancel All Placed Support Orders ... + CancelAllEQMOrders(); + + // + string message = "EQM Closed (" + ToString(positionsCount) + ") due Hedge by: " + ToString(profit); + + // + LogMessage(message); + } + + // + return; + } + + // + // TODO: Add Longest Age in Props ... + int longDetectionAgeForInDrawDownPositions = 26; + int longDetectionAgeForUntriggeredSupports = 26; + + // + // Here we have to Place Support Signals if there is no Equity ... + bool hasEquity = CheckEquityForTrade(); + if (profit < 0 && !hasEquity) + { + // + // Retrieve and Placed EQM Support Orders ... + HandleEQMSupportPlacement(); + } + else if (profit < 0 && hasEquity) + { + // + // Here there are some Open Positions and we have eQuity but + // there isn't new Signals and exists positions in DrawDown ... + + // + // here we have to Generate EQM Support Signal ... + + // + // First try to Find Max In Draw down Position ... + XPosition inDPositions[]; + int inDPositionsCount = GetInDrawdownPositions( + inDPositions, + NULL, + NULL, + NULL, + NULL, + X_POSITION_SELECT_MAX); + if (inDPositionsCount <= 0) + { + return; + } + + // + XPosition maxInDPosition = inDPositions[0]; + int maxInDPositionAge = GetAge(maxInDPosition); + + // + bool isSupportable = maxInDPositionAge >= longDetectionAgeForInDrawDownPositions; + if (!isSupportable) + { + return; + } + + // + // now we are sure Max In DrawDown Position is Supportable ... + HandleEQMSupportPlacement(); + } +} + +// +// Retrieve All EQM Placed Support Orders ... +int GetEQMOrders( + XOrder &orders[] // Hold Result +) +{ + // + int result = 0; + + // + XOrder allOrders[]; + int allOrdersCount = GetOrders(allOrders); + if (allOrdersCount <= 0) + { + return result; + } + + // + // Extract EQM Orders ... + result = GetEQMSupportOrders( + orders, + allOrders); + + // + return result; +} + +// +// Retrieve All EQM Support Positions ... +int GetEQMPositions( + XPosition &positions[] // Hold Result +) +{ + // + int result = 0; + + // + XPosition allPositions[]; + int allPositionsCount = GetPositions(allPositions); + if (allPositionsCount <= 0) + { + return result; + } + + // + // Extract EQM Positions ... + result = GetEQMSupportPositions( + positions, + allPositions); + + // + return result; +} + +// +// Cancel all EQM Placed Support Orders ... +bool CancelAllEQMOrders() +{ + // + bool result = false; + + // + XOrder eqmOrders[]; + int eqmOrdersCount = GetEQMOrders(eqmOrders); + if (eqmOrdersCount <= 0) + { + return result; + } + + // + result = mTrader.CancelOrders(eqmOrders); + + // + return result; +} + +// +// Generate EQM Support Signals ... +int GenerateEQMSupports( + XSignal &supports[], // Holds Supports + bool placeSL = true, // Place SL For EQM Supports + bool placeTP = true // Place TP For EQM Supports +) +{ + // + int result = 0; + + // + // Clean result Array ... + Clean(supports); + + // + // Since we Generate Support Signals based on Max In Drawdown Positions ... + // we hae to Find it and then find it's Related Provider ... + // then recieve Market Conditions based on it's Signaller's Provider ... + // then try to Generate Supports ... + XPosition inDrawdownPositions[]; + int inDrawdownPositionsCount = GetInDrawdownPositions( + inDrawdownPositions, + NULL, // All Symbols ... + NULL, // All TYpe Of Positions ... + NULL, // All Periods ... + NULL, // All Providers ... + X_POSITION_SELECT_MAX // we need Max InDrawdown ... + ); + if (inDrawdownPositionsCount <= 0) + { + return result; + } + + // + // Since We Select Max here ... + // and also check count ... + // just Recieve Max In DD Position ... + XPosition maxInDDPosition = inDrawdownPositions[0]; + + // + // Here we can Select Provider based on InDD Position ... + int providerIDX = GetProviderIndex( + maxInDDPosition.symbol, + maxInDDPosition.period); + + // + // Validate Index ... + if (providerIDX <= -1) + { + return result; + } + + // + double entry = GetEntry( + maxInDDPosition.symbol, + maxInDDPosition.type); + + // + // Retrieve Market Conditions Based on Specific Provider ... + X121MarketConditions conditions = mProviders[providerIDX] + .provider + .GetMarketConditions(0); + + // + // Retrieve Support and Resistance ... + XOHCLSupRes supRes = mProviders[providerIDX] + .provider + .GenerateSupportAndResistance( + entry, + 36 // + ); + + // + double volume = GetEQMSupportVolume(); + + // + // Try to Find above peak and below vale Pivots ... + double pivots[]; + mProviders[providerIDX] + .provider + .FillPivotPoints(pivots); + + // // + // GenerateFiboEQMSupports( + // conditions, + // maxInDDPosition, + // supports, + // pivots, + // volume, + // placeSL, + // placeTP); + + // + // GenerateSupportAndResistanceEQMSupports( + // conditions, + // maxInDDPosition, + // supRes, + // supports, + // volume, + // placeSL, + // placeTP); + + // + result = ArraySize(supports); + + // + return result; +} + +// +// Count all open Positions Volume for supports ... +double GetEQMSupportVolume( + bool ignoreEQM = true // Ignore EQM Positions +) +{ + // + double result = 0; + + // + // TODO: + // add to Props ... + double maxEQMSupportVolume = 0.3; + + // + // Retrieve Positions ... + XPosition positions[]; + int positionsCount = GetPositions(positions); + if (positionsCount <= 0) + { + return result; + } + + // + // Retrieve EQM Positions and Check ... + // if it's count bigger than 0 means there are an Open + // EQM Support Position and we do not have to do anything ... + XPosition eqmPositions[]; + int eqmPositionsCount = GetEQMPositions(eqmPositions); + if (!ignoreEQM && eqmPositionsCount > 0) + { + return result; + } + + // + for (int i = 0; i < positionsCount; i++) + { + // + XPosition iPosition = positions[i]; + + // + result += iPosition.volume; + } + + // + // Multiply Volume Summary ... + // TODO: Make it Configurable ... + result *= 1; + if (result > maxEQMSupportVolume) + { + result = maxEQMSupportVolume; + } + + // + return result; +} + +// +void HandleEQMSupportPlacement() +{ + // + // TODO: Add Longest Age in Props ... + int longDetectionAgeForInDrawDownPositions = 26; + int longDetectionAgeForUntriggeredSupports = 26; + + // + // Here we have to Place EQM Support Orders ... + + // + // First Check Exists Supports ... + XOrder orders[]; + int ordersCount = GetEQMOrders(orders); + if (ordersCount > 0) + { + // + // When there are Exists Untriggered EQM Support Orders ... + // first we have to check their Age ... + // if it's longest as enough for replacing, cance all EQM Orders and regenerate new Ones ... + // otherwise wait until they triggered or be long as enough ... + + // + int minEQMSupportAge = 0; + for (int i = 0; i < ordersCount; i++) + { + // + XOrder iOrder = orders[i]; + + // + int iAge = GetAge(iOrder); + minEQMSupportAge = minEQMSupportAge == 0 || + minEQMSupportAge > iAge + ? iAge + : minEQMSupportAge; + } + + // + // we have min support order's age ... + // check it is long enough for cancelling or not ... + bool isTooOld = minEQMSupportAge >= longDetectionAgeForUntriggeredSupports; + if (!isTooOld) + { + return; + } + + // + // we are sre exists EQM Supports are To old ... + bool isCancelled = CancelAllEQMOrders(); + if (!isCancelled) + { + return; + } + } + + // + XSignal signals[]; + int signalsCount = GenerateEQMSupports(signals); + if (signalsCount <= 0) + { + return; + } + + // + string comment = GenerateXEQMSupportComment(); + int executed = mTrader.ExecuteSignals( + signals, + comment // + ); + if (executed > 0) + { + // + string message = "Execute (" + ToString(executed) + ") EQM Supports ..."; + + // + LogMessage(message); + } +} diff --git a/MQLTestWorkspace/BKPS/Templates/old.candle.draw.mq5 b/MQLTestWorkspace/BKPS/Templates/old.candle.draw.mq5 new file mode 100644 index 0000000..fece105 --- /dev/null +++ b/MQLTestWorkspace/BKPS/Templates/old.candle.draw.mq5 @@ -0,0 +1,976 @@ +// +// XOHCL ... +void DrawCandleAsLine( + XOHCL &c, // the Candle Which required to Draw ... + const datetime time, // Candle Time ... + string tag = "", // Draw Tag ... + // + bool drawOpen = true, // Draw Open ... + int openWidth = 1, // Open Width ... + color clrOpen = clrLime, // Open Color ... + ENUM_LINE_STYLE openStyle = STYLE_SOLID, // Open Style ... + // + bool drawHigh = true, // Draw High ... + int highWidth = 1, // High Width ... + color clrHigh = clrAqua, // High Color ... + ENUM_LINE_STYLE highStyle = STYLE_SOLID, // High Style ... + // + bool drawClose = true, // Draw Close ... + int closeWidth = 1, // Close Width ... + color clrClose = clrRed, // Close Color ... + ENUM_LINE_STYLE closeStyle = STYLE_SOLID, // Cose Style ... + // + bool drawLow = true, // Draw Low ... + int lowWidth = 1, // Low Width ... + color clrLow = clrMagenta, // Low Color ... + ENUM_LINE_STYLE lowStyle = STYLE_SOLID // Low Style ... +) +{ + // + int subWindow = 0; + long chartId = ChartID(); + + // + datetime cTime = TimeCurrent(); + + // + // Open ... + if (drawOpen) + { + // + string openTag = tag + "|O|" + ToString(c.open); + + // + // Check if Object Exists Delete it ... + bool isExists = IsDrawExists( + openTag, + chartId, + subWindow // + ); + + // + if (isExists) + { + // + // Move ... + } + else + { + // + // Draw ... + DrawTrendLine( + chartId, + openTag, + subWindow, + time, + c.open, + cTime, + c.open, + clrOpen, + openStyle, + openWidth // + ); + } + } + + // + // High ... + if (drawHigh) + { + // + string highTag = tag + "|H|" + ToString(c.high); + + // + // Check if Object Exists Delete it ... + bool isExists = IsDrawExists( + highTag, + chartId, + subWindow // + ); + + // + if (isExists) + { + // + // Move ... + } + else + { + // + // Draw ... + DrawTrendLine( + chartId, + highTag, + subWindow, + time, + c.high, + cTime, + c.high, + clrHigh, + highStyle, + highWidth // + ); + } + } + + // + // Close ... + if (drawClose) + { + // + string closeTag = tag + "|C|" + ToString(c.close); + + // + // Check if Object Exists Delete it ... + bool isExists = IsDrawExists( + closeTag, + chartId, + subWindow // + ); + + // + if (isExists) + { + // + // Move ... + } + else + { + // + // Draw ... + DrawTrendLine( + chartId, + closeTag, + subWindow, + time, + c.close, + cTime, + c.close, + clrClose, + closeStyle, + closeWidth // + ); + } + } + + // + // Low ... + if (drawLow) + { + // + string lowTag = tag + "|L|" + ToString(c.low); + + // + // Check if Object Exists Delete it ... + bool isExists = IsDrawExists( + lowTag, + chartId, + subWindow // + ); + + // + if (isExists) + { + // + // Move ... + } + else + { + // + // Draw ... + DrawTrendLine( + chartId, + lowTag, + subWindow, + time, + c.low, + cTime, + c.low, + clrLow, + lowStyle, + lowWidth // + ); + } + } +} + + + + +// +// Define a Draw Specifications ... +struct XDrawSpecifications +{ + // + // Props ... + + // + bool draw; // Draw or Not ... + + // + int width; // Draw Witdth ... + color clr; // Draw Color ... + ENUM_LINE_STYLE style; // Draw Style ... + + // + bool back; // in the background + bool fill; // fill object if supported + bool selection; // highlight to move + bool rayRight; // line's continuation to the right + bool hidden; // hidden in the object list + long zOrder; // priority for mouse click + + // + // Constructor ... + XDrawSpecifications() + { + Clean(); + } + + // + // Operator ... + void operator=(const XDrawSpecifications &value) + { + // + clr = value.clr; + draw = value.draw; + width = value.width; + style = value.style; + + // + back = value.back; + hidden = value.hidden; + zOrder = value.zOrder; + rayRight = value.rayRight; + selection = value.selection; + + // + fill = value.fill; + } + + // + // Functions ... + + // + void Clean() + { + // + draw = false; + width = 1; + clr = CLR_NONE; + style = STYLE_SOLID; + + // + back = false; + hidden = false; + rayRight = false; + selection = false; + fill = false; + + // + zOrder = 0; + } +}; + +// +// Candle Draw Specifications ... +struct XOHCLDrawSpecification +{ + // + // Props ... + XDrawSpecifications openStyle; + XDrawSpecifications highStyle; + XDrawSpecifications closeStyle; + XDrawSpecifications lowStyle; + + // + // Constructors ... + XOHCLDrawSpecification() + { + Clean(); + } + + // + // Operators ... + void operator=(const XOHCLDrawSpecification &value) + { + // + lowStyle = value.lowStyle; + openStyle = value.openStyle; + highStyle = value.highStyle; + closeStyle = value.closeStyle; + } + + // + // Functions ... + + // + void Clean() + { + // + lowStyle.Clean(); + openStyle.Clean(); + highStyle.Clean(); + closeStyle.Clean(); + } + + // + void Default() + { + // + // Open ... + openStyle.width = 1; + openStyle.draw = true; + openStyle.clr = clrLime; + openStyle.style = STYLE_SOLID; + + // + // High ... + highStyle.width = 1; + highStyle.draw = true; + highStyle.clr = clrAqua; + highStyle.style = STYLE_SOLID; + + // + // Close ... + closeStyle.width = 1; + closeStyle.draw = true; + closeStyle.clr = clrRed; + closeStyle.style = STYLE_SOLID; + + // + // Low ... + lowStyle.width = 1; + lowStyle.draw = true; + lowStyle.clr = clrMagenta; + lowStyle.style = STYLE_SOLID; + } + + // + void Width(int value) + { + // + lowStyle.width = value; + openStyle.width = value; + highStyle.width = value; + closeStyle.width = value; + } + + // + void Style(ENUM_LINE_STYLE value) + { + // + lowStyle.style = value; + openStyle.style = value; + highStyle.style = value; + closeStyle.style = value; + } + + // + void Color(color value) + { + // + lowStyle.clr = value; + openStyle.clr = value; + highStyle.clr = value; + closeStyle.clr = value; + } + + // + void RayRight(bool value) + { + // + lowStyle.rayRight = value; + openStyle.rayRight = value; + highStyle.rayRight = value; + closeStyle.rayRight = value; + } + + // + void Draw(bool value) + { + // + lowStyle.draw = value; + openStyle.draw = value; + highStyle.draw = value; + closeStyle.draw = value; + } + + // + void Back(bool value) + { + // + lowStyle.back = value; + openStyle.back = value; + highStyle.back = value; + closeStyle.back = value; + } + + // + void Fill(bool value) + { + // + lowStyle.fill = value; + openStyle.fill = value; + highStyle.fill = value; + closeStyle.fill = value; + } +}; + +// +bool RemoveCandle( + XOHCL &c, + long chartId = 0, + int subWindow = 0 // +) +{ + // + bool result = false; + + // + string cTag = GenerateTag(c); + + // + result = IsDrawExists( + cTag, + chartId, + subWindow); + if (!result) + { + return result; + } + + // + RemoveDraws( + cTag, + chartId, + subWindow); + + // + return result; +} + +// +// XOHCL ... +void DrawCandleAsLine( + long chartId, // Chart ID ... + int subWindow, // SubWindow ... + XOHCL &c, // the Candle Which required to Draw ... + const datetime time, // Candle Time ... + XOHCLDrawSpecification &config, // Draw Specifications ... + string tag = "", // Draw Tag ... + bool update = true, // Update Draw if Exists ... + bool drawMidLine = true // Draw Open Close Middle Line ... +) +{ + // + datetime cTime = TimeCurrent(); + XDrawSpecifications specs; + + // + string baseTag = tag + GenerateTag(c); + + // + // Open ... + specs = config.openStyle; + if (specs.draw) + { + // + double value = c.open; + string valueTag = "|O|"; + + // + string mTag = baseTag + valueTag + ToString(value); + + // + // Check if Object Exists Delete it ... + bool isExists = IsDrawExists( + mTag, + chartId, + subWindow // + ); + bool canDraw = !isExists || (isExists && update); + + // + if (isExists && canDraw) + { + // + DeleteTrendLine( + chartId, + mTag); + } + + // + if (canDraw) + { + // + // Draw ... + DrawTrendLine( + chartId, + mTag, + subWindow, + time, + value, + cTime, + value, + specs.clr, + specs.style, + specs.width, + specs.back, + specs.selection, + specs.rayRight, + specs.hidden, + specs.zOrder // + ); + } + } + + // + // High ... + specs = config.highStyle; + if (specs.draw) + { + // + double value = c.high; + string valueTag = "|H|"; + + // + string mTag = baseTag + valueTag + ToString(value); + + // + // Check if Object Exists Delete it ... + bool isExists = IsDrawExists( + mTag, + chartId, + subWindow // + ); + bool canDraw = !isExists || (isExists && update); + + // + if (isExists && canDraw) + { + // + DeleteTrendLine( + chartId, + mTag); + } + + // + if (canDraw) + { + // + // Draw ... + DrawTrendLine( + chartId, + mTag, + subWindow, + time, + value, + cTime, + value, + specs.clr, + specs.style, + specs.width, + specs.back, + specs.selection, + specs.rayRight, + specs.hidden, + specs.zOrder // + ); + } + } + + // + // Close ... + specs = config.closeStyle; + if (specs.draw) + { + // + double value = c.close; + string valueTag = "|C|"; + + // + string mTag = baseTag + valueTag + ToString(value); + + // + // Check if Object Exists Delete it ... + bool isExists = IsDrawExists( + mTag, + chartId, + subWindow // + ); + bool canDraw = !isExists || (isExists && update); + + // + if (isExists && canDraw) + { + // + DeleteTrendLine( + chartId, + mTag); + } + + // + if (canDraw) + { + // + // Draw ... + DrawTrendLine( + chartId, + mTag, + subWindow, + time, + value, + cTime, + value, + specs.clr, + specs.style, + specs.width, + specs.back, + specs.selection, + specs.rayRight, + specs.hidden, + specs.zOrder // + ); + } + } + + // + // Low ... + specs = config.lowStyle; + if (specs.draw) + { + // + double value = c.low; + string valueTag = "|L|"; + + // + string mTag = baseTag + valueTag + ToString(value); + + // + // Check if Object Exists Delete it ... + bool isExists = IsDrawExists( + mTag, + chartId, + subWindow // + ); + bool canDraw = !isExists || (isExists && update); + + // + if (isExists && canDraw) + { + // + DeleteTrendLine( + chartId, + mTag); + } + + // + if (canDraw) + { + // + // Draw ... + DrawTrendLine( + chartId, + mTag, + subWindow, + time, + value, + cTime, + value, + specs.clr, + specs.style, + specs.width, + specs.back, + specs.selection, + specs.rayRight, + specs.hidden, + specs.zOrder // + ); + } + } + + // + double midle = MathAbs(c.open + c.close) / 2; + string mTag = tag + GenerateTag(c); + + // + // Check if Object Exists Delete it ... + bool isExists = IsDrawExists( + mTag, + chartId, + subWindow // + ); + bool canDraw = !isExists || (isExists && update); + + // + if (isExists && canDraw) + { + // + DeleteTrendLine( + chartId, + mTag); + } + + // + if (canDraw) + { + // + // Draw ... + DrawTrendLine( + chartId, + mTag, + subWindow, + time, + midle, + cTime, + midle, + clrYellow, + STYLE_SOLID, + 2, + false, + false, + false, + false, + 0 // + ); + } +} + +// +void DrawCandleAsBox( + long chartId, // Chart ID ... + int subWindow, // SubWindow ... + XOHCL &c, // the Candle Which required to Draw ... + const datetime time, // Candle Time ... + XOHCLDrawSpecification &config, // Draw Specifications ... + string tag = "", // Draw Tag ... + bool drawBody = true, // Draw Body ... + bool drawShadows = true, // Draw Shadows ... + bool update = true // Update Draw if Exists ... +) +{ + // + datetime cTime = TimeCurrent(); + + // + // First Check all Styles Must Be Draw true ... + bool canDraw = + // + config.openStyle.draw && + config.highStyle.draw && + config.closeStyle.draw && + config.lowStyle.draw + // + ; + + // + if (!canDraw) + { + return; + } + + // + // Next we have to determine Candle is Bullish or Bearish ... + // + bool isBullish = + c.open < c.close; + + // + bool isBearish = + c.open > c.close; + + // + XDrawSpecifications bodySpec; + if (isBullish) + { + bodySpec = config.openStyle; + } + else if (isBearish) + { + bodySpec = config.closeStyle; + } + else + { + // + bodySpec.clr = clrGray; + } + + // + // Now We have to Draw 3 Rectangle ... + // 1- Up Shadow + // 2- Candle Body + // 3- Down Shadow + + // + double upPrice = MathMax(c.open, c.close); + double downPrice = MathMin(c.open, c.close); + double upShadowSize = c.high - upPrice; + double downShadowSize = downPrice - c.low; + + // + string mTag = "OHCL|O" + ToString(c.open) + "|H" + ToString(c.high) + "|C" + ToString(c.close) + "|L" + ToString(c.low) + "|"; + + // + // Draw Up Shadow ... + if (drawShadows) + { + // + string upShadowTag = mTag + "|US|"; + + XDrawSpecifications spec = config.highStyle; + + // + // Check if Object Exists Delete it ... + bool isExists = IsDrawExists( + upShadowTag, + chartId, + subWindow // + ); + + // + bool canDraw = !isExists || (isExists && update); + + // + if (isExists && canDraw) + { + // + DeleteRectangle( + chartId, + upShadowTag // + ); + } + + // + if (canDraw) + { + // + // New ... + DrawRectangle( + chartId, + upShadowTag, + subWindow, + time, + c.high, + cTime, + upPrice, + spec.clr, + spec.style, + spec.width, + spec.fill, + spec.back, + spec.selection, + spec.hidden, + spec.zOrder // + ); + } + } + + // + // Draw Body ... + if (drawBody) + { + // + string bodyTag = mTag + "|BDY|"; + + // + // Check if Object Exists Delete it ... + bool isExists = IsDrawExists( + bodyTag, + chartId, + subWindow // + ); + + // + bool canDraw = !isExists || (isExists && update); + + // + if (isExists && canDraw) + { + // + DeleteRectangle( + chartId, + bodyTag // + ); + } + + // + if (canDraw) + { + // + // New ... + DrawRectangle( + chartId, + bodyTag, + subWindow, + time, + upPrice, + cTime, + downPrice, + bodySpec.clr, + bodySpec.style, + bodySpec.width, + bodySpec.fill, + bodySpec.back, + bodySpec.selection, + bodySpec.hidden, + bodySpec.zOrder // + ); + } + } + + // + // Draw Down Shadow ... + if (drawShadows) + { + // + string downShadowTag = mTag + "|DS|"; + + XDrawSpecifications spec = config.lowStyle; + + // + // Check if Object Exists Delete it ... + bool isExists = IsDrawExists( + downShadowTag, + chartId, + subWindow // + ); + + // + bool canDraw = !isExists || (isExists && update); + + // + if (isExists && canDraw) + { + // + DeleteRectangle( + chartId, + downShadowTag // + ); + } + + // + if (canDraw) + { + // + // New ... + DrawRectangle( + chartId, + downShadowTag, + subWindow, + time, + downPrice, + cTime, + downPrice + downShadowSize, + spec.clr, + spec.style, + spec.width, + spec.fill, + spec.back, + spec.selection, + spec.hidden, + spec.zOrder // + ); + } + } +} diff --git a/MQLTestWorkspace/BKPS/old.mq5 b/MQLTestWorkspace/BKPS/old.mq5 new file mode 100644 index 0000000..b18eed3 --- /dev/null +++ b/MQLTestWorkspace/BKPS/old.mq5 @@ -0,0 +1,314 @@ + +// +// Prepare Signal ... +void PrepareConditionsSignal(X121MarketConditions &conditions) +{ + // + if (!conditions.hasSignal) + { + return; + } + + // + bool isLong = IsLong(conditions.signal.type); + + // + // Check Calculate TP ... + if ( + conditions.signal.sl > 0 && + conditions.signal.tp <= 0 && + conditions.signal.r2r > 0 && + conditions.signal.entry > 0) + { + // + double riskPrice = MathAbs(conditions.signal.entry - conditions.signal.sl); + double riskPoint = PriceToPoint( + conditions.signal.symbol, + riskPrice); + double rewardPoint = riskPoint * conditions.signal.r2r; + double rewardPrice = PointToPrice( + conditions.signal.symbol, + rewardPoint); + + // + double tp = + isLong + ? conditions.signal.entry + rewardPrice + : conditions.signal.entry - rewardPrice; + + // + conditions.signal.tp = tp; + } + + // + PrepareSignal(conditions.signal); + + // + conditions.signal.supportAndResistance = conditions.supportResistances; +} + +// +// TODO: Delete This ... +void DrawConditionsSignalOnChart(X121MarketConditions &conditions) +{ + // + ulong mTicket = MathRand() * 100000; + + // + DrawSignal( + mTicket, + conditions.signal); + + // + DrawSupportResistance( + 0, + conditions.supportResistances, + conditions.signal.providers[0]); +} + + + // + // Catch Trend Changes ... + if (ArraySize(trendStateBuffer) > 1) + { + // + bool isChanged = + trendStateBuffer[0] != trendStateBuffer[1] && + trendStateBuffer[0] != EMPTY_VALUE; + if (isChanged) + { + // + double to = trendBuffer[0]; + double from = trendBuffer[1]; + ENUM_XMAN_STATES state = (ENUM_XMAN_STATES)(int)trendStateBuffer[0]; + datetime at = iTime( + mSymbol, + mPeriod, + barIndex); + + // + XValueChanged lastChange; + bool hasLastChange = GetLastItem( + lastChange, + trendChanges); + bool canAdd = + !hasLastChange + ? true + : lastChange.at < at; + + // + if (canAdd) + { + // + // Here also we Free Trend Changes Sizes if + // its More than 500 ... + if (ArraySize(trendChanges) >= 500) + { + // + // Retrieve Last Change model and add theme + // again ... + + // + Clean(trendChanges); + + // + if (hasLastChange) + { + // + Add( + lastChange, + trendChanges); + } + } + + // + XValueChanged model; + + // + model.to = to; + model.from = from; + model.at = at; + + // + Add( + model, + trendChanges); + + // // + // LogMessage( + // "Trend Changed On: " + ToString(trendChangeddOn) + + // "\n state: " + EnumToString(state) + + // "\n from: " + ToString(lastTrend) + + // "\n to: " + ToString(trend) + + // "\n" + // // + // ); + } + } + } + + // + Copy( + trendChanges, + result.trendChanges); + ArraySetAsSeries( + result.trendChanges, + true); + + // + // Catch Peaks Changes ... + if (ArraySize(peaksBuffer) > 1) + { + // + bool isPeakChanged = + peaksBuffer[0] != peaksBuffer[1] && + peaksBuffer[0] != EMPTY_VALUE; + if (isPeakChanged) + { + // + double peak = peaksBuffer[0]; + double lastPeak = peaksBuffer[1]; + + // + datetime at = iTime( + mSymbol, + mPeriod, + barIndex); + + // + XValueChanged lastChange; + bool hasLastChange = GetLastItem( + lastChange, + peakChanges); + bool canAdd = + !hasLastChange + ? true + : lastChange.at < at; + + // + if (canAdd) + { + // + // Here also we Free Trend Changes Sizes if + // its More than 500 ... + if (ArraySize(peakChanges) >= 500) + { + // + // Retrieve Last Change model and add theme + // again ... + + // + Clean(peakChanges); + + // + if (hasLastChange) + { + // + Add( + lastChange, + peakChanges); + } + } + + // + XValueChanged model; + + // + model.to = peak; + model.from = lastPeak; + model.at = at; + + // + Add( + model, + peakChanges); + } + } + } + + // + Copy( + peakChanges, + result.peakChanges); + ArraySetAsSeries( + result.peakChanges, + true); + + // + // Catch Vales Changes ... + if (ArraySize(valesBuffer) > 1) + { + // + bool isChanged = + valesBuffer[0] != valesBuffer[1] && + valesBuffer[0] != EMPTY_VALUE; + if (isChanged) + { + // + double peak = peaksBuffer[0]; + double lastPeak = peaksBuffer[1]; + + // + datetime at = iTime( + mSymbol, + mPeriod, + barIndex); + + // + XValueChanged lastChange; + bool hasLastChange = GetLastItem( + lastChange, + peakChanges); + bool canAdd = + !hasLastChange + ? true + : lastChange.at < at; + + // + if (canAdd) + { + // + // Here also we Free Trend Changes Sizes if + // its More than 500 ... + if (ArraySize(peakChanges) >= 500) + { + // + // Retrieve Last Change model and add theme + // again ... + + // + Clean(peakChanges); + + // + if (hasLastChange) + { + // + Add( + lastChange, + peakChanges); + } + } + + // + XValueChanged model; + + // + model.to = peak; + model.from = lastPeak; + model.at = at; + + // + Add( + model, + peakChanges); + } + } + } + + // + Copy( + peakChanges, + result.peakChanges); + ArraySetAsSeries( + result.peakChanges, + true); diff --git a/MQLTestWorkspace/BKPS/x-saherelm.x121.condition.parser.lib copy.mq5 b/MQLTestWorkspace/BKPS/x-saherelm.x121.condition.parser.lib copy.mq5 index b400d27..a451190 100644 --- a/MQLTestWorkspace/BKPS/x-saherelm.x121.condition.parser.lib copy.mq5 +++ b/MQLTestWorkspace/BKPS/x-saherelm.x121.condition.parser.lib copy.mq5 @@ -5085,3 +5085,104 @@ for (int i = 1; i < pivotsCount - 1; i++) } } } + + + // + double lastMax = 0; + while (ArraySize(tmp) > 0) + { + // + int maxIDX = ArrayMaximum(tmp); + if (maxIDX <= -1) + { + break; + } + + // + double max = tmp[maxIDX]; + double maxLesser = FindLesserThanValue( + max, + pivots, + true); + if (maxLesser == -1) + { + maxLesser = boundaryMin; + } + + // + if (price < max && price > maxLesser) + { + // + if (longSupport) + { + LogMessage("Create Long Max Breakeout Signal"); + } + + // + if (shortSupport) { + LogMessage("Create Max Short Breakeout Signals"); + } + } + + // // + // // Check Max ... + // if ( + // price < max && + // (lastMax == 0 || (lastMax > 0 && price > lastMax))) + // { + // // + // // Create Long for Aboves ... + // if (longSupport) + // { + // // + // type = POSITION_TYPE_BUY; + // mode = X_ORDER_MODE_STOP; + + // // + // tp = tpValue == 0 && placeTP + // ? lastMax + // : tpValue; + // entry = max; + // sl = slValue == 0 && placeSL + // ? maxLesser + // : slValue; + + // // + // signal = CreateSignal( + // symbol, + // period, + // type, + // mode, + // entry, + // volume, + // tp, + // sl); + + // // + // Add( + // signal, + // signals); + // } + + // + // Short for Belows ... + + // + // Long for Below Ups ... + // } + + // + LogMessage("MAX: " + ToString(max)); + LogMessage("MAX Lesser: " + ToString(maxLesser)); + LogMessage("MAX Last: " + ToString(lastMax)); + + // + Remove( + max, + tmp // + ); + lastMax = max; + } + + // + LogMessage("FFFF"); diff --git a/MQLTestWorkspace/BKPS/x-saherelm.x121.xea.class.mq5 b/MQLTestWorkspace/BKPS/x-saherelm.x121.xea.class.mq5 new file mode 100644 index 0000000..1928328 --- /dev/null +++ b/MQLTestWorkspace/BKPS/x-saherelm.x121.xea.class.mq5 @@ -0,0 +1,1565 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Class Library +// ---------------------------------------------- +// Name: XSCX121EA +// Description: an Expert Class which +// used X121 Setup ... +// +// +// 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 + +// +// START Import and Inclused requirements ... +// + +// +// Includes ... +#include "../Classes/x-saherelm.xea.class.mq5" +#include "../Libraries/x-saherelm.x121.draw.lib.mq5" +#include "../Classes/x-saherelm.x121.provider.class.mq5" + +// +// END Import and Inclused requirements ... +// + +// +// START Definitions ... +// + +// +// END Definitions ... +// + +// +// START Overrides ... +// + +// +// END Overrides ... +// + +// +// an Expert Advisor Class by X121Provider ... +class XSCX121EA : public XSCBaseEA +{ + // + // Public ... +public: + // + // Props ... + + // + // Constructor ... + void XSCX121EA( + string symbol, // Trading Symbol + ENUM_TIMEFRAMES period, // Trading Time Frame + ulong magic, // Magic Number + int slippage, // Slippgae + double maxAllowedSpread = 0, // Max Allowed Spread to Execute Signal + int maxAllowedPositions = 0, // Maximum Allowed Same Time Position + double minProfitPerTrade = 0, // Min Profit Per Trade based On Volume Factor (Hedge) + double minProfitPerVolumeFactor = 0, // Min Volume Factor for Calculating Profit (Hedge) + double maxAllowedDrawDownFactor = 0, // Max Allowed Drawdown factor for Open New Positions + TOnStopLoss onStopLossTriggered = NULL, // On StopLoass Triggered Event Handler + TOnTakeProfit onTakeProfitTriggered = NULL, // On TakeProfit Triggered Event Handler + TOnDealsChanged onDealsChangedHandler = NULL, // On Deals Changed Event Handler + TOnOrdersChanged onOrdersChangedHandler = NULL, // On Orders Changed Event Handler + TOnPositionsChanged onPositionsChangedHandler = NULL, // On Positions Changed Event Handler + TOnTradeStateChanged onTradeStateChangedHandler = NULL, // On Trade State Changed Event Handler + TOnSignalConditions onSignalConditions = NULL // On SignalConditions Event Handler + ) : XSCBaseEA(symbol, + period, + magic, + slippage, + maxAllowedSpread, + maxAllowedPositions, + minProfitPerTrade, + minProfitPerVolumeFactor, + maxAllowedDrawDownFactor, + onStopLossTriggered, + onTakeProfitTriggered, + onDealsChangedHandler, + onOrdersChangedHandler, + onPositionsChangedHandler, + onTradeStateChangedHandler) + { + mOnSignalConditions = onSignalConditions; + } + + // + // DeConstructor ... + void ~XSCX121EA() + { + // + // Delete All Registered Providers ... + int providersCount = ArraySize(mProviders); + if (providersCount > 0) + { + // + for (int i = 0; i < providersCount; i++) + { + // + X121SignalProvider iProvider = mProviders[i]; + + // + delete iProvider.provider; + } + } + } + + // + // START Properties ... + // + + // + // Min Profit Per Trade ... + + // + bool MinProfitPerTrade(double value) + { + // + bool result = false; + + // + if (value <= 0) + { + return result; + } + + // + result = value > 0; + if (value == mMinProfitPerTrade) + { + return result; + } + + // + mMinProfitPerTrade = value; + + // + return result; + } + + // + double MinProfitPerTrade() + { + return mMinProfitPerTrade; + } + + // + // Min Profit Per Volume Factor ... + + // + bool MinProfitPerVolumeFactor(double value) + { + // + bool result = false; + + // + if (value <= 0) + { + return result; + } + + // + result = value > 0; + if (value == mMinProfitPerVolumeFactor) + { + return result; + } + + // + mMinProfitPerVolumeFactor = value; + + // + return result; + } + + // + double MinProfitPerVolumeFactor() + { + return mMinProfitPerVolumeFactor; + } + + // + // Add Provider ... + bool AddProvider( + X121SignalProvider &provider // Specific Provider ... + ) + { + // + bool result = false; + + // + // Validate Provider ... + if (provider.symbol == NULL || + provider.period == NULL || + provider.riskAmount <= 0 || + StringLen(provider.symbol) == 0 || + ArraySize(provider.providers) == 0) + { + return result; + } + + // + // Check Exists or not ... + int idx = GetProviderIndex( + provider.symbol, + provider.period); + if (idx >= 0) + { + return result; + } + + // + PrepareProviderConfig(); + + // + // Make Instance of X121Provider Class ... + provider.provider = new XSCX121Provider( + provider.symbol, + provider.period, + true // Ignore Ticks after Recieved a Signal Till new Candle ... + ); + + // + // Attach Event Listener ... + if (mOnSignalConditions != NULL) + { + // + // Attach Event Handlers ... + provider.provider.AddOnSignalConditionEventHandler(mOnSignalConditions); + } + + // + // Set Signallers to Provider Class ... + result = provider.provider.SetSignallers(provider.providers); + if (!result) + { + return result; + } + + // + // Initialize Provider ... + result = provider.provider.SetConfig(mProviderConfig); + + // + // Add Prepared Provider to Providers ... + Add( + provider, + mProviders); + + // + return result; + } + + // + // Add Providers ... + int AddProviders( + X121SignalProvider &providers[] // Specific Providers ... + ) + { + // + int result = 0; + + // + int providersCount = ArraySize(providers); + if (providersCount <= 0) + { + return result; + } + + // + for (int i = 0; i < providersCount; i++) + { + // + X121SignalProvider iProvider = providers[i]; + + // + bool isAdded = AddProvider(iProvider); + if (isAdded) + { + result++; + } + } + + // + return result; + } + + // + // END Properties ... + // + + // + // START Overrides ... + // + + // + void OnPositionsChangedHandler(int count) + { + } + + // + // Handle TakeProfit Event ... + void OnTakeProfitTriggered(const XDeal &deal) + { + // + // Since we Use Hedge in Min Profit ... + // Some times a Position Modified and SL Trails ... + // this Position closed through sl Event ... + // here we Must Close positions's Pack Orders ... + + // + // So We Have to Get Positions Pack ... + XPositionPack dealPack; + bool hasPack = mTrader.GetDealPack( + deal, + dealPack); + if (hasPack) + { + HandleClosePack(dealPack); + } + + // + CancelAllEQMOrders(); + } + + // + // Handle StopLoss Event ... + void OnStopLossTriggered(const XDeal &deal) + { + // + // Since we Use Hedge in Min Profit ... + // Some times a Position Modified and SL Trails ... + // this Position closed through sl Event ... + // here we Must Close positions's Pack Orders ... + + // + // So We Have to Get Positions Pack ... + XPositionPack dealPack; + bool hasPack = mTrader.GetDealPack( + deal, + dealPack); + if (hasPack) + { + HandleClosePack(dealPack); + } + + // + CancelAllEQMOrders(); + } + + // + // END Overrides ... + // + + // + // START Inheritance Functions ... + // + + // + void PrepareTag() + { + mTag = "X121EA:" + mSymbol + "," + ToString(mPeriod) + (string)mMagic; + } + + // + // Check Providers Guard States ... + bool CheckGuard(XGuard &guards[]) + { + // + bool result = false; + + // + Clean(guards); + + // + // Positions Management ... + // HandlePositionManagement(); + + // + int providersCount = ArraySize(mProviders); + if (providersCount <= 0) + { + return result; + } + + // + for (int i = 0; i < providersCount; i++) + { + // + X121SignalProvider iProvider = mProviders[i]; + + // + XGuard iGuards[]; + bool iHasGuard = iProvider.provider.GuardCheck(iGuards); + if (iHasGuard) + { + // + Copy( + iGuards, + guards, + false); + } + } + + // + // Here we Can Implement Custom Guards Senario ... + + // + // Do Management Equity ... + HandleEquityManagement(); + + // + result = ArraySize(guards) > 0; + + // + return result; + } + + // + // Check Providers for Signals ... + bool SignalCheck(XSignal &signals[]) + { + // + bool result = false; + + // + Clean(signals); + + // + // Since We may have Custom Supporting Senarios for Positions + // if there is no Equity or Positions Count Passed ... + // we Clear Account Policies Check here and do it after + // recieveing Signals ... + + // + // Check Providers Count ... + int providersCount = ArraySize(mProviders); + if (providersCount <= 0) + { + return result; + } + + // + // Loop through Providers to Recieve Market Sence based on each them ... + for (int i = 0; i < providersCount; i++) + { + // + // Get provider Descriptor Struct ... + X121SignalProvider iProvider = mProviders[i]; + + // + // Check Provider Pivot Point Ready ... + int iFoundedPivots = iProvider.provider.CountPivots(); + int iReuiredPivots = iProvider.provider.GetMinPivots(); + if (iFoundedPivots < iReuiredPivots) + { + // + // Start Retrieveing Pivot Points ... + iProvider.provider.ProccessPivotPoints(); + + // + // ignore Calculating Signals since Pivot Points recieved ... + continue; + } + + // + // Retrieve Market Consitions from Specified Provider ... + X121MarketConditions iConditions; + bool iHasSignal = iProvider.provider.ProcessTick(iConditions); + + // + // Check there is Signal or not ... + if (iHasSignal && iConditions.hasSignal) + { + // + // Check Signalling is Enabled by Signal type ... + bool isiSignalLong = IsLong(iConditions.signal.type); + if ((isiSignalLong && !mEnableLongs) || + (!isiSignalLong && !mEnableShorts)) + { + continue; + } + + // + // Here we Calculate Signals tp/sl volume and etc based on given + // configurations ... + PrepareConditionsSignal(iConditions); + + // + // Add Signal to Retrieved Signals Collection ... + Add( + iConditions.signal, + signals); + } + } + + // + // Here we proccess all Exists Registered Providers and get + // probably signals and add them signals Array ... + + // + // Check Signals Exists for Processing ... + result = ArraySize(signals) > 0; + + // + // IMPORTANT: + // Since we have to Implement our Signal Execution Senario + // Ignore this here for Default behaviour and implememt or Execution ... + if (result) + { + // + // Create an Array for Holding Allowed To Execute Signals ... + // this filled by given Signals from all providers ... + XSignal allowedSignals[]; + + // + // Check Account has required Equity for open Trades or not ... + bool hasEquity = CheckEquityForTrade(); + if (hasEquity) + { + // + // if Equity Exists ... + + // + // Check Positions Count ... + XPosition positions[]; + int positionsCount = GetPositions(positions); + + // + // Calculate Remained Positions based on configurations ... + int remainedPositionsCount = mMaxAllowedPositions - positionsCount; + + // + int incommingSignalsCount = ArraySize(signals); + + // + // Check incomming signals and remained Positions count ... + if (remainedPositionsCount >= incommingSignalsCount) + { + // + // Since we have necessary Equity for Trade ... + // and also remainedPositions count is bigger than incomming signals ... + // Accept all incomming Signals ... + Copy( + signals, + allowedSignals); + } + else + { + // + // since we have necessary Equity for trade ... + // but incomming Signals count is bigger than Max allowed positions at same time ... + // we have to select only remains count ... + for (int i = 0; i < remainedPositionsCount; i++) + { + // + XSignal iSignal = signals[i]; + + // + Add( + iSignal, + allowedSignals); + } + + // + int allowedSignalsCount = ArraySize(allowedSignals); + if (allowedSignalsCount <= 0) + { + // + // TODO: Implement Senario for when to Recieved Signals but + // Max Allowed Trades Reached ... + } + } + } + else + { + // + // there isn't enough Equity for Trade ... + // How to Select Signals when there is no Equity for Trade ... + + // + // TODO: we can Implement Equity Management here ... + + // + LogMessage("No Equity ..."); + } + + // + // Check Allowed Signals Count ... + int allowedSignalsCount = ArraySize(allowedSignals); + if (allowedSignalsCount <= 0) + { + return false; + } + + // + // Now we Sure the Equity is OK and only have Acceptable Signals count ... + + // + // Here We Have to Check Signals based On it's Providers ... + allowedSignalsCount = CheckSignalsProviderState(allowedSignals); + if (allowedSignalsCount <= 0) + { + return false; + } + + // + // Prepare Allowed Signals for Execution ... + PrepareSignals(allowedSignals); + + // + // Execute Signals oly when allowed ... + int executed = mTrader.ExecuteSignals(allowedSignals); + if (executed > 0) + { + // + // Draw Signal ... + // On Chart ... + DrawSignals( + allowedSignals, + true); + } + + // + // Prevent Default Base Signal Execution ... + + // + Clean(signals); + + // + return false; + } + + // + return result; + } + + // + // END Inheritance Functions ... + // + + // + // START Provided Actions ... + // + + // + // END Provided Actions ... + // + + // + // Protected ... +protected: + // + // Private ... +private: + // + // Props ... + X121SignalProvider mProviders[]; + X121ProviderInputs mProviderConfig; + TOnSignalConditions mOnSignalConditions; + + // + // Actions ... + + // + // Pepare a Collection Of Signals ... + void PrepareSignals(XSignal &signals[]) + { + // + int signalsCount = ArraySize(signals); + if (signalsCount <= 0) + { + return; + } + + // + for (int i = 0; i < signalsCount; i++) + { + // + PrepareSignal(signals[i]); + } + } + + // + // EQUITYMANAGEMENT ... + // + + // + // All available Equity Actions Implemented here ... + void HandleEquityManagement() + { + // + // TODO: Complete this ... + + // + // Here we Must first Check Number of Trades ... + XPosition positions[]; + int positionsCount = GetPositions(positions); + if (positionsCount <= 0) + { + return; + } + + // + double profit = CalculatePositionsProfit(positions); + double requiredProfit = CalculatePositionsProfit(positions); + + // + if (profit > 0 && + positionsCount >= mMaxAllowedPositions) + { + // + // TODO: + // Wait for Max Profit for Closing all Open Positions ... + // Also Support Orders ... + + // + // here we have to Multiply requirement profit for hedging ... + bool canHedge = profit >= (requiredProfit * 1.5); + string comment = "EQM Hedge ..."; + int closed = mTrader.ClosePositions( + positions, + comment); + if (closed > 0) + { + // + // Cancel All Placed Support Orders ... + CancelAllEQMOrders(); + + // + string message = "EQM Closed (" + ToString(positionsCount) + ") due Hedge by: " + ToString(profit); + + // + LogMessage(message); + } + + // + return; + } + else if (profit > 0 && positionsCount > 1) + { + // + // Here we can Hedge Positions in regular Senario ... + bool canHedge = profit >= requiredProfit; + string comment = "EQM Hedge ..."; + int closed = mTrader.ClosePositions( + positions, + comment); + if (closed > 0) + { + // + // Cancel All Placed Support Orders ... + CancelAllEQMOrders(); + + // + string message = "EQM Closed (" + ToString(positionsCount) + ") due Hedge by: " + ToString(profit); + + // + LogMessage(message); + } + + // + return; + } + + // + // TODO: Add Longest Age in Props ... + int longDetectionAgeForInDrawDownPositions = 26; + int longDetectionAgeForUntriggeredSupports = 26; + + // + // Here we have to Place Support Signals if there is no Equity ... + bool hasEquity = CheckEquityForTrade(); + if (profit < 0 && !hasEquity) + { + // + // Retrieve and Placed EQM Support Orders ... + HandleEQMSupportPlacement(); + } + else if (profit < 0 && hasEquity) + { + // + // Here there are some Open Positions and we have eQuity but + // there isn't new Signals and exists positions in DrawDown ... + + // + // here we have to Generate EQM Support Signal ... + + // + // First try to Find Max In Draw down Position ... + XPosition inDPositions[]; + int inDPositionsCount = GetInDrawdownPositions( + inDPositions, + NULL, + NULL, + NULL, + NULL, + X_POSITION_SELECT_MAX); + if (inDPositionsCount <= 0) + { + return; + } + + // + XPosition maxInDPosition = inDPositions[0]; + int maxInDPositionAge = GetAge(maxInDPosition); + + // + bool isSupportable = maxInDPositionAge >= longDetectionAgeForInDrawDownPositions; + if (!isSupportable) + { + return; + } + + // + // now we are sure Max In DrawDown Position is Supportable ... + HandleEQMSupportPlacement(); + } + } + + // + // Retrieve All EQM Placed Support Orders ... + int GetEQMOrders( + XOrder &orders[] // Hold Result + ) + { + // + int result = 0; + + // + XOrder allOrders[]; + int allOrdersCount = GetOrders(allOrders); + if (allOrdersCount <= 0) + { + return result; + } + + // + // Extract EQM Orders ... + result = GetEQMSupportOrders( + orders, + allOrders); + + // + return result; + } + + // + // Retrieve All EQM Support Positions ... + int GetEQMPositions( + XPosition &positions[] // Hold Result + ) + { + // + int result = 0; + + // + XPosition allPositions[]; + int allPositionsCount = GetPositions(allPositions); + if (allPositionsCount <= 0) + { + return result; + } + + // + // Extract EQM Positions ... + result = GetEQMSupportPositions( + positions, + allPositions); + + // + return result; + } + + // + // Cancel all EQM Placed Support Orders ... + bool CancelAllEQMOrders() + { + // + bool result = false; + + // + XOrder eqmOrders[]; + int eqmOrdersCount = GetEQMOrders(eqmOrders); + if (eqmOrdersCount <= 0) + { + return result; + } + + // + result = mTrader.CancelOrders(eqmOrders); + + // + return result; + } + + // + // Generate EQM Support Signals ... + int GenerateEQMSupports( + XSignal &supports[], // Holds Supports + bool placeSL = true, // Place SL For EQM Supports + bool placeTP = true // Place TP For EQM Supports + ) + { + // + int result = 0; + + // + // Clean result Array ... + Clean(supports); + + // + // Since we Generate Support Signals based on Max In Drawdown Positions ... + // we hae to Find it and then find it's Related Provider ... + // then recieve Market Conditions based on it's Signaller's Provider ... + // then try to Generate Supports ... + XPosition inDrawdownPositions[]; + int inDrawdownPositionsCount = GetInDrawdownPositions( + inDrawdownPositions, + NULL, // All Symbols ... + NULL, // All TYpe Of Positions ... + NULL, // All Periods ... + NULL, // All Providers ... + X_POSITION_SELECT_MAX // we need Max InDrawdown ... + ); + if (inDrawdownPositionsCount <= 0) + { + return result; + } + + // + // Since We Select Max here ... + // and also check count ... + // just Recieve Max In DD Position ... + XPosition maxInDDPosition = inDrawdownPositions[0]; + + // + // Here we can Select Provider based on InDD Position ... + int providerIDX = GetProviderIndex( + maxInDDPosition.symbol, + maxInDDPosition.period); + + // + // Validate Index ... + if (providerIDX <= -1) + { + return result; + } + + // + double entry = GetEntry( + maxInDDPosition.symbol, + maxInDDPosition.type); + + // + // Retrieve Market Conditions Based on Specific Provider ... + X121MarketConditions conditions = mProviders[providerIDX] + .provider + .GetMarketConditions(0); + + // + // Retrieve Support and Resistance ... + XOHCLSupRes supRes = mProviders[providerIDX] + .provider + .GenerateSupportAndResistance( + entry, + 36 // + ); + + // + double volume = GetEQMSupportVolume(); + + // + // Try to Find above peak and below vale Pivots ... + double pivots[]; + mProviders[providerIDX] + .provider + .FillPivotPoints(pivots); + + // // + // GenerateFiboEQMSupports( + // conditions, + // maxInDDPosition, + // supports, + // pivots, + // volume, + // placeSL, + // placeTP); + + // + // GenerateSupportAndResistanceEQMSupports( + // conditions, + // maxInDDPosition, + // supRes, + // supports, + // volume, + // placeSL, + // placeTP); + + // + result = ArraySize(supports); + + // + return result; + } + + // + // Count all open Positions Volume for supports ... + double GetEQMSupportVolume( + bool ignoreEQM = true // Ignore EQM Positions + ) + { + // + double result = 0; + + // + // TODO: + // add to Props ... + double maxEQMSupportVolume = 0.3; + + // + // Retrieve Positions ... + XPosition positions[]; + int positionsCount = GetPositions(positions); + if (positionsCount <= 0) + { + return result; + } + + // + // Retrieve EQM Positions and Check ... + // if it's count bigger than 0 means there are an Open + // EQM Support Position and we do not have to do anything ... + XPosition eqmPositions[]; + int eqmPositionsCount = GetEQMPositions(eqmPositions); + if (!ignoreEQM && eqmPositionsCount > 0) + { + return result; + } + + // + for (int i = 0; i < positionsCount; i++) + { + // + XPosition iPosition = positions[i]; + + // + result += iPosition.volume; + } + + // + // Multiply Volume Summary ... + // TODO: Make it Configurable ... + result *= 1; + if (result > maxEQMSupportVolume) + { + result = maxEQMSupportVolume; + } + + // + return result; + } + + // + void HandleEQMSupportPlacement() + { + // + // TODO: Add Longest Age in Props ... + int longDetectionAgeForInDrawDownPositions = 26; + int longDetectionAgeForUntriggeredSupports = 26; + + // + // Here we have to Place EQM Support Orders ... + + // + // First Check Exists Supports ... + XOrder orders[]; + int ordersCount = GetEQMOrders(orders); + if (ordersCount > 0) + { + // + // When there are Exists Untriggered EQM Support Orders ... + // first we have to check their Age ... + // if it's longest as enough for replacing, cance all EQM Orders and regenerate new Ones ... + // otherwise wait until they triggered or be long as enough ... + + // + int minEQMSupportAge = 0; + for (int i = 0; i < ordersCount; i++) + { + // + XOrder iOrder = orders[i]; + + // + int iAge = GetAge(iOrder); + minEQMSupportAge = minEQMSupportAge == 0 || + minEQMSupportAge > iAge + ? iAge + : minEQMSupportAge; + } + + // + // we have min support order's age ... + // check it is long enough for cancelling or not ... + bool isTooOld = minEQMSupportAge >= longDetectionAgeForUntriggeredSupports; + if (!isTooOld) + { + return; + } + + // + // we are sre exists EQM Supports are To old ... + bool isCancelled = CancelAllEQMOrders(); + if (!isCancelled) + { + return; + } + } + + // + XSignal signals[]; + int signalsCount = GenerateEQMSupports(signals); + if (signalsCount <= 0) + { + return; + } + + // + string comment = GenerateXEQMSupportComment(); + int executed = mTrader.ExecuteSignals( + signals, + comment // + ); + if (executed > 0) + { + // + string message = "Execute (" + ToString(executed) + ") EQM Supports ..."; + + // + LogMessage(message); + } + } + + // + // Check Signallers ... + // when recieved signals we have to check each signal + // based on it's signaller ... + // if there isn't any open Position from it's signaller or + // there was open positions and all of them in profit we accept new recieved signal ... + // in this way we can handle balance between signallers and their positions and also + // we prevent big losses ... + int CheckSignalsProviderState(XSignal &signals[]) + { + // + int result = 0; + + // + int signalsCount = ArraySize(signals); + if (signalsCount <= 0) + { + return result; + } + + // + XSignal tmp[]; + Copy( + signals, + tmp); + Clean(signals); + + // + // Loop through Signals ... + for (int i = 0; i < signalsCount; i++) + { + // + XSignal iSignal = tmp[i]; + + // + int providersCount = ArraySize(iSignal.providers); + if (providersCount <= 0) + { + continue; + } + + // + string iSignaller = iSignal.providers[0]; + + // + // Retrieve Signaller's Open Positions ... + XPosition iSignallerPositions[]; + int iSignallerPositionsCount = GetPositions( + iSignallerPositions, + iSignal.symbol, + iSignal.type, + iSignal.period, + iSignaller); + if (iSignallerPositionsCount <= 0) + { + // + // this means we can accept Signal without Checking anything ... + Add( + iSignal, + signals // + ); + + // + // TODO: Here we can Provide Support Signals for First Arrived Signal ... + + // + continue; + } + + // + // here we have to check Signallers open Positions Profit ... + double iSignallerPositionsProfit = CalculatePositionsProfit(iSignallerPositions); + bool isInProfit = iSignallerPositionsProfit > mMinProfitPerTrade; + if (!isInProfit) + { + continue; + } + + // + // this means all Signaller Open Positions in Profit ... + // so we Accept Signal ... + Add( + iSignal, + signals // + ); + } + + // + Clean(tmp); + + // + result = ArraySize(signals); + + // + if (result > 0) + { + // + // This means Signallers provide In Profits Positions Before ... + // the Best thing is make them Risk Free at current Signals Minimum Entry ... + // TODO: Complete This ... + // for (int i = 0; i < result; i++) + // { + // // + // XSignal iSignal = signals[i]; + + // // + // HandleGuardHedgeAction( + // iSignal.providers[0], + // iSignal.symbol, + // iSignal.type, + // iSignal.period, + // iSignal.entry + // ); + // } + } + + // + return result; + } + + // + // PROVIDERS ... + // + + // + // Find Specific Provider Index by using give symbol and period ... + int GetProviderIndex( + string symbol, // Trading Symbol ... + ENUM_TIMEFRAMES period // Trading Time frame ... + ) + { + // + int result = -1; + + // + // Validate Args ... + if (period == NULL || + symbol == NULL || + StringLen(symbol) == 0) + { + return result; + } + + // + int providersCount = ArraySize(mProviders); + if (providersCount <= 0) + { + return result; + } + + // + for (int i = 0; i < providersCount; i++) + { + // + X121SignalProvider iProvider = mProviders[i]; + + // + if (iProvider.symbol == symbol && iProvider.period == period) + { + // + result = i; + break; + } + } + + // + return result; + } + + // + // Prepare Default Configurations for X121Provider Setup ... + void PrepareProviderConfig() + { + // + // Set Default X121 Provider Configurations ... + + // + // XMAN ... + + // + // Candle Timer ... + mProviderConfig.xmanConfig.candleTimerColor = clrGold; + mProviderConfig.xmanConfig.candleTimerCorner = CORNER_RIGHT_UPPER; + + // + // Chart Style ... + mProviderConfig.xmanConfig.upColor = clrLime; + mProviderConfig.xmanConfig.downColor = clrRed; + mProviderConfig.xmanConfig.lineColor = clrLime; + mProviderConfig.xmanConfig.bearishColor = clrRed; + mProviderConfig.xmanConfig.bullishColor = clrLime; + mProviderConfig.xmanConfig.volumesColor = clrGreen; + mProviderConfig.xmanConfig.chartMode = CHART_CANDLES; + + // + // Market Cycles ... + + // + // Level 1 ... + mProviderConfig.xmanConfig.l1Method = X_PERIOD_AUTO; + mProviderConfig.xmanConfig.l1Period = NULL; + + // + // Level 1 ... + mProviderConfig.xmanConfig.l2Method = X_PERIOD_AUTO; + mProviderConfig.xmanConfig.l2Period = NULL; + + // + // Level 1 ... + mProviderConfig.xmanConfig.l3Method = X_PERIOD_AUTO; + mProviderConfig.xmanConfig.l3Period = NULL; + + // + // Level 1 ... + mProviderConfig.xmanConfig.l4Method = X_PERIOD_AUTO; + mProviderConfig.xmanConfig.l4Period = NULL; + + // + // Fibonacci ... + mProviderConfig.xmanConfig.fiboLevel1 = 0.236; + mProviderConfig.xmanConfig.fiboLevel2 = 0.382; + mProviderConfig.xmanConfig.fiboLevel3 = 0.5; + mProviderConfig.xmanConfig.fiboLevel4 = 0.618; + mProviderConfig.xmanConfig.fiboLevel5 = 0.764; + + // + // Boundary Detection Modes ... + mProviderConfig.xmanConfig.hhMode = MODE_HIGH; + mProviderConfig.xmanConfig.llMode = MODE_LOW; + + // + // Trend Detection ... + mProviderConfig.xmanConfig.trendMultiplier = 3.5; + mProviderConfig.xmanConfig.trendPriceAppliedTo = PRICE_MEDIAN; + + // + // Ribbon Detection ... + mProviderConfig.xmanConfig.ribbonMode = X_MA_SMMA; + + // + // Hull Trend Detection ... + mProviderConfig.xmanConfig.hullDivisor = 2.0; + mProviderConfig.xmanConfig.hullUpAppliedTo = PRICE_HIGH; + mProviderConfig.xmanConfig.hullDownAppliedTo = PRICE_LOW; + + // + // SSL Channel ... + mProviderConfig.xmanConfig.sslcMode = X_MA_SMA; + mProviderConfig.xmanConfig.sslcUpAppliedTo = PRICE_HIGH; + mProviderConfig.xmanConfig.sslcDownAppliedTo = PRICE_LOW; + + // + // Presentation ... + // NOTE: Since we Configure Presentation on PreDefine Section ... + // here we turn of all Presentations as Default ... + mProviderConfig.xmanConfig.showCandleTimer = false; + mProviderConfig.xmanConfig.showCandles = false; + mProviderConfig.xmanConfig.showHKCandles = false; + mProviderConfig.xmanConfig.showSMHKCandles = false; + mProviderConfig.xmanConfig.showPeaksAndVales = false; + mProviderConfig.xmanConfig.showTrends = false; + mProviderConfig.xmanConfig.fillTrends = false; + mProviderConfig.xmanConfig.showLevels = false; + mProviderConfig.xmanConfig.showConsolidations = false; + mProviderConfig.xmanConfig.showRibbons = false; + mProviderConfig.xmanConfig.showHull = false; + mProviderConfig.xmanConfig.showSSLChannel = false; + mProviderConfig.xmanConfig.showFibo1Levels = false; + mProviderConfig.xmanConfig.showFibo2Levels = false; + mProviderConfig.xmanConfig.showFibo3Levels = false; + mProviderConfig.xmanConfig.showFibo4Levels = false; + mProviderConfig.xmanConfig.showFibo5Levels = false; + + // + PreDefineProviderConfig(); + } + + // + // Config Representation of X121 Provider Setup ... + // for Specified Strategies ... + void PreDefineProviderConfig() + { + // + // Here we have to Name or Predefined Styles ... + bool x786Config = true; + + // + // by default we need to Show Candles and also Candle Timer ... + mProviderConfig.xmanConfig.showCandles = true; + mProviderConfig.xmanConfig.showCandleTimer = true; + + // + // now we act based on Predefined Variables ... + if (x786Config) + { + // + bool showHK = false; + bool showPVs = true; + bool showFibo = true; + bool showHull = true; + bool showSSLC = true; + bool showTrend = true; + bool showRibbon = true; + bool showPVLevels = false; + bool showPVLevelConsolidations = false; + + // + mProviderConfig.xmanConfig.showCandles = !showHK; + mProviderConfig.xmanConfig.showHKCandles = showHK; + mProviderConfig.xmanConfig.showSMHKCandles = true; + + // + mProviderConfig.xmanConfig.showHull = showHull; + mProviderConfig.xmanConfig.showTrends = showTrend; + mProviderConfig.xmanConfig.showRibbons = showRibbon; + mProviderConfig.xmanConfig.showSSLChannel = showSSLC; + + // + mProviderConfig.xmanConfig.showFibo1Levels = showFibo; + mProviderConfig.xmanConfig.showFibo2Levels = showFibo; + mProviderConfig.xmanConfig.showFibo3Levels = showFibo; + mProviderConfig.xmanConfig.showFibo4Levels = showFibo; + mProviderConfig.xmanConfig.showFibo5Levels = showFibo; + + // + mProviderConfig.xmanConfig.showPeaksAndVales = showPVs; + + // + mProviderConfig.xmanConfig.showLevels = showPVLevels; + mProviderConfig.xmanConfig.showConsolidations = showPVLevelConsolidations; + } + } + + // + // Prepare Signal ... + void PrepareConditionsSignal(X121MarketConditions &conditions) + { + // + if (!conditions.hasSignal) + { + return; + } + + // + bool isLong = IsLong(conditions.signal.type); + + // + // Check Calculate TP ... + if ( + conditions.signal.sl > 0 && + conditions.signal.tp <= 0 && + conditions.signal.r2r > 0 && + conditions.signal.entry > 0) + { + // + double riskPrice = MathAbs(conditions.signal.entry - conditions.signal.sl); + double riskPoint = PriceToPoint( + conditions.signal.symbol, + riskPrice); + double rewardPoint = riskPoint * conditions.signal.r2r; + double rewardPrice = PointToPrice( + conditions.signal.symbol, + rewardPoint); + + // + double tp = + isLong + ? conditions.signal.entry + rewardPrice + : conditions.signal.entry - rewardPrice; + + // + conditions.signal.tp = tp; + } + + // + PrepareSignal(conditions.signal); + + // + conditions.signal.supportAndResistance = conditions.supportResistances; + } + + // + // TODO: Delete This ... + void DrawConditionsSignalOnChart(X121MarketConditions &conditions) + { + // + ulong mTicket = MathRand() * 100000; + + // + DrawSignal( + mTicket, + conditions.signal); + + // + DrawSupportResistance( + 0, + conditions.supportResistances, + conditions.signal.providers[0]); + } +}; + +// +// START Usefull Functions ... +// + +// +// END Usefull Functions ... +//

#>$Om2jX7|QeNS)3gXM}iXru5Xu=@kHbSSFjUeGBRjH zy&!1@~ zQ>n5a>tig2O52bjUpctUGuL7#`n|XpKN>qgXR53=U}09%DK#n)CwHf`t-Zy?3KC*u1I1)G%bB>@;J>s z)dHWPOs$Z-g+(#;*@#9S%S>50u^j^9!38O^{ALdYnw7rg6w+$UuB-w6<%)-@7axp3 z07)a`4vgq3%rX&I({1~?k4Urq>Tr3t>Emd>J&8vsKV5;Py)0OhfFa7W3phn0lLDBY zjKAVw|DTjI?>DPGEegdr;Q^41O z00?1~8PlmrXE7yCh69)8fA%8;U)w(v>!YKV6)ochv}(-us_J8m{c$EzCtLjTgZvO1 zR!r0^rKcysnhd5rI61SXUEGN63gHzXVio^{TtFj^4LOGQxB&hmw22Ib9pg-TlPX4I)ZZ5iW_BlW?+A>L(L{v_>PM$Szqo3AM=2OsTQK8aAn6O zu?{w?<7XC}0!{8XdjzbZm8akCcQDO9Rsp)~ZJt;`)k~nnfCloft@Vqj=$;2CzS7Q_ z=QLK#y{S^4jS7axfJ-L9ZobhP?I_#BYW204>c7zaP~eox=sJf%)k)~IBqxz2Ke$&v z(hl|uRP_TH3L3A%suQ8jWcuPVsjlX2lW@I_@&4R0PYD18hGwqr39r36r$#!2mI_z} zE%YF^q}@ubtE<|5+eI@6rb~8e!(230>Nz3^3hSQMEC$@&dMe2-1R9sFk!ME@>Y>0F zpylKtUMo=TetFLBH9TR^Q}q<0N2-Nl#{Cp3q?=Qc_Qx6*4&KkS-eVW!Git=c1nH>D zV1%D_BQG$)6P=iWPRH37)x4lv@%lfmOSiv!1bR^frYo~XSir7YA_>f zi%nK6<9bIUR-9TXo(2l2)ZI7u%2EnoiDvrgMiyv4c%G*}{BxyaDRhTscaMW_xkuLq z(q4NdRb9z1<*Are;p~Y&2dp&BKGE^#yAw6i2icLMroYIgbNy0`Hy^7nzK;bojK&QQ zo4ldfjAo7oA*+vbP-u&cP<)bEk(Atmux>paG=yHK_}NcilHGKBnsQ-FJx*R27)Pw- zLtk_Q4PQlQ2+~d>@upwpHwhl^)0WO>BJqLl}Uy-zMH#4IDD4FZCK2=B&%ryON7BT_RWmd4IH;y|F5r_d#uh|uZ z&cwQ`iO%^4GjNo9t42bC)4=^a0MbUVw_y>#nrwcHX-NxCCvV}AqKPneOndfOJYlw9 z=&hk}y?ZWkNxgoad&XWwq}#pT(Ij!>5SUrqri7ZePcGYLdiQ_D*m~Q35h`N+&Y~}Y zdgTqI$&Wq3Aw~E{qM_YFI4IAG^#7j^UqIc1<5>zHT!Y&-;~xCGnutC}CeqR!@r<4s zZ8LUSdM5&nH){;?GQ@gz{iM^=sL{&8)_J>EU?DOm;bBYKQ+1)9JCMrBWH5r&q|N$% zZ&VT^6f+Lw(`$XU^-{*6^~-~PiG`f4v|Y=Tqq1_;f{w*ICmEz$Vm1%r&Mepo%gc$`C6FgR_ehl9d?kJHzC~k_`nb6j^lWc^%i!uvPxiMKmeD95p z;1FL8sv$d9nAME&V9;aviMVbfeDod&#YrchbIvBCC4EB zk>!-+*87xDpJ?1xCjGc2l_sd#DohdDjjHYd{%j(V00!;WX9i#h96J|5J}a;OK z2FwoX`O5v`Sbe{foM0n-uZP8%w=j|hDT%Uy)W7uU_lif6iXztUZ8Eq0V6^q+Pq$xZ z_RIp(WvAZMyi!rr5+!b1(?oIp$^tEb)14#_?#D1?eC|iXkRk-|*x(?(CnuxKv7t6v zZVpBKojFq{ufI#u*3-p(-LV-|9y=)9)|YX&hh;#7bA8QZhD7R2Fy-SDs&xspQ~*Qk z^dyI&Q>Df*w6KcueXzAErbWOU#K_A7)DNtPp`3Q8!l@U%+@|oY27|xHn^@iKgRjo0PcT4_YErVEFJk*$uwP$$ z3M(imI^U}EL)U18u9viX<3MUPbwRv!l2bTj^R*U<%-*ioA~F_Hl7=<}CnegI*qQC- z6Ejha+A_;P2$R%%ch|o`!3cE{GR2oBL8P>QyQTX}+)i-|c2!p<1gcLCN6%NR(Eoz5 zb$BTcK)l2OJ-3S&;v7lt1&>64nc?QB8;T6+`>#T)OWpHR%owI|`RaaYlis}|WH*Eh zg@~o7xz75Humn;Aq@_koAiYibla~G$Zv$NDl{rWX5}gPr0(@!p)FQU`YB#j^vt;K? zr`G_s=s)JD=Kz|!p&Y|_>+VkIqvf+B(_VeGbi&j1%3cyHyLU46%4iNvHPxf2Eg6HH zk{D$;GUW{^L#jhxQSSTxCC!|uyz~r|0BJ@V7-ntF@U%bTS74jbJrPJ8_vUbTeSR6O zq&e!Oi0nD_a+au!H?Bi;e-~?#6;GQ}Z%Ghsd)Idc-4IG~KG=6J0++&9_AUc^-nIa9 zPSKLPhY(|&YkEAYkMGDLmGDh@i@96VB8S0_6CNR8_SKR&@jAJSk$R>orgCZ3dCdh; z=_2$Cyj^CBDeVxUqG^_K!%en*CHW6(s@UO#nW8fr_kG7RKUc!dwVx}AWnwoht4J~$ z*ibRIlyP?7WNYM?Z24G zo-;mG6s$R`7c1{TMOxf7FiXx=7KkDeC)m0ImUTcCL0@>CaO%>HcpgNkR}21d+`8bO z=StQNjJ?+{AZ&D0b}_g}67SKk*~(`y;c<~%2z z9XSIJ+)U+3+z0(DeDCFSXK_4yhyiM)OjD2AceIYPbZN?Kze&Xs*_{iWL4Rm{sBXZ$ zl2B00UoY&7rTa8Dv4^6{vqtyK71b~6jL(On6wHCe7Xs71yCB_|iF*QoiXa8ToULyK zfg0aA^9UKPS0tuU*g^9nXuBp1DgNaWpZG^{KBPFI117l z_z5N{#>(Y>-J8aam8vy3Dzpd_2u0CD1O&?Sz<3P8dXAV4xgl{2B68xvSk3TL7q2Ss zL?V~bapAKHb0z$Xi|8h(^B_UAch2jWMOV)1Xp;>&1kxC*Qi{q4ktHhb;wj^{s9mb0 zj%&WyAt6Vr{q_4@r8mLixw6seTT_T1`lKzk_BC(Sxvipuk)c7jQ3TYGJW`Mu@L!5s z=U4^Nyd7@L z^+Bk?@BLXxC|-{mF62*#0>Dpn-5?HcO*B)JR}AHF@ZDhvFvn}@w*L%QZuWw3)ecS0 z07OV&5b!v#jg1N~8M1t3{b#;k8ukF5>|SrZ_l+2R$A*|eU=L+9xdB-$kP*9(3VGPc zr{%i*mlloupE%~*ENkQHlP*DfxIgQ|#&MaZwMj~PB%lzZ19|Lp9+M58hjmdQwm&LH zRb-rPzqvFv-5pmv;ySA9s`IydpTgxk!PAIxx(T5ah+5C0xo)$h;37qlJ4Q3-j#+xG zZl5Y(o=P3M8l0i+nO2%TrZ*4)h5==UNR^Qnm|)$_kI#q%VT@JLnyy5CANvXJnY0RM zan2X&OU{pg=s)adNB@HfS^FBr^)?Kxq2T14xw4Y%mdhHulE!=dO3$nEz{x|HR$7+< ztTUQN+PJ4XySbSaqZ3S>(kdK z=7H-Rpa-~uWtv+|K~}@%SLbUxI5K0Z(DDF!B%zm&&B?NZ=tbynOnWqIpScpC%Bb1>&aW5h2#XFkI z_p>#C%2vt-ra4pQ0Qj}I>C*{liLro_PDX>iKM+$_0b(Kr~rnIEuULcR5LYEzI zHu%@dWi?;U%)RPC7U#x7sG{kK-r1KY%KZ+tPk@alaDBS}5QhY&u1byw{e(kRRIO~z zGrmM6_tw3vq{a+drK1)wtAcT*m7(}6znIPi=;*t zZ4$0jmi4yx5(FMZ;t(GtnbGCJoWYZGfu$ap#+1HhTl2iqq9|q<3MiZU{bF!b_oT=i zbV2Ug9j&j%o-O-TvdmgjGQ6a{Ty*Evz5;;vUJEG{kfS zK{mm8wN`Ly>8vt-g$hT+dM3gBhqedUQh;n3!h%p$OnA*o+Dm?UE`vQupYoahcHU0= zf0&*A*@7LrxpdJzQ7fjVS(7i90{2R#UrHV~} zZxf(ht+g@om;M8F4{N?Dgv7?$5j=Q{i}yt0;kI&AtWI%uvXoZxPfEnhVQ|20JjDkH z&bo;TrSw}&h@gW#`h9bZ^yVi50L{pV^G8G$2Yg+4-z$7Sc@jk`Gd_Tn_|vp4(GRjh zkmJ;k_nUeFA-WO)U4DvX)fA__8e~+h5N5u&!coh|XCKX;h!O`02-gl_b@#+Aiex@( z_xAfFH7$_}WdO7=pcPW&hQixyUlX&D{UaOTw0C|HD`{nKBB-nd$=^V}HZ!5|AN+6S z1|)j1%LtUsXhW1#QxG5;Au@KTX5PxqugxtwPY_8bm6(Rbr;;4d@mJ{uwswyvhIq`p zbLPDY(Q4);noT?Ce8V%`G>+757DI1agBH$qqR6})kec>JP(E3X3~2fO;D<)WwLTL> zUE2?$`%cjy9tV>ZQIE-aHIA7(2%rHNq1dh074CeRDvW#;*Nk|!1_~%WQRimxx0=ji zcHwYt+t<;f&KUucOYJvuROmEQzJ;q(2q+&B?c6y(iXbGT&9y_X*(Esgj4C9QPK>qo zsxFCsz$<6_{x7@RlgUL3q43BtCP}5#bt)W22jz$k@b*+(zV&?+Qt7_W#dWq(bXDz2 zp1LWnBTRMD@cM#<3xMVROii@SR;@&!8r{4ATePRpjrLj5?%k=D6z5+yxp4}1;4uGq%ydB@S z*;fiYMb;`ICt=xG3^Krx^=cEeD|BLo6jn-U8G0owpLtN%_=cZ(r2^T z5ONbkBckA~Y#{p4V=};!W(OX=R;9$Vxfe|;b8vM=G1{x})Fkjv;sL5L0|bkfg246i z&O{t@fGBYOA>|h|zcd+vYd5Z-sf7D|fKVKj7W+>bCsHS9cP3n_uO|E>A15Ype zuHg^9y9>Uz&26Dxd}L|T1et@yCEOVAjek7dG4^Ewe}m%xn3$0LIiY78C)y&z7~KSAf7*=zL0;8UDYz2ciZ|<__O8y*-ls5 z?;vL^>F@GLR|q*7QEb8g$6*~AOW|?OMXQx=2=ZKjf_Nvv$#XYA)6x7=uTUeVeh*A)P7?C1l2S*S*SyEKOiKvy_q( z5`S-|Jyub7P~v*kQM<;4mOxfam=yUvI#fdpLt-rO|Mv#Aih%DV05ITrVoQ$$|}KP^mD8$lpnHkGg$hEC-8Ql8&}0KA1fho7Z! z5qe`Y9#0%*J{X{)9^jqyKlS7x#N13@yWV#u>c5ZFmXL>RfGZAupWe@yt znGj&-a^M=t9Z$5eD9}XVwC=UOvjI0jep>`Ps_`}C^>(LkecumJ{tMU1alqpCELbj~ zl*Xr>>UeJ@@N`u3HWPWzkq0Z%^;7OhN*qpPKXn&Tp#R@zXJO5q`sB z5k)^S7J)vkJ$`X-tLC+@r!SU>)I7QTgp+{;f@5z_R^;TE{ba*akACw)R}?878roud z^!KfSH4FBO{w;V#%_bS==$lIlJb~rE0CuaGMc!@& zQgIMSZAFju+F@Tu&*DOHHlE>kW~Z|##t#)dtOVIQ7s}Hf@^r`U+@6AzwH$&8sCqn{vSR=kC%sL>YemrHBEilUQ7D?>UK0kJ4V z#we0us~nR3f+;wN^cICYz^C?uEqK*Nhn_N@lu&qk;-FIjfK!UA#`D^YiylWjn)XFfn5`~`qzQ}|jS05ypu3mMxeQbgJ|q5;4$=aB!3F8M`0MF- zc|s$RfzOe469g@bI13lQktgVRSl`WrIyKz%;(}uKQ8;!Nb@1!6pQ487ff2RliKby7 zdys%7^h^NC(z~}~ZG!3ziD5hygJzU;p3>p>;_zPH1}}dK>d$7O_3EZI`T7D+~b=q8~Gux zS4UP-LS#txnJa}YVrS3^LkuE?zmQH2YXbe#ndv+G!MH- zP#%UBkWkR-g(23X1lF>lqZ6LpBv3cA*`vHuc861H#61i21(_o{UIEc>TGay1f7;3z zorB8o9YQ^p&v08(f8(I&>}_7inDVm_eC+LZ*sW$Y>K^^)Rx~Ce+ML=qPoD8T{73;M zQTxv5h(iFNBXw!l_GP*Z_iXhs^j(uq#pP7@JAq@bHcZy$lmg4`q3BDC=&V3k@z0W@<7%=5(*GMoV#p6jHdXWy>Cqya6FUGj@7kpiR}IlD8wMSj z#?A`C!;du7#|Pe#W;2JT!NMRe5|nw2;(w`+Ow@o?l@PiqPKFY}I(Jt6QKplYD98m} z=X|`y-+;uU95ZgC^l{LtC_nT-tSRE{BUM@hWD_IGoHtNzJ6TBwA#M= z5=CewsK3Bw_;9vVxuaqgrHI4V13 z(p@KZji3}K4dOS1M6ve3T2Ef!juI;5&cVuX`@b2jegNCvv$JX|6yU(G9t;R<-6@K| zlidc3#3;Kr3!B~Svg4rgxDfc^e~A6S7Q|8nFoq1zklO*Akn_Km-_X+4mN+Z`zlD5Kf zD{*|z?k4wnmtNwpnyPwey0!QY44#cInL^@3e@xwAEX{k(uQ7c4d#tfb7s@sbiMwHG zH@vISf$pBZ7Q1{1z6`~&Sok`9hyE>CE?}Zp^t+Ga8kw&Kz+%C~snl)VUt_TSkHdzbMk&BL-#B6q<8rn{-b!C;(d&4n($tO5~4I z?oHR2Xnr(+!0|=D5lAWi3Q@1VW@qfKhw{L%qPeiYtd70MdWY@;p=jf~MGY3tHj7ry z%-!C~(8@xFiL2hJbKsd54jk$z#5D!}NjUZ``fa#K3VqYX-B0tfMD6jolFL#CQ#l2vQEF9sUfh?NB0W4nfvi>86eLka7|I_8w2tuN>;2dQO%?c7Jd2xO-#=WZF3kU4=$nfUFSUJ-9(9DfjNLK73c0&9L}ZVsKJ! z*Jf-&PSqB%B(8fGopk4}=n9;ne-V4v!_!Es7myqOL5!U|AHEYO5U8%(J4?~rCW)e+ zPcOi&&se>bTLJevYB3AMPxeX6d7duhmI=>#?4qHeHgnSrfH=i%AoAUol`pzI2qv zh72hR`G@o(186iI&F|8OL`{-%Y0#Vu!uOV3ZHd`fXrX*XF)rZ(qRq6_-wg91vO3)1 zi_V+}B$Vz7a6A7$@r?gXSLg{475`OdPEg*!rz??E?6-dL4ly>o^v?E|DSX310u6jA zFQxYW$^^^GDlFw-BP1dNFBv~m-=5x_H|5I~JxV`>Is(NKbT|Vylp1aDrCV}F`uyD- z$;~$`Y7_bJvqxmv*7LzKbr&$RzgoAF>n-R)5Uc`r;_Vlm7R<=+=`%Us%Ep;SvNN8$WW3VY{n+1U5?1y1CzP#3>DySbNHUmJC`=9 zz}Z-g#kRE;*9{p~N{Z(&n!mGdK4n?S3xV8r9I{))m|4d=^LpLx!6<(8Asp4l*Fx+g zpN!zL#b&%}nxkTKB%6Kx`lYI9Q^Xpx8cFRx|E+No&SuEl%>wUC?u{^k9J&xJX1!tH z-0`DfpX@b(bO)dS4I_V@w~Al9pCWiU4w1FUBH@w2WfE`Z9ot}JqMq^=Wey#@ z8GDzGV{usb;p{7w?wTQVJdoI&$N?36oZ0qZ?b$1%1E=^%bax@L>aM)#97nc63EsO#3X>!reDXxEh(2agtvn+l1^$MKJww(tcsxxaZ zVW$)wB7Q3vl>80{Ow5Q{%dPUCG9J^Js~KLPZ_ltne&TWU%M)AE3|01;U;PY6=Kt=g zZ#!6ew_;Rk-ZEDix#x{tMN7C({u5NE<_}a|7eNwo!#T&D_ttFNP2j35BQTrA{Am>X zrVvkfWEUdCG^02&h)X74+9lPegNAp(qHnRvLJQ zqZi%(!i9>T<%0?CTR4{ZmysZ1tpYGBkfq#KcSrIuDeh(qX>QYO7@xOgt;4n}D|1UO zuK6fQ*O;@g_~G>~SR`(Orp@iTQKN*#u1Pd{dr*!zACo%?^mCs(Q-vnFz$uiTo_G># zi!fDVN=;>(WGFaW#`anJm3{Sg?@!xvxk(sdhME45bLcy{4Z{DzhFm-#7}TU{rYyQ0*P(U#;?(ASht$`MWm| zKSDd#zGhG!@J$-%mr}?L>gq)s%nC>LWF@Rlv2hDZu7Mb)FwCnpryB{n`yAB5ztzeG z)bEgT@P$2|Zx|tN8nSJR2`rKr_uq8oBb9wXT9<_JTd)v4&BQ(g_5vWnc2<6eUaOR3 z5N{-6L790(?Mhk$5P8IV;?mvh#$Wbu^XL{(3aO6EESbv;CIdTjCudYCX5z0b?>6lD z*NU$EMG<_~o%m|^x40}_68P4UBih-(h#d|gu>w`J@!w6gY`Na3)yuD9r3;rZ%USODcR)S|!n%0s}K)cFIY zI3vU@6SWFm1HXxi@c%T_)qpN%~40C+Q8$- zdKu=w&#Pz!;yXyr{lqZ|+BOy;7x%Mkzf#1v^@6qz-?m>S>>Yk`&a=Mb!ti#mq2Uw7 zzNI$ZilQ&Qn_3vJhMv9x7?f`Ohe0Ntp3hE#C30&i0^aB$(ReT(skHhuR7klo{SsJN z)~MdB>e-Xg5ax@vCQ)@*f2Dd9m1+J4$)p+3-f!C+XURrngBux%+Rx2P^7L%frVfr( z4P$L{nYT`>yKZYm{bTrsWBl9qKai=7;(BQ<mqNP>L03n6`V1L22DPopd*Vai$nOds=kloti=}u z7bdUmFBJJ0YE-Vf<03422JX8;j>t@&}OSV{ohGq_Ixb1EF- zI^6z)q~G#unL#(A(z-7M2kr14BND%7*p7yHB?I;+9a*fSEhr6vWE$7=z~#>(<_xeA zwgoekpm-D|CW-pwlkN#235A;O``0NN^<&|Kj2+n9iAS34BQ+k^B)Id34lJ)6-dpG3 zN-bN+Eq*vQ*Ld!ss|c1udduAdCnWv#ILJ~tul$)kCeVt~b6ee+jMd+Ql;uF7>O!6)6c{N9|Gcx)q$^SWUD5lj z%-}st)zZD8_c(ds|*Akm)cxUc@H2dD`PP5S~;6(j+qt)(V+6Mi!H&Y+SQOMV&om@ zK`uwRL@}VP%Mr-Z^2pqMX*_jKJkp5OS~}62oE`F=5yt!w8RZcEJ1aN3MSt(HU;#%@ z{lM^1UvU}(7ezJs9l)+w86cgY%ToowED`OQ+k>W$_?dU60=lS^vXwn=V1)Cc_3&+% zG}e%_zTr%@64OZ1A{f*5lb2EWl zJ-I?q-Lm>1^DVlq*3kzU<+QUNv;{fF%W42Drg|ey?r|^5VB*3Y`W9p>s#{bWg*yi! z08uSfumxy}$Bc1m5AmXVA|@Lt3)E*H-u7jN3gCwK6+yl8{-c5J>FTi~`ye?IX!(Vc zr)6tfQBQC3s(9MAeF!q}Pce6I+ayO8bU|GH@BZWQCB z<*87Uk@Xv-R!*7)AsEG72TwC5;z_S`7MIjwd4^l%#`pa@6dTWUw@85A3*89W&s2KM z&Ybp8G=f#zVVGzzD%&kJWyH3%GDRqGQH;>+?eL4| zGC&%C8K8$3QlUE_M#Zrc-2u5?+qI6%yji6<@0BK%jz})2;w;kIP#ceSH??uR!^qRm zVryVt*a;dsycV*_`KoA1bthtv!U3tNxInw+-YNUTkY@q~|C4-XIs$7FTKGl7Mmcfs zT1yGMT0;{YW2(t5xtbNryNFdr*-yM%knz`lhi=A)v>Y`qNC(Os3b3j8)2P#qzC{`74`0dj4hj$^dm1V5D8RcN7#Ouv=~N9|*N}Ev zUP`Gh$&Z&>zWRHyogS>nZbdWasg$o1(h{lhz=7OhytX};kBU8nm{ZXI!~$Ms)Cw}c z{~a9T%<ydo{Y{s za?K$`J~z1!rm*WLMMa48^-xMV+TnL`1}@fv?k(yloi25xOAUh6YOl;Zme`k8P-#1> zkZ6FM4pKxy?8%YOl}=cy+EoOI5-=n&(|W~=32870IyF>~!bPV@gE^-DkbzTwuX-IB zk9GKh7BDG8YuxKW+S!Dq&WclU!^s7iS+F~xW=^!B)u8!z9MqjOh@IaBfl>Mdon!Jd z!zP=)E?PPtB48%FG|6vak{CeTFfEVO^cUc(AzE~r#ML64I97Ec)%xwjc zZI1KzMS$BfFe+1ko9q%C6Gr9df6bqs4!s`0LPq)=ay}GH&ul>mT@KMh9iT77(_=BU zAT8QAR`dxBx-cvHg*>Qj&TbP+$t0@O{P&Ohs<^S)h$zA)BLgqFxdu>0)>du!A~nMn zORqxM9`grB;BMoLH;1@|2x+}mMg$knd@p9sifjcDlJBKSpqhum=-81>e1l%KOaf_# zy*dcCl5P;kPcnV;Unz*-PQM#f#ZPZ{l5m9 z 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 literal 0 HcmV?d00001 diff --git a/MQLTestWorkspace/BKPS/14030222/Experts/x-saherelm.xea.mq5 b/MQLTestWorkspace/BKPS/14030222/Experts/x-saherelm.xea.mq5 new file mode 100644 index 0000000..6120a6a --- /dev/null +++ b/MQLTestWorkspace/BKPS/14030222/Experts/x-saherelm.xea.mq5 @@ -0,0 +1,377 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Expert Advisor +// ---------------------------------------- +// Name: X121EA +// Description: this is an expert controller +// advisors which provides a mechanism for use them ... +// +// NOTE: about provider instancing in multi asset state: +// you can provide configurations using this: +// +// EURUSDb,USDCHFb|M5|0.01|X786,X92|true +// EURUSDb,GBPUSDb,USDJPYb,USDCHFb,XAUUSDb|M5,M15|0.01|X786|true +// EURUSDb,GBPUSDb,USDJPYb,USDCHFb,XAUUSDb|M5,M15|0.01|X786|true +// +// or make the instance use this: +// +// XPV(EURUSDb|M15|0.01|X92|true)XPV(GBPUSDb|M5|0.02|X786|false) +// +// if leave Configuration string blank this will used default config +// and One asset mode enabled ... +// +// Maintainer: +// ------------ +// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) +// +//////////////////////////////////////////////////////x +// +// Global Properties ... +#property copyright "Copyright 2023, SaherElm IT Center" +#property link "https://saherelm.ir" +#property version "1.00" +#property description "SaherElm X121EA" +#property strict + +// +// START Definitions ... +// + +// +#define ShortName "X121EA" + +// +// END Definitions ... +// + +// +// START Inputs ... +// + +// +// EA ... +input group "Common"; +input bool xEAEnable = true; // Enable EA +input int xEASlippage = 10; // Slippgae +input ulong xEAMagicNumber = 1604056; // Magic Number + +// +// Providers ... +input group "Providers"; +input string xEAProvidersConfiguration = ""; // Providers Configuration +input string xEADefaultSignalProviders = "XTEST"; // Default Allowed Signal Providers + +// +// Signals ... +input group "Signals"; +input bool xEAEnableLongs = true; // Enable Long Trades +input bool xEAEnableShorts = true; // Enable Short Trades + +// +// Risk Management ... +input group "Risk Management"; +input double xEAMaxAllowedSpread = 10; // Max Allowed Spread to Execute Signal +input int xEAMaxOpenPositions = 15; // Max Allowed Open Trades +input double xEAMinRiskAmountPerTrade = 0.001; // Min Risk Amount Per Trade +input double xEAMaxAllowedDrawDownFactor = 0.01; // Max Allowed Drawdown Factor +input double xEAMinProfitPerTrade = 0.5; // Min Acceptable Profit Per Trade +input double xEAMinProfitPerVolumeFactor = 0.01; // Min Acceptable Profit Volume Factor Per Trade +input bool xEAUseRiskAmountAsStaticVolume = true; // Use Provided Risk Amount as Static Volume + +// +input group "EQM"; +input int xEAMinAgeForDoSupport = 35; // Minimum Age For Supporting In Drawdown Positions when there isn't Equity +input int xEAMinAgeForUpdateSupports = 35; // Minimum Age For Update Untriggered Support Orders + +// +// Alerts ... +input group "Alerts"; +input bool xEAEnableAlerts = true; // Enable Events Alert +input bool xEAEnableHourlyAlerts = false; // Send Alert on each new Hour +input bool xEAEnableDailyAlerts = false; // Send Alert on each new Day +input bool xEAEnableWeeklyAlerts = false; // Send Alert on each new Week +input bool xEAEnableMonthlyAlerts = false; // Send Alert on each new Month + +// +// END Inputs ... +// + +// +// START Including Providers ... +// + +// +// Logger Library ... +#include "../Libraries/x-saherelm.log.lib.mq5" +#include "../Classes/x-saherelm.x121.xea.class.mq5" +#include "../Libraries/x-saherelm.seriallizer.lib.mq5" + +// +// END Including Providers ... +// + +// +// START Global Definitions: Variables, Properties and etc ... +// + +// +XSCX121EA *mX121EA; + +// +// END Global Definitions: Variables, Properties and etc ... +// + +// +// START Event Handlers ... +// + +// +// Initialization ... +int OnInit() +{ + // + logTag = ShortName; + drawPrefix = logTag; + alertPrefix = logTag; + + // + // Validate Inputs ... + if (!ValidateInputs()) + { + return INIT_PARAMETERS_INCORRECT; + } + + // + bool isInit = InitEAInstance(); + if (!isInit) + { + return INIT_FAILED; + } + + // + // Init Succeed ... + return INIT_SUCCEEDED; +} + +// +// DeInitialization ... +void OnDeinit(const int reason) +{ + // + // REASON_PROGRAM 0 The EA has stopped working calling the ExpertRemove() function + // REASON_REMOVE 1 Program removed from a chart + // REASON_RECOMPILE 2 Program recompiled + // REASON_CHARTCHANGE 3 A symbol or a chart period is changed + // REASON_CHARTCLOSE 4 Chart closed + // REASON_PARAMETERS 5 Inputs changed by a user + // REASON_ACCOUNT 6 Another account has been activated or reconnection to the trade server has occurred due to changes in the account settings + // REASON_TEMPLATE 7 Another chart template applied + // REASON_INITFAILED 8 The OnInit() handler returned a non-zero value + // REASON_CLOSE 9 Terminal closed + + // + // De Initialize XEA Providers ... + delete mX121EA; +} + +// +// On Tick Handler ... +void OnTick() +{ + // + // Prevent Going Forward if user Disable it ... + if (xEAEnable) + { + mX121EA.OnTick(); + } +} + +// +// Handle Trade Events ... +void OnTrade() +{ + mX121EA.OnTrade(); +} + +// +// Handle Signal Event ... +void OnSignalConditionsRecieved(X121MarketConditions &info) +{ +} + +// +// Handle StopLoss Event ... +void OnStopLossTriggered(const XDeal &deal) +{ +} + +// +// Handle TakeProfit Event ... +void OnTakeProfitTriggered(const XDeal &deal) +{ +} + +// +// Handle Deals Changed Event ... +void OnDealsChangedHandler(int count) +{ +} + +// +// Handle Order Changed Event ... +void OnOrdersChangedHandler(int count) +{ +} + +// +// Handle Position Changed Event ... +void OnPositionsChangedHandler(int count) +{ +} + +// +// Handle Trade State Changed ... +void OnTradeStateChangedHandler(const XOnTradeHandlerState &state) +{ +} + +// +// END Event Handlers ... +// + +// +// START Functions ... +// + +// +// Validate Input Args for Initialization ... +bool ValidateInputs() +{ + // + bool result = true; + + // + // Validate Args ... + result = + // + xEASlippage > 0 && + xEAMagicNumber > 0 && + xEAMinRiskAmountPerTrade > 0 && + StringLen(xEADefaultSignalProviders) > 0 + // + // TODO: add new validations here ... + // + ; + + // + // Validate Providers ... + if (result) + { + // + string providers[]; + SplitContent( + providers, + xEADefaultSignalProviders); + + // + int providersCount = ArraySize(providers); + if (providersCount <= 0) + { + // + result = false; + return result; + } + + // + string allProviders[]; + GetAllProviders(allProviders); + + // + bool hasError = false; + for (int i = 0; i < providersCount; i++) + { + // + string iProvider = providers[i]; + if (!Contains(iProvider, allProviders)) + { + // + hasError = true; + break; + } + } + + // + if (hasError) + { + // + result = false; + return result; + } + } + + // + // Logging State ... + string message = "Validation of (" + logTag + ") Inputs " + (result ? "Succeeded" : "Failed") + " ..."; + LogMessage(message); + + // + return result; +} + +// +// Initialize X121EA Class Instances ... +bool InitEAInstance() +{ + // + bool result = false; + + // + X121SignalProvider providers[]; + + // + // Try to Extract Configs ... + int configsCount = ExtractProviderConfigurations( + providers, + xEAProvidersConfiguration, + xEADefaultSignalProviders, + xEAMinRiskAmountPerTrade, + xEAUseRiskAmountAsStaticVolume); + + // + mX121EA = new XSCX121EA( + _Symbol, + _Period, + xEAMagicNumber, + xEASlippage, + xEAMaxAllowedSpread, + xEAMaxOpenPositions, + xEAMinProfitPerTrade, + xEAMinProfitPerVolumeFactor, + xEAMaxAllowedDrawDownFactor, + OnStopLossTriggered, + OnTakeProfitTriggered, + OnDealsChangedHandler, + OnOrdersChangedHandler, + OnPositionsChangedHandler, + OnTradeStateChangedHandler, + // + xEAMinAgeForDoSupport, + xEAMinAgeForUpdateSupports, + OnSignalConditionsRecieved); + + // + mX121EA.EnableLongs(xEAEnableLongs); + mX121EA.EnableShorts(xEAEnableShorts); + + // + // Attach Providers to EA Instance ... + int providersCount = ArraySize(providers); + int addedProviders = mX121EA.AddProviders(providers); + result = addedProviders == providersCount; + + // + return result; +} +// +// END Functions ... +// diff --git a/MQLTestWorkspace/BKPS/14030222/Experts/x-sample.ea.ex5 b/MQLTestWorkspace/BKPS/14030222/Experts/x-sample.ea.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..566aa41d1eb81a81d51db51b9ba05fb428e4a9db GIT binary patch literal 160428 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 z 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 BM0)@L literal 0 HcmV?d00001 diff --git a/MQLTestWorkspace/BKPS/14030222/Experts/x-sample.ea.mq5 b/MQLTestWorkspace/BKPS/14030222/Experts/x-sample.ea.mq5 new file mode 100644 index 0000000..1a8ca3a --- /dev/null +++ b/MQLTestWorkspace/BKPS/14030222/Experts/x-sample.ea.mq5 @@ -0,0 +1,1329 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center XSAMPLE MQL5 Expert Advisor +// ------------------------------------------------- +// Name: XSAMPLE +// Description: an Exper Advisor which used RSI and MA +// to Analyse Market ... +// +// Maintainer: +// ------------ +// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) +// +//////////////////////////////////////////////////////x +// +// Global Properties ... +#property copyright "Copyright 2023, SaherElm IT Center" +#property link "https://saherelm.ir" +#property version "1.00" +#property description "SaherElm XSAMPLE" +#property strict + +// +#define ShortName "XSAMPLE" + +// +#include "../Libraries/x-saherelm.log.lib.mq5" +#include "../Libraries/x-saherelm.draw.lib.mq5" +#include "../Libraries/x-saherelm.common.lib.mq5" +#include "../Classes/x-saherelm.xtrade.class.mq5" + +// +// Inputs ... +long xSampleEAMagicNumber = 78692110; // Magic Number +int xSampleEASlippage = 10; // Slippgae + +// +double xSampleEAVolume = 0.01; // Volume Per Trade + +// +ENUM_TIMEFRAMES xSCPeriod = PERIOD_H4; +ENUM_TIMEFRAMES xMCPeriod = PERIOD_H12; +ENUM_TIMEFRAMES xLCPeriod = PERIOD_D1; +ENUM_TIMEFRAMES xHCPeriod = PERIOD_W1; + +// +// Vars ... +string xSampleEASymbol; +ENUM_TIMEFRAMES xSampleEAPeriod; + +// +int maxBuys = 1; +int maxSells = 1; +int buyCount = 0; +int sellCount = 0; + +// +XOHCL candle0; +datetime candle0Time; +XOHCLDrawSpecification candle0Style; + +// +XOHCL candle1; +datetime candle1Time; +XOHCLDrawSpecification candle1Style; + +// +XOHCL scCandle0; +datetime scCandle0Time; +XOHCLDrawSpecification scCandle0Style; + +// +XOHCL scCandle1; +datetime scCandle1Time; +XOHCLDrawSpecification scCandle1Style; + +// +XOHCL mcCandle0; +datetime mcCandle0Time; +XOHCLDrawSpecification mcCandle0Style; + +// +XOHCL mcCandle1; +datetime mcCandle1Time; +XOHCLDrawSpecification mcCandle1Style; + +// +XOHCL lcCandle0; +datetime lcCandle0Time; +XOHCLDrawSpecification lcCandle0Style; + +// +XOHCL lcCandle1; +datetime lcCandle1Time; +XOHCLDrawSpecification lcCandle1Style; + +// +XOHCL hcCandle0; +datetime hcCandle0Time; +XOHCLDrawSpecification hcCandle0Style; + +// +XOHCL hcCandle1; +datetime hcCandle1Time; +XOHCLDrawSpecification hcCandle1Style; + +// +string c0TagPrefix = "CC0"; +string c1TagPrefix = "CC1"; + +// +string sc0TagPrefix = "SC0"; +string sc1TagPrefix = "SC1"; + +// +string mc0TagPrefix = "MC0"; +string mc1TagPrefix = "MC1"; + +// +string lc0TagPrefix = "L0"; +string lc1TagPrefix = "L1"; + +// +string hc0TagPrefix = "H0"; +string hc1TagPrefix = "H1"; + +// +double _tp = 0; +double _sl = 0; +double _entry = 0; +ENUM_POSITION_TYPE _type = NULL; + +// +MqlTick xSampleEATick; +XSCTrade *xSampleEATrader; + +// +// Event Handlers ... +// +// Initialization ... +int OnInit() +{ + // + if (xSampleEASymbol == NULL || StringLen(xSampleEASymbol) <= 0) + { + xSampleEASymbol = _Symbol; + } + + // + if (xSampleEAPeriod == NULL) + { + xSampleEAPeriod = _Period; + } + + // + // Validate Inputs ... + if (!XSampleEAValidateInputs()) + { + return INIT_PARAMETERS_INCORRECT; + } + + // + logTag = ShortName; + drawPrefix = ShortName; + + // + XSampleEAConfigureCandleStyles(); + + // + // Initialize XTrader ... + xSampleEATrader = new XSCTrade( + xSampleEASlippage, + xSampleEAMagicNumber); + + // + // Init Succeed ... + return INIT_SUCCEEDED; +} + +// +// DeInitialization ... +void OnDeinit(const int reason) +{ + // + // REASON_PROGRAM 0 The EA has stopped working calling the ExpertRemove() function + // REASON_REMOVE 1 Program removed from a chart + // REASON_RECOMPILE 2 Program recompiled + // REASON_CHARTCHANGE 3 A symbol or a chart period is changed + // REASON_CHARTCLOSE 4 Chart closed + // REASON_PARAMETERS 5 Inputs changed by a user + // REASON_ACCOUNT 6 Another account has been activated or reconnection to the trade server has occurred due to changes in the account settings + // REASON_TEMPLATE 7 Another chart template applied + // REASON_INITFAILED 8 The OnInit() handler returned a non-zero value + // REASON_CLOSE 9 Terminal closed + + // + // De Initialize XSampleEA Providers ... + delete xSampleEATrader; +} + +// +// On Tick Handler ... +void OnTick() +{ + // + if (!IsNewCandle( + xSampleEASymbol, + xSampleEAPeriod)) + { + return; + } + + // + // Reading Tick ... + if (!SymbolInfoTick(xSampleEASymbol, xSampleEATick)) + { + return; + } + + // + // Counting Currently Open Positions ... + buyCount = xSampleEATrader.CountPositions(xSampleEASymbol, POSITION_TYPE_BUY); + sellCount = xSampleEATrader.CountPositions(xSampleEASymbol, POSITION_TYPE_SELL); + + // + HandleCalculateTick(); + + // + if (buyCount < maxBuys) + { + // + // Check For Buy Signals ... + } + + // + if (sellCount < maxSells) + { + // + // Check for Sell Signals ... + } +} + +// +// Custom Functions ... + +// +// Validate Variables nd Inputs ... +bool XSampleEAValidateInputs() +{ + // + bool result = false; + + // + result = + // + xSampleEASlippage > 0 && + xSampleEAMagicNumber > 0 + // + ; + + // + return result; +} + +// +void PrepareCandleStyle( + XOHCLDrawSpecification &source, + int width = 1, + color clr = CLR_NONE, + ENUM_LINE_STYLE style = STYLE_SOLID, + bool ray = false, + bool fill = false, + bool back = false // +) +{ + // + source.Default(); + + // + source.Width(width); + + // + if (clr != CLR_NONE) + { + source.Color(clr); + } + + // + source.Style(style); + source.RayRight(ray); + source.Fill(fill); + source.Back(back); +} + +// +// Configure Default Styles for Candle Drawing ... +void XSampleEAConfigureCandleStyles() +{ + // + PrepareCandleStyle( + candle0Style, + 1, + CLR_NONE, + STYLE_DOT, + false, + false, + true // + ); + candle0Style.SetLabelPrefix(c0TagPrefix); + + // + PrepareCandleStyle( + candle1Style, + 1, + CLR_NONE, + STYLE_DOT, + false, + false, + true // + ); + candle1Style.SetLabelPrefix(c1TagPrefix); + + // + PrepareCandleStyle( + scCandle0Style, + 1, + CLR_NONE, + STYLE_DASH, + false, + false, + true // + ); + scCandle0Style.SetLabelPrefix(sc0TagPrefix); + + // + PrepareCandleStyle( + scCandle1Style, + 1, + CLR_NONE, + STYLE_DASH, + false, + false, + true // + ); + scCandle1Style.SetLabelPrefix(sc1TagPrefix); + + // + PrepareCandleStyle( + mcCandle0Style, + 1, + CLR_NONE, + STYLE_DASHDOT, + false, + false, + true // + ); + mcCandle0Style.SetLabelPrefix(mc0TagPrefix); + + // + PrepareCandleStyle( + mcCandle1Style, + 1, + CLR_NONE, + STYLE_DASHDOT, + false, + false, + true // + ); + mcCandle1Style.SetLabelPrefix(mc1TagPrefix); + + // + PrepareCandleStyle( + lcCandle0Style, + 1, + CLR_NONE, + STYLE_DASHDOTDOT, + false, + false, + true // + ); + lcCandle0Style.SetLabelPrefix(lc0TagPrefix); + + // + PrepareCandleStyle( + lcCandle1Style, + 1, + CLR_NONE, + STYLE_DASHDOTDOT, + false, + false, + true // + ); + lcCandle1Style.SetLabelPrefix(lc1TagPrefix); + + // + PrepareCandleStyle( + hcCandle0Style, + 1, + CLR_NONE, + STYLE_DOT, + false, + false, + true // + ); + hcCandle0Style.highStyle.clr = clrLightSkyBlue; + hcCandle0Style.openStyle.clr = clrDarkOliveGreen; + hcCandle0Style.closeStyle.clr = clrCoral; + hcCandle0Style.lowStyle.clr = clrPink; + hcCandle0Style.SetLabelPrefix(hc0TagPrefix); + + // + PrepareCandleStyle( + hcCandle1Style, + 2, + CLR_NONE, + STYLE_DOT, + false, + false, + true // + ); + hcCandle1Style.SetLabelPrefix(hc1TagPrefix); +} + +// +void HandleCalculateTick() +{ + // + // Calculate Candles ... + + // + // SC ... + scCandle0 = GetCandle( + xSampleEASymbol, + xSCPeriod, + 0 // Current Candle + ); + scCandle1 = GetCandle( + xSampleEASymbol, + xSCPeriod, + 1 // Before Candle + ); + + // + scCandle0Time = GetCandleTime( + xSampleEASymbol, + xSCPeriod, + 0); + scCandle1Time = GetCandleTime( + xSampleEASymbol, + xSCPeriod, + 1); + + // + // MC ... + mcCandle0 = GetCandle( + xSampleEASymbol, + xMCPeriod, + 0 // Current Candle + ); + mcCandle1 = GetCandle( + xSampleEASymbol, + xMCPeriod, + 1 // Before Candle + ); + + // + mcCandle0Time = GetCandleTime( + xSampleEASymbol, + xMCPeriod, + 0); + mcCandle1Time = GetCandleTime( + xSampleEASymbol, + xMCPeriod, + 1); + + // + // LC ... + lcCandle0 = GetCandle( + xSampleEASymbol, + xLCPeriod, + 0 // Current Candle + ); + lcCandle1 = GetCandle( + xSampleEASymbol, + xLCPeriod, + 1 // Before Candle + ); + + // + lcCandle0Time = GetCandleTime( + xSampleEASymbol, + xLCPeriod, + 0); + lcCandle1Time = GetCandleTime( + xSampleEASymbol, + xLCPeriod, + 1); + + // + // HC ... + hcCandle0 = GetCandle( + xSampleEASymbol, + xHCPeriod, + 0 // Current Candle + ); + hcCandle1 = GetCandle( + xSampleEASymbol, + xHCPeriod, + 1 // Before Candle + ); + + // + hcCandle0Time = GetCandleTime( + xSampleEASymbol, + xHCPeriod, + 0); + hcCandle1Time = GetCandleTime( + xSampleEASymbol, + xHCPeriod, + 1); + + // + // Now Reading Current Candle ... + candle0 = GetCandle( + xSampleEASymbol, + xSampleEAPeriod, + 0 // Current Candle + ); + candle1 = GetCandle( + xSampleEASymbol, + xSampleEAPeriod, + 1 // Before Candle + ); + + // + candle0Time = GetCandleTime( + xSampleEASymbol, + xSampleEAPeriod, + 0); + candle1Time = GetCandleTime( + xSampleEASymbol, + xSampleEAPeriod, + 1); + + // + // Drawing Candles ... + XSampleEADrawCandles(); +} + +// +// DRAW Functions ... +void XSampleEADrawCandles( + // + bool drawAsBox = false, // Draw Candles As Box ... + // + bool update = true, // Update Candles based On Time ... + // + bool drawCandle0 = false, // Draw 0 Time Candles ... + bool drawCandle1 = true, // Draw 1 Time Candles ... + // + bool drawBody = true, // Show Candle Bodies ... + bool drawShadows = true, // Show Candle Shadows ... + // + // Candles ... + bool drawCurrent = false, // Draw Current Candle ... + bool drawSC = true, // Draw Short Candle ... + bool drawMC = true, // Draw Medium Candle ... + bool drawLC = true, // Draw Long Candle ... + bool drawHC = true, // Draw Hind Candle ... + // + // MidLines ... + bool draw0MidLine = false, + bool draw1MidLine = false, + bool drawSC0MidLine = true, + bool drawSC1MidLine = true, + bool drawMC0MidLine = true, + bool drawMC1MidLine = true, + bool drawLC0MidLine = true, + bool drawLC1MidLine = true, + bool drawHC0MidLine = true, + bool drawHC1MidLine = true // +) +{ + // + int subWindow = 0; + long chartId = ChartID(); + + // + // Configure Styles for Draw Shadows and Bodies of Candles + // based On Configurations ... + + // + candle0Style.openStyle.draw = drawCandle0 && drawBody; + candle0Style.closeStyle.draw = drawCandle0 && drawBody; + + // + candle1Style.openStyle.draw = drawCandle1 && drawBody; + candle1Style.closeStyle.draw = drawCandle1 && drawBody; + + // + scCandle0Style.openStyle.draw = drawCandle0 && drawBody; + scCandle0Style.closeStyle.draw = drawCandle0 && drawBody; + + // + scCandle1Style.openStyle.draw = drawCandle1 && drawBody; + scCandle1Style.closeStyle.draw = drawCandle1 && drawBody; + + // + mcCandle0Style.openStyle.draw = drawCandle0 && drawBody; + mcCandle0Style.closeStyle.draw = drawCandle0 && drawBody; + + // + mcCandle1Style.openStyle.draw = drawCandle1 && drawBody; + mcCandle1Style.closeStyle.draw = drawCandle1 && drawBody; + + // + lcCandle0Style.openStyle.draw = drawCandle0 && drawBody; + lcCandle0Style.closeStyle.draw = drawCandle0 && drawBody; + + // + lcCandle1Style.openStyle.draw = drawCandle1 && drawBody; + lcCandle1Style.closeStyle.draw = drawCandle1 && drawBody; + + // + hcCandle0Style.openStyle.draw = drawCandle0 && drawBody; + hcCandle0Style.closeStyle.draw = drawCandle0 && drawBody; + + // + hcCandle1Style.openStyle.draw = drawCandle1 && drawBody; + hcCandle1Style.closeStyle.draw = drawCandle1 && drawBody; + + // + candle0Style.highStyle.draw = drawCandle0 && drawShadows; + candle0Style.lowStyle.draw = drawCandle0 && drawShadows; + + // + candle1Style.highStyle.draw = drawCandle1 && drawShadows; + candle1Style.lowStyle.draw = drawCandle1 && drawShadows; + + // + scCandle0Style.highStyle.draw = drawCandle0 && drawShadows; + scCandle0Style.lowStyle.draw = drawCandle0 && drawShadows; + + // + scCandle1Style.highStyle.draw = drawCandle1 && drawShadows; + scCandle1Style.lowStyle.draw = drawCandle1 && drawShadows; + + // + mcCandle0Style.highStyle.draw = drawCandle0 && drawShadows; + mcCandle0Style.lowStyle.draw = drawCandle0 && drawShadows; + + // + mcCandle1Style.highStyle.draw = drawCandle1 && drawShadows; + mcCandle1Style.lowStyle.draw = drawCandle1 && drawShadows; + + // + lcCandle0Style.highStyle.draw = drawCandle0 && drawShadows; + lcCandle0Style.lowStyle.draw = drawCandle0 && drawShadows; + + // + lcCandle1Style.highStyle.draw = drawCandle1 && drawShadows; + lcCandle1Style.lowStyle.draw = drawCandle1 && drawShadows; + + // + hcCandle0Style.highStyle.draw = drawCandle0 && drawShadows; + hcCandle0Style.lowStyle.draw = drawCandle0 && drawShadows; + + // + hcCandle1Style.highStyle.draw = drawCandle1 && drawShadows; + hcCandle1Style.lowStyle.draw = drawCandle1 && drawShadows; + + // + // Default Mid Line Specs ... + XDrawSpecifications specs; + specs.width = 2; + specs.rayRight = false; + specs.clr = clrYellow; + specs.style = STYLE_DOT; + + // + if (drawCurrent) + { + // + if (!drawAsBox) + { + // + if (drawCandle0) + { + // + DrawCandleAsLine( + chartId, + subWindow, + candle0, + candle0Time, + candle0Style, + c0TagPrefix, + update // + ); + } + + // + if (drawCandle1) + { + // + if (drawCandle1) + { + // + DrawCandleAsLine( + chartId, + subWindow, + candle1, + candle1Time, + candle1Style, + c1TagPrefix, + update // + ); + } + } + } + else + { + // + if (drawCandle0) + { + // + DrawCandleAsBox( + chartId, + subWindow, + candle0, + candle0Time, + candle0Style, + c0TagPrefix, + drawBody, + drawShadows, + update // + ); + } + + // + if (drawCandle1) + { + // + DrawCandleAsBox( + chartId, + subWindow, + candle1, + candle1Time, + candle1Style, + c1TagPrefix, + drawBody, + drawShadows, + update // + ); + } + } + } + + // + if (drawSC) + { + // + if (!drawAsBox) + { + // + if (drawCandle0) + { + // + DrawCandleAsLine( + chartId, + subWindow, + scCandle0, + scCandle0Time, + scCandle0Style, + sc0TagPrefix, + update // + ); + } + + // + if (drawCandle1) + { + // + DrawCandleAsLine( + chartId, + subWindow, + scCandle1, + scCandle1Time, + scCandle1Style, + sc1TagPrefix, + update // + ); + } + } + else + { + // + if (drawCandle0) + { + // + DrawCandleAsBox( + chartId, + subWindow, + scCandle0, + scCandle0Time, + scCandle0Style, + sc0TagPrefix, + drawBody, + drawShadows, + update // + ); + } + + // + if (drawCandle1) + { + // + DrawCandleAsBox( + chartId, + subWindow, + scCandle1, + scCandle1Time, + scCandle1Style, + sc1TagPrefix, + drawBody, + drawShadows, + update // + ); + } + } + } + + // + if (drawMC) + { + // + if (!drawAsBox) + { + // + if (drawCandle0) + { + // + DrawCandleAsLine( + chartId, + subWindow, + mcCandle0, + mcCandle0Time, + mcCandle0Style, + mc0TagPrefix, + update // + ); + } + + // + if (drawCandle1) + { + // + DrawCandleAsLine( + chartId, + subWindow, + mcCandle1, + mcCandle1Time, + mcCandle1Style, + mc1TagPrefix, + update // + ); + } + } + else + { + // + if (drawCandle0) + { + // + DrawCandleAsBox( + chartId, + subWindow, + mcCandle0, + mcCandle0Time, + mcCandle0Style, + mc0TagPrefix, + drawBody, + drawShadows, + update // + ); + } + + // + if (drawCandle1) + { + // + DrawCandleAsBox( + chartId, + subWindow, + mcCandle1, + mcCandle1Time, + mcCandle1Style, + mc1TagPrefix, + drawBody, + drawShadows, + update // + ); + } + } + } + + // + if (drawLC) + { + // + if (!drawAsBox) + { + // + if (drawCandle0) + { + // + DrawCandleAsLine( + chartId, + subWindow, + lcCandle0, + lcCandle0Time, + lcCandle0Style, + lc0TagPrefix, + update // + ); + } + + // + if (drawCandle1) + { + // + DrawCandleAsLine( + chartId, + subWindow, + lcCandle1, + lcCandle1Time, + lcCandle1Style, + lc1TagPrefix, + update // + ); + } + } + else + { + // + if (drawCandle0) + { + // + DrawCandleAsBox( + chartId, + subWindow, + lcCandle0, + lcCandle0Time, + lcCandle0Style, + lc0TagPrefix, + drawBody, + drawShadows, + update // + ); + } + + // + if (drawCandle1) + { + // + DrawCandleAsBox( + chartId, + subWindow, + lcCandle1, + lcCandle1Time, + lcCandle1Style, + lc1TagPrefix, + drawBody, + drawShadows, + update // + ); + } + } + } + + // + if (drawHC) + { + // + if (!drawAsBox) + { + // + if (drawCandle0) + { + // + DrawCandleAsLine( + chartId, + subWindow, + hcCandle0, + hcCandle0Time, + hcCandle0Style, + hc0TagPrefix, + update // + ); + } + + // + if (drawCandle1) + { + // + DrawCandleAsLine( + chartId, + subWindow, + hcCandle1, + hcCandle1Time, + hcCandle1Style, + hc1TagPrefix, + update // + ); + } + } + else + { + // + if (drawCandle0) + { + // + DrawCandleAsBox( + chartId, + subWindow, + hcCandle0, + hcCandle0Time, + hcCandle0Style, + hc0TagPrefix, + drawBody, + drawShadows, + update // + ); + } + + // + if (drawCandle1) + { + // + DrawCandleAsBox( + chartId, + subWindow, + hcCandle1, + hcCandle1Time, + hcCandle1Style, + hc1TagPrefix, + drawBody, + drawShadows, + update // + ); + } + } + } + + // + // Draw MidLines ... + + // + string candel0MidLineTag = GenerateCandleMidLineTag( + candle0, + c0TagPrefix // + ); + string candel1MidLineTag = GenerateCandleMidLineTag( + candle1, + c1TagPrefix // + ); + string scCandel0MidLineTag = GenerateCandleMidLineTag( + scCandle0, + sc0TagPrefix // + ); + string scCandel1MidLineTag = GenerateCandleMidLineTag( + scCandle1, + sc1TagPrefix // + ); + string mcCandel0MidLineTag = GenerateCandleMidLineTag( + mcCandle0, + mc0TagPrefix // + ); + string mcCandel1MidLineTag = GenerateCandleMidLineTag( + mcCandle1, + mc1TagPrefix // + ); + string lcCandel0MidLineTag = GenerateCandleMidLineTag( + lcCandle0, + lc0TagPrefix // + ); + string lcCandel1MidLineTag = GenerateCandleMidLineTag( + lcCandle1, + lc1TagPrefix // + ); + string hcCandel0MidLineTag = GenerateCandleMidLineTag( + hcCandle0, + hc0TagPrefix // + ); + string hcCandel1MidLineTag = GenerateCandleMidLineTag( + hcCandle1, + hc1TagPrefix // + ); + + // + // Current ... + + // + // Candle 0 ... + specs.style = STYLE_DOT; + specs.clr = clrTurquoise; + DrawCandleMidLine( + candle0, + candle0Time, + specs, + candel0MidLineTag, + c0TagPrefix, + draw0MidLine // + ); + + // + // Candle 1 ... + specs.width = 2; + specs.style = STYLE_SOLID; + DrawCandleMidLine( + candle1, + candle1Time, + specs, + candel1MidLineTag, + c1TagPrefix, + draw1MidLine // + ); + + // + // Short ... + + // + // Candle 0 ... + specs.width = 1; + specs.style = STYLE_DOT; + specs.clr = clrSpringGreen; + DrawCandleMidLine( + scCandle0, + scCandle0Time, + specs, + scCandel0MidLineTag, + sc0TagPrefix, + drawSC0MidLine // + ); + + // + // Candle 1 ... + specs.width = 2; + specs.style = STYLE_SOLID; + DrawCandleMidLine( + scCandle1, + scCandle1Time, + specs, + scCandel1MidLineTag, + sc1TagPrefix, + drawSC1MidLine // + ); + + // + // Medium ... + + // + // Candle 0 ... + specs.width = 1; + specs.clr = clrCornflowerBlue; + specs.style = STYLE_DOT; + DrawCandleMidLine( + mcCandle0, + mcCandle0Time, + specs, + mcCandel0MidLineTag, + mc0TagPrefix, + drawMC0MidLine // + ); + + // + // Candle 1 ... + specs.width = 2; + specs.style = STYLE_SOLID; + DrawCandleMidLine( + mcCandle1, + mcCandle1Time, + specs, + mcCandel1MidLineTag, + mc1TagPrefix, + drawMC1MidLine // + ); + + // + // Long ... + + // + // Candle 0 ... + specs.width = 1; + specs.style = STYLE_DOT; + specs.clr = clrYellow; + DrawCandleMidLine( + lcCandle0, + lcCandle0Time, + specs, + lcCandel0MidLineTag, + lc0TagPrefix, + drawLC0MidLine // + ); + + // + // Candle 1 ... + specs.width = 2; + specs.style = STYLE_SOLID; + DrawCandleMidLine( + lcCandle1, + lcCandle1Time, + specs, + lcCandel1MidLineTag, + lc1TagPrefix, + drawLC1MidLine // + ); + + // + // Hind ... + + // + // Candle 0 ... + specs.clr = clrDarkOrange; + specs.width = 1; + specs.style = STYLE_DOT; + DrawCandleMidLine( + hcCandle0, + hcCandle0Time, + specs, + hcCandel0MidLineTag, + hc0TagPrefix, + drawHC0MidLine // + ); + + // + // Candle 1 ... + specs.width = 2; + specs.style = STYLE_SOLID; + DrawCandleMidLine( + hcCandle1, + hcCandle1Time, + specs, + hcCandel1MidLineTag, + hc1TagPrefix, + drawHC1MidLine // + ); +} + +// +void DrawCandleMidLine( + XOHCL &c, // Candle ... + const datetime time, // Candle Time ... + XDrawSpecifications &specs, // Draw Specifications ... + string tag = "", // Tag ... + string label = "", // Label ... + bool draw = false // Draw MidLine ... +) +{ + // + if (!draw) + { + return; + } + + // + long chartId = ChartID(); + int subWindow = 0; + + // + double value = (c.open + c.close) / 2; + + // + datetime cTime = TimeCurrent(); + + // + string lblTag = tag + "_lbl"; + DrawText( + chartId, + lblTag, + subWindow, + cTime, + value, + label, + "Arial", + 20, + specs.clr, + 90, + ANCHOR_LEFT_UPPER, + specs.back, + specs.selection, + specs.hidden, + specs.zOrder // + ); + + // + // Draw ... + DrawTrendLine( + chartId, + tag, + subWindow, + time, + value, + cTime, + value, + specs.clr, + specs.style, + specs.width, + specs.back, + specs.selection, + specs.rayRight, + specs.hidden, + specs.zOrder // + ); +} + +// +string GenerateCandleMidLineTag( + XOHCL &c, // Candle ... + string tag = "" // Tag ... +) +{ + // + double value = (c.open + c.close) / 2; + + // + string result = tag + "_" + "|MID|"; + + // + return result; +} diff --git a/MQLTestWorkspace/BKPS/14030222/Helpers/x-saherelm.x121.xman.helper.class.ex5 b/MQLTestWorkspace/BKPS/14030222/Helpers/x-saherelm.x121.xman.helper.class.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..d8893caa09e96651283cfffbafbdd4b7b620486a GIT binary patch literal 10166 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 WoW$R72k(Z^qDJ|@Mb0_zrvERGXpCb3 literal 0 HcmV?d00001 diff --git a/MQLTestWorkspace/BKPS/14030222/Helpers/x-saherelm.x121.xman.helper.class.mq5 b/MQLTestWorkspace/BKPS/14030222/Helpers/x-saherelm.x121.xman.helper.class.mq5 new file mode 100644 index 0000000..dc0d890 --- /dev/null +++ b/MQLTestWorkspace/BKPS/14030222/Helpers/x-saherelm.x121.xman.helper.class.mq5 @@ -0,0 +1,1927 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Helper Class Library +// ---------------------------------------------- +// Name: XSCXMANHelper +// Description: provides all Indicator +// Helper requirements ... +// +// +// Maintainer: +// ------------ +// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) +// +////////////////////////////////////////////////////// +// +// Global Properties ... +#property library +#property copyright "Copyright 2023, SaherElm IT Center" +#property link "https://www.saherelm.ir" +#property version "1.00" +#property strict + +// +// START Definitions ... +// + +// +#include "../Libraries/x-saherelm.xman.parser.lib.mq5" + +// +// All Extractable Buffers ... +enum ENUM_XMAN_BUFFERS +{ + // + // Peaks and Vales ... + XMAN_PEAKS_LINE = 0, // Peaks + XMAN_VALES_LINE = 1, // Vales + XMAN_PEAKS_STATE_LINE = 74, // New Peak + XMAN_VALES_STATE_LINE = 75, // New Vales + // + // Fibonacci Retracement ... + XMAN_FIB_L1_LINE = 6, // Fibo Level 1 + XMAN_FIB_L2_LINE = 8, // Fibo Level 2 + XMAN_FIB_L3_LINE = 10, // Fibo Level 3 + XMAN_FIB_L4_LINE = 12, // Fibo Level 3 + XMAN_FIB_L5_LINE = 14, // Fibo Level 3 + // + // Period Cycles ... + // + // Short Cycle ... + XMAN_SC_HH_LINE = 16, // High + XMAN_SC_LL_LINE = 18, // Low + XMAN_SC_HH_STATE_LINE = 76, // High State + XMAN_SC_LL_STATE_LINE = 77, // Low State + // + // Medium ... + XMAN_MC_HH_LINE = 20, // High + XMAN_MC_LL_LINE = 22, // Low + XMAN_MC_HH_STATE_LINE = 78, // High State + XMAN_MC_LL_STATE_LINE = 79, // Low State + // + // Long ... + XMAN_LC_HH_LINE = 24, // High + XMAN_LC_LL_LINE = 26, // Low + XMAN_LC_HH_STATE_LINE = 80, // High State + XMAN_LC_LL_STATE_LINE = 81, // Low State + // + // Hind ... + XMAN_HC_HH_LINE = 28, // High + XMAN_HC_LL_LINE = 30, // Low + XMAN_HC_HH_STATE_LINE = 82, // High State + XMAN_HC_LL_STATE_LINE = 83, // Low State + // + // XSTR ... + XMAN_TREND_LINE = 34, // Trend Value + XMAN_TREND_STATE_LINE = 84, // Trend Direction + // + // XMRB ... + // + // RIBBON 1 _ HIGH ... + XMAN_RB1_LINE = 36, // Value + XMAN_RB1_STATE_LINE = 85, // State + // + // RIBBON 2 _ OPEN ... + XMAN_RB2_LINE = 38, // Value + XMAN_RB2_STATE_LINE = 86, // State + // + // RIBBON 3 _ CLOSE ... + XMAN_RB3_LINE = 40, // Value + XMAN_RB3_STATE_LINE = 87, // State + // + // RIBBON 4 _ MEDIAN ... + XMAN_RB4_LINE = 42, // Value + XMAN_RB4_STATE_LINE = 88, // State + // + // RIBBON 5 _ TYPICAL ... + XMAN_RB5_LINE = 44, // Value + XMAN_RB5_STATE_LINE = 89, // State + // + // RIBBON 6 _ LOW ... + XMAN_RB6_LINE = 46, // Value + XMAN_RB6_STATE_LINE = 90, // State + // + // XSSLC ... + XMAN_SSLC_UP_LINE = 48, // Up + XMAN_SSLC_DOWN_LINE = 50, // Down + // + // XHULL ... + XMAN_HULL_UP_LINE = 52, // Up + XMAN_HULL_DOWN_LINE = 54, // Down + XMAN_HULL_UP_STATE_LINE = 91, // Up State + XMAN_HULL_DOWN_STATE_LINE = 92, // Down State + // + // XHK ... + XMAN_HK_OPEN_LINE = 56, // Open + XMAN_HK_HIGH_LINE = 57, // High + XMAN_HK_LOW_LINE = 58, // Low + XMAN_HK_CLOSE_LINE = 59, // Close + XMAN_HK_STATE_LINE = 93, // State + // + // XSMHK ... + XMAN_SMHK_OPEN_LINE = 61, // Open + XMAN_SMHK_HIGH_LINE = 62, // High + XMAN_SMHK_LOW_LINE = 63, // Low + XMAN_SMHK_CLOSE_LINE = 64, // Close +}; + +// +// Define States On XMAN ... +enum ENUM_XMAN_STATES +{ + XMAN_STATE_BULLISH = 2, + XMAN_STATE_STRONG_BULLISH = 8, + XMAN_STATE_BEARISH = 3, + XMAN_STATE_STRONG_BEARISH = 9, + XMAN_STATE_NEUTURAL = 1, + XMAN_STATE_STRONG_NEUTURAL = 7, +}; + +// +// Model all required info as a Model for Instancing Helper Class ... +struct XMANInputs +{ + // + // Candle Timer ... + color candleTimerColor; // Text Color + ENUM_BASE_CORNER candleTimerCorner; // Text Position + + // + // Chart Style ... + color upColor; // Up Color + color downColor; // Down Color + color lineColor; // Line mode and Doji candlestick Color + color bearishColor; // Bullish Color + color bullishColor; // Bearish Color + color volumesColor; // Volumes Color + ENUM_CHART_MODE chartMode; // Chart Mode + + // + // Market Cycles ... + + // + // Level 1 ... + ENUM_X_PERIOD_METHOD l1Method; // How to Find Period + ENUM_TIMEFRAMES l1Period; // Time Period + + // + // Level 2 ... + ENUM_X_PERIOD_METHOD l2Method; // How to Find Period + ENUM_TIMEFRAMES l2Period; // Time Period + + // + // Level 3 ... + ENUM_X_PERIOD_METHOD l3Method; // How to Find Period + ENUM_TIMEFRAMES l3Period; // Time Period + + // + // Level 4 ... + ENUM_X_PERIOD_METHOD l4Method; // How to Find Period + ENUM_TIMEFRAMES l4Period; // Time Period + + // + // Fibonacci ... + double fiboLevel1; // Fibio 1st Level + double fiboLevel2; // Fibio 2st Level + double fiboLevel3; // Fibio 3rd Level + double fiboLevel4; // Fibio 4th Level + double fiboLevel5; // Fibio 5th Level + + // + // Boundary Detection Modes ... + ENUM_SERIESMODE hhMode; // Highest High Calculation Method + ENUM_SERIESMODE llMode; // Lowest Low Calculation Method + + // + // Trend Detection + double trendMultiplier; // Multiplier + ENUM_APPLIED_PRICE trendPriceAppliedTo; // Applied To + + // + // Ribbon Detection ... + ENUM_X_MA_METHOD ribbonMode; // How to Calculate + + // + // Hull Trend Detection ... + double hullDivisor; // Divisor (Speed) + ENUM_APPLIED_PRICE hullUpAppliedTo; // Up Zone Applied to + ENUM_APPLIED_PRICE hullDownAppliedTo; // Down Zone Applied to + + // + // SSL Channel Detection ... + ENUM_X_MA_METHOD sslcMode; // How to Calculate + ENUM_APPLIED_PRICE sslcUpAppliedTo; // Up Applied To + ENUM_APPLIED_PRICE sslcDownAppliedTo; // Down Applied To + + // + // Presentation ... + bool showCandleTimer; // Show Candle Time + bool showCandles; // Show Candles + bool showHKCandles; // Draw Hiken Ashi Candle + bool showSMHKCandles; // Draw Smoothed Hiken Ashi Candle + bool showPeaksAndVales; // Show Peaks and Vales + bool showTrends; // Show Trends + bool fillTrends; // Fill Trends + bool showLevels; // Show Levels + bool showConsolidations; // Show Consolidations + bool showRibbons; // Show Ribbons + bool showHull; // Show Hull + bool showSSLChannel; // Show SSL Channel + bool showFibo1Levels; // Show Fibo 1st Level + bool showFibo2Levels; // Show Fibo 2nd Level + bool showFibo3Levels; // Show Fibo 3rd Level + bool showFibo4Levels; // Show Fibo 4th Level + bool showFibo5Levels; // Show Fibo 5th Level +}; + +// +// Model all Extractable Info as a Model for Market Analyzing ... +struct XMANInfo +{ + // + // COMMONS ... + + // + // Symbol ... + string symbol; + + // + // Period ... + ENUM_TIMEFRAMES period; + + // + // Bar Time ... + datetime barTime; + + // + // Bar Index ... + int barIndex; + + // + // SPECIALS ... + + // + // Buffers ... + + // + // Chanes ... + XValueChanged trendChanges[]; + XValueChanged peakChanges[]; + XValueChanged valeChanges[]; + + // + // Peaks and Vales ... + double peaks[]; + double peaksStates[]; + double vales[]; + double valesStates[]; + + // + // Fibonacci ... + double fibLevel1s[]; + double fibLevel2s[]; + double fibLevel3s[]; + double fibLevel4s[]; + double fibLevel5s[]; + + // + // Cycles ... + + // + // Short ... + double sHHs[]; + double sHHStates[]; + double sLLs[]; + double sLLStates[]; + + // + // Medium ... + double mHHs[]; + double mHHStates[]; + double mLLs[]; + double mLLStates[]; + + // + // Long ... + double lHHs[]; + double lHHStates[]; + double lLLs[]; + double lLLStates[]; + + // + // Hind ... + double hHHs[]; + double hHHStates[]; + double hLLs[]; + double hLLStates[]; + + // + // Trends ... + double trends[]; + double trendStates[]; + + // + // Ribbons ... + + // + // 1 _ High ... + double ribbon1s[]; + double ribbon1States[]; + + // + // 2 _ Open ... + double ribbon2s[]; + double ribbon2States[]; + + // + // 3 _ Close ... + double ribbon3s[]; + double ribbon3States[]; + + // + // 4 _ Median ... + double ribbon4s[]; + double ribbon4States[]; + + // + // 5 _ Typical ... + double ribbon5s[]; + double ribbon5States[]; + + // + // 6 _ Low ... + double ribbon6s[]; + double ribbon6States[]; + + // + // SSL Channel ... + double sslcUps[]; + double sslcDowns[]; + + // + // Hull Trend ... + double hullUps[]; + double hullUpStates[]; + double hullDowns[]; + double hullDownStates[]; + + // + // Hiken Ashi ... + double hkOpens[]; + double hkHighs[]; + double hkLows[]; + double hkCloses[]; + double hkStates[]; + + // + // Smoothed Hiken Ashi ... + double smhkOpens[]; + double smhkHighs[]; + double smhkLows[]; + double smhkCloses[]; +}; + +// +// END Definitions ... +// + +// +// START Import and Inclused requirements ... +// + +// +// Includes ... +#include "../Libraries/x-saherelm.common.lib.mq5" +#include "../Classes/x-saherelm.xhelper.class.mq5" + +// +// END Import and Inclused requirements ... +// + +// +// START Overrides ... +// + +// +// END Overrides ... +// + +// +class XSCXMANHelper : public XSCBaseHelper +{ + // + // Public ... +public: + // + // Props ... + + // + XValueChanged trendChanges[]; + XValueChanged peakChanges[]; + XValueChanged valeChanges[]; + + // + // Peaks and Vales ... + double peaksBuffer[]; + double peaksStateBuffer[]; + double valesBuffer[]; + double valesStateBuffer[]; + + // + // Fibonacci ... + double fibLevel1Buffer[]; + double fibLevel2Buffer[]; + double fibLevel3Buffer[]; + double fibLevel4Buffer[]; + double fibLevel5Buffer[]; + + // + // Cycles ... + + // + // Short ... + double sHHBuffer[]; + double sHHStateBuffer[]; + double sLLBuffer[]; + double sLLStateBuffer[]; + + // + // Medium ... + double mHHBuffer[]; + double mHHStateBuffer[]; + double mLLBuffer[]; + double mLLStateBuffer[]; + + // + // Long ... + double lHHBuffer[]; + double lHHStateBuffer[]; + double lLLBuffer[]; + double lLLStateBuffer[]; + + // + // Hind ... + double hHHBuffer[]; + double hHHStateBuffer[]; + double hLLBuffer[]; + double hLLStateBuffer[]; + + // + // Trends ... + double trendBuffer[]; + double trendStateBuffer[]; + + // + // Ribbons ... + + // + // 1 _ High ... + double ribbon1Buffer[]; + double ribbon1StateBuffer[]; + + // + // 2 _ Open ... + double ribbon2Buffer[]; + double ribbon2StateBuffer[]; + + // + // 3 _ Close ... + double ribbon3Buffer[]; + double ribbon3StateBuffer[]; + + // + // 4 _ Median ... + double ribbon4Buffer[]; + double ribbon4StateBuffer[]; + + // + // 5 _ Typical ... + double ribbon5Buffer[]; + double ribbon5StateBuffer[]; + + // + // 6 _ Low ... + double ribbon6Buffer[]; + double ribbon6StateBuffer[]; + + // + // SSL Channel ... + double sslUpBuffer[]; + double sslDownBuffer[]; + + // + // Hull Trend ... + double hullUpBuffer[]; + double hullUpStateBuffer[]; + double hullDownBuffer[]; + double hullDownStateBuffer[]; + + // + // Hiken Ashi ... + double hkOpenBuffer[]; + double hkHighBuffer[]; + double hkLowBuffer[]; + double hkCloseBuffer[]; + double hkStateBuffer[]; + + // + // Smoothed Hiken Ashi ... + double smhkOpenBuffer[]; + double smhkHighBuffer[]; + double smhkLowBuffer[]; + double smhkCloseBuffer[]; + + // + // Constructor ... + void XSCXMANHelper( + string symbol, // Trading Symbol + ENUM_TIMEFRAMES period // Trading Time Frame + ) : XSCBaseHelper(symbol, period) + { + PrepareTag(); + } + + // + // Deconstructor ... + void ~XSCXMANHelper() + { + } + + // + // START Properties ... + // + + // + // END Properties ... + // + + // + // START Provided Functions ... + // + + // + // Prepare Tag ... + virtual void PrepareTag() + { + mTag = "XMAN" + GetTagPrefix(); + } + + // + virtual int GetMaxLength() + { + // + int result = 1; + + // + result = 1; + + // + return result; + } + + // + // Initial Indicator Handler ... + bool Init() + { + // + bool result = false; + + // + // Validate Args ... + result = + // + // L1 ... + // Short Cycle ... + ( + // + mL1Method == X_PERIOD_AUTO + ? mL1Period == NULL + : mL1Period != NULL && mL1Method != X_PERIOD_NOTHING + // + ) + // + && + // + // L2 ... + // Medium Cycle ... + ( + // + mL2Method == X_PERIOD_AUTO + ? mL2Period == NULL + : mL2Period != NULL && mL2Method != X_PERIOD_NOTHING + // + ) + // + && + // + // L3 ... + // Long Cycle ... + ( + // + mL3Method == X_PERIOD_AUTO + ? mL3Period == NULL + : mL3Period != NULL && mL3Method != X_PERIOD_NOTHING + // + ) + // + && + // + // L4 ... + // Hind Cycle ... + ( + // + mL4Method == X_PERIOD_AUTO + ? mL4Period == NULL + : mL4Period != NULL && mL4Method != X_PERIOD_NOTHING + // + ) + // + && + // + // Validate Ribbon ... + ( + // + mRibbonMode != X_MA_NOTHING + // + ) + // + ; + if (!result) + { + return false; + } + + // + // Now we Have to Generate Proper Configs of Inputs ... + // to bypass into iCustom ... + + // + // Candle Timer ... + string ctConfig = GenerateCTimerConfig( + mCandleTimerColor, + mCandleTimerCorner); + + // + // Chart Style ... + string chStyleConfig = GenerateChartStyleConfig( + mUpColor, + mDownColor, + mLineColor, + mBearishColor, + mBullishColor, + mVolumesColor, + mChartMode); + + // + // Market Cycles ... + + // + // SHORT ... + string scConfig = GenerateSCConfig( + mL1Method, + mL1Period); + + // + // MEDIUM ... + string mcConfig = GenerateMCConfig( + mL2Method, + mL2Period); + + // + // LONG ... + string lcConfig = GenerateLCConfig( + mL3Method, + mL3Period); + + // + // HIND ... + string hcConfig = GenerateHCConfig( + mL4Method, + mL4Period); + + // + // Fibonacci ... + string fiboConfig = GenerateFibonacciConfig( + mFiboLevel1, + mFiboLevel2, + mFiboLevel3, + mFiboLevel4, + mFiboLevel5); + + // + // Boundary Detection ... + string bdConfig = GenerateBDConfig( + mHHMode, + mLLMode); + + // + // Trend Detection ... + string tdConfig = GenerateTDConfig( + mTrendMultiplier, + mTrendPriceAppliedTo); + + // + // Ribbon ... + string rbConfig = GenerateRBConfig( + mRibbonMode); + + // + // Hull Trend ... + string hullConfig = GenerateHullConfig( + mHullDivisor, + mHullUpAppliedTo, + mHullDownAppliedTo); + + // + // SSL Channel ... + string sslcConfig = GenerateSSLCConfig( + mSslcMode, + mSslcUpAppliedTo, + mSslcDownAppliedTo); + + // + // Presentations ... + + // + // STYLES ... + string stylesPRSConfig = GenerateStylePresentationConfig( + mShowCandleTimer, + mShowCandles, + mShowHKCandles, + mShowSMHKCandles); + + // + // PEAKSANDVALES ... + string pvPRSConfig = GeneratePVPresentationConfig( + mShowPeaksAndVales, + mShowLevels, + mShowConsolidations); + + // + // TREND ... + string trendPRSConfig = GenerateTrendPresentationConfig( + mShowTrends, + mFillTrends, + mShowRibbons, + mShowHull, + mShowSSLChannel); + + // + // FIBO ... + string fiboPRSConfig = GenerateFiboPresentationConfig( + mShowFibo1Levels, + mShowFibo2Levels, + mShowFibo3Levels, + mShowFibo4Levels, + mShowFibo5Levels); + + // + // Initialize Handler ... + mHandler = iCustom( + // + mSymbol, + mPeriod, + "x-saherelm.x121.xman", + // + // Inputs ... + // + // Candle Timer + "", + ctConfig, + // + // Chart Style + "", + chStyleConfig, + // + // Makret Cycles + "", + // + // Short + "", + scConfig, + // + // Medium + "", + mcConfig, + // + // Long + "", + lcConfig, + // + // Hind + "", + hcConfig, + // + // Fibonacci + "", + fiboConfig, + // + // Boundary Detection Modes + "", + bdConfig, + // + // Trend Detection + "", + tdConfig, + // + // Ribbon Detection + "", + rbConfig, + // + // Hull Trend Detection + "", + hullConfig, + // + // SSL Channel + "", + sslcConfig, + // + // Presentations + "", + // + // STYLES + stylesPRSConfig, + // + // PEAKSANDVALES + pvPRSConfig, + // + // TREND + trendPRSConfig, + // + // FIBO + fiboPRSConfig + // + ); + result = mHandler != INVALID_HANDLE; + + // + return result; + } + + // + // Retrieve Current Config ... + XMANInputs GetConfig() + { + // + XMANInputs result; + + // + result.candleTimerColor = mCandleTimerColor; + result.candleTimerCorner = mCandleTimerCorner; + result.upColor = mUpColor; + result.downColor = mDownColor; + result.lineColor = mLineColor; + result.bearishColor = mBearishColor; + result.bullishColor = mBullishColor; + result.volumesColor = mVolumesColor; + result.chartMode = mChartMode; + result.l1Method = mL1Method; + result.l1Period = mL1Period; + result.l2Method = mL2Method; + result.l2Period = mL2Period; + result.l3Method = mL3Method; + result.l3Period = mL3Period; + result.l4Method = mL4Method; + result.l4Period = mL4Period; + result.fiboLevel1 = mFiboLevel1; + result.fiboLevel2 = mFiboLevel2; + result.fiboLevel3 = mFiboLevel3; + result.fiboLevel4 = mFiboLevel4; + result.fiboLevel5 = mFiboLevel5; + result.hhMode = mHHMode; + result.llMode = mLLMode; + result.trendMultiplier = mTrendMultiplier; + result.trendPriceAppliedTo = mTrendPriceAppliedTo; + result.ribbonMode = mRibbonMode; + result.hullDivisor = mHullDivisor; + result.hullUpAppliedTo = mHullUpAppliedTo; + result.hullDownAppliedTo = mHullDownAppliedTo; + result.sslcMode = mSslcMode; + result.sslcUpAppliedTo = mSslcUpAppliedTo; + result.sslcDownAppliedTo = mSslcDownAppliedTo; + result.showCandleTimer = mShowCandleTimer; + result.showCandles = mShowCandles; + result.showHKCandles = mShowHKCandles; + result.showSMHKCandles = mShowSMHKCandles; + result.showPeaksAndVales = mShowPeaksAndVales; + result.showTrends = mShowTrends; + result.fillTrends = mFillTrends; + result.showLevels = mShowLevels; + result.showConsolidations = mShowConsolidations; + result.showRibbons = mShowRibbons; + result.showHull = mShowHull; + result.showSSLChannel = mShowSSLChannel; + result.showFibo1Levels = mShowFibo1Levels; + result.showFibo2Levels = mShowFibo2Levels; + result.showFibo3Levels = mShowFibo3Levels; + result.showFibo4Levels = mShowFibo4Levels; + result.showFibo5Levels = mShowFibo5Levels; + + // + return result; + } + + // + // Set Config ... + bool SetConfig(XMANInputs &config) + { + // + bool result = false; + + // + mCandleTimerColor = config.candleTimerColor; + mCandleTimerCorner = config.candleTimerCorner; + mUpColor = config.upColor; + mDownColor = config.downColor; + mLineColor = config.lineColor; + mBearishColor = config.bearishColor; + mBullishColor = config.bullishColor; + mVolumesColor = config.volumesColor; + mChartMode = config.chartMode; + mL1Method = config.l1Method; + mL1Period = config.l1Period; + mL2Method = config.l2Method; + mL2Period = config.l2Period; + mL3Method = config.l3Method; + mL3Period = config.l3Period; + mL4Method = config.l4Method; + mL4Period = config.l4Period; + mFiboLevel1 = config.fiboLevel1; + mFiboLevel2 = config.fiboLevel2; + mFiboLevel3 = config.fiboLevel3; + mFiboLevel4 = config.fiboLevel4; + mFiboLevel5 = config.fiboLevel5; + mHHMode = config.hhMode; + mLLMode = config.llMode; + mTrendMultiplier = config.trendMultiplier; + mTrendPriceAppliedTo = config.trendPriceAppliedTo; + mRibbonMode = config.ribbonMode; + mHullDivisor = config.hullDivisor; + mHullUpAppliedTo = config.hullUpAppliedTo; + mHullDownAppliedTo = config.hullDownAppliedTo; + mSslcMode = config.sslcMode; + mSslcUpAppliedTo = config.sslcUpAppliedTo; + mSslcDownAppliedTo = config.sslcDownAppliedTo; + mShowCandleTimer = config.showCandleTimer; + mShowCandles = config.showCandles; + mShowHKCandles = config.showHKCandles; + mShowSMHKCandles = config.showSMHKCandles; + mShowPeaksAndVales = config.showPeaksAndVales; + mShowTrends = config.showTrends; + mFillTrends = config.fillTrends; + mShowLevels = config.showLevels; + mShowConsolidations = config.showConsolidations; + mShowRibbons = config.showRibbons; + mShowHull = config.showHull; + mShowSSLChannel = config.showSSLChannel; + mShowFibo1Levels = config.showFibo1Levels; + mShowFibo2Levels = config.showFibo2Levels; + mShowFibo3Levels = config.showFibo3Levels; + mShowFibo4Levels = config.showFibo4Levels; + mShowFibo5Levels = config.showFibo5Levels; + + // + result = Init(); + + // + return result; + } + + // + // Reading Buffers based on Given Bar Index ... + virtual void Calculate( + int barIndex // Given Bar Index + ) + { + // + // Peaks ... + ArraySetAsSeries(peaksBuffer, true); + CopyBuffer( + mHandler, + XMAN_PEAKS_LINE, + barIndex, + mLoopbackBars, + peaksBuffer); + + // + // Peaks State ... + ArraySetAsSeries(peaksStateBuffer, true); + CopyBuffer( + mHandler, + XMAN_PEAKS_STATE_LINE, + barIndex, + mLoopbackBars, + peaksStateBuffer); + + // + // Vales ... + ArraySetAsSeries(valesBuffer, true); + CopyBuffer( + mHandler, + XMAN_VALES_LINE, + barIndex, + mLoopbackBars, + valesBuffer); + + // + // Vales State ... + ArraySetAsSeries(valesStateBuffer, true); + CopyBuffer( + mHandler, + XMAN_VALES_STATE_LINE, + barIndex, + mLoopbackBars, + valesStateBuffer); + + // + // Fibo 1 ... + ArraySetAsSeries(fibLevel1Buffer, true); + CopyBuffer( + mHandler, + XMAN_FIB_L1_LINE, + barIndex, + mLoopbackBars, + fibLevel1Buffer); + + // + // Fibo 2 ... + ArraySetAsSeries(fibLevel2Buffer, true); + CopyBuffer( + mHandler, + XMAN_FIB_L2_LINE, + barIndex, + mLoopbackBars, + fibLevel2Buffer); + + // + // Fibo 3 ... + ArraySetAsSeries(fibLevel3Buffer, true); + CopyBuffer( + mHandler, + XMAN_FIB_L3_LINE, + barIndex, + mLoopbackBars, + fibLevel3Buffer); + + // + // Fibo 4 ... + ArraySetAsSeries(fibLevel4Buffer, true); + CopyBuffer( + mHandler, + XMAN_FIB_L4_LINE, + barIndex, + mLoopbackBars, + fibLevel4Buffer); + + // + // Fibo 5 ... + ArraySetAsSeries(fibLevel5Buffer, true); + CopyBuffer( + mHandler, + XMAN_FIB_L5_LINE, + barIndex, + mLoopbackBars, + fibLevel5Buffer); + + // + // Cycles ... + + // + // Short ... + + // + // High ... + ArraySetAsSeries(sHHBuffer, true); + CopyBuffer( + mHandler, + XMAN_SC_HH_LINE, + barIndex, + mLoopbackBars, + sHHBuffer); + + // + // High State ... + ArraySetAsSeries(sHHStateBuffer, true); + CopyBuffer( + mHandler, + XMAN_SC_HH_STATE_LINE, + barIndex, + mLoopbackBars, + sHHStateBuffer); + + // + // High ... + ArraySetAsSeries(sLLBuffer, true); + CopyBuffer( + mHandler, + XMAN_SC_LL_LINE, + barIndex, + mLoopbackBars, + sLLBuffer); + + // + // High State ... + ArraySetAsSeries(sLLStateBuffer, true); + CopyBuffer( + mHandler, + XMAN_SC_LL_STATE_LINE, + barIndex, + mLoopbackBars, + sLLStateBuffer); + + // + // Medium ... + + // + // High ... + ArraySetAsSeries(mHHBuffer, true); + CopyBuffer( + mHandler, + XMAN_MC_HH_LINE, + barIndex, + mLoopbackBars, + mHHBuffer); + + // + // High State ... + ArraySetAsSeries(mHHStateBuffer, true); + CopyBuffer( + mHandler, + XMAN_MC_HH_STATE_LINE, + barIndex, + mLoopbackBars, + mHHStateBuffer); + + // + // High ... + ArraySetAsSeries(mLLBuffer, true); + CopyBuffer( + mHandler, + XMAN_MC_LL_LINE, + barIndex, + mLoopbackBars, + mLLBuffer); + + // + // High State ... + ArraySetAsSeries(mLLStateBuffer, true); + CopyBuffer( + mHandler, + XMAN_MC_LL_STATE_LINE, + barIndex, + mLoopbackBars, + mLLStateBuffer); + + // + // Long ... + + // + // High ... + ArraySetAsSeries(lHHBuffer, true); + CopyBuffer( + mHandler, + XMAN_LC_HH_LINE, + barIndex, + mLoopbackBars, + lHHBuffer); + + // + // High State ... + ArraySetAsSeries(lHHStateBuffer, true); + CopyBuffer( + mHandler, + XMAN_LC_HH_STATE_LINE, + barIndex, + mLoopbackBars, + lHHStateBuffer); + + // + // High ... + ArraySetAsSeries(lLLBuffer, true); + CopyBuffer( + mHandler, + XMAN_LC_LL_LINE, + barIndex, + mLoopbackBars, + lLLBuffer); + + // + // High State ... + ArraySetAsSeries(lLLStateBuffer, true); + CopyBuffer( + mHandler, + XMAN_LC_LL_STATE_LINE, + barIndex, + mLoopbackBars, + lLLStateBuffer); + + // + // Hind ... + + // + // High ... + ArraySetAsSeries(hHHBuffer, true); + CopyBuffer( + mHandler, + XMAN_HC_HH_LINE, + barIndex, + mLoopbackBars, + hHHBuffer); + + // + // High State ... + ArraySetAsSeries(hHHStateBuffer, true); + CopyBuffer( + mHandler, + XMAN_HC_HH_STATE_LINE, + barIndex, + mLoopbackBars, + hHHStateBuffer); + + // + // High ... + ArraySetAsSeries(hLLBuffer, true); + CopyBuffer( + mHandler, + XMAN_HC_LL_LINE, + barIndex, + mLoopbackBars, + hLLBuffer); + + // + // High State ... + ArraySetAsSeries(hLLStateBuffer, true); + CopyBuffer( + mHandler, + XMAN_HC_LL_STATE_LINE, + barIndex, + mLoopbackBars, + hLLStateBuffer); + + // + // Trend ... + + // + // Trend ... + ArraySetAsSeries(trendBuffer, true); + CopyBuffer( + mHandler, + XMAN_TREND_LINE, + barIndex, + mLoopbackBars, + trendBuffer); + + // + // Trend State ... + ArraySetAsSeries(trendStateBuffer, true); + CopyBuffer( + mHandler, + XMAN_TREND_STATE_LINE, + barIndex, + mLoopbackBars, + trendStateBuffer); + + // + // Ribbons ... + + // + // 1 ... + + // + // R1 ... + ArraySetAsSeries(ribbon1Buffer, true); + CopyBuffer( + mHandler, + XMAN_RB1_LINE, + barIndex, + mLoopbackBars, + ribbon1Buffer); + + // + // R1 State ... + ArraySetAsSeries(ribbon1StateBuffer, true); + CopyBuffer( + mHandler, + XMAN_RB1_STATE_LINE, + barIndex, + mLoopbackBars, + ribbon1StateBuffer); + + // + // 2 ... + + // + // R2 ... + ArraySetAsSeries(ribbon2Buffer, true); + CopyBuffer( + mHandler, + XMAN_RB2_LINE, + barIndex, + mLoopbackBars, + ribbon2Buffer); + + // + // R2 State ... + ArraySetAsSeries(ribbon2StateBuffer, true); + CopyBuffer( + mHandler, + XMAN_RB2_STATE_LINE, + barIndex, + mLoopbackBars, + ribbon2StateBuffer); + + // + // 3 ... + + // + // R3 ... + ArraySetAsSeries(ribbon3Buffer, true); + CopyBuffer( + mHandler, + XMAN_RB3_LINE, + barIndex, + mLoopbackBars, + ribbon3Buffer); + + // + // R3 State ... + ArraySetAsSeries(ribbon3StateBuffer, true); + CopyBuffer( + mHandler, + XMAN_RB3_STATE_LINE, + barIndex, + mLoopbackBars, + ribbon3StateBuffer); + + // + // 4 ... + + // + // R4 ... + ArraySetAsSeries(ribbon4Buffer, true); + CopyBuffer( + mHandler, + XMAN_RB4_LINE, + barIndex, + mLoopbackBars, + ribbon4Buffer); + + // + // R4 State ... + ArraySetAsSeries(ribbon4StateBuffer, true); + CopyBuffer( + mHandler, + XMAN_RB4_STATE_LINE, + barIndex, + mLoopbackBars, + ribbon4StateBuffer); + + // + // 5 ... + + // + // R5 ... + ArraySetAsSeries(ribbon5Buffer, true); + CopyBuffer( + mHandler, + XMAN_RB5_LINE, + barIndex, + mLoopbackBars, + ribbon5Buffer); + + // + // R5 State ... + ArraySetAsSeries(ribbon5StateBuffer, true); + CopyBuffer( + mHandler, + XMAN_RB5_STATE_LINE, + barIndex, + mLoopbackBars, + ribbon5StateBuffer); + + // + // 6 ... + + // + // R6 ... + ArraySetAsSeries(ribbon6Buffer, true); + CopyBuffer( + mHandler, + XMAN_RB6_LINE, + barIndex, + mLoopbackBars, + ribbon6Buffer); + + // + // R6 State ... + ArraySetAsSeries(ribbon6StateBuffer, true); + CopyBuffer( + mHandler, + XMAN_RB6_STATE_LINE, + barIndex, + mLoopbackBars, + ribbon6StateBuffer); + + // + // SSL Channel ... + + // + // UP ... + ArraySetAsSeries(sslUpBuffer, true); + CopyBuffer( + mHandler, + XMAN_SSLC_UP_LINE, + barIndex, + mLoopbackBars, + sslUpBuffer); + + // + // DOWN ... + ArraySetAsSeries(sslDownBuffer, true); + CopyBuffer( + mHandler, + XMAN_SSLC_DOWN_LINE, + barIndex, + mLoopbackBars, + sslDownBuffer); + + // + // HULL Trend ... + + // + // UP ... + ArraySetAsSeries(hullUpBuffer, true); + CopyBuffer( + mHandler, + XMAN_HULL_UP_LINE, + barIndex, + mLoopbackBars, + hullUpBuffer); + + // + // UP State ... + ArraySetAsSeries(hullUpStateBuffer, true); + CopyBuffer( + mHandler, + XMAN_HULL_UP_STATE_LINE, + barIndex, + mLoopbackBars, + hullUpStateBuffer); + + // + // DOWN ... + ArraySetAsSeries(hullDownBuffer, true); + CopyBuffer( + mHandler, + XMAN_HULL_DOWN_LINE, + barIndex, + mLoopbackBars, + hullDownBuffer); + + // + // DOWN State ... + ArraySetAsSeries(hullDownStateBuffer, true); + CopyBuffer( + mHandler, + XMAN_HULL_DOWN_STATE_LINE, + barIndex, + mLoopbackBars, + hullDownStateBuffer); + + // + // Hiken Ashi ... + + // + // Open ... + ArraySetAsSeries(hkOpenBuffer, true); + CopyBuffer( + mHandler, + XMAN_HK_OPEN_LINE, + barIndex, + mLoopbackBars, + hkOpenBuffer); + + // + // High ... + ArraySetAsSeries(hkHighBuffer, true); + CopyBuffer( + mHandler, + XMAN_HK_HIGH_LINE, + barIndex, + mLoopbackBars, + hkHighBuffer); + + // + // Low ... + ArraySetAsSeries(hkLowBuffer, true); + CopyBuffer( + mHandler, + XMAN_HK_LOW_LINE, + barIndex, + mLoopbackBars, + hkLowBuffer); + + // + // Close ... + ArraySetAsSeries(hkCloseBuffer, true); + CopyBuffer( + mHandler, + XMAN_HK_CLOSE_LINE, + barIndex, + mLoopbackBars, + hkCloseBuffer); + + // + // Close ... + ArraySetAsSeries(hkStateBuffer, true); + CopyBuffer( + mHandler, + XMAN_HK_STATE_LINE, + barIndex, + mLoopbackBars, + hkStateBuffer); + + // + // XSMHK ... + + // + // Open ... + ArraySetAsSeries(smhkOpenBuffer, true); + CopyBuffer( + mHandler, + XMAN_SMHK_OPEN_LINE, + barIndex, + mLoopbackBars, + smhkOpenBuffer); + + // + // High ... + ArraySetAsSeries(smhkHighBuffer, true); + CopyBuffer( + mHandler, + XMAN_SMHK_HIGH_LINE, + barIndex, + mLoopbackBars, + smhkHighBuffer); + + // + // Low ... + ArraySetAsSeries(smhkLowBuffer, true); + CopyBuffer( + mHandler, + XMAN_SMHK_LOW_LINE, + barIndex, + mLoopbackBars, + smhkLowBuffer); + + // + // Close ... + ArraySetAsSeries(smhkCloseBuffer, true); + CopyBuffer( + mHandler, + XMAN_SMHK_CLOSE_LINE, + barIndex, + mLoopbackBars, + smhkCloseBuffer); + } + + // + // Retrieve Info at Specific Bar Index ... + XMANInfo GetInfo( + int barIndex // Given Bar Index + ) + { + // + XMANInfo result; + + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + // Do Calculations ... + Calculate(barIndex); + + // + // Generate Candle Time ... + datetime barTime = GetCandleTime( + mSymbol, + mPeriod, + barIndex); + + // + // Fill Result ... + result.symbol = mSymbol; + result.period = mPeriod; + result.barTime = barTime; + result.barIndex = barIndex; + + // + // Buffers ... + + // + Copy(peaksBuffer, + result.peaks); + Copy(peaksStateBuffer, + result.peaksStates); + Copy(valesBuffer, + result.vales); + Copy(valesStateBuffer, + result.valesStates); + + // + Copy(fibLevel1Buffer, + result.fibLevel1s); + Copy(fibLevel2Buffer, + result.fibLevel2s); + Copy(fibLevel3Buffer, + result.fibLevel3s); + Copy(fibLevel4Buffer, + result.fibLevel4s); + Copy(fibLevel5Buffer, + result.fibLevel5s); + + // + Copy(sHHBuffer, + result.sHHs); + Copy(sHHStateBuffer, + result.sHHStates); + Copy(sLLBuffer, + result.sLLs); + Copy(sLLStateBuffer, + result.sLLStates); + + // + Copy(mHHBuffer, + result.mHHs); + Copy(mHHStateBuffer, + result.mHHStates); + Copy(mLLBuffer, + result.mLLs); + Copy(mLLStateBuffer, + result.mLLStates); + + // + Copy(lHHBuffer, + result.lHHs); + Copy(lHHStateBuffer, + result.lHHStates); + Copy(lLLBuffer, + result.lLLs); + Copy(lLLStateBuffer, + result.lLLStates); + + // + Copy(hHHBuffer, + result.hHHs); + Copy(hHHStateBuffer, + result.hHHStates); + Copy(hLLBuffer, + result.hLLs); + Copy(hLLStateBuffer, + result.hLLStates); + + // + Copy(trendBuffer, + result.trends); + Copy(trendStateBuffer, + result.trendStates); + + // + Copy(ribbon1Buffer, + result.ribbon1s); + Copy(ribbon1StateBuffer, + result.ribbon1States); + + // + Copy(ribbon2Buffer, + result.ribbon2s); + Copy(ribbon2StateBuffer, + result.ribbon2States); + + // + Copy(ribbon3Buffer, + result.ribbon3s); + Copy(ribbon3StateBuffer, + result.ribbon3States); + + // + Copy(ribbon4Buffer, + result.ribbon4s); + Copy(ribbon4StateBuffer, + result.ribbon4States); + + // + Copy(ribbon5Buffer, + result.ribbon5s); + Copy(ribbon5StateBuffer, + result.ribbon5States); + + // + Copy(ribbon6Buffer, + result.ribbon6s); + Copy(ribbon6StateBuffer, + result.ribbon6States); + + // + Copy(sslUpBuffer, + result.sslcUps); + Copy(sslDownBuffer, + result.sslcDowns); + + // + Copy(hullUpBuffer, + result.hullUps); + Copy(hullUpStateBuffer, + result.hullUpStates); + Copy(hullDownBuffer, + result.hullDowns); + Copy(hullDownStateBuffer, + result.hullDownStates); + + // + Copy(hkOpenBuffer, + result.hkOpens); + Copy(hkHighBuffer, + result.hkHighs); + Copy(hkLowBuffer, + result.hkLows); + Copy(hkCloseBuffer, + result.hkCloses); + Copy(hkStateBuffer, + result.hkStates); + + // + Copy(smhkOpenBuffer, + result.smhkOpens); + Copy(smhkHighBuffer, + result.smhkHighs); + Copy(smhkLowBuffer, + result.smhkLows); + Copy(smhkCloseBuffer, + result.smhkCloses); + + // + // Prepare Change Handlers ... + barTime = GetCandleTime( + mSymbol, + mPeriod, + 0); + + // + // Trend Change ... + bool isTrendChangedHandled = + HandleValueChanged( + trendChanges, + trendStateBuffer, + trendBuffer, + barTime); + + // + Copy( + trendChanges, + result.trendChanges); + + // + // Peak Change ... + bool isPeaksChangedHandled = + HandleValueChanged( + peakChanges, + peaksBuffer, + peaksBuffer, + barTime); + + // + Copy( + peakChanges, + result.peakChanges); + + // + // Vale Change ... + bool isValesChangedHandled = + HandleValueChanged( + valeChanges, + valesBuffer, + valesBuffer, + barTime); + + // + Copy( + valeChanges, + result.valeChanges); + + // + return result; + } + + // + // Protcted ... +protected: + // + // Private ... +private: + // + // Inputs ... + + // + // Candle Timer ... + color mCandleTimerColor; // Text Color + ENUM_BASE_CORNER mCandleTimerCorner; // Text Position + + // + // Chart Style ... + color mUpColor; // Up Color + color mDownColor; // Down Color + color mLineColor; // Line mode and Doji candlestick Color + color mBearishColor; // Bullish Color + color mBullishColor; // Bearish Color + color mVolumesColor; // Volumes Color + ENUM_CHART_MODE mChartMode; // Chart Mode + + // + // Market Cycles ... + + // + // Level 1 ... + ENUM_X_PERIOD_METHOD mL1Method; // How to Find Period + ENUM_TIMEFRAMES mL1Period; // Time Period + + // + // Level 2 ... + ENUM_X_PERIOD_METHOD mL2Method; // How to Find Period + ENUM_TIMEFRAMES mL2Period; // Time Period + + // + // Level 3 ... + ENUM_X_PERIOD_METHOD mL3Method; // How to Find Period + ENUM_TIMEFRAMES mL3Period; // Time Period + + // + // Level 4 ... + ENUM_X_PERIOD_METHOD mL4Method; // How to Find Period + ENUM_TIMEFRAMES mL4Period; // Time Period + + // + // Fibonacci ... + double mFiboLevel1; // Fibio 1st Level + double mFiboLevel2; // Fibio 2st Level + double mFiboLevel3; // Fibio 3rd Level + double mFiboLevel4; // Fibio 4th Level + double mFiboLevel5; // Fibio 5th Level + + // + // Boundary Detection Modes ... + ENUM_SERIESMODE mHHMode; // Highest High Calculation Method + ENUM_SERIESMODE mLLMode; // Lowest Low Calculation Method + + // + // Trend Detection + double mTrendMultiplier; // Multiplier + ENUM_APPLIED_PRICE mTrendPriceAppliedTo; // Applied To + + // + // Ribbon Detection ... + ENUM_X_MA_METHOD mRibbonMode; // How to Calculate + + // + // Hull Trend Detection ... + double mHullDivisor; // Divisor (Speed) + ENUM_APPLIED_PRICE mHullUpAppliedTo; // Up Zone Applied to + ENUM_APPLIED_PRICE mHullDownAppliedTo; // Down Zone Applied to + + // + // SSL Channel Detection ... + ENUM_X_MA_METHOD mSslcMode; // How to Calculate + ENUM_APPLIED_PRICE mSslcUpAppliedTo; // Up Applied To + ENUM_APPLIED_PRICE mSslcDownAppliedTo; // Down Applied To + + // + // Presentation ... + bool mShowCandleTimer; // Show Candle Time + bool mShowCandles; // Show Candles + bool mShowHKCandles; // Draw Hiken Ashi Candle + bool mShowSMHKCandles; // Draw Smoothed Hiken Ashi Candle + bool mShowPeaksAndVales; // Show Peaks and Vales + bool mShowTrends; // Show Trends + bool mFillTrends; // Fill Trends + bool mShowLevels; // Show Levels + bool mShowConsolidations; // Show Consolidations + bool mShowRibbons; // Show Ribbons + bool mShowHull; // Show Hull + bool mShowSSLChannel; // Show SSL Channel + bool mShowFibo1Levels; // Show Fibo 1st Level + bool mShowFibo2Levels; // Show Fibo 2nd Level + bool mShowFibo3Levels; // Show Fibo 3rd Level + bool mShowFibo4Levels; // Show Fibo 4th Level + bool mShowFibo5Levels; // Show Fibo 5th Level +}; + +// +// START Usefull Functions ... +// + +// +// END Usefull Functions ... +// diff --git a/MQLTestWorkspace/BKPS/14030222/Indicators/x-saherelm.x121.xdema.ex5 b/MQLTestWorkspace/BKPS/14030222/Indicators/x-saherelm.x121.xdema.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..ae2c45c2f4f93b780d8cebb76e78d586ace6710c GIT binary patch literal 12298 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 literal 0 HcmV?d00001 diff --git a/MQLTestWorkspace/BKPS/14030222/Indicators/x-saherelm.x121.xdema.mq5 b/MQLTestWorkspace/BKPS/14030222/Indicators/x-saherelm.x121.xdema.mq5 new file mode 100644 index 0000000..186778e --- /dev/null +++ b/MQLTestWorkspace/BKPS/14030222/Indicators/x-saherelm.x121.xdema.mq5 @@ -0,0 +1,348 @@ +////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Indicator +// --------------------------------------------- +// Name: X121_XDEMA +// Description: Super Trend Indicator ... +// +// +// Maintainer: +// ------------ +// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) +// +////////////////////////////////////////////////////// +// +// Global Properties ... +#property copyright "Copyright 2023, SaherElm IT Center" +#property link "https://saherelm.ir" +#property version "1.00" +#property description "SaherElm X121_XAMA Indicator" +#property strict + +// +// START Constants ... +// + +#define ShortName "X121_XDEMA" + +// +// END Constants ... +// + +// +// START Inputs ... +// + +// +// Market ... +input group "Market"; +input int length = 200; // Length +input int shift = 0; // Shift + +// +// Presentation ... +input group "Presentation"; +input bool showDema = true; // Show Dema +input bool showEMA = false; // Show EMA +input bool showEMAOfEMA = false; // Show EMA of EMA + +// +// END Inputs ... +// + +// +// Includes Common Library ... +#include +#include "../Libraries/x-saherelm.common.lib.mq5" + +// +// START Buffers ... +// + +// +#property indicator_chart_window + +// +#property indicator_buffers 6 +#property indicator_plots 6 + +// +#define demaBufferIndex 0 +double demaBuffer[]; + +// +#define demaColorBufferIndex 1 +double demaColorBuffer[]; + +// +#property indicator_label1 "X121_XDEMA DEMA" +#property indicator_type1 DRAW_COLOR_LINE +#property indicator_color1 clrDodgerBlue, CLR_NONE +#property indicator_style1 STYLE_SOLID +#property indicator_width1 1 + +// +#define emaBufferIndex 2 +double emaBuffer[]; + +// +#define emaColorBufferIndex 3 +double emaColorBuffer[]; + +// +#property indicator_label2 "X121_XDEMA EMA" +#property indicator_type2 DRAW_COLOR_LINE +#property indicator_color2 clrBlue, CLR_NONE +#property indicator_style2 STYLE_DOT +#property indicator_width2 1 + +// +#define emaOfEMABufferIndex 4 +double emaOfEMABuffer[]; + +// +#define emaOfEMAColorBufferIndex 5 +double emaOfEMAColorBuffer[]; + +// +#property indicator_label3 "X121_XDEMA EMA of EMA" +#property indicator_type3 DRAW_COLOR_LINE +#property indicator_color3 clrOrange, CLR_NONE +#property indicator_style3 STYLE_DOT +#property indicator_width3 1 + +// +// END Buffers ... +// + +// +// START Global Definitions: Variables, Properties and etc ... +// + +// +int maxLength; + +// +// END Global Definitions: Variables, Properties and etc ... +// + +// +// START Event Handlers ... +// + +// +// Initialization ... +int OnInit() +{ + // + // Validate Inputs ... + if (!ValidateInputs()) + { + return INIT_PARAMETERS_INCORRECT; + } + + // + // because in some cases we may have more than one input for + // calculation and we must prevent any calculation + // untill we pass the biggest input length, here we get max Input length + // and then wait until pass it ... + maxLength = ExtractMaxLengthOfInputs(); + + // + // Define Index Buffers ... + DefineBuffers(); + + // + // Set Indicator ShortName ... + SetIndicatorName(); + + // + // Init Succeed ... + return INIT_SUCCEEDED; +} + +// +// DeInitialization ... +void OnDeinit(const int reason) +{ + // + // REASON_PROGRAM 0 The EA has stopped working calling the ExpertRemove() function + // REASON_REMOVE 1 Program removed from a chart + // REASON_RECOMPILE 2 Program recompiled + // REASON_CHARTCHANGE 3 A symbol or a chart period is changed + // REASON_CHARTCLOSE 4 Chart closed + // REASON_PARAMETERS 5 Inputs changed by a user + // REASON_ACCOUNT 6 Another account has been activated or reconnection to the trade server has occurred due to changes in the account settings + // REASON_TEMPLATE 7 Another chart template applied + // REASON_INITFAILED 8 The OnInit() handler returned a non-zero value + // REASON_CLOSE 9 Terminal closed +} + +// +// Do Calculations ... +int OnCalculate(const int rates_total, + const int prev_calculated, + const int begin, + const double &price[]) +{ + // + ArraySetAsSeries(price, true); + + // + // check for data ... + if (rates_total < 2 * length - 2) + { + return 0; + } + + // + int limit; + + // + limit = (prev_calculated > rates_total || prev_calculated <= 0) ? rates_total : (rates_total - prev_calculated) + 1; + + // + // calculate EMA ... + ExponentialMAOnBuffer(rates_total, prev_calculated, 0, length, price, emaBuffer); + + // + // calculate EMA on EMA array ... + ExponentialMAOnBuffer(rates_total, prev_calculated, length - 1, length, emaBuffer, emaOfEMABuffer); + + // + // Main Loop ... + for (int i = limit - 1; i >= 0 && !IsStopped(); i--) + { + // + // calculate DEMA ... + demaBuffer[i] = 2 * emaBuffer[i] - emaOfEMABuffer[i]; + + // + double showColorIDX = 0; + double hideColorIDX = 1; + + // + demaColorBuffer[i] = hideColorIDX; + emaColorBuffer[i] = hideColorIDX; + emaOfEMAColorBuffer[i] = hideColorIDX; + + // + if (showDema) + { + demaColorBuffer[i] = showColorIDX; + } + + // + if (showEMA) + { + emaColorBuffer[i] = showColorIDX; + } + + // + if (showEMAOfEMA) + { + emaOfEMAColorBuffer[i] = showColorIDX; + } + } + + // + return rates_total; +} + +// +// END Event Handlers ... +// + +// +// START Functions ... +// + +// +// Validate Input Args for Initialization ... +bool ValidateInputs() +{ + // + bool result = + // + (length > 2 && + shift >= 0) + // + ; + + // + return result; +} + +// +// Retrieve all Exists Input Max Length ... +// use for Start Of Drawing ... +int ExtractMaxLengthOfInputs() +{ + // + int result = 0; + + // + // Peaks and Vales ... + result = length; + + // + return result; +} + +// +// Set Indicator Short Name and also we can define Buffers Labels ... +void SetIndicatorName() +{ + IndicatorSetString(INDICATOR_SHORTNAME, ShortName); +} + +// +// Define Indexes and Styles ... +void DefineBuffers() +{ + // + // DEMA ... + + // + // Buffer ... + ArraySetAsSeries(demaBuffer, true); + SetIndexBuffer(demaBufferIndex, demaBuffer, INDICATOR_DATA); + PlotIndexSetInteger(demaBufferIndex, PLOT_SHOW_DATA, showDema); + + // + // Color Buffer ... + ArraySetAsSeries(demaColorBuffer, true); + SetIndexBuffer(demaColorBufferIndex, demaColorBuffer, INDICATOR_COLOR_INDEX); + + // + // EMA ... + + // + // Buffer ... + ArraySetAsSeries(emaBuffer, true); + SetIndexBuffer(emaBufferIndex, emaBuffer, INDICATOR_DATA); + PlotIndexSetInteger(emaBufferIndex, PLOT_SHOW_DATA, showEMA); + + // + // Color Buffer ... + ArraySetAsSeries(emaColorBuffer, true); + SetIndexBuffer(emaColorBufferIndex, emaColorBuffer, INDICATOR_COLOR_INDEX); + + // + // EMA of EMA ... + + // + // Buffer ... + ArraySetAsSeries(emaOfEMABuffer, true); + SetIndexBuffer(emaOfEMABufferIndex, emaOfEMABuffer, INDICATOR_DATA); + PlotIndexSetInteger(emaOfEMABufferIndex, PLOT_SHOW_DATA, showEMAOfEMA); + + // + // Color Buffer ... + ArraySetAsSeries(emaOfEMAColorBuffer, true); + SetIndexBuffer(emaOfEMAColorBufferIndex, emaOfEMAColorBuffer, INDICATOR_COLOR_INDEX); +} + +// +// END Functions ... +// diff --git a/MQLTestWorkspace/BKPS/14030222/Indicators/x-saherelm.x121.xdsr.ex5 b/MQLTestWorkspace/BKPS/14030222/Indicators/x-saherelm.x121.xdsr.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..efbfe45f7c15e4528442c8cf361a86423089f654 GIT binary patch literal 27272 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