From 3fa288c92ce1465ca7f31daa8a8d4cc0fd7f8ab4 Mon Sep 17 00:00:00 2001 From: Hadi Khazaee Asl Date: Mon, 13 May 2024 18:21:02 +0330 Subject: [PATCH] bkp workspace ... --- .../XBEEA/14030224/Experts/x-donchain.ea.mq5 | 558 ++ .../XBEEA/14030224/Experts/x-rsima.ea.mq5 | 494 ++ .../14030224/Experts/x-saherelm.xbe.ea.ex5 | Bin 0 -> 214444 bytes .../14030224/Experts/x-saherelm.xbe.ea.mq5 | 3319 ++++++++++ .../XBEEA/14030224/Experts/x-saherelm.xea.ex5 | Bin 0 -> 412550 bytes .../XBEEA/14030224/Experts/x-saherelm.xea.mq5 | 377 ++ .../x-saherelm.x121.xman.helper.class.ex5 | Bin 0 -> 10470 bytes .../x-saherelm.x121.xman.helper.class.mq5 | 1927 ++++++ .../Indicators/x-saherelm.x121.xche.ex5 | Bin 0 -> 18864 bytes .../Indicators/x-saherelm.x121.xche.mq5 | 631 ++ .../Indicators/x-saherelm.x121.xdema.ex5 | Bin 0 -> 12810 bytes .../Indicators/x-saherelm.x121.xdema.mq5 | 348 + .../Indicators/x-saherelm.x121.xdsr.ex5 | Bin 0 -> 41950 bytes .../Indicators/x-saherelm.x121.xdsr.mq5 | 964 +++ .../Indicators/x-saherelm.x121.xich.ex5 | Bin 0 -> 20534 bytes .../Indicators/x-saherelm.x121.xich.mq5 | 836 +++ .../Indicators/x-saherelm.x121.xman.ex5 | Bin 0 -> 87354 bytes .../Indicators/x-saherelm.x121.xman.mq5 | 4631 +++++++++++++ .../Indicators/x-saherelm.x121.xosc.ex5 | Bin 0 -> 25548 bytes .../Indicators/x-saherelm.x121.xosc.mq5 | 721 ++ .../Indicators/x-saherelm.x121.xstr.ex5 | Bin 0 -> 17770 bytes .../Indicators/x-saherelm.x121.xstr.mq5 | 580 ++ .../Indicators/x-saherelm.x121.xzg.ex5 | Bin 0 -> 10856 bytes .../Indicators/x-saherelm.x121.xzg.mq5 | 757 +++ .../14030224/Indicators/x-saherelm.xchnl.ex5 | Bin 0 -> 25906 bytes .../14030224/Indicators/x-saherelm.xchnl.mq5 | 775 +++ .../14030224/Indicators/x-saherelm.xdon.ex5 | Bin 0 -> 9942 bytes .../14030224/Indicators/x-saherelm.xdon.mq5 | 365 + .../Libraries/x-saherelm.alert.lib.ex5 | Bin 0 -> 7232 bytes .../Libraries/x-saherelm.alert.lib.mq5 | 187 + .../Libraries/x-saherelm.common.lib.ex5 | Bin 0 -> 7770 bytes .../Libraries/x-saherelm.common.lib.mq5 | 5878 +++++++++++++++++ .../Libraries/x-saherelm.draw.lib.ex5 | Bin 0 -> 6416 bytes .../Libraries/x-saherelm.draw.lib.mq5 | 3608 ++++++++++ .../Libraries/x-saherelm.http.lib.ex5 | Bin 0 -> 3836 bytes .../Libraries/x-saherelm.http.lib.mq5 | 177 + .../14030224/Libraries/x-saherelm.log.lib.ex5 | Bin 0 -> 6454 bytes .../14030224/Libraries/x-saherelm.log.lib.mq5 | 1088 +++ .../Libraries/x-saherelm.models.lib.ex5 | Bin 0 -> 5300 bytes .../Libraries/x-saherelm.models.lib.mq5 | 326 + .../Libraries/x-saherelm.seriallizer.lib.ex5 | Bin 0 -> 13148 bytes .../Libraries/x-saherelm.seriallizer.lib.mq5 | 1326 ++++ .../x-saherelm.x121.condition.parser.lib.mq5 | 3841 +++++++++++ .../Libraries/x-saherelm.x121.draw.lib.ex5 | Bin 0 -> 6974 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 -> 10032 bytes .../Libraries/x-saherelm.xman.parser.lib.mq5 | 1663 +++++ 50 files changed, 36881 insertions(+) create mode 100644 MQLTestWorkspace/XBEEA/14030224/Experts/x-donchain.ea.mq5 create mode 100644 MQLTestWorkspace/XBEEA/14030224/Experts/x-rsima.ea.mq5 create mode 100644 MQLTestWorkspace/XBEEA/14030224/Experts/x-saherelm.xbe.ea.ex5 create mode 100644 MQLTestWorkspace/XBEEA/14030224/Experts/x-saherelm.xbe.ea.mq5 create mode 100644 MQLTestWorkspace/XBEEA/14030224/Experts/x-saherelm.xea.ex5 create mode 100644 MQLTestWorkspace/XBEEA/14030224/Experts/x-saherelm.xea.mq5 create mode 100644 MQLTestWorkspace/XBEEA/14030224/Helpers/x-saherelm.x121.xman.helper.class.ex5 create mode 100644 MQLTestWorkspace/XBEEA/14030224/Helpers/x-saherelm.x121.xman.helper.class.mq5 create mode 100644 MQLTestWorkspace/XBEEA/14030224/Indicators/x-saherelm.x121.xche.ex5 create mode 100644 MQLTestWorkspace/XBEEA/14030224/Indicators/x-saherelm.x121.xche.mq5 create mode 100644 MQLTestWorkspace/XBEEA/14030224/Indicators/x-saherelm.x121.xdema.ex5 create mode 100644 MQLTestWorkspace/XBEEA/14030224/Indicators/x-saherelm.x121.xdema.mq5 create mode 100644 MQLTestWorkspace/XBEEA/14030224/Indicators/x-saherelm.x121.xdsr.ex5 create mode 100644 MQLTestWorkspace/XBEEA/14030224/Indicators/x-saherelm.x121.xdsr.mq5 create mode 100644 MQLTestWorkspace/XBEEA/14030224/Indicators/x-saherelm.x121.xich.ex5 create mode 100644 MQLTestWorkspace/XBEEA/14030224/Indicators/x-saherelm.x121.xich.mq5 create mode 100644 MQLTestWorkspace/XBEEA/14030224/Indicators/x-saherelm.x121.xman.ex5 create mode 100644 MQLTestWorkspace/XBEEA/14030224/Indicators/x-saherelm.x121.xman.mq5 create mode 100644 MQLTestWorkspace/XBEEA/14030224/Indicators/x-saherelm.x121.xosc.ex5 create mode 100644 MQLTestWorkspace/XBEEA/14030224/Indicators/x-saherelm.x121.xosc.mq5 create mode 100644 MQLTestWorkspace/XBEEA/14030224/Indicators/x-saherelm.x121.xstr.ex5 create mode 100644 MQLTestWorkspace/XBEEA/14030224/Indicators/x-saherelm.x121.xstr.mq5 create mode 100644 MQLTestWorkspace/XBEEA/14030224/Indicators/x-saherelm.x121.xzg.ex5 create mode 100644 MQLTestWorkspace/XBEEA/14030224/Indicators/x-saherelm.x121.xzg.mq5 create mode 100644 MQLTestWorkspace/XBEEA/14030224/Indicators/x-saherelm.xchnl.ex5 create mode 100644 MQLTestWorkspace/XBEEA/14030224/Indicators/x-saherelm.xchnl.mq5 create mode 100644 MQLTestWorkspace/XBEEA/14030224/Indicators/x-saherelm.xdon.ex5 create mode 100644 MQLTestWorkspace/XBEEA/14030224/Indicators/x-saherelm.xdon.mq5 create mode 100644 MQLTestWorkspace/XBEEA/14030224/Libraries/x-saherelm.alert.lib.ex5 create mode 100644 MQLTestWorkspace/XBEEA/14030224/Libraries/x-saherelm.alert.lib.mq5 create mode 100644 MQLTestWorkspace/XBEEA/14030224/Libraries/x-saherelm.common.lib.ex5 create mode 100644 MQLTestWorkspace/XBEEA/14030224/Libraries/x-saherelm.common.lib.mq5 create mode 100644 MQLTestWorkspace/XBEEA/14030224/Libraries/x-saherelm.draw.lib.ex5 create mode 100644 MQLTestWorkspace/XBEEA/14030224/Libraries/x-saherelm.draw.lib.mq5 create mode 100644 MQLTestWorkspace/XBEEA/14030224/Libraries/x-saherelm.http.lib.ex5 create mode 100644 MQLTestWorkspace/XBEEA/14030224/Libraries/x-saherelm.http.lib.mq5 create mode 100644 MQLTestWorkspace/XBEEA/14030224/Libraries/x-saherelm.log.lib.ex5 create mode 100644 MQLTestWorkspace/XBEEA/14030224/Libraries/x-saherelm.log.lib.mq5 create mode 100644 MQLTestWorkspace/XBEEA/14030224/Libraries/x-saherelm.models.lib.ex5 create mode 100644 MQLTestWorkspace/XBEEA/14030224/Libraries/x-saherelm.models.lib.mq5 create mode 100644 MQLTestWorkspace/XBEEA/14030224/Libraries/x-saherelm.seriallizer.lib.ex5 create mode 100644 MQLTestWorkspace/XBEEA/14030224/Libraries/x-saherelm.seriallizer.lib.mq5 create mode 100644 MQLTestWorkspace/XBEEA/14030224/Libraries/x-saherelm.x121.condition.parser.lib.mq5 create mode 100644 MQLTestWorkspace/XBEEA/14030224/Libraries/x-saherelm.x121.draw.lib.ex5 create mode 100644 MQLTestWorkspace/XBEEA/14030224/Libraries/x-saherelm.x121.draw.lib.mq5 create mode 100644 MQLTestWorkspace/XBEEA/14030224/Libraries/x-saherelm.x121.x786.lib.mq5 create mode 100644 MQLTestWorkspace/XBEEA/14030224/Libraries/x-saherelm.x121.x92.lib.mq5 create mode 100644 MQLTestWorkspace/XBEEA/14030224/Libraries/x-saherelm.x121.xtest.lib.mq5 create mode 100644 MQLTestWorkspace/XBEEA/14030224/Libraries/x-saherelm.xman.parser.lib.ex5 create mode 100644 MQLTestWorkspace/XBEEA/14030224/Libraries/x-saherelm.xman.parser.lib.mq5 diff --git a/MQLTestWorkspace/XBEEA/14030224/Experts/x-donchain.ea.mq5 b/MQLTestWorkspace/XBEEA/14030224/Experts/x-donchain.ea.mq5 new file mode 100644 index 0000000..a529c33 --- /dev/null +++ b/MQLTestWorkspace/XBEEA/14030224/Experts/x-donchain.ea.mq5 @@ -0,0 +1,558 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center RSIMA MQL5 Expert Advisor +// ------------------------------------------------- +// Name: XDONCHAINEA +// 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 XDONCHAINEA" +#property strict + +// +#include + +// +#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/XBEEA/14030224/Experts/x-rsima.ea.mq5 b/MQLTestWorkspace/XBEEA/14030224/Experts/x-rsima.ea.mq5 new file mode 100644 index 0000000..47292a0 --- /dev/null +++ b/MQLTestWorkspace/XBEEA/14030224/Experts/x-rsima.ea.mq5 @@ -0,0 +1,494 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center RSIMA MQL5 Expert Advisor +// ------------------------------------------------- +// Name: XRSIMAEA +// 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 XRSIMAEA" +#property strict + +// +#include + +// +#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/XBEEA/14030224/Experts/x-saherelm.xbe.ea.ex5 b/MQLTestWorkspace/XBEEA/14030224/Experts/x-saherelm.xbe.ea.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..c4dbbfab0eedda5721f2c9f1e7f0290196b538f6 GIT binary patch literal 214444 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 z%0A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

NCuFr66GJoui|10TZ7USn~qWp@Ff+l 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

DSIJ&xHG8-9a2 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 z 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 QXXI4BF==h^QNbxs0Kharw*UYD literal 0 HcmV?d00001 diff --git a/MQLTestWorkspace/XBEEA/14030224/Experts/x-saherelm.xea.mq5 b/MQLTestWorkspace/XBEEA/14030224/Experts/x-saherelm.xea.mq5 new file mode 100644 index 0000000..52210bb --- /dev/null +++ b/MQLTestWorkspace/XBEEA/14030224/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 = "EURUSDb,GBPUSDb,USDJPYb,USDCHFb,XAUUSDb|M5,M15|0.01|X786|true"; // 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/XBEEA/14030224/Helpers/x-saherelm.x121.xman.helper.class.ex5 b/MQLTestWorkspace/XBEEA/14030224/Helpers/x-saherelm.x121.xman.helper.class.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..c92bebaf62fd366e27060550f5882c278ceff4f6 GIT binary patch literal 10470 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 9 && + loopback >= 0; + + // + return result; +} + +// +// Retrieve all Exists Input Max Length ... +// use for Start Of Drawing ... +int ExtractMaxLengthOfInputs() +{ + // + int result = 0; + + // + result = MathMax(length, loopback); + + // + 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() +{ + // + uint arrowCode = 159; + + // + // LEVEL 1 ... + + // + // Long Exit 1 ... + + // + // Draw Type ... + ENUM_DRAW_TYPE longExit1DrawType = showLongExit1Line ? DRAW_LINE : DRAW_NONE; + ENUM_DRAW_TYPE longExit1StartDrawType = showLongExit1Line ? DRAW_ARROW : DRAW_NONE; + + // + // Buffer ... + SetIndexBuffer(longExit1BufferIndex, longExit1Buffer, INDICATOR_DATA); + PlotIndexSetInteger(longExit1BufferIndex, PLOT_SHOW_DATA, showLongExit1Line); + PlotIndexSetInteger(longExit1BufferIndex, PLOT_DRAW_TYPE, longExit1DrawType); + + // + // Start Buffer ... + SetIndexBuffer(longExit1StartBufferIndex, longExit1StartBuffer, INDICATOR_DATA); + PlotIndexSetInteger(longExit1StartBufferIndex, PLOT_ARROW, arrowCode); + PlotIndexSetInteger(longExit1StartBufferIndex, PLOT_SHOW_DATA, false); + PlotIndexSetInteger(longExit1StartBufferIndex, PLOT_DRAW_TYPE, longExit1StartDrawType); + + // + // Short Exit 1 ... + + // + // Draw Type ... + ENUM_DRAW_TYPE shortExit1DrawType = showShortExit1Line ? DRAW_LINE : DRAW_NONE; + ENUM_DRAW_TYPE shortExit1StartDrawType = showShortExit1Line ? DRAW_ARROW : DRAW_NONE; + + // + // Buffer ... + SetIndexBuffer(shortExit1BufferIndex, shortExit1Buffer, INDICATOR_DATA); + PlotIndexSetInteger(shortExit1BufferIndex, PLOT_SHOW_DATA, showShortExit1Line); + PlotIndexSetInteger(shortExit1BufferIndex, PLOT_DRAW_TYPE, shortExit1DrawType); + + // + // Start Buffer ... + SetIndexBuffer(shortExit1StartBufferIndex, shortExit1StartBuffer, INDICATOR_DATA); + PlotIndexSetInteger(shortExit1StartBufferIndex, PLOT_ARROW, arrowCode); + PlotIndexSetInteger(shortExit1StartBufferIndex, PLOT_SHOW_DATA, false); + PlotIndexSetInteger(shortExit1StartBufferIndex, PLOT_DRAW_TYPE, shortExit1StartDrawType); + + // + // LEVEL 2 ... + + // + // Long Exit 2 ... + + // + // Draw Type ... + ENUM_DRAW_TYPE longExit2DrawType = showLongExit2Line ? DRAW_LINE : DRAW_NONE; + ENUM_DRAW_TYPE longExit2StartDrawType = showLongExit2Line ? DRAW_ARROW : DRAW_NONE; + + // + // Buffer ... + SetIndexBuffer(longExit2BufferIndex, longExit2Buffer, INDICATOR_DATA); + PlotIndexSetInteger(longExit2BufferIndex, PLOT_SHOW_DATA, showLongExit2Line); + PlotIndexSetInteger(longExit2BufferIndex, PLOT_DRAW_TYPE, longExit2DrawType); + + // + // Start Buffer ... + SetIndexBuffer(longExit2StartBufferIndex, longExit2StartBuffer, INDICATOR_DATA); + PlotIndexSetInteger(longExit2StartBufferIndex, PLOT_ARROW, arrowCode); + PlotIndexSetInteger(longExit2StartBufferIndex, PLOT_SHOW_DATA, false); + PlotIndexSetInteger(longExit2StartBufferIndex, PLOT_DRAW_TYPE, longExit2StartDrawType); + + // + // Short Exit 2 ... + + // + // Draw Type ... + ENUM_DRAW_TYPE shortExit2DrawType = showShortExit2Line ? DRAW_LINE : DRAW_NONE; + ENUM_DRAW_TYPE shortExit2StartDrawType = showShortExit2Line ? DRAW_ARROW : DRAW_NONE; + + // + // Buffer ... + SetIndexBuffer(shortExit2BufferIndex, shortExit2Buffer, INDICATOR_DATA); + PlotIndexSetInteger(shortExit2BufferIndex, PLOT_SHOW_DATA, showShortExit2Line); + PlotIndexSetInteger(shortExit2BufferIndex, PLOT_DRAW_TYPE, shortExit2DrawType); + + // + // Start Buffer ... + SetIndexBuffer(shortExit2StartBufferIndex, shortExit2StartBuffer, INDICATOR_DATA); + PlotIndexSetInteger(shortExit2StartBufferIndex, PLOT_ARROW, arrowCode); + PlotIndexSetInteger(shortExit2StartBufferIndex, PLOT_SHOW_DATA, false); + PlotIndexSetInteger(shortExit2StartBufferIndex, PLOT_DRAW_TYPE, shortExit2StartDrawType); +} + +// +// Calculate Buffers ... +void CalculateBuffers( + int bar_index, // Selected Bar Index + int prevCalculated, // Previous Calculated + int ratesTotal, // Total Rates + const double &open[], // Rates Open ... + const double &high[], // Rates High ... + const double &low[], // Rates Low ... + const double &close[] // Rates Close ... +) +{ + // + // Cleanup Buffers ... + longExit1Buffer[bar_index] = longExit1StartBuffer[bar_index] = shortExit1Buffer[bar_index] = shortExit1StartBuffer[bar_index] = EMPTY_VALUE; + longExit2Buffer[bar_index] = longExit2StartBuffer[bar_index] = shortExit2Buffer[bar_index] = shortExit2StartBuffer[bar_index] = EMPTY_VALUE; + + // + int start = MathMax(bar_index - loopback, 0); + + // + // Calculate ATR Value ... + double atrValue = 0; + for (int k = 1; k <= length && (bar_index - k - 1) >= 0; k++) + { + // + atrValue += MathMax(high[bar_index - k], close[MathMax(bar_index - k - 1, 0)]) - + MathMin(low[bar_index - k], close[MathMax(bar_index - k - 1, 0)]); + } + atrValue /= (double)length; + + // + // Retrieve Highest High and Lowest Lows ... + double loopbackMax = high[ArrayMaximum(high, start, loopback)]; + double loopbackMin = low[ArrayMinimum(low, start, loopback)]; + + // + // Fill Multi Dimesional Working Array ... + work[bar_index][hi1Idx] = loopbackMax - multiplier1 * atrValue; + work[bar_index][lo1Idx] = loopbackMin + multiplier1 * atrValue; + work[bar_index][hi2Idx] = loopbackMax - multiplier2 * atrValue; + work[bar_index][lo2Idx] = loopbackMin + multiplier2 * atrValue; + work[bar_index][trend1Idx] = (bar_index > 0) ? work[bar_index - 1][trend1Idx] : 0; + work[bar_index][trend2Idx] = (bar_index > 0) ? work[bar_index - 1][trend2Idx] : 0; + + // + if (bar_index > 0) + { + // + // Calculate Trends ... + if (close[bar_index] > work[bar_index - 1][lo1Idx]) + { + work[bar_index][trend1Idx] = 1; + } + + // + if (close[bar_index] < work[bar_index - 1][hi1Idx]) + { + work[bar_index][trend1Idx] = -1; + } + + // + if (close[bar_index] > work[bar_index - 1][lo2Idx]) + { + work[bar_index][trend2Idx] = 1; + } + + // + if (close[bar_index] < work[bar_index - 1][hi2Idx]) + { + work[bar_index][trend2Idx] = -1; + } + + // + // Calculate Exit Values ... + + // + // Exit 1 ... + + // + // Long ... + if (multiplier1 > 0 && work[bar_index][trend1Idx] == 1) + { + // + if (work[bar_index][hi1Idx] < work[bar_index - 1][hi1Idx]) + { + work[bar_index][hi1Idx] = work[bar_index - 1][hi1Idx]; + } + + // + longExit1Buffer[bar_index] = work[bar_index][hi1Idx]; + + // + if (longExit1Buffer[bar_index - 1] == EMPTY_VALUE) + { + longExit1StartBuffer[bar_index] = longExit1Buffer[bar_index]; + } + } + + // + // Short ... + if (multiplier1 > 0 && work[bar_index][trend1Idx] == -1) + { + // + if (work[bar_index][lo1Idx] > work[bar_index - 1][lo1Idx]) + { + work[bar_index][lo1Idx] = work[bar_index - 1][lo1Idx]; + } + + // + shortExit1Buffer[bar_index] = work[bar_index][lo1Idx]; + + // + if (shortExit1Buffer[bar_index - 1] == EMPTY_VALUE) + { + shortExit1StartBuffer[bar_index] = shortExit1Buffer[bar_index]; + } + } + + // + // Exit 2 ... + + // + // Long ... + if (multiplier2 > 0 && work[bar_index][trend2Idx] == 1) + { + if (work[bar_index][hi2Idx] < work[bar_index - 1][hi2Idx]) + { + work[bar_index][hi2Idx] = work[bar_index - 1][hi2Idx]; + } + + // + longExit2Buffer[bar_index] = work[bar_index][hi2Idx]; + + // + if (longExit2Buffer[bar_index - 1] == EMPTY_VALUE) + { + longExit2StartBuffer[bar_index] = longExit2Buffer[bar_index]; + } + } + + // + // Short ... + if (multiplier2 > 0 && work[bar_index][trend2Idx] == -1) + { + // + if (work[bar_index][lo2Idx] > work[bar_index - 1][lo2Idx]) + { + work[bar_index][lo2Idx] = work[bar_index - 1][lo2Idx]; + } + + // + shortExit2Buffer[bar_index] = work[bar_index][lo2Idx]; + + // + if (shortExit2Buffer[bar_index - 1] == EMPTY_VALUE) + { + shortExit2StartBuffer[bar_index] = shortExit2Buffer[bar_index]; + } + } + } +} + +// +// END Functions ... +// diff --git a/MQLTestWorkspace/XBEEA/14030224/Indicators/x-saherelm.x121.xdema.ex5 b/MQLTestWorkspace/XBEEA/14030224/Indicators/x-saherelm.x121.xdema.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..5c339b0ce696b72af1c8164d071cf77146211e60 GIT binary patch literal 12810 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 +#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/XBEEA/14030224/Indicators/x-saherelm.x121.xdsr.ex5 b/MQLTestWorkspace/XBEEA/14030224/Indicators/x-saherelm.x121.xdsr.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..626738592647e7ea6f13bd21854ebc127ccad413 GIT binary patch literal 41950 zcmdS9Q_wIx3?};8wr$(CZQHhO+qP}n#`oH`t@H1hvpcirV(&Md6nWB4(_D0tR#bx( z#1WtbK>!4R0000G;1~qpeCFf{BJ<^{}=qv@&C7u7X$#n z|6l+B*#C+AuNI56-5!Nl3lBluQdW*UMUvT20GI^Fkq^hAO9`3n4cMNe1h5f9!0dla z5C*UZZ~*WGa00LdFbA*zaQSb$OaKi3F*5+oe|=>D!~dkF|KXwlHUPH&NhASO{;P%m zliB^J{XdZZo9Ta8?DF3UI0JA2(EnGQ|Cha{|F6At|DDVK-4_0zy~7AV_n)^J{?AJP z2h@)UUx-I1k3t(n&1c$nl-$Q`lju$=UFs;~!m=yUO23`9Gl-W(TYjWPQFb^uKAi9F zifnvwDTC@TVD}5?`_mhEL(^K0XQt~L{a%UtSDR4-_Q^koG)?G^LVa96?g#ylJPmuH zP@tvFup9fua-K##_&%<~PA!3I;iC+2(U%oHlx|Lb>5!G1`+Ky=j+>Z!v2H-%YqVb? z5Np1U)UAIp3x%Ull-YuHemy?$Nt7hdf-Q=>5XKyXFta>ThF|npK;G-Mha8p$OsYvQ zSp9%@*HNF58R`x1(4Sp%PFKJ(M{Cn~!Q0jcz&lmPLsVb(#nIc`k#x@z(Yzh0ktD&T z#DzeqNQ@Bo0|ZXf-(lQh9mPfr&|vUgI%w({^7PCi*4{kq(lmFM(57J@!6{SlgW3ZE;x`?imaTja7zq! z;dGaXw(*2{J?7H0RGbNl_s31{$ChTR1-{3*DUVX%LAOkWCt6%&q3&A%HS9r@tSI49 zM{1?TG(DZYQ`pnyzi}VGG1|C0+U8&{?NmK20BXZkzLT8}-+9MZM);an)gXmEO!Obq z07fccGT^szG61JXKF1oDBb^Co3TbT`c|%kN0BBCvcg5Lbr>U&p@a+u?;tlLDA6aYi zYg~lTE=2WTCuXRG%@f@w5obh4
s(?qO^)-#^qMxICL~q6$tmrOC{0Ae!+Gy~0(t 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%0AvSf%0 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 rates_total || prev_calculated <= 0) + ? rates_total - 1 + : (rates_total - prev_calculated); + + // + // Main Loop ... + for (int i = limit; i >= 0 && !IsStopped(); i--) + { + // + // Calculate Buffers ... + CalculateBuffer(i); + } + + // + return rates_total; +} + +// +// CUSTOM Functions ... + +// +// Validate Input Args for Initialization ... +bool ValidateInputs() +{ + // + bool result = false; + + // + result = + // + // Short ... + IsValidCycle( + scMode, + scPeriod) + // + && + // + // Medium ... + IsValidCycle( + mcMode, + mcPeriod) + // + && + // + // Long ... + IsValidCycle( + lcMode, + lcPeriod) + // + && + // + // Hind ... + IsValidCycle( + hcMode, + hcPeriod) + // + ; + + // + return result; +} + +// +// Define Indexes and Styles ... +void DefineBuffers() +{ + // + // Short ... + + // + // High ... + + // + ArraySetAsSeries(scHighBuffer, true); + SetIndexBuffer(scHighBufferIndex, scHighBuffer, INDICATOR_DATA); + + // + PlotIndexSetInteger(scHighBufferPlotIndex, PLOT_SHOW_DATA, true); + PlotIndexSetInteger(scHighBufferPlotIndex, PLOT_DRAW_BEGIN, 0); + PlotIndexSetDouble(scHighBufferPlotIndex, PLOT_EMPTY_VALUE, 0); + + // + // Low ... + + // + ArraySetAsSeries(scLowBuffer, true); + SetIndexBuffer(scLowBufferIndex, scLowBuffer, INDICATOR_DATA); + + // + PlotIndexSetInteger(scLowBufferPlotIndex, PLOT_SHOW_DATA, true); + PlotIndexSetInteger(scLowBufferPlotIndex, PLOT_DRAW_BEGIN, 0); + PlotIndexSetDouble(scLowBufferPlotIndex, PLOT_EMPTY_VALUE, 0); + + // + // Open ... + + // + ArraySetAsSeries(scOpenBuffer, true); + SetIndexBuffer(scOpenBufferIndex, scOpenBuffer, INDICATOR_DATA); + + // + PlotIndexSetInteger(scOpenBufferPlotIndex, PLOT_SHOW_DATA, true); + PlotIndexSetInteger(scOpenBufferPlotIndex, PLOT_DRAW_BEGIN, 0); + PlotIndexSetDouble(scOpenBufferPlotIndex, PLOT_EMPTY_VALUE, 0); + + // + ArraySetAsSeries(scOpenColorBuffer, true); + SetIndexBuffer(scOpenColorBufferIndex, scOpenColorBuffer, INDICATOR_COLOR_INDEX); + + // + // Close ... + + ArraySetAsSeries(scCloseBuffer, true); + SetIndexBuffer(scCloseBufferIndex, scCloseBuffer, INDICATOR_DATA); + + // + PlotIndexSetInteger(scCloseBufferPlotIndex, PLOT_SHOW_DATA, true); + PlotIndexSetInteger(scCloseBufferPlotIndex, PLOT_DRAW_BEGIN, 0); + PlotIndexSetDouble(scCloseBufferPlotIndex, PLOT_EMPTY_VALUE, 0); + + // + ArraySetAsSeries(scCloseColorBuffer, true); + SetIndexBuffer(scCloseColorBufferIndex, scCloseColorBuffer, INDICATOR_COLOR_INDEX); + + // + // Medium ... + + // + // High ... + + // + ArraySetAsSeries(mcHighBuffer, true); + SetIndexBuffer(mcHighBufferIndex, mcHighBuffer, INDICATOR_DATA); + + // + PlotIndexSetInteger(mcHighBufferPlotIndex, PLOT_SHOW_DATA, true); + PlotIndexSetInteger(mcHighBufferPlotIndex, PLOT_DRAW_BEGIN, 0); + PlotIndexSetDouble(mcHighBufferPlotIndex, PLOT_EMPTY_VALUE, 0); + + // + // Low ... + + // + ArraySetAsSeries(mcLowBuffer, true); + SetIndexBuffer(mcLowBufferIndex, mcLowBuffer, INDICATOR_DATA); + + // + PlotIndexSetInteger(mcLowBufferPlotIndex, PLOT_SHOW_DATA, true); + PlotIndexSetInteger(mcLowBufferPlotIndex, PLOT_DRAW_BEGIN, 0); + PlotIndexSetDouble(mcLowBufferPlotIndex, PLOT_EMPTY_VALUE, 0); + + // + // Open ... + + // + ArraySetAsSeries(mcOpenBuffer, true); + SetIndexBuffer(mcOpenBufferIndex, mcOpenBuffer, INDICATOR_DATA); + + // + PlotIndexSetInteger(mcOpenBufferPlotIndex, PLOT_SHOW_DATA, true); + PlotIndexSetInteger(mcOpenBufferPlotIndex, PLOT_DRAW_BEGIN, 0); + PlotIndexSetDouble(mcOpenBufferPlotIndex, PLOT_EMPTY_VALUE, 0); + + // + ArraySetAsSeries(mcOpenColorBuffer, true); + SetIndexBuffer(mcOpenColorBufferIndex, mcOpenColorBuffer, INDICATOR_COLOR_INDEX); + + // + // Close ... + + ArraySetAsSeries(mcCloseBuffer, true); + SetIndexBuffer(mcCloseBufferIndex, mcCloseBuffer, INDICATOR_DATA); + + // + PlotIndexSetInteger(mcCloseBufferPlotIndex, PLOT_SHOW_DATA, true); + PlotIndexSetInteger(mcCloseBufferPlotIndex, PLOT_DRAW_BEGIN, 0); + PlotIndexSetDouble(mcCloseBufferPlotIndex, PLOT_EMPTY_VALUE, 0); + + // + ArraySetAsSeries(mcCloseColorBuffer, true); + SetIndexBuffer(mcCloseColorBufferIndex, mcCloseColorBuffer, INDICATOR_COLOR_INDEX); + + // + // Long ... + + // + // High ... + + // + ArraySetAsSeries(lcHighBuffer, true); + SetIndexBuffer(lcHighBufferIndex, lcHighBuffer, INDICATOR_DATA); + + // + PlotIndexSetInteger(lcHighBufferPlotIndex, PLOT_SHOW_DATA, true); + PlotIndexSetInteger(lcHighBufferPlotIndex, PLOT_DRAW_BEGIN, 0); + PlotIndexSetDouble(lcHighBufferPlotIndex, PLOT_EMPTY_VALUE, 0); + + // + // Low ... + + // + ArraySetAsSeries(lcLowBuffer, true); + SetIndexBuffer(lcLowBufferIndex, lcLowBuffer, INDICATOR_DATA); + + // + PlotIndexSetInteger(lcLowBufferPlotIndex, PLOT_SHOW_DATA, true); + PlotIndexSetInteger(lcLowBufferPlotIndex, PLOT_DRAW_BEGIN, 0); + PlotIndexSetDouble(lcLowBufferPlotIndex, PLOT_EMPTY_VALUE, 0); + + // + // Open ... + + // + ArraySetAsSeries(lcOpenBuffer, true); + SetIndexBuffer(lcOpenBufferIndex, lcOpenBuffer, INDICATOR_DATA); + + // + PlotIndexSetInteger(lcOpenBufferPlotIndex, PLOT_SHOW_DATA, true); + PlotIndexSetInteger(lcOpenBufferPlotIndex, PLOT_DRAW_BEGIN, 0); + PlotIndexSetDouble(lcOpenBufferPlotIndex, PLOT_EMPTY_VALUE, 0); + + // + ArraySetAsSeries(lcOpenColorBuffer, true); + SetIndexBuffer(lcOpenColorBufferIndex, lcOpenColorBuffer, INDICATOR_COLOR_INDEX); + + // + // Close ... + + ArraySetAsSeries(lcCloseBuffer, true); + SetIndexBuffer(lcCloseBufferIndex, lcCloseBuffer, INDICATOR_DATA); + + // + PlotIndexSetInteger(lcCloseBufferPlotIndex, PLOT_SHOW_DATA, true); + PlotIndexSetInteger(lcCloseBufferPlotIndex, PLOT_DRAW_BEGIN, 0); + PlotIndexSetDouble(lcCloseBufferPlotIndex, PLOT_EMPTY_VALUE, 0); + + // + ArraySetAsSeries(lcCloseColorBuffer, true); + SetIndexBuffer(lcCloseColorBufferIndex, lcCloseColorBuffer, INDICATOR_COLOR_INDEX); + + // + // Hind ... + + // + // High ... + + // + ArraySetAsSeries(hcHighBuffer, true); + SetIndexBuffer(hcHighBufferIndex, hcHighBuffer, INDICATOR_DATA); + + // + PlotIndexSetInteger(hcHighBufferPlotIndex, PLOT_SHOW_DATA, true); + PlotIndexSetInteger(hcHighBufferPlotIndex, PLOT_DRAW_BEGIN, 0); + PlotIndexSetDouble(hcHighBufferPlotIndex, PLOT_EMPTY_VALUE, 0); + + // + // Low ... + + // + ArraySetAsSeries(hcLowBuffer, true); + SetIndexBuffer(hcLowBufferIndex, hcLowBuffer, INDICATOR_DATA); + + // + PlotIndexSetInteger(hcLowBufferPlotIndex, PLOT_SHOW_DATA, true); + PlotIndexSetInteger(hcLowBufferPlotIndex, PLOT_DRAW_BEGIN, 0); + PlotIndexSetDouble(hcLowBufferPlotIndex, PLOT_EMPTY_VALUE, 0); + + // + // Open ... + + // + ArraySetAsSeries(hcOpenBuffer, true); + SetIndexBuffer(hcOpenBufferIndex, hcOpenBuffer, INDICATOR_DATA); + + // + PlotIndexSetInteger(hcOpenBufferPlotIndex, PLOT_SHOW_DATA, true); + PlotIndexSetInteger(hcOpenBufferPlotIndex, PLOT_DRAW_BEGIN, 0); + PlotIndexSetDouble(hcOpenBufferPlotIndex, PLOT_EMPTY_VALUE, 0); + + // + ArraySetAsSeries(hcOpenColorBuffer, true); + SetIndexBuffer(hcOpenColorBufferIndex, hcOpenColorBuffer, INDICATOR_COLOR_INDEX); + + // + // Close ... + + ArraySetAsSeries(hcCloseBuffer, true); + SetIndexBuffer(hcCloseBufferIndex, hcCloseBuffer, INDICATOR_DATA); + + // + PlotIndexSetInteger(hcCloseBufferPlotIndex, PLOT_SHOW_DATA, true); + PlotIndexSetInteger(hcCloseBufferPlotIndex, PLOT_DRAW_BEGIN, 0); + PlotIndexSetDouble(hcCloseBufferPlotIndex, PLOT_EMPTY_VALUE, 0); + + // + ArraySetAsSeries(hcCloseColorBuffer, true); + SetIndexBuffer(hcCloseColorBufferIndex, hcCloseColorBuffer, INDICATOR_COLOR_INDEX); +} + +// +// Set Indicator Short Name and also we can define Buffers Labels ... +void SetIndicatorName() +{ + IndicatorSetString(INDICATOR_SHORTNAME, ShortName); +} + +// +void CalculateBuffer(const int barIndex) +{ + // + // First Update Market Cycles ... + UpdateMarketCycles(barIndex); + + // + double bullishColorIDX = 0; + double bearishColorIDX = 1; + + // + // Short ... + int scBarIndex = sc.GetBarIndex(barIndex); + XOHCL scBar1 = sc.GetBar(scBarIndex + 1); + + // + bool isSCBar1Bullish = scBar1.open < scBar1.close; + + // + scOpenBuffer[barIndex] = scBar1.open; + scHighBuffer[barIndex] = scBar1.high; + scCloseBuffer[barIndex] = scBar1.close; + scLowBuffer[barIndex] = scBar1.low; + + // + scOpenColorBuffer[barIndex] = + isSCBar1Bullish + ? bullishColorIDX + : bearishColorIDX; + + // + scCloseColorBuffer[barIndex] = + isSCBar1Bullish + ? bullishColorIDX + : bearishColorIDX; + + // + // Medium ... + int mcBarIndex = mc.GetBarIndex(barIndex); + XOHCL mcBar1 = mc.GetBar(mcBarIndex + 1); + + // + bool isMCBar1Bullish = mcBar1.open < mcBar1.close; + + // + mcOpenBuffer[barIndex] = mcBar1.open; + mcHighBuffer[barIndex] = mcBar1.high; + mcCloseBuffer[barIndex] = mcBar1.close; + mcLowBuffer[barIndex] = mcBar1.low; + + // + mcOpenColorBuffer[barIndex] = + isMCBar1Bullish + ? bullishColorIDX + : bearishColorIDX; + + // + mcCloseColorBuffer[barIndex] = + isMCBar1Bullish + ? bullishColorIDX + : bearishColorIDX; + + // + // Long ... + int lcBarIndex = lc.GetBarIndex(barIndex); + XOHCL lcBar1 = lc.GetBar(lcBarIndex + 1); + + // + bool isLCBar1Bullish = lcBar1.open < lcBar1.close; + + // + lcOpenBuffer[barIndex] = lcBar1.open; + lcHighBuffer[barIndex] = lcBar1.high; + lcCloseBuffer[barIndex] = lcBar1.close; + lcLowBuffer[barIndex] = lcBar1.low; + + // + lcOpenColorBuffer[barIndex] = + isLCBar1Bullish + ? bullishColorIDX + : bearishColorIDX; + + // + lcCloseColorBuffer[barIndex] = + isLCBar1Bullish + ? bullishColorIDX + : bearishColorIDX; + + // + // Hind ... + int hcBarIndex = hc.GetBarIndex(barIndex); + XOHCL hcBar1 = hc.GetBar(hcBarIndex + 1); + + // + bool isHCBar1Bullish = hcBar1.open < hcBar1.close; + + // + hcOpenBuffer[barIndex] = hcBar1.open; + hcHighBuffer[barIndex] = hcBar1.high; + hcCloseBuffer[barIndex] = hcBar1.close; + hcLowBuffer[barIndex] = hcBar1.low; + + // + hcOpenColorBuffer[barIndex] = + isHCBar1Bullish + ? bullishColorIDX + : bearishColorIDX; + + // + hcCloseColorBuffer[barIndex] = + isHCBar1Bullish + ? bullishColorIDX + : bearishColorIDX; +} + +// +// TOOLS ... + +// +// Initial Market Cycles ... +bool InitMarketCycles() +{ + // + bool result = false; + + // + // Short ... + sc.method = scMode; + sc.period = scPeriod; + result = sc.Init( + _Symbol, + _Period, + X_MARKET_CYCLE_SHORT); + if (!result) + { + return result; + } + + // + // Medium ... + mc.method = mcMode; + mc.period = mcPeriod; + result = mc.Init( + _Symbol, + _Period, + X_MARKET_CYCLE_MEDIUM); + if (!result) + { + return result; + } + + // + // Long ... + lc.method = lcMode; + lc.period = lcPeriod; + result = lc.Init( + _Symbol, + _Period, + X_MARKET_CYCLE_LONG); + if (!result) + { + return result; + } + + // + // Hind ... + hc.method = hcMode; + hc.period = hcPeriod; + result = hc.Init( + _Symbol, + _Period, + X_MARKET_CYCLE_HIND); + if (!result) + { + return result; + } + + // + return result; +} + +// +// Update Market Cycles ... +bool UpdateMarketCycles(int barIndex) +{ + // + bool result = false; + + // + // Short ... + result = sc.Update(barIndex); + if (!result) + { + return result; + } + + // + // Medium ... + result = mc.Update(barIndex); + if (!result) + { + return result; + } + + // + // Long ... + result = lc.Update(barIndex); + if (!result) + { + return result; + } + + // + // Hind ... + result = hc.Update(barIndex); + if (!result) + { + return result; + } + + // + return result; +} diff --git a/MQLTestWorkspace/XBEEA/14030224/Indicators/x-saherelm.x121.xich.ex5 b/MQLTestWorkspace/XBEEA/14030224/Indicators/x-saherelm.x121.xich.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..2c0d33a790746ca450a0d619ed78972de89a6a53 GIT binary patch literal 20534 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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/XBEEA/14030224/Indicators/x-saherelm.x121.xman.ex5 b/MQLTestWorkspace/XBEEA/14030224/Indicators/x-saherelm.x121.xman.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..6072b99fc5f2cc669263950e329a72084d8f08d2 GIT binary patch literal 87354 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 z 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 UJnVo<1wFJr=PceS=9#NEw+A(wX#fBK literal 0 HcmV?d00001 diff --git a/MQLTestWorkspace/XBEEA/14030224/Indicators/x-saherelm.x121.xman.mq5 b/MQLTestWorkspace/XBEEA/14030224/Indicators/x-saherelm.x121.xman.mq5 new file mode 100644 index 0000000..67a2484 --- /dev/null +++ b/MQLTestWorkspace/XBEEA/14030224/Indicators/x-saherelm.x121.xman.mq5 @@ -0,0 +1,4631 @@ +/////////////////////////////////////////////////////// +// SaherElm IT Center MQL5 Indicator +// ------------------------------------------- +// Name: X121_XMAN +// Description: Market Analyzer +// - Find Peaks and Vales +// - Find Trend +// - Find Market Direction +// - Detect Pivot Points and Swings +// +// Contains: +// ----------- +// - 4 Cycle of TimeFrames +// - Fibonacci Golden Zone +// - Trend Detection using True Range Averaging +// - Trend Detecting using Moving Averages Ribbon +// - Trend Detecting using SSL Channel +// - Trend Detecting using Hull Implementation +// +// 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_XMAN Indicator" +#property strict + +// +// START Constants ... +// + +// +// Indicator Short Name ... +#define ShortName "X121_XMAN" + +// +struct XHullData +{ + // + double value; + double value3; + + // + double wsum1; + double wsum2; + double wsum3; + + // + double lsum1; + double lsum2; + double lsum3; +}; + +// +// Holds an SnapShot of Charts Configuration ... +struct XChartStyle +{ + // + // chart's ID ... + long chartId; + // + // chart's mode ... + ENUM_CHART_MODE mode; + // + // show bid line ... + bool showBidLine; + // + // show ask line ... + bool showAskLine; + // + // show grids on chart ... + bool showGrid; + // + // show volumes ... + bool showVolumes; + // + // Displaying trade levels in the chart (levels of open positions, Stop Loss, Take Profit and pending orders) ... + bool showTradeLevels; + // + // chart autoscroll ... + bool autoScroll; + // + // chart quick navigation state ... + bool quickNavigation; + // + // chart's foreground color ... + color foreGroundColor; + // + // chart's background color ... + color backGroundColor; + // + // Up Color ... + color upColor; + // + // Down Color ... + color downColor; + // + // Bullish color ... + color bullishColor; + // + // Bearish color ... + color bearishColor; + // + // grid color ... + color gridColor; + // + // bid line color ... + color bidLineColor; + // + // ask line color ... + color askLineColor; + // + // line mode and doji candlestick color ... + color lineColor; + // + // Color of stop order levels (Stop Loss and Take Profit) ... + color stopColor; + // + // volumes color ... + color volumesColor; +}; + +// +struct XMRBColorInfo +{ + double clr; + double state; +}; + +// +// a Class For Hull Calculations ... +class XSCHull +{ + // +public: + // + // Constructor ... + XSCHull() : mFullPeriod(1), mHalfPeriod(1), mSqrtPeriod(1), mArraySize(-1) + { + // + // These are a way above to assign Private variables at Construct time ... + } + + // + // Deconstructor ... + ~XSCHull() + { + ArrayFree(mData); + } + + // + // Initial Hull ... + bool Init( + int mPeriod, + double mDivisor) + { + // + bool result = false; + + // + mFullPeriod = (int)(mPeriod > 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/XBEEA/14030224/Indicators/x-saherelm.x121.xosc.ex5 b/MQLTestWorkspace/XBEEA/14030224/Indicators/x-saherelm.x121.xosc.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..4358f8ad1a09c2e20ae26db7d36126066ad5f7dc GIT binary patch literal 25548 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 ckIPo%W99(r(Kw6c*Ixx}q*hczpzitp7l7?t!T= maxLength && + rviCalculatedBars >= maxLength && + bullPCalculatedBars >= maxLength && + bearPCalculatedBars >= maxLength && + volumeCalculatedBars >= maxLength && + rsiCalculatedBars >= maxLength && + cciCalculatedBars >= maxLength && + momentumCalculatedBars >= maxLength && + sarCalculatedBars >= maxLength && + macdCalculatedBars >= maxLength && + stochCalculatedBars >= maxLength && + stddevCalculatedBars >= maxLength + // + ; + if (!isCalculatedBarsPassed) + { + return prev_calculated; + } + + // + limit = (prev_calculated > rates_total || prev_calculated <= 0) ? rates_total : (rates_total - prev_calculated) + 1; + + // + // Buffers Copy ... + int atrCopiedItems = CopyBuffer(atrHandler, 0, 0, limit, atrBuffer); + int rviMainCopiedItems = CopyBuffer(rviHandler, MAIN_LINE, 0, limit, rviMainBuffer); + int rviSignalCopiedItems = CopyBuffer(rviHandler, SIGNAL_LINE, 0, limit, rviSignalBuffer); + int bullPCopiedItems = CopyBuffer(bullPHandler, 0, 0, limit, bullPBuffer); + int bearPCopiedItems = CopyBuffer(bearPHandler, 0, 0, limit, bearPBuffer); + int volumeCopiedItems = CopyBuffer(volumeHandler, 0, 0, limit, volumeBuffer); + int rsiCopiedItems = CopyBuffer(rsiHandler, 0, 0, limit, rsiBuffer); + int cciCopiedItems = CopyBuffer(cciHandler, 0, 0, limit, cciBuffer); + int momentumCopiedItems = CopyBuffer(momentumHandler, 0, 0, limit, momentumBuffer); + int sarCopiedItems = CopyBuffer(sarHandler, 0, 0, limit, sarBuffer); + int macdMainCopiedItems = CopyBuffer(macdHandler, MAIN_LINE, 0, limit, macdMainBuffer); + int macdSignalCopiedItems = CopyBuffer(macdHandler, SIGNAL_LINE, 0, limit, macdSignalBuffer); + int stochMainCopiedItems = CopyBuffer(stochHandler, MAIN_LINE, 0, limit, stochMainBuffer); + int stocSignalhCopiedItems = CopyBuffer(stochHandler, SIGNAL_LINE, 0, limit, stochSignalBuffer); + int stddevCopiedItems = CopyBuffer(stddevHandler, 0, 0, limit, stddevBuffer); + + // + bool isCopiedBarsPassed = + // + atrCopiedItems > 0 && + rviMainCopiedItems > 0 && + rviSignalCopiedItems > 0 && + bullPCopiedItems > 0 && + bearPCopiedItems > 0 && + volumeCopiedItems > 0 && + rsiCopiedItems > 0 && + cciCopiedItems > 0 && + momentumCopiedItems > 0 && + sarCopiedItems > 0 && + macdMainCopiedItems > 0 && + macdSignalCopiedItems > 0 && + stochMainCopiedItems > 0 && + stocSignalhCopiedItems > 0 && + stddevCopiedItems > 0 + // + ; + if (!isCopiedBarsPassed) + { + return prev_calculated; + } + + // + // Main Loop ... + for (int i = limit - 1; i >= 0 && !IsStopped(); i--) + { + // + // Do Buffers Calculation ... + // HERE We Do Not anything ... + } + + // + return rates_total; +} + +// +// END Event Handlers ... +// + +// +// START Functions ... +// + +// +// Validate Input Args for Initialization ... +bool ValidateInputs() +{ + // + bool result = false; + + // + // Validate Args ... + result = + // + atrLength >= 2 && + rviLength >= 2 && + bullpLength >= 2 && + bearpLength >= 2 && + rsiLength >= 2 && + cciLength >= 2 && + momentumLength >= 2 && + sarStep > 0 && + sarStep < sarMaximum && + macdFastLength >= 2 && + macdSlowLength > macdFastLength && + macdSignaLength >= 2 && + stochKLength >= 2 && + stochDLength >= 2 && + stochSlowing >= 2 && + stddevLength >= 2 && + stddevShift >= 0 + // + ; + + // + return result; +} + +// +// Retrieve all Exists Input Max Length ... +// use for Start Of Drawing ... +int ExtractMaxLengthOfInputs() +{ + // + int result = 0; + + // + result = MathMax(atrLength, rviLength); + result = MathMax(result, bullpLength); + result = MathMax(result, bearpLength); + result = MathMax(result, rsiLength); + result = MathMax(result, cciLength); + result = MathMax(result, momentumLength); + result = MathMax(result, macdFastLength); + result = MathMax(result, macdSlowLength); + result = MathMax(result, macdSignaLength); + result = MathMax(result, stochKLength); + result = MathMax(result, stochDLength); + result = MathMax(result, stochSlowing); + result = MathMax(result, stddevLength); + + // + 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() +{ + // + // DATA Buffers ... + + // + // ATR ... + ArraySetAsSeries(atrBuffer, true); + SetIndexBuffer(atrBufferIndex, atrBuffer, INDICATOR_CALCULATIONS); + + // + // RVI ... + + // + // Main ... + ArraySetAsSeries(rviMainBuffer, true); + SetIndexBuffer(rviMainBufferIndex, rviMainBuffer, INDICATOR_CALCULATIONS); + + // + // Signal ... + ArraySetAsSeries(rviSignalBuffer, true); + SetIndexBuffer(rviSignalBufferIndex, rviSignalBuffer, INDICATOR_CALCULATIONS); + + // + // BULLPOWER ... + ArraySetAsSeries(bullPBuffer, true); + SetIndexBuffer(bullPBufferIndex, bullPBuffer, INDICATOR_CALCULATIONS); + + // + // BEARPOWER ... + ArraySetAsSeries(bearPBuffer, true); + SetIndexBuffer(bearPBufferIndex, bearPBuffer, INDICATOR_CALCULATIONS); + + // + // VOLUME ... + ArraySetAsSeries(volumeBuffer, true); + SetIndexBuffer(volumeBufferIndex, volumeBuffer, INDICATOR_CALCULATIONS); + + // + // RSI ... + ArraySetAsSeries(rsiBuffer, true); + SetIndexBuffer(rsiBufferIndex, rsiBuffer, INDICATOR_CALCULATIONS); + + // + // CCI ... + ArraySetAsSeries(cciBuffer, true); + SetIndexBuffer(cciBufferIndex, cciBuffer, INDICATOR_CALCULATIONS); + + // + // MOMENTUM ... + ArraySetAsSeries(momentumBuffer, true); + SetIndexBuffer(momentumBufferIndex, momentumBuffer, INDICATOR_CALCULATIONS); + + // + // SAR ... + ArraySetAsSeries(sarBuffer, true); + SetIndexBuffer(sarBufferIndex, sarBuffer, INDICATOR_CALCULATIONS); + + // + // STANDARDDEVIATION ... + ArraySetAsSeries(stddevBuffer, true); + SetIndexBuffer(stddevBufferIndex, stddevBuffer, INDICATOR_CALCULATIONS); + + // + // MACD ... + + // + // Main ... + ArraySetAsSeries(macdMainBuffer, true); + SetIndexBuffer(macdMainBufferIndex, macdMainBuffer, INDICATOR_CALCULATIONS); + + // + // Signal ... + ArraySetAsSeries(macdSignalBuffer, true); + SetIndexBuffer(macdSignalBufferIndex, macdSignalBuffer, INDICATOR_CALCULATIONS); +} + +// +// END Functions ... +// diff --git a/MQLTestWorkspace/XBEEA/14030224/Indicators/x-saherelm.x121.xstr.ex5 b/MQLTestWorkspace/XBEEA/14030224/Indicators/x-saherelm.x121.xstr.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..542535ded143d90eb17fee4ee4952370ea03f6d6 GIT binary patch literal 17770 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 literal 0 HcmV?d00001 diff --git a/MQLTestWorkspace/XBEEA/14030224/Indicators/x-saherelm.x121.xstr.mq5 b/MQLTestWorkspace/XBEEA/14030224/Indicators/x-saherelm.x121.xstr.mq5 new file mode 100644 index 0000000..bca9597 --- /dev/null +++ b/MQLTestWorkspace/XBEEA/14030224/Indicators/x-saherelm.x121.xstr.mq5 @@ -0,0 +1,580 @@ +////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Indicator +// --------------------------------------------- +// Name: X121_XSTR +// 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_XSTR" + +// +// END Constants ... +// + +// +// START Inputs ... +// + +// +// Market ... +input group "ATR"; +input int atrLength = 14; // Length +input double atrMultiplier = 3.0; // Multiplier +input ENUM_APPLIED_PRICE atrAppliedTo = PRICE_MEDIAN; // Applied To + +// +// Presentation ... +input group "Presentation"; +input bool showTrends = true; // Show Trends +input bool fillTrends = true; // Fill Trends + +// +// END Inputs ... +// + +// +// Includes Common Library ... +#include "../Libraries/x-saherelm.common.lib.mq5" + +// +// START Buffers ... +// + +// +#property indicator_chart_window + +// +#property indicator_buffers 9 +#property indicator_plots 2 + +// +#define fillUpBufferIndex 0 +double fillUpBuffer[]; + +#define fillDownBufferIndex 1 +double fillDownBuffer[]; + +// +#define fillingPlotBufferIndex 0 + +// +#property indicator_label1 "X121_XSTR Filling" +#property indicator_type1 DRAW_FILLING +#property indicator_color1 clrBisque, clrPaleGreen + +// +#define mainBufferIndex 2 +#define mainPlotBufferIndex 1 +double mainBuffer[]; + +// +#define mainColorBufferIndex 3 +double mainColorBuffer[]; + +// +#property indicator_label2 "X121_XSTR" +#property indicator_type2 DRAW_COLOR_LINE +#property indicator_color2 CLR_NONE, clrGreen, clrDarkRed +#property indicator_style2 STYLE_DOT + +// +// DATA Buffers ... + +// +#define atrBufferIndex 4 +double atrBuffer[]; + +// +#define trendBufferIndex 5 +double trendBuffer[]; + +// +#define upBufferIndex 6 +double upBuffer[]; + +// +#define downBufferIndex 7 +double downBuffer[]; + +// +#define priceBufferIndex 8 +double priceBuffer[]; + +// +// END Buffers ... +// + +// +// START Global Definitions: Variables, Properties and etc ... +// + +// +int maxLength; + +// +int atrHandler = INVALID_HANDLE; + +// +int changeOfTrend; +int startBearishTrend; +int startBullishTrend; + +// +// 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(); + + // + atrHandler = iATR( + _Symbol, + _Period, + atrLength); + if (atrHandler == INVALID_HANDLE) + { + return INIT_FAILED; + } + + // + // Define Index Buffers ... + DefineBuffers(); + + // + // Set Indicator ShortName ... + SetIndicatorName(); + + // + // Init Succeed ... + return INIT_SUCCEEDED; +} + +// +// DeInitialization ... +void OnDeinit(const int reason) +{ + // + // REASON_PROGRAM 0 The EA has stopped working calling the ExpertRemove() function + // REASON_REMOVE 1 Program removed from a chart + // REASON_RECOMPILE 2 Program recompiled + // REASON_CHARTCHANGE 3 A symbol or a chart period is changed + // REASON_CHARTCLOSE 4 Chart closed + // REASON_PARAMETERS 5 Inputs changed by a user + // REASON_ACCOUNT 6 Another account has been activated or reconnection to the trade server has occurred due to changes in the account settings + // REASON_TEMPLATE 7 Another chart template applied + // REASON_INITFAILED 8 The OnInit() handler returned a non-zero value + // REASON_CLOSE 9 Terminal closed + + // + // Here we can handle De Initialization Reasons ... + IndicatorRelease(atrHandler); +} + +// +// 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[]) +{ + // + 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 0; + } + + // + // Check Number of items Copy or not ... + int copiedATRs = CopyBuffer(atrHandler, 0, 0, numOfRequiredAtrs, atrBuffer); + if (copiedATRs <= 0) + { + return 0; + } + + // + 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 = getPrice( + atrAppliedTo, + open, + high, + low, + close, + i); + // price = (high[i] + low[i]) / 2; + priceBuffer[i] = price; + + // + double atr = atrBuffer[i]; + + // + // Up ... + upBuffer[i] = price + (atrMultiplier * atr); + + // + // Down ... + downBuffer[i] = price - (atrMultiplier * atr); + + // + if (close[i] > upBuffer[i - 1]) + { + // + trendBuffer[i] = 1; + if (trendBuffer[i - 1] == -1) + { + changeOfTrend = 1; + } + } + else if (close[i] < downBuffer[i - 1]) + { + // + trendBuffer[i] = -1; + if (trendBuffer[i - 1] == 1) + { + changeOfTrend = 1; + } + } + else if (trendBuffer[i - 1] == 1) + { + // + trendBuffer[i] = 1; + changeOfTrend = 0; + } + else if (trendBuffer[i - 1] == -1) + { + // + trendBuffer[i] = -1; + changeOfTrend = 0; + } + + // + // Down Trend Starting ... + if (trendBuffer[i] < 0 && trendBuffer[i - 1] > 0) + { + startBearishTrend = 1; + } + else + { + startBearishTrend = 0; + } + + // + // Up Trend Starting ... + if (trendBuffer[i] > 0 && trendBuffer[i - 1] < 0) + { + startBullishTrend = 1; + } + else + { + startBullishTrend = 0; + } + + // + if (trendBuffer[i] > 0 && downBuffer[i] < downBuffer[i - 1]) + { + downBuffer[i] = downBuffer[i - 1]; + } + + // + if (trendBuffer[i] < 0 && upBuffer[i] > upBuffer[i - 1]) + { + upBuffer[i] = upBuffer[i - 1]; + } + + // + if (startBearishTrend == 1) + { + upBuffer[i] = priceBuffer[i] + (atrMultiplier * atr); + } + + // + if (startBullishTrend == 1) + { + downBuffer[i] = priceBuffer[i] - (atrMultiplier * atr); + } + + // + // Draw the indicator ... + + // + double colorIDX = 0; + mainColorBuffer[i] = colorIDX; + + // + if (trendBuffer[i] == 1) + { + // + mainBuffer[i] = downBuffer[i]; + if (changeOfTrend == 1) + { + mainBuffer[i - 1] = mainBuffer[i - 2]; + changeOfTrend = 0; + } + + // + colorIDX = 1; + } + else if (trendBuffer[i] == -1) + { + // + mainBuffer[i] = upBuffer[i]; + if (changeOfTrend == 1) + { + // + mainBuffer[i - 1] = mainBuffer[i - 2]; + changeOfTrend = 0; + } + + // + colorIDX = 2; + } + + // + if (showTrends) + { + mainColorBuffer[i] = colorIDX; + } + + // + // Filling ... + if (fillTrends) + { + // + fillUpBuffer[i] = mainBuffer[i]; + fillDownBuffer[i] = close[i]; + } + else + { + // + fillUpBuffer[i] = EMPTY_VALUE; + fillDownBuffer[i] = EMPTY_VALUE; + } + } + + // + return rates_total; +} + +// +// END Event Handlers ... +// + +// +// START Functions ... +// + +// +// Validate Input Args for Initialization ... +bool ValidateInputs() +{ + // + bool result = false; + + // + // Validate Args ... + result = + // + atrLength >= 2 + // + ; + + // + return result; +} + +// +// Retrieve all Exists Input Max Length ... +// use for Start Of Drawing ... +int ExtractMaxLengthOfInputs() +{ + // + int result = 0; + + // + result = atrLength; + + // + 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() +{ + // + // PLOT Buffers ... + + // + // FILLINGS ... + SetIndexBuffer(fillUpBufferIndex, fillUpBuffer, INDICATOR_DATA); + SetIndexBuffer(fillDownBufferIndex, fillDownBuffer, INDICATOR_DATA); + PlotIndexSetInteger(fillingPlotBufferIndex, PLOT_SHOW_DATA, false); + + // + // MAIN ... + SetIndexBuffer(mainBufferIndex, mainBuffer, INDICATOR_DATA); + PlotIndexSetInteger(mainPlotBufferIndex, PLOT_SHOW_DATA, showTrends); + SetIndexBuffer(mainColorBufferIndex, mainColorBuffer, INDICATOR_COLOR_INDEX); + + // + // DATA Buffers ... + + // + // ATR ... + SetIndexBuffer(atrBufferIndex, atrBuffer, INDICATOR_CALCULATIONS); + + // + // TREND ... + SetIndexBuffer(trendBufferIndex, trendBuffer, INDICATOR_CALCULATIONS); + + // + // UP ... + SetIndexBuffer(upBufferIndex, upBuffer, INDICATOR_CALCULATIONS); + + // + // DOWN ... + SetIndexBuffer(downBufferIndex, downBuffer, INDICATOR_CALCULATIONS); + + // + // PRICE ... + SetIndexBuffer(priceBufferIndex, priceBuffer, INDICATOR_CALCULATIONS); +} + +// +// END Functions ... +// + +// +// TEMPLATE Function ... + +template +double getPrice(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); +} diff --git a/MQLTestWorkspace/XBEEA/14030224/Indicators/x-saherelm.x121.xzg.ex5 b/MQLTestWorkspace/XBEEA/14030224/Indicators/x-saherelm.x121.xzg.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..5d14851ca38b5eb9568167b5df7c0ee26210e031 GIT binary patch literal 10856 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 literal 0 HcmV?d00001 diff --git a/MQLTestWorkspace/XBEEA/14030224/Indicators/x-saherelm.x121.xzg.mq5 b/MQLTestWorkspace/XBEEA/14030224/Indicators/x-saherelm.x121.xzg.mq5 new file mode 100644 index 0000000..d7cde07 --- /dev/null +++ b/MQLTestWorkspace/XBEEA/14030224/Indicators/x-saherelm.x121.xzg.mq5 @@ -0,0 +1,757 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Indicator +// --------------------------------------------- +// Name: X121_XZG +// Description: Zogzag Implementation ... +// +// +// 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_XZG Indicator" +#property strict + +// +#define ShortName "X121_XZG" + +// +// DEFINITIONS ... +enum ENUM_X_ZG_SEARCH_MODE +{ + X_ZG_SEARCH_EXTREMUM = 0, // searching for the first extremum + X_ZG_SEARCH_PEAK = 1, // searching for the next ZigZag peak + X_ZG_SEARCH_VALE = -1 // searching for the next ZigZag vale +}; + +// +// How to Calculate Up and Down Price ... +enum ENUM_X_ZG_PRICE_MODE +{ + // + X_ZG_PRICE_HIGH_LOW_MODE = 1, + X_ZG_PRICE_OPEN_CLOSE_MODE = 2, +}; + +// +// INPUT ... + +// +input int depth = 12; // Depth +input int deviation = 5; // Deviation +input int backStep = 3; // Back Step +input ENUM_X_ZG_PRICE_MODE mode = X_ZG_PRICE_HIGH_LOW_MODE; // Mode + +// +// BUFFERS ... + +// +#property indicator_chart_window + +// +#property indicator_buffers 5 +#property indicator_plots 3 + +// +// ZigZag ... + +// +#define mainBufferIndex 0 +#define mainBufferPlotIndex 0 +double mainBuffer[]; + +// +#property indicator_label1 "X121_XZG Main" +#property indicator_type1 DRAW_SECTION +#property indicator_color1 clrYellow +#property indicator_width1 2 + +// +// Highs ... + +// +// ZigZag Pointer or Line Indicator ... +#define arrowBufferIndex 1 +#define arrowBufferPlotIndex 1 +double arrowBuffer[]; + +// +#define arrowColorBufferIndex 2 +double arrowColorBuffer[]; + +// +#property indicator_label2 "X121_XZG PV" +#property indicator_type2 DRAW_COLOR_ARROW +#property indicator_color2 clrAqua, clrMagenta +#property indicator_width2 1 + +// +#define highsBufferIndex 3 +double highsBuffer[]; + +// +// Lows ... + +// +#define lowsBufferIndex 4 +double lowsBuffer[]; + +// +// VARIABLES ... + +// +int mRecalc = 3; // Number of last extremes for recalculation + +// +// EVENT Handlers ... + +// +// Initialization ... +int OnInit() +{ + // + // Validate Inputs ... + if (!ValidateInputs()) + { + return INIT_PARAMETERS_INCORRECT; + } + + // + // logTag = ShortName; + + // + // 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[] // +) +{ + // + double mZGHigh[]; + double mZGLow[]; + if (mode == X_ZG_PRICE_OPEN_CLOSE_MODE) + { + // + ArrayCopy( + mZGHigh, + open + // + ); + + // + ArrayCopy( + mZGLow, + close + // + ); + } + else + { + // + ArrayCopy( + mZGHigh, + high + // + ); + + // + ArrayCopy( + mZGLow, + low + // + ); + } + + // + int zigZagResult = CalcukateZigZag( + prev_calculated, + rates_total, + mZGHigh, + mZGLow + // + ); + + // + if (zigZagResult != rates_total) + { + return zigZagResult; + } + + // + return rates_total; +} + +// +// CUSTOM Functions ... + +// +// Validate Input Args for Initialization ... +bool ValidateInputs() +{ + // + bool result = false; + + // + result = + // + depth > 0 && + deviation > 0 && + backStep > 0 + // + ; + + // + return result; +} + +// +// Define Indexes and Styles ... +void DefineBuffers() +{ + // + // Main ... + + // + SetIndexBuffer(mainBufferIndex, mainBuffer, INDICATOR_DATA); + + // + PlotIndexSetInteger(mainBufferPlotIndex, PLOT_SHOW_DATA, true); + PlotIndexSetInteger(mainBufferPlotIndex, PLOT_DRAW_BEGIN, 0); + PlotIndexSetDouble(mainBufferPlotIndex, PLOT_EMPTY_VALUE, 0); + + // + // Arrow ... + + // + SetIndexBuffer(arrowBufferIndex, arrowBuffer, INDICATOR_DATA); + + // + PlotIndexSetInteger(arrowBufferPlotIndex, PLOT_SHOW_DATA, true); + PlotIndexSetInteger(arrowBufferPlotIndex, PLOT_DRAW_BEGIN, 0); + PlotIndexSetInteger(arrowBufferPlotIndex, PLOT_ARROW, 159); + PlotIndexSetInteger(arrowBufferPlotIndex, PLOT_ARROW_SHIFT, 0); + PlotIndexSetDouble(arrowBufferPlotIndex, PLOT_EMPTY_VALUE, 0); + + // + // Arrow Color ... + SetIndexBuffer(arrowColorBufferIndex, arrowColorBuffer, INDICATOR_COLOR_INDEX); + + // + // Highs ... + SetIndexBuffer(highsBufferIndex, highsBuffer, INDICATOR_CALCULATIONS); + + // + // Lows ... + SetIndexBuffer(lowsBufferIndex, lowsBuffer, INDICATOR_CALCULATIONS); +} + +// +// Set Indicator Short Name and also we can define Buffers Labels ... +void SetIndicatorName() +{ + IndicatorSetString(INDICATOR_SHORTNAME, ShortName); +} + +// +// Calculating Zig Zag ... +int CalcukateZigZag( + const int prev_calculated, + const int rates_total, + double &high[], + double &low[] + // +) +{ + // + if (rates_total < 100) + { + return 0; + } + + // + // Define Variables ... + int i = 0; + + // + int start = 0; + int extreme_counter = 0; + int extreme_search = X_ZG_SEARCH_EXTREMUM; + int shift = 0; + int back = 0; + int last_high_pos = 0; + int last_low_pos = 0; + + // + double val = 0; + double res = 0; + double curlow = 0; + double curhigh = 0; + double last_high = 0; + double last_low = 0; + + // + double colorIDX = 0; + double lastZigZagValue = 0; + + // + // Initializing ... + if (prev_calculated == 0) + { + // + ArrayInitialize(mainBuffer, 0); + ArrayInitialize(highsBuffer, 0); + ArrayInitialize(lowsBuffer, 0); + + // + start = depth; + } + + // + // Already Calculated Before ... + if (prev_calculated > 0) + { + // + i = rates_total - 1; + + // + // Searching for the third X_ZG_SEARCH_EXTREMUM from the last UnComplete Bar ... + while (extreme_counter < mRecalc && i > rates_total - 100) + { + // + res = mainBuffer[i]; + if (res != 0) + { + extreme_counter++; + } + + // + i--; + } + + // + i++; + start = i; + + // + // What type of X_ZG_SEARCH_EXTREMUM we Search for ... + if (lowsBuffer[i] != 0) + { + // + curlow = lowsBuffer[i]; + extreme_search = X_ZG_SEARCH_PEAK; + } + else + { + // + curhigh = highsBuffer[i]; + extreme_search = X_ZG_SEARCH_VALE; + } + + // + // Clear Values ... + for (i = start + 1; i < rates_total && !IsStopped(); i++) + { + // + mainBuffer[i] = 0; + lowsBuffer[i] = 0; + highsBuffer[i] = 0; + } + } + + // + // Search for High and Low Extremes ... + for (shift = start; shift < rates_total && !IsStopped(); shift++) + { + // + // Low ... + val = low[Lowest(low, depth, shift)]; + if (val == last_low) + { + val = 0; + } + else + { + // + last_low = val; + + // + if ((low[shift] - val) > deviation * _Point) + { + val = 0; + } + else + { + // + for (back = 1; back <= backStep; back++) + { + // + res = lowsBuffer[shift - back]; + if ((res != 0) && (res > val)) + { + lowsBuffer[shift - back] = 0; + } + } + } + } + + // + if (low[shift] == val) + { + lowsBuffer[shift] = val; + } + else + { + lowsBuffer[shift] = 0; + } + + // + // High ... + val = high[Highest(high, depth, shift)]; + if (val == last_high) + { + val = 0; + } + else + { + // + last_high = val; + + // + if ((val - high[shift]) > deviation * _Point) + { + val = 0; + } + else + { + // + for (back = 1; back <= backStep; back++) + { + // + res = highsBuffer[shift - back]; + if ((res != 0) && (res < val)) + { + highsBuffer[shift - back] = 0; + } + } + } + } + + // + if (high[shift] == val) + { + highsBuffer[shift] = val; + } + else + { + highsBuffer[shift] = 0; + } + } + + // + // Set Last Value ... + if (extreme_search == 0) // Undefined Values ... + { + // + last_low = 0; + last_high = 0; + } + else + { + // + last_low = curlow; + last_high = curhigh; + } + + // + // Final Selection of Extreme Points for ZigZag ... + for (shift = start; shift < rates_total && !IsStopped(); shift++) + { + // + res = 0; + + // + switch (extreme_search) + { + // + case X_ZG_SEARCH_EXTREMUM: + // + if (last_low == 0 && last_high == 0) + { + // + if (highsBuffer[shift] != 0) + { + // + last_high_pos = shift; + last_high = high[shift]; + + // + extreme_search = X_ZG_SEARCH_VALE; + + // + mainBuffer[shift] = last_high; + + // + res = 1; + } + + // + if (lowsBuffer[shift] != 0) + { + // + last_low_pos = shift; + last_low = low[shift]; + + // + extreme_search = X_ZG_SEARCH_PEAK; + + // + mainBuffer[shift] = last_low; + + // + res = 1; + } + } + break; + + // + case X_ZG_SEARCH_PEAK: + // + if (lowsBuffer[shift] != 0 && lowsBuffer[shift] < last_low && highsBuffer[shift] == 0) + { + // + mainBuffer[last_low_pos] = 0; + + // + last_low_pos = shift; + last_low = lowsBuffer[shift]; + + // + mainBuffer[shift] = last_low; + + // + res = 1; + } + + // + if (highsBuffer[shift] != 0 && lowsBuffer[shift] == 0) + { + // + last_high_pos = shift; + last_high = highsBuffer[shift]; + + // + mainBuffer[shift] = last_high; + + // + extreme_search = X_ZG_SEARCH_VALE; + + // + res = 1; + } + break; + + // + case X_ZG_SEARCH_VALE: + // + if (highsBuffer[shift] != 0 && highsBuffer[shift] > last_high && lowsBuffer[shift] == 0) + { + // + mainBuffer[last_high_pos] = 0; + + // + last_high_pos = shift; + last_high = highsBuffer[shift]; + + // + mainBuffer[shift] = last_high; + } + + // + if (lowsBuffer[shift] != 0 && highsBuffer[shift] == 0) + { + // + last_low_pos = shift; + last_low = lowsBuffer[shift]; + + // + mainBuffer[shift] = last_low; + + // + extreme_search = X_ZG_SEARCH_PEAK; + } + break; + } + + // + double iZigZagForColor = lastZigZagValue; + double iZigZag = mainBuffer[shift]; + if (iZigZag == 0 && lastZigZagValue != 0) + { + arrowBuffer[shift] = lastZigZagValue; + } + else if (iZigZag != 0) + { + // + lastZigZagValue = iZigZag; + arrowBuffer[shift] = lastZigZagValue; + } + + // + colorIDX = + lastZigZagValue > iZigZagForColor + ? 0 + : lastZigZagValue < iZigZagForColor + ? 1 + : colorIDX; + arrowColorBuffer[shift] = colorIDX; + } + + // + return rates_total; +} + +// +// TOOLS ... + +// +// Search for the index of the highest bar ... +int Highest( + const double &mArray[], + const int mDepth, + const int mStart // +) +{ + // + int result = 0; + + // + if (mStart < 0) + { + return result; + } + + // + double max = mArray[mStart]; + result = mStart; + + // + // Start searching ... + for (int i = mStart - 1; i > mStart - mDepth && i >= 0; i--) + { + // + if (mArray[i] > max) + { + // + result = i; + max = mArray[i]; + } + } + + // + // Return index of the highest bar + return result; +} + +// +// Search for the index of the lowest bar ... +int Lowest( + const double &mArray[], + const int mDepth, + const int mStart // +) +{ + // + int result = 0; + + // + if (mStart < 0) + { + return result; + } + + // + double min = mArray[mStart]; + result = mStart; + + // + // Start searching ... + for (int i = mStart - 1; i > mStart - mDepth && i >= 0; i--) + { + // + if (mArray[i] < min) + { + // + result = i; + min = mArray[i]; + } + } + + // + // Return index of the lowest bar + return result; +} diff --git a/MQLTestWorkspace/XBEEA/14030224/Indicators/x-saherelm.xchnl.ex5 b/MQLTestWorkspace/XBEEA/14030224/Indicators/x-saherelm.xchnl.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..55aff36ae97be70fda5331f432b6ac97f9794850 GIT binary patch literal 25906 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 literal 0 HcmV?d00001 diff --git a/MQLTestWorkspace/XBEEA/14030224/Indicators/x-saherelm.xchnl.mq5 b/MQLTestWorkspace/XBEEA/14030224/Indicators/x-saherelm.xchnl.mq5 new file mode 100644 index 0000000..c850540 --- /dev/null +++ b/MQLTestWorkspace/XBEEA/14030224/Indicators/x-saherelm.xchnl.mq5 @@ -0,0 +1,775 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Indicator +// --------------------------------------------- +// Name: X121_XCHNL +// Description: XCHL Channel 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_XCHNL Indicator" +#property strict + +// +// START Constants ... +// + +// +#define ShortName "X121_XCHNL" + +// +// END Constants ... +// + +// +// START Includes and Imports ... +// + +// +// Includes Common Library ... +#include "../Libraries/x-saherelm.common.lib.mq5" + +// +// Includes Draw Library ... +#include "../Libraries/x-saherelm.draw.lib.mq5" + +// +// END Includes and Imports ... +// + +// +// START XSCHULL Class Definition ... +// + +// +// END XSCHULL Class Definition ... +// + +// +// START Inputs ... +// + +// +input group "Makret Cycles"; +input int shortLength = 9; // Short Length +input int mediumLength = 17; // Medium Length +input int longLength = 26; // Long Length +input int hindLength = 35; // Hind Length + +// +input group "Trend"; +input int numOfShoulder = 10; // Number of Shoulders for Swings + +// +input group "Detection Modes"; +input ENUM_SERIESMODE hhMode = MODE_HIGH; // Highest High Calculation Method +input ENUM_SERIESMODE llMode = MODE_LOW; // Lowest Low Calculation Method + +// +input group "Presentation"; +input bool showTrend = false; // Show Trend +input bool showSRs = false; // Show Support and Resistance + +// +// END Inputs ... +// + +// +// START Buffers ... +// + +// +// PEKSANDVALES ... + +#property indicator_chart_window + +// +#property indicator_buffers 8 +#property indicator_plots 0 + +#define sHHBufferIndex 0 +#define sLLBufferIndex 1 +#define mHHBufferIndex 2 +#define mLLBufferIndex 3 +#define lHHBufferIndex 4 +#define lLLBufferIndex 5 +#define hHHBufferIndex 6 +#define hLLBufferIndex 7 + +double sHHBuffer[]; +double sLLBuffer[]; +double mHHBuffer[]; +double mLLBuffer[]; +double lHHBuffer[]; +double lLLBuffer[]; +double hHHBuffer[]; +double hLLBuffer[]; + +// +// 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; + } + + // + 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(); + + // + // Define Index Buffers ... + DefineBuffers(); + + // + // Set Indicator ShortName ... + SetIndicatorName(); + + // + // Make an Instance of Hull Class ... + + // + // 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 mPeriod 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 + + // + RemoveDraws(drawPrefix); +} + +// +// 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[]) +{ + // + // 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++) + { + CalculateBuffers(i); + } + + // + return rates_total; +} +// +// END Event Handlers ... +// + +// +// START Functions ... +// + +// +// Validate Input Args for Initialization ... +bool ValidateInputs() +{ + // + bool result = true; + + // + result = + // + // Validate Peaks and Vales ... + (shortLength > 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/XBEEA/14030224/Indicators/x-saherelm.xdon.ex5 b/MQLTestWorkspace/XBEEA/14030224/Indicators/x-saherelm.xdon.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..e30324bd97eb50845531e2b3b1437af64d603d18 GIT binary patch literal 9942 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 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/XBEEA/14030224/Libraries/x-saherelm.alert.lib.ex5 b/MQLTestWorkspace/XBEEA/14030224/Libraries/x-saherelm.alert.lib.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..d35859ba94982b871518289d20bd37eb11637e44 GIT binary patch literal 7232 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 literal 0 HcmV?d00001 diff --git a/MQLTestWorkspace/XBEEA/14030224/Libraries/x-saherelm.alert.lib.mq5 b/MQLTestWorkspace/XBEEA/14030224/Libraries/x-saherelm.alert.lib.mq5 new file mode 100644 index 0000000..429d830 --- /dev/null +++ b/MQLTestWorkspace/XBEEA/14030224/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/XBEEA/14030224/Libraries/x-saherelm.common.lib.ex5 b/MQLTestWorkspace/XBEEA/14030224/Libraries/x-saherelm.common.lib.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..5729e1844e0869ddcc56fc61e9cf4b658b78e173 GIT binary patch literal 7770 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 K(&0}-Wd9$e3(ju< literal 0 HcmV?d00001 diff --git a/MQLTestWorkspace/XBEEA/14030224/Libraries/x-saherelm.common.lib.mq5 b/MQLTestWorkspace/XBEEA/14030224/Libraries/x-saherelm.common.lib.mq5 new file mode 100644 index 0000000..b056de8 --- /dev/null +++ b/MQLTestWorkspace/XBEEA/14030224/Libraries/x-saherelm.common.lib.mq5 @@ -0,0 +1,5878 @@ +/////////////////////////////////////////////////////// +// +// 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; +} + +// +// Converts an String to it's related Market Cycle ... +ENUM_X_MARKET_CYCLES ToCycle(string value) +{ + // + ENUM_X_MARKET_CYCLES result = X_MARKET_CYCLE_UNKNOWN; + + // + ENUM_X_MARKET_CYCLES cycles[]; + int count = GetAllMarketCycles(cycles); + for (int i = 0; i < count; i++) + { + // + ENUM_X_MARKET_CYCLES iCycle = cycles[i]; + string iStr = ToString(iCycle); + + // + if (value == iStr) + { + // + result = iCycle; + break; + } + } + + // + return result; +} + +// +// Converts a Cycle to it's String Representation ... +string ToString(ENUM_X_MARKET_CYCLES cycle) +{ + // + string result = ""; + + // + string mPStr = EnumToString(cycle); + + string mPStrParts[]; + int partsCount = StringSplit( + mPStr, + StringGetCharacter("_", 0), + mPStrParts); + if (partsCount <= 0) + { + return result; + } + + // + result = mPStrParts[3]; + + // + return result; +} + +// +// Retrieve all Available Cycles ... +int GetAllMarketCycles(ENUM_X_MARKET_CYCLES &result[]) +{ + // + int mResult = 0; + + // + Clean(result); + + // + ENUM_X_MARKET_CYCLES tmp[] = { + X_MARKET_CYCLE_UNKNOWN, + X_MARKET_CYCLE_SHORT, + X_MARKET_CYCLE_MEDIUM, + X_MARKET_CYCLE_LONG, + X_MARKET_CYCLE_HIND}; + + // + Copy( + tmp, + result); + + // + Clean(tmp); + + // + mResult = ArraySize(result); + + // + return mResult; +} + +// +// CYCLES ... +struct XMarketCycle +{ + // + string prefix; // Prefix Trag ... + + // + string symbol; // Market Symbol ... + + // + ENUM_TIMEFRAMES period; // Period of Cycle ... + ENUM_X_PERIOD_METHOD method; // Period Selection Method ... + ENUM_X_MARKET_CYCLES cycle; // Cycles of MArket ... + + // + int seconds; // Number of Seconds ... + XOHCL bar; // Current Candle of Cycle ... + XCandleRemains remains; // Remains Data of current Candle ... + datetime start; // Start Date of Current Candle ... + datetime next; // Next Candle Start Date ... + + // + int length; // Number Of Candles per Current Time Frame ... + ENUM_TIMEFRAMES hostPeriod; // Current Time Frame ... + + // + datetime lastStart; // Last Candle Bar Time ... + + // + // Constructor ... + XMarketCycle() + { + // + prefix = ""; + symbol = NULL; + period = NULL; + method = NULL; + + // + seconds = 0; + start = 0; + next = 0; + + // + length = 0; + hostPeriod = NULL; + + // + lastStart = 0; + } + + // + // Check Structure Valid ... + bool IsValid() + { + // + bool result = false; + + // + result = IsValidCycle( + method, + period); + if (!result) + { + return result; + } + + // + result = + // + symbol != NULL && + period != NULL && + hostPeriod != NULL && + method != NULL && method != X_PERIOD_NOTHING && + seconds > 0 && + length > 0 + // + ; + + // + return result; + } + + // + // Init Cycle ... + bool Init( + string mSymbol, // Trading Symbol + ENUM_TIMEFRAMES mHostPeriod, // Host Period + ENUM_X_MARKET_CYCLES mCycle, // Init Cycle + int mHostBarIndex = 0, // Specified Host Period Bar Index + string mPrefix = "" // Prefix + ) + { + // + bool result = false; + + // + result = mCycle != NULL && mCycle != X_MARKET_CYCLE_UNKNOWN; + if (!result) + { + return result; + } + + // + this.cycle = mCycle; + + // + // Set Automatically Prefix ... + if (StringLen(mPrefix) == 0) + { + this.prefix = ToString(cycle); + } + + // + result = IsValidCycle( + method, + period // + ); + if (!result) + { + return result; + } + + // + this.symbol = mSymbol; + this.hostPeriod = mHostPeriod; + + // + // Find Cycle Period ... + if (method == X_PERIOD_AUTO) + { + // + // Select Period ... + switch (cycle) + { + // + case X_MARKET_CYCLE_SHORT: + // + this.period = GetNearestTimeFrame(mHostPeriod); + break; + + // + case X_MARKET_CYCLE_MEDIUM: + this.period = GetMediestTimeFrame(mHostPeriod); + break; + + // + case X_MARKET_CYCLE_LONG: + this.period = GetFarestTimeFrame(mHostPeriod); + break; + + // + case X_MARKET_CYCLE_HIND: + this.period = GetHindmostTimeFrame(mHostPeriod); + break; + } + } + + // + // Set Prefix if Provided ... + if (StringLen(mPrefix) > 0) + { + this.prefix = mPrefix; + } + + // + // Calculate Required Info ... + + // + // Seconds ... + this.seconds = PeriodSeconds(this.period); + + // + // Length ... + int hostPeriodSeconds = PeriodSeconds(this.hostPeriod); + this.length = this.seconds / hostPeriodSeconds; + + // + // Update Additional Data ... + result = this.Update(mHostBarIndex); + + // + return result; + } + + // + // Update Market Cycle Additional Info ... + bool Update(int hostBarIndex) + { + // + bool result = false; + + // + result = this.IsValid(); + if (!result) + { + return result; + } + + // + int barIndex = GetBarIndex(hostBarIndex); + + // + // Retrieve Current Candle ... + this.bar = GetCandle( + this.symbol, + this.period, + barIndex // + ); + + // + if (this.start != 0 && this.start != NULL) + { + this.lastStart = this.start; + } + + // + this.start = GetCandleTime( + this.symbol, + this.period, + barIndex // + ); + + // + if (this.lastStart == 0 || this.lastStart == NULL) + { + this.lastStart = this.start; + } + + // + this.next = this.start + this.seconds; + + // + // Retrieve Candle Remains ... + GetCandleRemainsTime( + this.remains, + this.symbol, + this.period, + barIndex // + ); + + // + return result; + } + + // + // Create and String Representation for Unique Taging ... + string ToString() + { + // + string result = ""; + + // + if (!this.IsValid()) + { + return result; + } + + // + result = + "XMarketCycle[" + + "PRFX(" + this.prefix + ")" + + "SMBL(" + this.symbol + ")" + + "CYC(" + ToString(this.cycle) + ")" + + "PRD(" + ToString(this.period) + ")" + + "PRDHST(" + ToString(this.hostPeriod) + ")" + + "MTH(" + EnumToString(this.method) + ")" + + "]"; + + // + return result; + } + + // + // Here we Produce a Summary brief of + // state of Cycle ... + string GenerateSummary() + { + // + string result = ""; + + // + bool hasPrefix = StringLen(this.prefix) > 0 && this.prefix != ToString(this.cycle); + result += (hasPrefix ? this.prefix + "[" : "") + + ToString(this.cycle) + + (hasPrefix ? "]" : "") + "\n"; + + // + result += " - PR: " + ToString(this.period) + "\n"; + + // + result += " - State: " + (this.IsBullish() ? "Bullish" : this.IsBearish() ? "Bearish" + : "Neutural"); + + // + return result; + } + + // + // TOOLS ... + + // + bool IsBullish() + { + return this.bar.open < this.bar.close; + } + + // + bool IsBearish() + { + return this.bar.open > this.bar.close; + } + + // + int Bars() + { + // + return iBars( + this.symbol, + this.period // + ); + } + + // + bool IsNewBar() + { + return this.lastStart < this.start; + } + + // + // Retrieve Current Bar Index based on Host Period bar Index ... + int GetBarIndex(int barIndex) + { + // + if (barIndex < 0) + { + return 0; + } + + // + int totalBars = this.Bars(); + if (barIndex >= totalBars) + { + return totalBars - 1; + } + + // + datetime hostBarTime = iTime( + this.symbol, + this.hostPeriod, + barIndex); + + // + int result = iBarShift( + this.symbol, + this.period, + hostBarTime); + + // + return result; + } + + // + // Retrieve Current Cycles Specific Bar ... + XOHCL GetBar(int barIndex) + { + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + int totalBars = Bars(); + if (barIndex >= totalBars) + { + barIndex = totalBars - 1; + } + + // + XOHCL result = GetCandle( + this.symbol, + this.period, + barIndex + // + ); + + // + return result; + } + + // + // Retrieve Bar Time ... + datetime GetBarTime(int barIndex) + { + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + int totalBars = Bars(); + if (barIndex >= totalBars) + { + barIndex = totalBars - 1; + } + + // + datetime result = GetCandleTime( + this.symbol, + this.period, + barIndex // + ); + + // + return result; + } + + // + // TODO: Add Shadow related and other tools here ... +}; + +// +// Validate Specific Period Mode ... +bool IsValidCycle( + ENUM_X_PERIOD_METHOD mMethod, // Period Select MEthod + ENUM_TIMEFRAMES mPeriod // Period +) +{ + // + bool result = false; + + // + result = + // + mMethod == X_PERIOD_NOTHING + ? false + : mMethod == X_PERIOD_MANUALLY + ? mPeriod != NULL + : mMethod == X_PERIOD_AUTO + ? true + : false + // + ; + + // + 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; +} + +// +// Hash Specified Content ... +template +string ToMD5(T content) +{ + // + string result = ""; + + // + string strContent = ToString(content); + if (StringLen(strContent) == 0) + { + return result; + } + + // + static XSCMD5 md5; + + // + result = md5.Hash(strContent); + + // + 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.type = type; + 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/XBEEA/14030224/Libraries/x-saherelm.draw.lib.ex5 b/MQLTestWorkspace/XBEEA/14030224/Libraries/x-saherelm.draw.lib.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..98df0ed4fb6505ff0d4bd2f658ede1bf01da3b90 GIT binary patch literal 6416 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 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 Label(string value) + { + // + lowStyle.Label(value); + openStyle.Label(value); + highStyle.Label(value); + closeStyle.Label(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 ... + if (StringLen(specs.label) > 0) + { + 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 ... + if (StringLen(specs.label) > 0) + { + 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 ... + if (StringLen(specs.label) > 0) + { + 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 ... + if (StringLen(specs.label) > 0) + { + 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/XBEEA/14030224/Libraries/x-saherelm.http.lib.ex5 b/MQLTestWorkspace/XBEEA/14030224/Libraries/x-saherelm.http.lib.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..2398a0f64cf414a1402d0bdcc6097c99acb7efa0 GIT binary patch literal 3836 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 WCNmd(D3*X|M&g8tof27K%|8LX;wsnx literal 0 HcmV?d00001 diff --git a/MQLTestWorkspace/XBEEA/14030224/Libraries/x-saherelm.http.lib.mq5 b/MQLTestWorkspace/XBEEA/14030224/Libraries/x-saherelm.http.lib.mq5 new file mode 100644 index 0000000..97f7ac0 --- /dev/null +++ b/MQLTestWorkspace/XBEEA/14030224/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/XBEEA/14030224/Libraries/x-saherelm.log.lib.ex5 b/MQLTestWorkspace/XBEEA/14030224/Libraries/x-saherelm.log.lib.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..ca4e3bb6e2118d3d40c4dd1a411ed6b877f62bd4 GIT binary patch literal 6454 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 ", 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/XBEEA/14030224/Libraries/x-saherelm.models.lib.ex5 b/MQLTestWorkspace/XBEEA/14030224/Libraries/x-saherelm.models.lib.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..5b77b3dc2d5300453cb10d9a694a29f56dd0d8e7 GIT binary patch literal 5300 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 literal 0 HcmV?d00001 diff --git a/MQLTestWorkspace/XBEEA/14030224/Libraries/x-saherelm.models.lib.mq5 b/MQLTestWorkspace/XBEEA/14030224/Libraries/x-saherelm.models.lib.mq5 new file mode 100644 index 0000000..ad75c82 --- /dev/null +++ b/MQLTestWorkspace/XBEEA/14030224/Libraries/x-saherelm.models.lib.mq5 @@ -0,0 +1,326 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center MQL5 Models Library +// --------------------------------------- +// Name: XModels +// Description: provides all required models ... +// +// +// 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 ... +// + +// +// START Global Definitions: Variables, Properties and etc ... +// + +// +// END Global Definitions: Variables, Properties and etc ... +// + +// +// START Provided Functions ... +// + +// +// How To Calculate Static Volume ... +enum ENUM_STATIC_VOLUME_METHODS +{ + // + // Based On Deposit ... + X_STATIC_VOLUME_BASED_ON_DEPOSIT, + // + // Based On Balance ... + X_STATIC_VOLUME_BASED_ON_BALANCE, +}; + +// +// START Model Definitions ... +// + +// +// OHCL Candel Model ... +enum ENUM_X_PRICE +{ + X_PRICE_HIGH, + X_PRICE_OPEN, + X_PRICE_CLOSE, + X_PRICE_LOW +}; + +// +// Swing Types Enum ... +enum ENUM_X_SWING_TYPE +{ + X_NO_SWING = 0, + X_SWING_HIGH = 1, + X_SWING_LOW = -1, +}; + +// +// Select Positions Type ... +enum ENUM_X_POSITION_SELECT_METHODS +{ + X_POSITION_SELECT_NONE, // None + X_POSITION_SELECT_MAX, // Max + X_POSITION_SELECT_MIN, // Min + X_POSITION_SELECT_ALL, // Min +}; + +// +// XPERIOD Calculation Method ... +enum ENUM_X_PERIOD_METHOD +{ + // + X_PERIOD_NOTHING, // Nothing + X_PERIOD_AUTO, // Auto Select + X_PERIOD_MANUALLY // Manually +}; + +// +enum ENUM_X_MARKET_CYCLES +{ + // + X_MARKET_CYCLE_UNKNOWN, // Unknown Cycle + X_MARKET_CYCLE_SHORT, // Short Cycle + X_MARKET_CYCLE_MEDIUM, // Medium Cycle + X_MARKET_CYCLE_LONG, // Long Cycle + X_MARKET_CYCLE_HIND, // Hind Cycle +}; + +// +// Available Guard Action ... +enum ENUM_X_GUARD_ACTIONS +{ + X_GUARD_ACTION_NOTHING, // Nothing + X_GUARD_ACTION_HEDGE, // Hedge + X_GUARD_PARTIAL_CLOSE, // Partial Close + X_GUARD_ACTION_TRAIL_STOP, // Trail StopLoss + X_GUARD_ACTION_FORCE_CLOSE, // Force Close + X_GUARD_ACTION_ADD_SUPPORT_SIGNAL, // Add Support Signal + X_GUARD_ACTION_CANCEL_PENDING_ORDERS, // Cancel Pending Orders +}; + +// +// Model Guard Info ... +struct XGuard +{ + string symbol; + string provider; + ENUM_TIMEFRAMES period; + ENUM_POSITION_TYPE type; + ENUM_X_GUARD_ACTIONS action; + + // + double dblPayLoad; + string strPayload; +}; + +// +// Describe an Specific Candle ... +struct XOHCL +{ + // + double high; + double open; + double close; + double low; + + // + string ToString() + { + // + string result = ""; + + // + result = "XOHCL(O(" + (string)open + "),H(" + (string)high + "),C(" + (string)close + "),L(" + (string)low + "))"; + + // + return result; + } +}; + +// +// Model Support and Resistance +// for Specific Bar ... +struct XOHCLSupRes +{ + // + double res[]; + + // + double sup[]; +}; + +// +struct XValueChanged +{ + datetime at; + double from; + double to; +}; + +// +// Available Order Modes ... +enum ENUM_X_ORDER_MODES +{ + X_ORDER_MODE_MARKET = 0, // Market Order + X_ORDER_MODE_STOP = 1, // Pending Stop Order + X_ORDER_MODE_LIMIT = 2, // Pending Limit Order + X_ORDER_MODE_STOP_LIMIT = 3, // Pending Stop Limit Order +}; + +// +// Model a Signal ... +struct XSignal +{ + // + string providers[]; + + // + string symbol; + + // + ENUM_TIMEFRAMES period; + + // + ENUM_POSITION_TYPE type; + + // + ENUM_X_ORDER_MODES mode; + + // + double entry; + + // + double tp; + + // + double sl; + + // + double r2r; + + // + double volume; + + // + // Support Signals ... + XSignal supports[]; + + // + XOHCLSupRes supportResistances; +}; + +// +// EXTENSION Methods ... + +// +// Clear an Specific Signal Item ... +void Clean(XSignal &item) +{ + // + Clean(item.providers); + + // + Clean(item.supports); + + // + Clean(item.supportResistances); + + // + item.symbol = ""; + item.type = NULL; + item.mode = NULL; + item.period = NULL; + + // + item.tp = 0; + item.sl = 0; + item.r2r = 0; + item.entry = 0; + item.volume = 0; +} + +// +void Clean(XOHCLSupRes &item) +{ + Clean(item.sup); + Clean(item.res); +} + +template +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/XBEEA/14030224/Libraries/x-saherelm.seriallizer.lib.ex5 b/MQLTestWorkspace/XBEEA/14030224/Libraries/x-saherelm.seriallizer.lib.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..3ee28a89cf22b41a860371c7d072cb73c5fa11f4 GIT binary patch literal 13148 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 literal 0 HcmV?d00001 diff --git a/MQLTestWorkspace/XBEEA/14030224/Libraries/x-saherelm.seriallizer.lib.mq5 b/MQLTestWorkspace/XBEEA/14030224/Libraries/x-saherelm.seriallizer.lib.mq5 new file mode 100644 index 0000000..c1fdd52 --- /dev/null +++ b/MQLTestWorkspace/XBEEA/14030224/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/XBEEA/14030224/Libraries/x-saherelm.x121.condition.parser.lib.mq5 b/MQLTestWorkspace/XBEEA/14030224/Libraries/x-saherelm.x121.condition.parser.lib.mq5 new file mode 100644 index 0000000..8bb775b --- /dev/null +++ b/MQLTestWorkspace/XBEEA/14030224/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/XBEEA/14030224/Libraries/x-saherelm.x121.draw.lib.ex5 b/MQLTestWorkspace/XBEEA/14030224/Libraries/x-saherelm.x121.draw.lib.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..4f32623744cdacf6f3019edad7264e0fb8b76c2e GIT binary patch literal 6974 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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/XBEEA/14030224/Libraries/x-saherelm.x121.x786.lib.mq5 b/MQLTestWorkspace/XBEEA/14030224/Libraries/x-saherelm.x121.x786.lib.mq5 new file mode 100644 index 0000000..f10d173 --- /dev/null +++ b/MQLTestWorkspace/XBEEA/14030224/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/XBEEA/14030224/Libraries/x-saherelm.x121.x92.lib.mq5 b/MQLTestWorkspace/XBEEA/14030224/Libraries/x-saherelm.x121.x92.lib.mq5 new file mode 100644 index 0000000..ce2270d --- /dev/null +++ b/MQLTestWorkspace/XBEEA/14030224/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/XBEEA/14030224/Libraries/x-saherelm.x121.xtest.lib.mq5 b/MQLTestWorkspace/XBEEA/14030224/Libraries/x-saherelm.x121.xtest.lib.mq5 new file mode 100644 index 0000000..ee752f4 --- /dev/null +++ b/MQLTestWorkspace/XBEEA/14030224/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/XBEEA/14030224/Libraries/x-saherelm.xman.parser.lib.ex5 b/MQLTestWorkspace/XBEEA/14030224/Libraries/x-saherelm.xman.parser.lib.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..7f287906efa168a1e6e685279fd532df68ef6353 GIT binary patch literal 10032 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 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; +} + +// +// +//

8ngVf^7B!vx%?^mOy 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 j`Gv9y!(RRC 0 && + xBEEAMagicNumber > 0 + // + && + // + // Short ... + IsValidCycle( + scMode, + scPeriod) + // + && + // + // Medium ... + IsValidCycle( + mcMode, + mcPeriod) + // + && + // + // Long ... + IsValidCycle( + lcMode, + lcPeriod) + // + && + // + // Hind ... + IsValidCycle( + hcMode, + hcPeriod) + // + ; + + // + return result; +} + +// +// Initial Indicators ... +bool InitIndicators() +{ + // + bool result = false; + + // + // Init XZG Indicator ... + zigZagHandler = iCustom( + xBEEASymbol, + xBEEAPeriod, + "x-saherelm.x121.xzg", + // + // Inputs ... + // TODO: + // add these inputs to TODO ... + 12, // Depth ... + 5, // Deviation ... + 3, // Back Step ... + 1 // MODE ENUM_X_ZG_PRICE_MODE (X_ZG_PRICE_HIGH_LOW_MODE) ... + // + ); + result = zigZagHandler != INVALID_HANDLE; + if (!result) + { + return result; + } + + // + // Here we have to Init XMarketCycles also ... + result = InitMarketCycles(); + + // + return result; +} + +// +// Initial Market Cycles ... +bool InitMarketCycles() +{ + // + bool result = false; + + // + // Short ... + sc.method = scMode; + sc.period = scPeriod; + result = sc.Init( + xBEEASymbol, + xBEEAPeriod, + X_MARKET_CYCLE_SHORT // + ); + if (!result) + { + return result; + } + + // + // Trend ... + ArraySetAsSeries(scTrndBuffer, true); + scTrndHandler = iCustom( + xBEEASymbol, + sc.period, + "x-saherelm.x121.xstr", + // + // Inputs ... + // + // ATR ... + "", + 14, // Length + 3.5, // Multiplier + PRICE_MEDIAN, // Applied To + // + // Presentation ... + "", + true, // Show Trends + false // Fill Trends + // + ); + + // + // Che ... + ArraySetAsSeries(scLongExit1, true); + ArraySetAsSeries(scLongExit2, true); + ArraySetAsSeries(scShortExit1, true); + ArraySetAsSeries(scShortExit2, true); + scCheHandler = iCustom( + xBEEASymbol, + sc.period, + "x-saherelm.x121.xche", + // + // Inputs ... + // + // Market ... + "", + 35, + 26, + 3.0, + 3.5, + // + // Calculations ... + "", + PRICE_HIGH, + PRICE_LOW, + // + // Presentation ... + "", + true, + true, + true, + true + // + ); + + // + // MA's ... + ArraySetAsSeries(scFastBuffer, true); + scFastHandler = iMA( + xBEEASymbol, + sc.period, + xBEEAMaFastLength, + xBEEAMaShift, + xBEEAMaMethod, + xBEEAMaAppliedTo // + ); + ArraySetAsSeries(scSlowBuffer, true); + scSlowHandler = iMA( + xBEEASymbol, + sc.period, + xBEEAMaSlowLength, + xBEEAMaShift, + xBEEAMaMethod, + xBEEAMaAppliedTo // + ); + + // + result = + // + scCheHandler != INVALID_HANDLE && + scTrndHandler != INVALID_HANDLE && + scFastHandler != INVALID_HANDLE && + scSlowHandler != INVALID_HANDLE + // + ; + if (!result) + { + return result; + } + + // + // Medium ... + mc.method = mcMode; + mc.period = mcPeriod; + result = mc.Init( + xBEEASymbol, + xBEEAPeriod, + X_MARKET_CYCLE_MEDIUM // + ); + if (!result) + { + return result; + } + + // + // Trend ... + ArraySetAsSeries(mcTrndBuffer, true); + mcTrndHandler = iCustom( + xBEEASymbol, + mc.period, + "x-saherelm.x121.xstr", + // + // Inputs ... + // + // ATR ... + "", + 14, // Length + 3.5, // Multiplier + PRICE_MEDIAN, // Applied To + // + // Presentation ... + "", + true, // Show Trends + false // Fill Trends + // + ); + + // + // Che ... + ArraySetAsSeries(mcLongExit1, true); + ArraySetAsSeries(mcLongExit2, true); + ArraySetAsSeries(mcShortExit1, true); + ArraySetAsSeries(mcShortExit2, true); + mcCheHandler = iCustom( + xBEEASymbol, + mc.period, + "x-saherelm.x121.xche", + // + // Inputs ... + // + // Market ... + "", + 35, + 26, + 3.0, + 3.5, + // + // Calculations ... + "", + PRICE_HIGH, + PRICE_LOW, + // + // Presentation ... + "", + true, + true, + true, + true + // + ); + + // + // MA's ... + ArraySetAsSeries(mcFastBuffer, true); + mcFastHandler = iMA( + xBEEASymbol, + mc.period, + xBEEAMaFastLength, + xBEEAMaShift, + xBEEAMaMethod, + xBEEAMaAppliedTo // + ); + ArraySetAsSeries(mcSlowBuffer, true); + mcSlowHandler = iMA( + xBEEASymbol, + mc.period, + xBEEAMaSlowLength, + xBEEAMaShift, + xBEEAMaMethod, + xBEEAMaAppliedTo // + ); + + // + result = + // + mcTrndHandler != INVALID_HANDLE && + mcFastHandler != INVALID_HANDLE && + mcSlowHandler != INVALID_HANDLE + // + ; + if (!result) + { + return result; + } + + // + // Long ... + lc.method = lcMode; + lc.period = lcPeriod; + result = lc.Init( + xBEEASymbol, + xBEEAPeriod, + X_MARKET_CYCLE_LONG // + ); + if (!result) + { + return result; + } + + // + // Trend ... + ArraySetAsSeries(lcTrndBuffer, true); + lcTrndHandler = iCustom( + xBEEASymbol, + lc.period, + "x-saherelm.x121.xstr", + // + // Inputs ... + // + // ATR ... + "", + 14, // Length + 3.5, // Multiplier + PRICE_MEDIAN, // Applied To + // + // Presentation ... + "", + true, // Show Trends + false // Fill Trends + // + ); + + // + // Che ... + ArraySetAsSeries(lcLongExit1, true); + ArraySetAsSeries(lcLongExit2, true); + ArraySetAsSeries(lcShortExit1, true); + ArraySetAsSeries(lcShortExit2, true); + lcCheHandler = iCustom( + xBEEASymbol, + lc.period, + "x-saherelm.x121.xche", + // + // Inputs ... + // + // Market ... + "", + 35, + 26, + 3.0, + 3.5, + // + // Calculations ... + "", + PRICE_HIGH, + PRICE_LOW, + // + // Presentation ... + "", + true, + true, + true, + true + // + ); + + // + // MA's ... + ArraySetAsSeries(lcFastBuffer, true); + lcFastHandler = iMA( + xBEEASymbol, + lc.period, + xBEEAMaFastLength, + xBEEAMaShift, + xBEEAMaMethod, + xBEEAMaAppliedTo // + ); + ArraySetAsSeries(lcSlowBuffer, true); + lcSlowHandler = iMA( + xBEEASymbol, + lc.period, + xBEEAMaSlowLength, + xBEEAMaShift, + xBEEAMaMethod, + xBEEAMaAppliedTo // + ); + + // + result = + // + lcTrndHandler != INVALID_HANDLE && + lcFastHandler != INVALID_HANDLE && + lcSlowHandler != INVALID_HANDLE + // + ; + if (!result) + { + return result; + } + + // + // Hind ... + hc.method = hcMode; + hc.period = hcPeriod; + result = hc.Init( + xBEEASymbol, + xBEEAPeriod, + X_MARKET_CYCLE_HIND // + ); + if (!result) + { + return result; + } + + // + // Trend ... + ArraySetAsSeries(hcTrndBuffer, true); + hcTrndHandler = iCustom( + xBEEASymbol, + hc.period, + "x-saherelm.x121.xstr", + // + // Inputs ... + // + // ATR ... + "", + 14, // Length + 3.5, // Multiplier + PRICE_MEDIAN, // Applied To + // + // Presentation ... + "", + true, // Show Trends + false // Fill Trends + // + ); + + // + // Che ... + ArraySetAsSeries(hcLongExit1, true); + ArraySetAsSeries(hcLongExit2, true); + ArraySetAsSeries(hcShortExit1, true); + ArraySetAsSeries(hcShortExit2, true); + hcCheHandler = iCustom( + xBEEASymbol, + hc.period, + "x-saherelm.x121.xche", + // + // Inputs ... + // + // Market ... + "", + 35, + 26, + 3.0, + 3.5, + // + // Calculations ... + "", + PRICE_HIGH, + PRICE_LOW, + // + // Presentation ... + "", + true, + true, + true, + true + // + ); + + // + // MA's ... + ArraySetAsSeries(hcFastBuffer, true); + hcFastHandler = iMA( + xBEEASymbol, + hc.period, + xBEEAMaFastLength, + xBEEAMaShift, + xBEEAMaMethod, + xBEEAMaAppliedTo // + ); + ArraySetAsSeries(hcSlowBuffer, true); + hcSlowHandler = iMA( + xBEEASymbol, + hc.period, + xBEEAMaSlowLength, + xBEEAMaShift, + xBEEAMaMethod, + xBEEAMaAppliedTo // + ); + + // + result = + // + hcTrndHandler != INVALID_HANDLE && + hcFastHandler != INVALID_HANDLE && + hcSlowHandler != INVALID_HANDLE + // + ; + if (!result) + { + return result; + } + + // + return result; +} + +// +// Prepare Style Specs for Drawings ... +void PrepareStyleSpecs() +{ + // + // Each Cycle has 2 Kind of Specs: + // 1- MidLines; + // 2- Candles; + // + // also for each Cycle we have 2 Series of Specs: + // 1- For Current Bar; + // 2- Prev Bar; + + // + // Short ... + + // + // Current ... + + // + // MidLine ... + scCMidSpecs.width = 1; + scCMidSpecs.style = STYLE_DOT; + scCMidSpecs.clr = clrSpringGreen; + scCMidSpecs.Label( + sc.prefix + "_C MID", + scCMidSpecs.clr, + "Arial", + 8, + ANCHOR_LEFT_UPPER, + 90 + // + ); + + // + // XOHCL ... + scCBSpecs.Default(); + scCBSpecs.Width(1); + scCBSpecs.Style(STYLE_DOT); + // + // scCBSpecs.openStyle.clr = clrDarkOliveGreen; + // scCBSpecs.closeStyle.clr = clrDarkOrchid; + // scCBSpecs.highStyle.clr = clrDarkSeaGreen; + // scCBSpecs.lowStyle.clr = clrPink; + // + scCBSpecs.openStyle.Label( + sc.prefix + "_C O", + scCBSpecs.openStyle.clr, + "Arial", + 8, + ANCHOR_LEFT_UPPER, + 90 + // + ); + scCBSpecs.highStyle.Label( + sc.prefix + "_C H", + scCBSpecs.highStyle.clr, + "Arial", + 8, + ANCHOR_LEFT_UPPER, + 90 + // + ); + scCBSpecs.closeStyle.Label( + sc.prefix + "_C C", + scCBSpecs.closeStyle.clr, + "Arial", + 8, + ANCHOR_LEFT_UPPER, + 90 + // + ); + scCBSpecs.lowStyle.Label( + sc.prefix + "_C L", + scCBSpecs.lowStyle.clr, + "Arial", + 8, + ANCHOR_LEFT_UPPER, + 90 + // + ); + + // + // Prev ... + + // + // MidLine ... + scPMidSpecs.width = 2; + scPMidSpecs.style = STYLE_SOLID; + scPMidSpecs.clr = clrLimeGreen; + scPMidSpecs.Label( + sc.prefix + "_P MID", + scPMidSpecs.clr, + "Arial", + 8, + ANCHOR_LEFT_UPPER, + 90 + // + ); + + // + // XOHCL ... + scPBSpecs.Default(); + scPBSpecs.Width(2); + // + // scPBSpecs.openStyle.clr = ; + // scPBSpecs.closeStyle.clr = ; + // scPBSpecs.highStyle.clr = ; + // scPBSpecs.lowStyle.clr = ; + // + scPBSpecs.openStyle.Label( + sc.prefix + "_P O", + scPBSpecs.openStyle.clr, + "Arial", + 8, + ANCHOR_LEFT_UPPER, + 90 + // + ); + scPBSpecs.highStyle.Label( + sc.prefix + "_P H", + scPBSpecs.highStyle.clr, + "Arial", + 8, + ANCHOR_LEFT_UPPER, + 90 + // + ); + scPBSpecs.closeStyle.Label( + sc.prefix + "_P C", + scPBSpecs.closeStyle.clr, + "Arial", + 8, + ANCHOR_LEFT_UPPER, + 90 + // + ); + scPBSpecs.lowStyle.Label( + sc.prefix + "_P L", + scPBSpecs.lowStyle.clr, + "Arial", + 8, + ANCHOR_LEFT_UPPER, + 90 + // + ); + + // + // Medium ... + + // + // Current ... + + // + // MidLine ... + mcCMidSpecs.width = 1; + mcCMidSpecs.style = STYLE_DOT; + mcCMidSpecs.clr = clrSteelBlue; + mcCMidSpecs.Label( + mc.prefix + "_C MID", + mcCMidSpecs.clr, + "Arial", + 8, + ANCHOR_LEFT_UPPER, + 90 + // + ); + + // + // XOHCL ... + mcCBSpecs.Default(); + mcCBSpecs.Width(1); + mcCBSpecs.Style(STYLE_DOT); + // + // mcCBSpecs.openStyle.clr = clrDarkOliveGreen; + // mcCBSpecs.closeStyle.clr = clrDarkOrchid; + // mcCBSpecs.highStyle.clr = clrDarkSeaGreen; + // mcCBSpecs.lowStyle.clr = clrPink; + // + mcCBSpecs.openStyle.Label( + mc.prefix + "_C O", + mcCBSpecs.openStyle.clr, + "Arial", + 8, + ANCHOR_LEFT_UPPER, + 90 + // + ); + mcCBSpecs.highStyle.Label( + mc.prefix + "_C H", + mcCBSpecs.highStyle.clr, + "Arial", + 8, + ANCHOR_LEFT_UPPER, + 90 + // + ); + mcCBSpecs.closeStyle.Label( + mc.prefix + "_C C", + mcCBSpecs.closeStyle.clr, + "Arial", + 8, + ANCHOR_LEFT_UPPER, + 90 + // + ); + mcCBSpecs.lowStyle.Label( + mc.prefix + "_C L", + mcCBSpecs.lowStyle.clr, + "Arial", + 8, + ANCHOR_LEFT_UPPER, + 90 + // + ); + + // + // Prev ... + + // + // MidLine ... + mcPMidSpecs.width = 2; + mcPMidSpecs.style = STYLE_SOLID; + mcPMidSpecs.clr = clrRoyalBlue; + mcPMidSpecs.Label( + mc.prefix + "_P MID", + mcPMidSpecs.clr, + "Arial", + 8, + ANCHOR_LEFT_UPPER, + 90 + // + ); + + // + // XOHCL ... + mcPBSpecs.Default(); + mcPBSpecs.Width(2); + // + // mcPBSpecs.openStyle.clr = ; + // mcPBSpecs.closeStyle.clr = ; + // mcPBSpecs.highStyle.clr = ; + // mcPBSpecs.lowStyle.clr = ; + // + mcPBSpecs.openStyle.Label( + mc.prefix + "_P O", + mcCBSpecs.openStyle.clr, + "Arial", + 8, + ANCHOR_LEFT_UPPER, + 90 + // + ); + mcPBSpecs.highStyle.Label( + mc.prefix + "_P H", + mcPBSpecs.highStyle.clr, + "Arial", + 8, + ANCHOR_LEFT_UPPER, + 90 + // + ); + mcPBSpecs.closeStyle.Label( + mc.prefix + "_P C", + mcPBSpecs.closeStyle.clr, + "Arial", + 8, + ANCHOR_LEFT_UPPER, + 90 + // + ); + mcPBSpecs.lowStyle.Label( + mc.prefix + "_P L", + mcPBSpecs.lowStyle.clr, + "Arial", + 8, + ANCHOR_LEFT_UPPER, + 90 + // + ); + + // + // Long ... + + // + // Current ... + + // + // MidLine ... + lcCMidSpecs.width = 1; + lcCMidSpecs.style = STYLE_DOT; + lcCMidSpecs.clr = clrYellow; + lcCMidSpecs.Label( + lc.prefix + "_C MID", + lcCMidSpecs.clr, + "Arial", + 8, + ANCHOR_LEFT_UPPER, + 90 + // + ); + + // + // XOHCL ... + lcCBSpecs.Default(); + lcCBSpecs.Width(1); + lcCBSpecs.Style(STYLE_DOT); + // + // lcCBSpecs.openStyle.clr = clrDarkOliveGreen; + // lcCBSpecs.closeStyle.clr = clrDarkOrchid; + // lcCBSpecs.highStyle.clr = clrDarkSeaGreen; + // lcCBSpecs.lowStyle.clr = clrPink; + // + lcCBSpecs.openStyle.Label( + lc.prefix + "_C O", + lcCBSpecs.openStyle.clr, + "Arial", + 8, + ANCHOR_LEFT_UPPER, + 90 + // + ); + lcCBSpecs.highStyle.Label( + lc.prefix + "_C H", + lcCBSpecs.highStyle.clr, + "Arial", + 8, + ANCHOR_LEFT_UPPER, + 90 + // + ); + lcCBSpecs.closeStyle.Label( + lc.prefix + "_C C", + lcCBSpecs.closeStyle.clr, + "Arial", + 8, + ANCHOR_LEFT_UPPER, + 90 + // + ); + lcCBSpecs.lowStyle.Label( + lc.prefix + "_C L", + lcCBSpecs.lowStyle.clr, + "Arial", + 8, + ANCHOR_LEFT_UPPER, + 90 + // + ); + + // + // Prev ... + + // + // MidLine ... + lcPMidSpecs.width = 2; + lcPMidSpecs.style = STYLE_SOLID; + lcPMidSpecs.clr = clrOrange; + lcPMidSpecs.Label( + lc.prefix + "_P MID", + lcPMidSpecs.clr, + "Arial", + 8, + ANCHOR_LEFT_UPPER, + 90 + // + ); + + // + // XOHCL ... + lcPBSpecs.Default(); + lcPBSpecs.Width(2); + // + // lcPBSpecs.openStyle.clr = ; + // lcPBSpecs.closeStyle.clr = ; + // lcPBSpecs.highStyle.clr = ; + // lcPBSpecs.lowStyle.clr = ; + // + lcPBSpecs.openStyle.Label( + lc.prefix + "_P O", + lcCBSpecs.openStyle.clr, + "Arial", + 8, + ANCHOR_LEFT_UPPER, + 90 + // + ); + lcPBSpecs.highStyle.Label( + lc.prefix + "_P H", + lcPBSpecs.highStyle.clr, + "Arial", + 8, + ANCHOR_LEFT_UPPER, + 90 + // + ); + lcPBSpecs.closeStyle.Label( + lc.prefix + "_P C", + lcPBSpecs.closeStyle.clr, + "Arial", + 8, + ANCHOR_LEFT_UPPER, + 90 + // + ); + lcPBSpecs.lowStyle.Label( + lc.prefix + "_P L", + lcPBSpecs.lowStyle.clr, + "Arial", + 8, + ANCHOR_LEFT_UPPER, + 90 + // + ); + + // + // Hind ... + + // + // Current ... + + // + // MidLine ... + hcCMidSpecs.width = 1; + hcCMidSpecs.style = STYLE_DOT; + hcCMidSpecs.clr = clrSandyBrown; + hcCMidSpecs.Label( + hc.prefix + "_C MID", + hcCMidSpecs.clr, + "Arial", + 8, + ANCHOR_LEFT_UPPER, + 90 + // + ); + + // + // XOHCL ... + hcCBSpecs.Default(); + hcCBSpecs.Width(1); + hcCBSpecs.Style(STYLE_DOT); + // + // hcCBSpecs.openStyle.clr = clrDarkOliveGreen; + // hcCBSpecs.closeStyle.clr = clrDarkOrchid; + // hcCBSpecs.highStyle.clr = clrDarkSeaGreen; + // hcCBSpecs.lowStyle.clr = clrPink; + // + hcCBSpecs.openStyle.Label( + hc.prefix + "_C O", + hcCBSpecs.openStyle.clr, + "Arial", + 8, + ANCHOR_LEFT_UPPER, + 90 + // + ); + hcCBSpecs.highStyle.Label( + hc.prefix + "_C H", + hcCBSpecs.highStyle.clr, + "Arial", + 8, + ANCHOR_LEFT_UPPER, + 90 + // + ); + hcCBSpecs.closeStyle.Label( + hc.prefix + "_C C", + hcCBSpecs.closeStyle.clr, + "Arial", + 8, + ANCHOR_LEFT_UPPER, + 90 + // + ); + hcCBSpecs.lowStyle.Label( + hc.prefix + "_C L", + hcCBSpecs.lowStyle.clr, + "Arial", + 8, + ANCHOR_LEFT_UPPER, + 90 + // + ); + + // + // Prev ... + + // + // MidLine ... + hcPMidSpecs.width = 2; + hcPMidSpecs.style = STYLE_SOLID; + hcPMidSpecs.clr = clrSaddleBrown; + hcPMidSpecs.Label( + hc.prefix + "_P MID", + hcPMidSpecs.clr, + "Arial", + 8, + ANCHOR_LEFT_UPPER, + 90 + // + ); + + // + // XOHCL ... + hcPBSpecs.Default(); + hcPBSpecs.Width(2); + // + // hcPBSpecs.openStyle.clr = clrDarkOliveGreen; + // hcPBSpecs.closeStyle.clr = clrDarkOrchid; + // hcPBSpecs.highStyle.clr = clrDarkSeaGreen; + // hcPBSpecs.lowStyle.clr = clrPink; + // + hcPBSpecs.openStyle.Label( + hc.prefix + "_P O", + hcPBSpecs.openStyle.clr, + "Arial", + 8, + ANCHOR_LEFT_UPPER, + 90 + // + ); + hcPBSpecs.highStyle.Label( + hc.prefix + "_P H", + hcPBSpecs.highStyle.clr, + "Arial", + 8, + ANCHOR_LEFT_UPPER, + 90 + // + ); + hcPBSpecs.closeStyle.Label( + hc.prefix + "_P C", + hcPBSpecs.closeStyle.clr, + "Arial", + 8, + ANCHOR_LEFT_UPPER, + 90 + // + ); + hcPBSpecs.lowStyle.Label( + hc.prefix + "_P L", + hcPBSpecs.lowStyle.clr, + "Arial", + 8, + ANCHOR_LEFT_UPPER, + 90 + // + ); +} + +// +// Reading Data From Indicators ... +void ReadData() +{ + // + int mLoopBack = 15; + + // + // Update Market Cycles ... + UpdateMarketCycles(0); + + // + // Short ... + CopyBuffer( + scFastHandler, + 0, + 0, + mLoopBack, + scFastBuffer + // + ); + CopyBuffer( + scSlowHandler, + 0, + 0, + mLoopBack, + scSlowBuffer + // + ); + isSCFastOverSlow = scFastBuffer[1] > scSlowBuffer[1]; + isSCFastUnderSlow = scFastBuffer[1] > scSlowBuffer[1]; + + // + // Medium ... + CopyBuffer( + mcFastHandler, + 0, + 0, + mLoopBack, + mcFastBuffer + // + ); + CopyBuffer( + mcSlowHandler, + 0, + 0, + mLoopBack, + mcSlowBuffer + // + ); + isMCFastOverSlow = mcFastBuffer[1] > mcSlowBuffer[1]; + isMCFastUnderSlow = mcFastBuffer[1] > mcSlowBuffer[1]; + + // + // Long ... + CopyBuffer( + lcFastHandler, + 0, + 0, + mLoopBack, + lcFastBuffer + // + ); + CopyBuffer( + lcSlowHandler, + 0, + 0, + mLoopBack, + lcSlowBuffer + // + ); + isLCFastOverSlow = lcFastBuffer[1] > lcSlowBuffer[1]; + isLCFastUnderSlow = lcFastBuffer[1] > lcSlowBuffer[1]; + + // + // Hind ... + CopyBuffer( + hcFastHandler, + 0, + 0, + mLoopBack, + hcFastBuffer + // + ); + CopyBuffer( + hcSlowHandler, + 0, + 0, + mLoopBack, + hcSlowBuffer + // + ); + isHCFastOverSlow = hcFastBuffer[1] > hcSlowBuffer[1]; + isHCFastUnderSlow = hcFastBuffer[1] > hcSlowBuffer[1]; + + // + // XZigZag ... + CopyBuffer( + zigZagHandler, + X_ZIGZAG_PIVOTS_LINE, + 0, + mLoopBack, + zigZagBuffer + // + ); + + // + isZigZagInPeak = zigZagBuffer[0] < MathMax(xBEEATick.ask, xBEEATick.bid); + + // + // Summary ... + CalculateSummary(); + + // + // Provide all Draws ... + XBEEAHandleDraws( + // + // Short ... + xBEEADrawSCLabel, + xBEEADrawSCCBar, + xBEEADrawSCPBar, + xBEEADrawSCCMid, + xBEEADrawSCPMid, + // + // Medium ... + xBEEADrawMCLabel, + xBEEADrawMCCBar, + xBEEADrawMCPBar, + xBEEADrawMCCMid, + xBEEADrawMCPMid, + // + // Long ... + xBEEADrawLCLabel, + xBEEADrawLCCBar, + xBEEADrawLCPBar, + xBEEADrawLCCMid, + xBEEADrawLCPMid, + // + // Hind ... + xBEEADrawHCLabel, + xBEEADrawHCCBar, + xBEEADrawHCPBar, + xBEEADrawHCCMid, + xBEEADrawHCPMid + // + ); +} + +// +// Update Market Cycles ... +bool UpdateMarketCycles(int barIndex) +{ + // + bool result = false; + + // + XOHCL cBar; + XOHCL pBar; + + // + // Short ... + result = sc.Update(barIndex); + if (!result) + { + return result; + } + // + cBar = sc.GetBar(0); + pBar = sc.GetBar(1); + scCBar = cBar; + scPBar = pBar; + scCMidLine = (cBar.high - cBar.low) / 2; + scPMidLine = (pBar.high - pBar.low) / 2; + isSCCBullish = cBar.close > cBar.open; + isSCPBullish = pBar.close > pBar.open; + + // + // Medium ... + result = mc.Update(barIndex); + if (!result) + { + return result; + } + // + cBar = mc.GetBar(0); + pBar = mc.GetBar(1); + mcCBar = cBar; + mcPBar = pBar; + mcCMidLine = (cBar.high - cBar.low) / 2; + mcPMidLine = (pBar.high - pBar.low) / 2; + isMCCBullish = cBar.close > cBar.open; + isMCPBullish = pBar.close > pBar.open; + + // + // Long ... + result = lc.Update(barIndex); + if (!result) + { + return result; + } + // + cBar = lc.GetBar(0); + pBar = lc.GetBar(1); + lcCBar = cBar; + lcPBar = pBar; + lcCMidLine = (cBar.high - cBar.low) / 2; + lcPMidLine = (pBar.high - pBar.low) / 2; + isLCCBullish = cBar.close > cBar.open; + isLCPBullish = pBar.close > pBar.open; + + // + // Hind ... + result = hc.Update(barIndex); + if (!result) + { + return result; + } + // + cBar = hc.GetBar(0); + pBar = hc.GetBar(1); + hcCBar = cBar; + hcPBar = pBar; + hcCMidLine = (cBar.high - cBar.low) / 2; + hcPMidLine = (pBar.high - pBar.low) / 2; + isHCCBullish = cBar.close > cBar.open; + isHCPBullish = pBar.close > pBar.open; + + // + return result; +} + +// +// Pivots ... + +// +int CountPivots() +{ + return ArraySize(mPivots); +} + +// +bool HasEnoughPivots() +{ + return CountPivots() >= mMinRequiredPivots; +} + +// +// First time Scan for Previous Pivots ... +void ProcessPivots() +{ + // + if (mPivotsScanStart) + { + return; + } + + // + mPivotsScanStart = true; + + // + ArraySetAsSeries(mPivots, true); + + // + double tmpPivots[]; + + // + int count = iBars( + xBEEASymbol, + xBEEAPeriod) - + mPivotsLoopback * 2; + + // + // Reading Pivots based on ZigZag ... + int bIdx = 0; + while (!HasEnoughPivots() && bIdx < count) + { + // + UpdatePivots(bIdx); + + // + bIdx++; + } +} + +// +// Update Pivots on Running ... +void UpdatePivots(int barIndex = 0) +{ + // + double tmpPivots[]; + + // + CopyBuffer( + zigZagHandler, + X_ZIGZAG_PIVOTS_LINE, + barIndex, + mPivotsLoopback, + tmpPivots); + + // + int valueVerifications = 0; + double selectedValue = tmpPivots[0]; + + // + int start = 1; + int end = ArraySize(tmpPivots) - 1; + for (int i = start; i < end; i++) + { + // + double iValue = tmpPivots[i]; + + // + if (iValue == selectedValue) + { + valueVerifications++; + } + } + + // + if (valueVerifications >= mNumberPivotsSequential) + { + // + AddIfNotExists( + selectedValue, + mPivots + // + ); + } + + // + ArrayFree(tmpPivots); +} + +// +// Other ... + +// +// Calculated Suggested States ... +void CalculateSummary() +{ + // + // Summary ... + + // + int bullishSigns = 0; + int bearishSigns = 0; + + // + // Short ... + + // + if (isSCCBullish) + { + bullishSigns++; + } + else + { + bearishSigns++; + } + + // + if (isSCPBullish) + { + bullishSigns++; + } + else + { + bearishSigns++; + } + + // + if (isSCFastOverSlow) + { + bullishSigns++; + } + else if (isSCFastUnderSlow) + { + bearishSigns++; + } + + // + if (scCMidLine < MathMin(scCBar.open, scCBar.close)) + { + bearishSigns++; + } + + if (scCMidLine < scCBar.low) + { + bearishSigns++; + } + + if (scPMidLine < MathMin(scPBar.open, scPBar.close)) + { + bearishSigns++; + } + + if (scPMidLine < scPBar.low) + { + bearishSigns++; + } + + if (scCMidLine < MathMin(scPBar.open, scPBar.close)) + { + bearishSigns++; + } + + if (scCMidLine < scPBar.low) + { + bearishSigns++; + } + + // + if (scCMidLine > MathMax(scCBar.open, scCBar.close)) + { + bullishSigns++; + } + + if (scCMidLine > scCBar.high) + { + bullishSigns++; + } + + if (scPMidLine > MathMax(scPBar.open, scPBar.close)) + { + bullishSigns++; + } + + if (scPMidLine > scPBar.high) + { + bullishSigns++; + } + + if (scCMidLine > MathMax(scPBar.open, scPBar.close)) + { + bullishSigns++; + } + + if (scCMidLine > scPBar.high) + { + bullishSigns++; + } + + // + // Medium ... + + // + if (isMCCBullish) + { + bullishSigns++; + } + else + { + bearishSigns++; + } + + // + if (isMCPBullish) + { + bullishSigns++; + } + else + { + bearishSigns++; + } + + // + if (isMCFastOverSlow) + { + bullishSigns++; + } + else if (isMCFastUnderSlow) + { + bearishSigns++; + } + + // + if (mcCMidLine < MathMin(mcCBar.open, mcCBar.close)) + { + bearishSigns++; + } + + if (mcCMidLine < mcCBar.low) + { + bearishSigns++; + } + + if (mcPMidLine < MathMin(mcPBar.open, mcPBar.close)) + { + bearishSigns++; + } + + if (mcPMidLine < mcPBar.low) + { + bearishSigns++; + } + + if (mcCMidLine < MathMin(mcPBar.open, mcPBar.close)) + { + bearishSigns++; + } + + if (mcCMidLine < mcPBar.low) + { + bearishSigns++; + } + + // + if (mcCMidLine > MathMax(mcCBar.open, mcCBar.close)) + { + bullishSigns++; + } + + if (mcCMidLine > mcCBar.high) + { + bullishSigns++; + } + + if (mcPMidLine > MathMax(mcPBar.open, mcPBar.close)) + { + bullishSigns++; + } + + if (mcPMidLine > mcPBar.high) + { + bullishSigns++; + } + + if (mcCMidLine > MathMax(mcPBar.open, mcPBar.close)) + { + bullishSigns++; + } + + if (mcCMidLine > mcPBar.high) + { + bullishSigns++; + } + + // + // Long ... + + // + if (isLCCBullish) + { + bullishSigns++; + } + else + { + bearishSigns++; + } + + // + if (isLCPBullish) + { + bullishSigns++; + } + else + { + bearishSigns++; + } + + // + if (isLCFastOverSlow) + { + bullishSigns++; + } + else if (isLCFastUnderSlow) + { + bearishSigns++; + } + + // + if (lcCMidLine < MathMin(lcCBar.open, lcCBar.close)) + { + bearishSigns++; + } + + if (lcCMidLine < lcCBar.low) + { + bearishSigns++; + } + + if (lcPMidLine < MathMin(lcPBar.open, lcPBar.close)) + { + bearishSigns++; + } + + if (lcPMidLine < lcPBar.low) + { + bearishSigns++; + } + + if (lcCMidLine < MathMin(lcPBar.open, lcPBar.close)) + { + bearishSigns++; + } + + if (lcCMidLine < lcPBar.low) + { + bearishSigns++; + } + + // + if (lcCMidLine > MathMax(lcCBar.open, lcCBar.close)) + { + bullishSigns++; + } + + if (lcCMidLine > lcCBar.high) + { + bullishSigns++; + } + + if (lcPMidLine > MathMax(lcPBar.open, lcPBar.close)) + { + bullishSigns++; + } + + if (lcPMidLine > lcPBar.high) + { + bullishSigns++; + } + + if (lcCMidLine > MathMax(lcPBar.open, lcPBar.close)) + { + bullishSigns++; + } + + if (lcCMidLine > lcPBar.high) + { + bullishSigns++; + } + + // + // Hind ... + + // + if (isHCCBullish) + { + bullishSigns++; + } + else + { + bearishSigns++; + } + + // + if (isHCPBullish) + { + bullishSigns++; + } + else + { + bearishSigns++; + } + + // + if (isHCFastOverSlow) + { + bullishSigns++; + } + else if (isHCFastUnderSlow) + { + bearishSigns++; + } + + // + if (hcCMidLine < MathMin(hcCBar.open, hcCBar.close)) + { + bearishSigns++; + } + + if (hcCMidLine < hcCBar.low) + { + bearishSigns++; + } + + if (hcPMidLine < MathMin(hcPBar.open, hcPBar.close)) + { + bearishSigns++; + } + + if (hcPMidLine < hcPBar.low) + { + bearishSigns++; + } + + if (hcCMidLine < MathMin(hcPBar.open, hcPBar.close)) + { + bearishSigns++; + } + + if (hcCMidLine < hcPBar.low) + { + bearishSigns++; + } + + // + if (hcCMidLine > MathMax(hcCBar.open, hcCBar.close)) + { + bullishSigns++; + } + + if (hcCMidLine > hcCBar.high) + { + bullishSigns++; + } + + if (hcPMidLine > MathMax(hcPBar.open, hcPBar.close)) + { + bullishSigns++; + } + + if (hcPMidLine > hcPBar.high) + { + bullishSigns++; + } + + if (hcCMidLine > MathMax(hcPBar.open, hcPBar.close)) + { + bullishSigns++; + } + + if (hcCMidLine > hcPBar.high) + { + bullishSigns++; + } + + // + // ZigZag ... + if (isZigZagInPeak) + { + bearishSigns++; + } + else + { + bullishSigns++; + } + + // + mBullishScore = bullishSigns; + mBearishScore = bearishSigns; + xBEEAIsSummaryTrendBullish = bullishSigns > bearishSigns; + + // + // Calculate Max an Min Scores ... + + // + mMinBullishScore = + // + mMinBullishScore == 0 || mMinBullishScore > mBullishScore + ? mBullishScore + : mMinBullishScore + // + ; + + // + mMinBearishScore = + // + mMinBearishScore == 0 || mMinBearishScore > mBearishScore + ? mBearishScore + : mMinBearishScore + // + ; + + // + mMaxBullishScore = + // + mMaxBullishScore == 0 || mMaxBullishScore < mBullishScore + ? mBullishScore + : mMaxBullishScore + // + ; + + // + mMaxBearishScore = + // + mMaxBearishScore == 0 || mMaxBearishScore < mBearishScore + ? mBearishScore + : mMaxBearishScore + // + ; + + // + if (xBEEAIsSummaryTrendBullish != xBEEALastIsSummaryTrendBullish) + { + // + // TODO: Summary Trend Change Alert ... + LogMessage("Majour Trend Changed Happens: " + (xBEEAIsSummaryTrendBullish ? "Bullish" : "Bearish")); + } + + // + xBEEALastIsSummaryTrendBullish = xBEEAIsSummaryTrendBullish; +} + +// +// Handle All Draws of Experts ... +void XBEEAHandleDraws( + // + // Short ... + bool drawSCLabel = true, + bool drawSCCBar = true, + bool drawSCPBar = true, + bool drawSCCMid = true, + bool drawSCPMid = true, + // + // Medium ... + bool drawMCLabel = true, + bool drawMCCBar = true, + bool drawMCPBar = true, + bool drawMCCMid = true, + bool drawMCPMid = true, + // + // Long ... + bool drawLCLabel = true, + bool drawLCCBar = true, + bool drawLCPBar = true, + bool drawLCCMid = true, + bool drawLCPMid = true, + // + // Hind ... + bool drawHCLabel = true, + bool drawHCCBar = true, + bool drawHCPBar = true, + bool drawHCCMid = true, + bool drawHCPMid = true // +) +{ + // + int offset = 0; + + // + // Short ... + + // + // Cycle ... + if (drawSCCBar || drawSCPBar) + { + // + XBEEADrawCycle( + sc.cycle, + drawSCLabel, + !drawSCCBar && drawSCPBar, + !drawSCPBar && drawSCCBar, + offset + // + ); + + // + if (drawSCLabel) + { + // + if (drawSCCBar) + { + offset += 3; + } + + // + if (drawSCPBar) + { + offset += 3; + } + + // + if (drawSCCMid) + { + offset++; + } + + // + if (drawSCPMid) + { + offset++; + } + } + } + + // + // MidLine ... + if (drawSCCMid || drawSCPMid) + { + // + XBEEADrawMidLine( + sc.cycle, + drawSCLabel, + !drawSCCMid && drawSCPMid, + !drawSCPMid && drawSCCMid, + offset + // + ); + + // + if (drawSCLabel) + { + // + if (drawSCCMid) + { + offset++; + } + + // + if (drawSCPMid) + { + offset++; + } + } + } + + // + // Medium ... + + // + // Cycle ... + if (drawMCCBar || drawMCPBar) + { + // + XBEEADrawCycle( + mc.cycle, + drawMCLabel, + !drawMCCBar && drawMCPBar, + !drawMCPBar && drawMCCBar, + offset + // + ); + + // + if (drawMCLabel) + { + // + if (drawMCCBar) + { + offset += 3; + } + + // + if (drawMCPBar) + { + offset += 3; + } + + // + if (drawMCCMid) + { + offset++; + } + + // + if (drawMCPMid) + { + offset++; + } + } + } + + // + // Mid Line ... + if (drawMCCMid || drawMCPMid) + { + // + XBEEADrawMidLine( + mc.cycle, + drawMCLabel, + !drawMCCMid && drawMCPMid, + !drawMCPMid && drawMCCMid, + offset + // + ); + + // + if (drawMCLabel) + { + // + if (drawMCCMid) + { + offset++; + } + + // + if (drawMCPMid) + { + offset++; + } + } + } + + // + // Long ... + + // + // Cycle ... + if (drawLCCBar || drawLCPBar) + { + // + XBEEADrawCycle( + lc.cycle, + drawLCLabel, + !drawLCCBar && drawLCPBar, + !drawLCPBar && drawLCCBar, + offset + // + ); + + // + if (drawLCLabel) + { + // + if (drawLCCBar) + { + offset += 3; + } + + // + if (drawLCPBar) + { + offset += 3; + } + + // + if (drawLCCMid) + { + offset++; + } + + // + if (drawLCPMid) + { + offset++; + } + } + } + + // + // MidLine ... + if (drawLCCMid || drawLCPMid) + { + // + XBEEADrawMidLine( + lc.cycle, + drawLCLabel, + !drawLCCMid && drawLCPMid, + !drawLCPMid && drawLCCMid, + offset + // + ); + + // + if (drawLCLabel) + { + // + if (drawLCCMid) + { + offset++; + } + + // + if (drawLCPMid) + { + offset++; + } + } + } + + // + // Hind ... + + // + // Cycle ... + if (drawHCCBar || drawHCPBar) + { + // + XBEEADrawCycle( + hc.cycle, + drawHCLabel, + !drawHCCBar && drawHCPBar, + !drawHCPBar && drawHCCBar, + offset + // + ); + + // + if (drawHCLabel) + { + // + if (drawHCCBar) + { + offset += 3; + } + + // + if (drawHCPBar) + { + offset += 3; + } + + // + if (drawHCCMid) + { + offset++; + } + + // + if (drawHCPMid) + { + offset++; + } + } + } + + // + // MidLine ... + if (drawHCCMid || drawHCPMid) + { + // + XBEEADrawMidLine( + hc.cycle, + drawHCLabel, + !drawHCCMid && drawHCPMid, + !drawHCPMid && drawHCCMid, + offset + // + ); + } +} + +// +// Draw Middle Line of Cycle ... +void XBEEADrawCycle( + ENUM_X_MARKET_CYCLES cycle, // Specify Which Cycle to Draw ... + bool drawLabel = false, // Specify Draw Label of Mid Line or not ... + bool drawOnlyPrev = false, // Specify Draw Only Prev Bar of Cycle ... + bool drawOnlyCurrent = false, // Specify Draw Only Current Bar of Cycle ... + int offset = 0 // Distance used for Labels ... +) +{ + // + if (offset < 0) + { + offset = 0; + } + + // + XMarketCycle cycleModel; + XOHCLDrawSpecification cycleCBarSpecs; + XOHCLDrawSpecification cyclePBarSpecs; + + // + switch (cycle) + { + // + case X_MARKET_CYCLE_SHORT: + // + cycleModel = sc; + cycleCBarSpecs = scCBSpecs; + cyclePBarSpecs = scPBSpecs; + break; + + // + case X_MARKET_CYCLE_MEDIUM: + // + cycleModel = mc; + cycleCBarSpecs = mcCBSpecs; + cyclePBarSpecs = mcPBSpecs; + break; + + // + case X_MARKET_CYCLE_LONG: + // + cycleModel = lc; + cycleCBarSpecs = lcCBSpecs; + cyclePBarSpecs = lcPBSpecs; + break; + + // + case X_MARKET_CYCLE_HIND: + // + cycleModel = hc; + cycleCBarSpecs = hcCBSpecs; + cyclePBarSpecs = hcPBSpecs; + break; + } + + // + string baseTag = ToString(cycle); + + // + XOHCL cBar = cycleModel.GetBar(0); + XOHCL pBar = cycleModel.GetBar(1); + + // + datetime fromCDate = cycleModel.GetBarTime(0); + datetime fromPDate = cycleModel.GetBarTime(1); + + // + datetime cTime = TimeCurrent(); + + // + // Try to Draw ... + + // + bool canDrawPrev = !drawOnlyCurrent; + bool canDrawCurrent = !drawOnlyPrev; + + // + // Set Cycles Color based on Current Candle ... + + // + bool isCBarBullish = + cBar.open < cBar.close; + + // + bool isPBarBullish = + pBar.open < pBar.close; + + // + color clrTemoBullishColor = cycleCBarSpecs.openStyle.clr; + color clrTemoBearishColor = cycleCBarSpecs.closeStyle.clr; + + // + color cBarSelectedColor = isCBarBullish ? clrTemoBullishColor : clrTemoBearishColor; + color pBarSelectedColor = isPBarBullish ? clrTemoBullishColor : clrTemoBearishColor; + + // + cycleCBarSpecs.openStyle.clr = cBarSelectedColor; + cycleCBarSpecs.openStyle.labelColor = cBarSelectedColor; + + // + cycleCBarSpecs.closeStyle.clr = cBarSelectedColor; + cycleCBarSpecs.closeStyle.labelColor = cBarSelectedColor; + + // + cyclePBarSpecs.openStyle.clr = pBarSelectedColor; + cyclePBarSpecs.openStyle.labelColor = pBarSelectedColor; + + // + cyclePBarSpecs.closeStyle.clr = pBarSelectedColor; + cyclePBarSpecs.closeStyle.labelColor = pBarSelectedColor; + + // + if (canDrawPrev) + { + offset++; + } + + // + // Label ... + if (drawLabel) + { + // + if (canDrawPrev) + { + // + // Draw Prev Bar Lables ... + + // + XBEEADrawCycleXOHCLLabel( + cycleModel, + pBar, + cyclePBarSpecs, + "P", + cTime, + offset - 1 + // + ); + + // + offset += 3; + } + + // + if (canDrawCurrent) + { + // + // Draw Current Bar Lables ... + + // + XBEEADrawCycleXOHCLLabel( + cycleModel, + cBar, + cycleCBarSpecs, + "C", + cTime, + offset + // + ); + } + } + + // + // Line ... + + // + if (canDrawPrev) + { + // + // Draw Cycle Prev Bar ... + XBEEADrawCycleXOHCLContent( + cycleModel, + pBar, + cyclePBarSpecs, + "P", + fromPDate + // + ); + } + + // + if (canDrawCurrent) + { + // + // Draw Cycle Current Bar ... + XBEEADrawCycleXOHCLContent( + cycleModel, + cBar, + cycleCBarSpecs, + "C", + fromCDate + // + ); + } +} + +// +// Draw Middle Line of Cycle ... +void XBEEADrawMidLine( + ENUM_X_MARKET_CYCLES cycle, // Specify Which Cycle to Draw ... + bool drawLabel = false, // Specify Draw Label of Mid Line or not ... + bool drawOnlyPrev = false, // Specify Draw Only Prev Bar of Cycle ... + bool drawOnlyCurrent = false, // Specify Draw Only Current Bar of Cycle ... + int offset = 0 // Distance used for Labels ... +) +{ + // + if (offset < 0) + { + offset = 0; + } + + // + XMarketCycle cycleModel; + XDrawSpecifications cycleCMidSpecs; + XDrawSpecifications cyclePMidSpecs; + + // + switch (cycle) + { + // + case X_MARKET_CYCLE_SHORT: + // + cycleModel = sc; + cycleCMidSpecs = scCMidSpecs; + cyclePMidSpecs = scPMidSpecs; + break; + + // + case X_MARKET_CYCLE_MEDIUM: + // + cycleModel = mc; + cycleCMidSpecs = mcCMidSpecs; + cyclePMidSpecs = mcPMidSpecs; + break; + + // + case X_MARKET_CYCLE_LONG: + // + cycleModel = lc; + cycleCMidSpecs = lcCMidSpecs; + cyclePMidSpecs = lcPMidSpecs; + break; + + // + case X_MARKET_CYCLE_HIND: + // + cycleModel = hc; + cycleCMidSpecs = hcCMidSpecs; + cyclePMidSpecs = hcPMidSpecs; + break; + } + + // + // Calculate Mid Line ... + double midLine = (cycleModel.bar.high + cycleModel.bar.low) / 2; + + // + XOHCL cyclePrevBar = cycleModel.GetBar(1); + double midLinePrev = (cyclePrevBar.high + cyclePrevBar.low) / 2; + + // + string baseTag = ToString(cycle); + + // + string midCTag = baseTag + "|MID|C|"; + string midPTag = baseTag + "|MID|P|"; + + // + string midCLblTag = midCTag + "lbl"; + string midPLblTag = midPTag + "lbl"; + + // + datetime fromCDate = cycleModel.GetBarTime(0); + datetime fromPDate = cycleModel.GetBarTime(1); + + // + datetime cTime = TimeCurrent(); + + // + // Try to Draw ... + + // + bool canDrawPrev = !drawOnlyCurrent; + bool canDrawCurrent = !drawOnlyPrev; + + // + if (canDrawPrev) + { + offset++; + } + + // + // Label ... + if (drawLabel) + { + // + if (canDrawPrev) + { + // + // Draw Prev Candle MidLine Lable ... + XBEEADrawLabel( + cyclePMidSpecs, + midPLblTag, + cTime, + midLinePrev, + offset // + ); + } + + // + if (canDrawCurrent) + { + // + // Draw Current Candle MidLine Label ... + XBEEADrawLabel( + cycleCMidSpecs, + midCLblTag, + cTime, + midLine, + offset - 1 // + ); + } + } + + // + // Line ... + + // + if (canDrawPrev) + { + // + // Draw Prev Candle MidLine ... + XBEEADrawTrendLine( + cyclePMidSpecs, + midPTag, + fromPDate, + midLinePrev // + ); + } + + // + if (canDrawCurrent) + { + // + // Draw Current Candle MidLine ... + XBEEADrawTrendLine( + cycleCMidSpecs, + midCTag, + fromCDate, + midLine // + ); + } +} + +// +// Generate Expert State ... +string XBEEAGenerateState() +{ + // + string result = ""; + + // + // Summary ... + result += + // + "Summary: \n" + + "------------------\n" + + "Pivots: " + ToString(CountPivots()) + "\n" + + "BullishScore: " + ToString(mBullishScore) + ", min: " + ToString(mMinBullishScore) + ", max: " + ToString(mMaxBullishScore) + "\n" + + "BearishScore: " + ToString(mBearishScore) + ", min: " + ToString(mMinBearishScore) + ", max: " + ToString(mMaxBearishScore) + "\n" + + "isSUmmaryBullish: " + ToString(xBEEAIsSummaryTrendBullish) + "\n" + + "\n" + // + ; + + // + // ZigZag ... + result += + // + "Peaks and Vales: \n" + + "------------------\n" + + "Looking for New: " + (isZigZagInPeak ? "Vale" : "Peak") + "\n" + + "\n" + // + ; + + // + // Short ... + result += + // + "Short: \n" + + "------------------\n" + + "Period: " + ToString(sc.period) + "\n" + + "Bar 0: " + (isSCCBullish ? "Bullish" : "Bearish") + "\n" + + "Bar 1: " + (isSCPBullish ? "Bullish" : "Bearish") + "\n" + + "Trend MA: " + (isSCFastOverSlow ? "Bullish" : "Bearish") + "\n" + + "\n" + // + ; + + // + // Long ... + result += + // + "Medium: \n" + + "------------------\n" + + "Period: " + ToString(mc.period) + "\n" + + "Bar 0: " + (isMCCBullish ? "Bullish" : "Bearish") + "\n" + + "Bar 1: " + (isMCPBullish ? "Bullish" : "Bearish") + "\n" + + "Trend MA: " + (isMCFastOverSlow ? "Bullish" : "Bearish") + "\n" + + "\n" + // + ; + + // + // Medium ... + result += + // + "Long: \n" + + "------------------\n" + + "Period: " + ToString(lc.period) + "\n" + + "Bar 0: " + (isLCCBullish ? "Bullish" : "Bearish") + "\n" + + "Bar 1: " + (isLCPBullish ? "Bullish" : "Bearish") + "\n" + + "Trend MA: " + (isLCFastOverSlow ? "Bullish" : "Bearish") + "\n" + + "\n" + // + ; + + // + // Hind ... + result += + // + "Hind: \n" + + "------------------\n" + + "Period: " + ToString(hc.period) + "\n" + + "Bar 0: " + (isHCCBullish ? "Bullish" : "Bearish") + "\n" + + "Bar 1: " + (isHCPBullish ? "Bullish" : "Bearish") + "\n" + + "Trend MA: " + (isHCFastOverSlow ? "Bullish" : "Bearish") + "\n" + + "\n" + // + ; + + // + string hash = ToMD5(result); + if (hash != mLastCommentHash) + { + // + LogMessage(result); + + // + LogMessage(hash); + + // + mLastCommentHash = hash; + } + + // + return result; +} + +// +// Custom DRAW(s) ... + +// +// Draw OHCL Labels ... +void XBEEADrawCycleXOHCLLabel( + XMarketCycle &cycleModel, // Specify Which Cycle to Draw ... + XOHCL &bar, // Specify Cycle XOHCL Model to Draw ... + XOHCLDrawSpecification &specs, // Specify Cycle XOHCL Draw Specifications ... + string baseTag, // Specify a Unique Tag ... + datetime time, // Draw Time ... + int offset = 0 // +) +{ + // + // Open ... + string openTag = cycleModel.prefix + "_" + baseTag + "_O_lbl"; + XBEEADrawLabel( + specs.openStyle, + openTag, + time, + bar.open, + offset + // + ); + + // + // High ... + string highTag = cycleModel.prefix + "_" + baseTag + "_H_lbl"; + XBEEADrawLabel( + specs.highStyle, + highTag, + time, + bar.high, + offset + 1 + // + ); + + // + // Close ... + string closeTag = cycleModel.prefix + "_" + baseTag + "_C_lbl"; + XBEEADrawLabel( + specs.closeStyle, + closeTag, + time, + bar.close, + offset + 2 + // + ); + + // + // Low ... + string lowTag = cycleModel.prefix + "_" + baseTag + "_L_lbl"; + XBEEADrawLabel( + specs.lowStyle, + lowTag, + time, + bar.low, + offset + 3 + // + ); +} + +// +// Draw OHCL Content ... +void XBEEADrawCycleXOHCLContent( + XMarketCycle &cycleModel, // Specify Which Cycle to Draw ... + XOHCL &bar, // Specify Cycle XOHCL Model to Draw ... + XOHCLDrawSpecification &specs, // Specify Cycle XOHCL Draw Specifications ... + string baseTag, // Specify a Unique Tag ... + datetime time // Draw Time ... +) +{ + // + // Open ... + string openTag = cycleModel.prefix + "_" + baseTag + "_O"; + XBEEADrawTrendLine( + specs.openStyle, + openTag, + time, + bar.open + // + ); + + // + // High ... + string highTag = cycleModel.prefix + "_" + baseTag + "_H"; + XBEEADrawTrendLine( + specs.highStyle, + highTag, + time, + bar.high + // + ); + + // + // Close ... + string closeTag = cycleModel.prefix + "_" + baseTag + "_C"; + XBEEADrawTrendLine( + specs.closeStyle, + closeTag, + time, + bar.close + // + ); + + // + // Low ... + string lowTag = cycleModel.prefix + "_" + baseTag + "_L"; + XBEEADrawTrendLine( + specs.lowStyle, + lowTag, + time, + bar.low + // + ); +} + +// +// Draw Label Using Specifications ... +void XBEEADrawLabel( + XDrawSpecifications &specs, + string tag, + datetime time, + double price, + int offset = 0 // +) +{ + // + long chartId = ChartID(); + int subWindow = 0; + + // + if (offset < 0) + { + offset = 0; + } + + // + int offsetSeconds = PeriodSeconds(xBEEAPeriod) * offset; + + // + string value = specs.label; + + // + DrawText( + chartId, + tag, + subWindow, + time - offsetSeconds, + price, + specs.label, + specs.labelFont, + specs.labelFontSize, + specs.labelColor, + specs.labelAngel, + specs.labelAnchor, + specs.back, + specs.selection, + specs.hidden, + specs.zOrder // + ); +} + +// +// Draw TrendLine Using Specifications ... +void XBEEADrawTrendLine( + XDrawSpecifications &specs, + string tag, + datetime fromDate, + double fromPrice, + datetime toDate = NULL, + double toPrice = 0 // +) +{ + // + long chartId = ChartID(); + int subWindow = 0; + + // + if (toPrice <= 0) + { + toPrice = fromPrice; + } + + // + if (toDate == 0 || toDate == NULL) + { + toDate = TimeCurrent(); + } + + // + DrawTrendLine( + chartId, + tag, + subWindow, + fromDate, + fromPrice, + toDate, + toPrice, + specs.clr, + specs.style, + specs.width, + specs.back, + specs.selection, + specs.rayRight, + specs.hidden, + specs.zOrder // + ); +} diff --git a/MQLTestWorkspace/XBEEA/14030224/Experts/x-saherelm.xea.ex5 b/MQLTestWorkspace/XBEEA/14030224/Experts/x-saherelm.xea.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..eb80b895a68f7f54dd056a1e6a3501a4df953ee5 GIT binary patch literal 412550 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