diff --git a/Documents/BKP/1.mq5 b/Documents/BKP/1.mq5 deleted file mode 100644 index 53a541f8..00000000 --- a/Documents/BKP/1.mq5 +++ /dev/null @@ -1,236 +0,0 @@ - // - // HTF Proves ... - - // // - // double scoreMultiplier = 1.5; - - // // - // bool isConsolidationScoreBullish = - // provider.consolidationBullishScore > (provider.consolidationBearishScore * scoreMultiplier); - - // // - // bool isConsolidationScoreBearish = - // provider.consolidationBearishScore > (provider.consolidationBullishScore * scoreMultiplier); - - // - // - // - - // // - // // Detect Kumo Trend ... - // bool isKumoBullish = provider.decisionXConditions.isSenkouSpanAOverB; - // bool isKumoBearish = provider.decisionXConditions.isSenkouSpanAUnderB; - - // // - // // Detect Nearest Cross ... - // XOHCL tkCrossedBar; - // ENUM_X_DIRECTION tkCrossDir; - // bool hasNearestTenkanSenKijunSenCross = - // provider - // .decisionCycleHelper - // .DetectNearestTenKijCross( - // tkCrossedBar, - // tkCrossDir, - // zIndex // - // ); - - // // - // bool isNearestTenkensSenCrossedOverKijunSen = - // hasNearestTenkanSenKijunSenCross && - // IsBullish(tkCrossDir); - - // // - // bool isNearestTenkensSenCrossedUnderKijunSen = - // hasNearestTenkanSenKijunSenCross && - // IsBearish(tkCrossDir); - - // // - // // Detect Nearest Volume ... - // XOHCL vSwitchedBar; - // ENUM_X_DIRECTION vSwitchedDir; - // bool isVolumeSwitched = - // provider - // .decisionCycleHelper - // .DetectNearestVolumeSwitched( - // vSwitchedBar, - // vSwitchedDir, - // zIndex // - // ); - // bool isVolumeBullish = - // isVolumeSwitched && - // IsBullish(vSwitchedDir); - // bool isVolumeBearish = - // isVolumeSwitched && - // IsBearish(vSwitchedDir); - - // // - // // Detect Nearest Delta Crossed ... - // XOHCL deltaCrossedBar; - // ENUM_X_DIRECTION deltaCrossedDir; - // bool isDeltaCrossed = - // provider - // .decisionCycleHelper - // .DetectNearestDeltaSwitched( - // deltaCrossedBar, - // deltaCrossedDir, - // zIndex // - // ); - // bool isDeltaBullish = - // isDeltaCrossed && - // IsBullish(deltaCrossedDir); - // bool isDeltaBearish = - // isDeltaCrossed && - // IsBearish(deltaCrossedDir); - - // // - // // Detect Nearest Str Switched ... - // XOHCL strSwitchedBar; - // ENUM_X_DIRECTION strSwitchedDir; - // bool isStrSwitched = - // provider - // .decisionCycleHelper - // .DetectNearestStrSwitched( - // strSwitchedBar, - // strSwitchedDir, - // zIndex // - // ); - // bool isStrBullish = - // isStrSwitched && - // IsBullish(deltaCrossedDir); - // bool isStrBearish = - // isStrSwitched && - // IsBearish(deltaCrossedDir); - - // // - // // Detect Price in TK Zone ... - // bool isBarInsideTKZone = - // isNearestTenkensSenCrossedOverKijunSen - // ? cBar.low < provider.decisionXConditions.tenkanSenBuffer[cIndex] - // : isNearestTenkensSenCrossedUnderKijunSen - // ? cBar.high > provider.decisionXConditions.tenkanSenBuffer[cIndex] - // : false; - - // // - // // Checking Bar Based on Positions State ... - // ENUM_X_DIRECTION iBarPosDir; - // bool isBarValidForDir = provider.decisionCycleHelper - // .mBarAnalyser - // .IsValidForPosition( - // cBar, - // iBarPosDir // - // ); - // bool isBarValidForBullish = - // isBarValidForDir && - // IsBullish(iBarPosDir); - // bool isBarValidForBearish = - // isBarValidForDir && - // IsBearish(iBarPosDir); - - // - // Summarize Conditions ... - - // - isBullish = - // - false - // isStrBullish && - // isKumoBullish && - // isDeltaBullish && - // isVolumeBullish && - // isBarInsideTKZone && - // isBarValidForBullish && - // isConsolidationScoreBullish && - // isNearestTenkensSenCrossedOverKijunSen - // - ; - - // - isBearish = - // - false - // isStrBearish && - // isKumoBearish && - // isDeltaBearish && - // isVolumeBearish && - // isBarInsideTKZone && - // isBarValidForBearish && - // isConsolidationScoreBearish && - // isNearestTenkensSenCrossedUnderKijunSen - // - ; - -/////////////////////////////////////////////////////////////////////////////// - - // - iBox.to = TimeCurrent(); - XCBoxObject *iObj; - has = helper.poiDrawer.DrawBox( - iBox, - iObj // - ); - if (has) - { - // - iObj.BoxWidth(2); - - // - color iCLR = - iBox.IsBullish() - ? clrAqua - : clrMagenta; - iObj.BoxColor(iCLR); - iObj.BoxStyle(STYLE_SOLID); - } - -////////////////////////////////////////////////////////////////////////////////////// - - // - // COMPLEX ... - - // - double iKTIRNDs[] = { - cKI, - cTKI, - cTrend // - }; - - // - double iKTIRNDMax = GetMax(iKTIRNDs); - double iKTIRNDMin = GetMin(iKTIRNDs); - - // - // Conditions Preparing ... - - // - bool isTKITRNDBullish = - cKIState > 0 && - cTKIState > 0 && - ctrendState > 0; - - // - bool isTKITRNDBullishPrev = - pKIState > 0 && - pTKIState > 0 && - ptrendState > 0; - - // - bool isTKITRNDBearish = - cKIState < 0 && - cTKIState < 0 && - ctrendState < 0; - - // - bool isTKITRNDBearishPrev = - pKIState < 0 && - pTKIState < 0 && - ptrendState < 0; - - // - bool isTKITRNDSwitchedToBullish = - isTKITRNDBullish && - !isTKITRNDBullishPrev; - - // - bool isTKITRNDSwitchedToBearish = - isTKITRNDBearish && - !isTKITRNDBearishPrev; diff --git a/Documents/BKP/1/signals/2.mq5 b/Documents/BKP/1/signals/2.mq5 deleted file mode 100644 index 4d60af7c..00000000 --- a/Documents/BKP/1/signals/2.mq5 +++ /dev/null @@ -1,2184 +0,0 @@ - -// -// Checking Conditions ... - -// -// Retrieve Some Values ... - -// -double peak = cXConditions.peaksBuffer[cIDX]; -double peakZ = cXConditions.peaksBuffer[zIDX]; -double peakP = cXConditions.peaksBuffer[pIDX]; -double peakPP = cXConditions.peaksBuffer[ppIDX]; - -// -double vale = cXConditions.valesBuffer[cIDX]; -double valeZ = cXConditions.valesBuffer[zIDX]; -double valeP = cXConditions.valesBuffer[pIDX]; -double valePP = cXConditions.valesBuffer[ppIDX]; - -// -double cSMHKOpen = cXConditions.xhkSMOpenBuffer[cIDX]; -double cSMHKHigh = cXConditions.xhkSMHighBuffer[cIDX]; -double cSMHKClose = cXConditions.xhkSMCloseBuffer[cIDX]; -double cSMHKLow = cXConditions.xhkSMLowBuffer[cIDX]; -double cSMHKMin = MathMin(cSMHKOpen, cSMHKClose); -double cSMHKMax = MathMax(cSMHKOpen, cSMHKClose); - -// -double pSMHKOpen = cXConditions.xhkSMOpenBuffer[pIDX]; -double pSMHKHigh = cXConditions.xhkSMHighBuffer[pIDX]; -double pSMHKClose = cXConditions.xhkSMCloseBuffer[pIDX]; -double pSMHKLow = cXConditions.xhkSMLowBuffer[pIDX]; -double pSMHKMin = MathMin(pSMHKOpen, pSMHKClose); -double pSMHKMax = MathMax(pSMHKOpen, pSMHKClose); - -// -double atrUpperSM = cXConditions.atrUpperSMBuffer[cIDX]; -double atrLowerSM = cXConditions.atrLowerSMBuffer[cIDX]; - -// -double atrUpperSMZ = cXConditions.atrUpperSMBuffer[zIDX]; -double atrLowerSMZ = cXConditions.atrLowerSMBuffer[zIDX]; - -// -double atrUpperSMP = cXConditions.atrUpperSMBuffer[pIDX]; -double atrLowerSMP = cXConditions.atrLowerSMBuffer[pIDX]; - -// -double atrUpperSMPP = cXConditions.atrUpperSMBuffer[ppIDX]; -double atrLowerSMPP = cXConditions.atrLowerSMBuffer[ppIDX]; - -// -double rsiChange = cXConditions.rsiChangeBuffer[cIDX]; -double rsiChangeZ = cXConditions.rsiChangeBuffer[zIDX]; -double rsiChangeP = cXConditions.rsiChangeBuffer[pIDX]; -double rsiChangePP = cXConditions.rsiChangeBuffer[ppIDX]; - -// -double rsiChangeSM = cXConditions.rsiChangeSMBuffer[cIDX]; -double rsiChangeSMZ = cXConditions.rsiChangeSMBuffer[zIDX]; -double rsiChangeSMP = cXConditions.rsiChangeSMBuffer[pIDX]; -double rsiChangeSMPP = cXConditions.rsiChangeSMBuffer[ppIDX]; - -// -double peaksGolden = cXConditions.peaksGoldenBuffer[cIDX]; -double peaksGoldenZ = cXConditions.peaksGoldenBuffer[zIDX]; -double peaksGoldenP = cXConditions.peaksGoldenBuffer[pIDX]; -double peaksGoldenPP = cXConditions.peaksGoldenBuffer[ppIDX]; - -// -double valesGolden = cXConditions.valesGoldenBuffer[cIDX]; -double valesGoldenZ = cXConditions.valesGoldenBuffer[zIDX]; -double valesGoldenP = cXConditions.valesGoldenBuffer[pIDX]; -double valesGoldenPP = cXConditions.valesGoldenBuffer[ppIDX]; - -// -double priceChange = cXConditions.priceChangeBuffer[cIDX]; -double priceChangeZ = cXConditions.priceChangeBuffer[zIDX]; -double priceChangeP = cXConditions.priceChangeBuffer[pIDX]; -double priceChangePP = cXConditions.priceChangeBuffer[ppIDX]; - -// -double priceChangeSM = cXConditions.priceChangeSMBuffer[cIDX]; -double priceChangeSMZ = cXConditions.priceChangeSMBuffer[zIDX]; -double priceChangeSMP = cXConditions.priceChangeSMBuffer[pIDX]; -double priceChangeSMPP = cXConditions.priceChangeSMBuffer[ppIDX]; - -// -// -// - -// -// XHK ... - -// -bool isPBarClosedOverSMHK = - // - pBar.IsBullish() && - pBar.GetUp() > pSMHKMax && - pBar.GetDown() < pSMHKMin - // - ; - -// -bool isPBarClosedUnderSMHK = - // - pBar.IsBearish() && - pBar.GetUp() > pSMHKMax && - pBar.GetDown() < pSMHKMin - // - ; - -// -bool isPBarBullishPriceChangeVPattern = - priceChangeP > priceChangePP && - priceChangeP > priceChange; - -// -bool isPBarBerishPriceChangeVPattern = - priceChangeP < priceChangePP && - priceChangeP < priceChange; - -// -bool isPBarPriceChangeOverPeak = - priceChangeP > peak && - priceChangeP > peakP && - priceChangeP > peakPP; - -// -bool isPBarPriceChangeUnderVale = - priceChangeP < vale && - priceChangeP < valeP && - priceChangeP < valePP; - -// -bool isPBarCloseOverPeaksGoldenZone = - pBar.close > peaksGoldenP; - -// -bool isPBarCloseUnderValesGoldenZone = - pBar.close < valesGoldenP; - -// -bool isPBarPriceChangeOverAtrUpper = - priceChangeP > atrUpperSMP; - -// -bool isPBarPriceChangeUnderAtrLower = - priceChangeP < atrLowerSMP; - -// -isBullish = - // - // false - // - hasSelectedBox && - selectedBox.IsBullish() && - cXConditions.isStrBullish - // - // cBar.IsBullish() && - // isPBarPriceChangeUnderVale && - // isPBarPriceChangeUnderAtrLower && - // isPBarBerishPriceChangeVPattern && - // isPBarCloseUnderValesGoldenZone - // - ; - -// -isBearish = - // - // false - // - hasSelectedBox && - selectedBox.IsBearish() && - cXConditions.isStrBearish - // - // cBar.IsBearish() && - // isPBarPriceChangeOverPeak && - // isPBarPriceChangeOverAtrUpper && - // isPBarCloseOverPeaksGoldenZone && - // isPBarBullishPriceChangeVPattern - // - ; - -///////////////////////////////////////////////////////// - -// -double xhkSL; -ENUM_X_DIRECTION xhkDir; -bool isXHKPassed = IsHKConditionsPassed( - xhkSL, - xhkDir, - cHelper, - cXConditions, - barIndex // -); -bool isXHKBullish = - isXHKPassed && - IsBullish(xhkDir); -bool isXHKBearish = - isXHKPassed && - IsBearish(xhkDir); - -///////////////////////////////////////////////////////// - -// -bool IsRejectedBox( - XOHCL &bar, // CBar ... - XBoxZone &box, - X121Conditions &conditions // -) -{ - // - bool result = false; - - // - result = - bar.IsValid() && - box.IsValid(); - if (!result) - { - return result; - } - - // - bool isBullish = box.IsBullish(); - - // - bool isBullishRejected = - isBullish && - bar.IsRejected( - box.upper, - box.dir, - true, // Force Type ... - true // Force Pressure ... - ); - - // - bool isBearishRejected = - !isBullish && - bar.IsRejected( - box.lower, - box.dir, - true, // Force Type ... - true // Force Pressure ... - ); - - // - result = isBullishRejected || - isBearishRejected; - - // - return result; -} - -// -bool IsPeaksOrValesPassedBox( - XBoxZone &box, - X121Conditions &conditions // -) -{ - // - bool result = false; - - // - result = box.IsValid(); - if (!result) - { - return result; - } - - // - double peakZ = conditions.peaksBuffer[0]; - double peakC = conditions.peaksBuffer[1]; - double peakP = conditions.peaksBuffer[2]; - double peakPP = conditions.peaksBuffer[3]; - - // - double valeZ = conditions.valesBuffer[0]; - double valeC = conditions.valesBuffer[1]; - double valeP = conditions.valesBuffer[2]; - double valePP = conditions.valesBuffer[3]; - - // - double boxQ = ((box.upper - box.lower) / 100) * 25; - double upperQuarter = box.upper - boxQ; - double lowerQuarter = box.lower + boxQ; - - // - bool isPPeakInsideUpperQ = - peakP < box.upper && - peakP > upperQuarter; - - // - bool isPValeInsideLowerQ = - valeP > box.lower && - valeP < lowerQuarter; - - // - bool isPPPeakInsideUpperQ = - peakPP < box.upper && - peakPP > upperQuarter; - - // - bool isPPValeInsideLowerQ = - valePP > box.lower && - valePP < lowerQuarter; - - // - result = - // - (box.IsBullish() && - (isPValeInsideLowerQ || - isPPValeInsideLowerQ) && - (valeC == valeP || - valeP == valePP)) - // - || - // - (box.IsBearish() && - (isPPeakInsideUpperQ || - isPPPeakInsideUpperQ) && - (peakC == peakP || - peakP == peakPP)) - // - ; - - // - return result; -} - -// -bool IsX3MaPassedBox( - XOHCL &bar, // CBar ... - XBoxZone &box, - X121Conditions &conditions // -) -{ - // - bool result = false; - - // - result = - bar.IsValid() && - box.IsValid(); - if (!result) - { - return result; - } - - // - double x3maFast = conditions.x3maFastBuffer[1]; - double x3maMid = conditions.x3maMidBuffer[1]; - double x3maSlow = conditions.x3maSlowBuffer[1]; - - // - bool isx3MaInsideBox = - // - // Fast ... - x3maFast < box.upper && - x3maFast > box.lower - // - && - // - // Mid ... - x3maMid < box.upper && - x3maMid > box.lower - // - && - // - // Slow ... - x3maSlow < box.upper && - x3maSlow > box.lower - // - ; - - // - bool isX3maSwitchedToBullishOrdered = - bar.IsBullish() && - box.IsBullish() && - isx3MaInsideBox && - bar.close > conditions.x3maFastBuffer[1] && - conditions.isX3MaSwitchedToBullishOrdered; - - // - bool isX3maSwitchedToBearishOrdered = - bar.IsBearish() && - box.IsBearish() && - isx3MaInsideBox && - bar.close < conditions.x3maFastBuffer[1] && - conditions.isX3MaSwitchedToBearishOrdered; - - // - result = isX3maSwitchedToBullishOrdered || - isX3maSwitchedToBearishOrdered; - - // - return result; -} - -// -// TODO: Complete this ... -bool IsActivatedBoxPassed( - XBoxZone &box, - X121Conditions &conditions // -) -{ - // - bool result = false; - - // - result = box.IsValid(); - if (!result) - { - return result; - } - - // - return result; -} - -// -// -// - -// -bool IsHKConditionsPassed( - double &sl, - ENUM_X_DIRECTION &dir, - XC121SMCCycleHelper *helper, - X121Conditions &conditions, - int barIndex = 0 // -) -{ - // - bool result = false; - - // - sl = 0; - dir = X_DIRECTION_NONE; - - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - int zIDX = 0; - int cIDX = zIDX + 1; - int pIDX = cIDX + 1; - int ppIDX = pIDX + 1; - - // - XOHCL zBar; - XOHCL cBar; - XOHCL pBar; - XOHCL ppBar; - - // - // Retrieve Bars ... - result = zBar.Init( - conditions.symbol, - conditions.period, - barIndex // - ); - result = - result && - zBar.GetPreviousBar(cBar); - result = - result && - cBar.GetPreviousBar(pBar); - result = - result && - pBar.GetPreviousBar(ppBar); - if (!result) - { - // - zBar.Clean(); - cBar.Clean(); - pBar.Clean(); - ppBar.Clean(); - - // - return result; - } - - // - // Check PBar Swing ... - ENUM_X_DIRECTION pBarSwingDir; - bool isPBarSwing = helper - .mBarAnalyser - .IsSwing( - pBar, - pBarSwingDir, - 3 // - ); - - // - bool isPBarSwingLow = - isPBarSwing && - IsBullish(pBarSwingDir); - - // - bool isPBarSwingHigh = - isPBarSwing && - IsBearish(pBarSwingDir); - - // - // Check PBar Rejection ... - ENUM_X_DIRECTION pBarRejectionDir; - bool isPBarRejected = helper - .mBarAnalyser - .IsRejected( - pBar, - pBarRejectionDir, - false, - true // - ); - - // - bool isPBarBullishRejected = - isPBarRejected && - IsBullish(pBarRejectionDir); - - // - bool isPBarBearishRejected = - isPBarRejected && - IsBearish(pBarRejectionDir); - - // - // Checking Str Incresing/Decreasing ... - - // - bool isStrIncresing = - // - (conditions.strBuffer[zIDX] > conditions.strBuffer[cIDX] && - conditions.strBuffer[zIDX] > conditions.strBuffer[pIDX] && - conditions.strBuffer[zIDX] > conditions.strBuffer[ppIDX]) - // - && - // - ( - // - (conditions.strBuffer[zIDX] > conditions.strBuffer[cIDX] && - conditions.strBuffer[cIDX] > conditions.strBuffer[pIDX]) - // - || - // - (conditions.strBuffer[cIDX] > conditions.strBuffer[pIDX] && - conditions.strBuffer[pIDX] > conditions.strBuffer[ppIDX]) - // - ) - // - ; - - // - bool isStrDecreasing = - // - (conditions.strBuffer[zIDX] < conditions.strBuffer[cIDX] && - conditions.strBuffer[zIDX] < conditions.strBuffer[pIDX] && - conditions.strBuffer[zIDX] < conditions.strBuffer[ppIDX]) - // - && - // - ( - // - (conditions.strBuffer[zIDX] < conditions.strBuffer[cIDX] && - conditions.strBuffer[cIDX] < conditions.strBuffer[pIDX]) - // - || - // - (conditions.strBuffer[cIDX] < conditions.strBuffer[pIDX] && - conditions.strBuffer[pIDX] < conditions.strBuffer[ppIDX]) - // - ) - // - ; - - // - bool isBullish = - // - isPBarSwingLow && - isStrIncresing && - cBar.IsBullish() && - cBar.low > pBar.low && - cBar.open > pBar.low && - zBar.open > cBar.low && - // isPBarBullishRejected && - conditions.isSarBullish && - conditions.isStrBullish && - conditions.isSMHKBullish - // - ; - - // - bool isBearish = - // - isPBarSwingHigh && - isStrDecreasing && - cBar.IsBearish() && - cBar.high < pBar.high && - cBar.open < pBar.high && - zBar.open < cBar.high && - // isPBarBearishRejected && - conditions.isSarBearish && - conditions.isStrBearish && - conditions.isSMHKBearish - // - ; - - // - result = isBullish || - isBearish; - if (result) - { - // - dir = isBullish - ? X_DIRECTION_BULLISH - : X_DIRECTION_BEARISH; - - // - // Selecting SL ... - sl = - isBullish - ? cBar.low - : cBar.high; - } - - // - // Cleanup Resources ... - zBar.Clean(); - cBar.Clean(); - pBar.Clean(); - ppBar.Clean(); - - // - return result; -} - -// -bool IsSARConditionsPassed( - double &sl, - ENUM_X_DIRECTION &dir, - XC121SMCCycleHelper *helper, - X121Conditions &conditions, - int barIndex = 0 // -) -{ - // - bool result = false; - - // - sl = 0; - dir = X_DIRECTION_NONE; - - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - int zIDX = 0; - int cIDX = zIDX + 1; - int pIDX = cIDX + 1; - int ppIDX = pIDX + 1; - - // - XOHCL zBar; - XOHCL cBar; - XOHCL pBar; - XOHCL ppBar; - - // - // Retrieve Bars ... - result = zBar.Init( - conditions.symbol, - conditions.period, - barIndex // - ); - result = - result && - zBar.GetPreviousBar(cBar); - result = - result && - cBar.GetPreviousBar(pBar); - result = - result && - pBar.GetPreviousBar(ppBar); - if (!result) - { - // - zBar.Clean(); - cBar.Clean(); - pBar.Clean(); - ppBar.Clean(); - - // - return result; - } - - // - // Check PBar Swing ... - ENUM_X_DIRECTION pBarSwingDir; - bool isPBarSwing = helper - .mBarAnalyser - .IsSwing( - pBar, - pBarSwingDir, - 3 // - ); - - // - bool isPBarSwingLow = - isPBarSwing && - IsBullish(pBarSwingDir); - - // - bool isPBarSwingHigh = - isPBarSwing && - IsBearish(pBarSwingDir); - - // - bool isBullish = - // - isPBarSwingLow && - cBar.IsBullish() && - cBar.low > pBar.low && - cBar.open > pBar.low && - zBar.open > cBar.low && - conditions.isSarSwitchedToBullish - // - ; - - // - bool isBearish = - // - isPBarSwingHigh && - isStrDecreasing && - cBar.IsBearish() && - cBar.high < pBar.high && - cBar.open < pBar.high && - zBar.open < cBar.high && - conditions.isSarSwitchedToBearish - // - ; - - // - result = isBullish || - isBearish; - if (result) - { - // - dir = isBullish - ? X_DIRECTION_BULLISH - : X_DIRECTION_BEARISH; - - // - // Selecting SL ... - sl = - isBullish - ? cBar.low - : cBar.high; - } - - // - // Cleanup Resources ... - zBar.Clean(); - cBar.Clean(); - pBar.Clean(); - ppBar.Clean(); - - // - return result; -} - -///////////////////////////////////////////////////////// - -// // -// bool isPVPassed = IsPeaksOrValesPassedBox( -// iBox, -// cXConditions // -// ); -// if (isPVPassed) -// { -// // -// selectedBox = iBox; -// iBox.Clean(); -// break; -// } - -// -// bool isx3MaPassed = IsX3MaPassedBox( -// cBar, -// iBox, -// cXConditions // -// ); -// if (isx3MaPassed) -// { -// // -// selectedBox = iBox; -// iBox.Clean(); -// break; -// } - -// -// bool isRejected = IsRejectedBox( -// cBar, -// iBox, -// cXConditions // -// ); -// if (isRejected) -// { -// // -// selectedBox = iBox; -// iBox.Clean(); -// break; -// } - -///////////////////////////////////////////////////////// - -// -// Checking Bullish Fair Value Gaps ... -has = cState.HasBullishFairValueGaps(); -if (has) -{ - // - XBoxZone tmpBoxes[]; - ToBox( - cState.bullishFairValueGaps, - tmpBoxes // - ); - - // - count = ArraySize(tmpBoxes); - has = IsValidSize(count); - if (has) - { - // - for (int i = 0; i < count; i++) - { - // - XBoxZone iBox = tmpBoxes[i]; - bool isValid = IsBoxValid( - iBox, - 0, - iBox.period // - ); - if (!isValid) - { - // - iBox.Clean(); - continue; - } - - // - has = IsBoxExists(iBox); - if (!has) - { - // - AddRef( - iBox, - mWaitingBoxes // - ); - } - - // - iBox.Clean(); - } - } - - // - Clean(tmpBoxes); -} - -// -// Checking Bearish Fair Value Gaps ... -has = cState.HasBearishFairValueGaps(); -if (has) -{ - // - XBoxZone tmpBoxes[]; - ToBox( - cState.bearishFairValueGaps, - tmpBoxes // - ); - - // - count = ArraySize(tmpBoxes); - has = IsValidSize(count); - if (has) - { - // - for (int i = 0; i < count; i++) - { - // - XBoxZone iBox = tmpBoxes[i]; - bool isValid = IsBoxValid( - iBox, - 0, - iBox.period // - ); - if (!isValid) - { - // - iBox.Clean(); - continue; - ; - } - - // - has = IsBoxExists(iBox); - if (!has) - { - // - AddRef( - iBox, - mWaitingBoxes // - ); - } - - // - iBox.Clean(); - } - } - - // - Clean(tmpBoxes); -} - -///////////////////////////////////////////////////////// - -// -bool GeneratePVBox( - XBoxZone &box, - int barIndex = 0 // -) -{ - // - bool result = false; - - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - box.Clean(); - box.symbol = GetSymbol(); - box.period = GetPeriod(); - - // - int index = barIndex; - - // - // Peak ... - datetime peaksSameFrom = NULL; - double peak = mX121Helper.xpvHelper.GetPeak(index); - double prevPeak = mX121Helper.xpvHelper.GetPeak(index + 1); - bool startsByPeak = peak == prevPeak; - - // - // Vale ... - datetime valesSameFrom = NULL; - double vale = mX121Helper.xpvHelper.GetVale(index); - double prevVale = mX121Helper.xpvHelper.GetVale(index + 1); - bool startsByVale = - !startsByPeak && - vale == prevVale; - - // - bool canBreak = false; - while (!canBreak) - { - // - index++; - - // - datetime cTime = iTime( - box.symbol, - box.period, - index // - ); - - // - // Peak ... - double iPeak = mX121Helper.xpvHelper.GetPeak(index); - - // - // Vale ... - double iVale = mX121Helper.xpvHelper.GetVale(index); - - // - // Start By Peak or Value ... - bool isSame = false; - if (startsByPeak) - { - // - isSame = iPeak == peak; - bool canSetVale = vale == 0 - ? true - : iVale > vale; - if (canSetVale) - { - vale = iVale; - } - } - else if (startsByVale) - { - // - isSame = iVale == vale; - bool canSetPeak = peak == 0 - ? true - : iPeak < peak; - if (canSetPeak) - { - peak = iPeak; - } - } - - // - if (isSame) - { - // - box.from = cTime; - box.upper = peak; - box.lower = vale; - } - else if (IsValid(box.from)) - { - // - // Complete Box ... - box.to = iTime( - box.symbol, - box.period, - barIndex // - ); - - // - box.type = "XPVBox"; - box.dir = startsByPeak - ? X_DIRECTION_BEARISH - : startsByVale - ? X_DIRECTION_BULLISH - : X_DIRECTION_NONE; - } - - // - canBreak = !isSame; - } - - // - result = box.IsValid(); - if (!result) - { - box.Clean(); - } - - // - return result; -} - -// -void DetectPVPivots( - int barIndex = 0, - int validation = 50, - int loopback = 100 // -) -{ - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - loopback = NormalizeInt(loopback, 10); - validation = NormalizeInt(validation, 5); - - // - int iPeakVerified = 0; - int iValeVerified = 0; - datetime iPeakTo = GetBarTime( - GetSymbol(), - GetPeriod(), - barIndex // - ); - datetime iValeTo = GetBarTime( - GetSymbol(), - GetPeriod(), - barIndex // - ); - double iPeak = mX121Helper.xpvHelper.GetPeak(barIndex); - double iVale = mX121Helper.xpvHelper.GetVale(barIndex); - double iPeakGolden = mX121Helper.xpvHelper.GetPeakGoldenZone(barIndex); - double iValeGolden = mX121Helper.xpvHelper.GetValeGoldenZone(barIndex); - for (int i = barIndex + 1; i < barIndex + 1 + loopback; i++) - { - // - double iiPeak = mX121Helper.xpvHelper.GetPeak(i); - double iiVale = mX121Helper.xpvHelper.GetVale(i); - double iiPeakGolden = mX121Helper.xpvHelper.GetPeakGoldenZone(i); - double iiValeGolden = mX121Helper.xpvHelper.GetValeGoldenZone(i); - - // - if (iiPeak == iPeak) - { - // - iPeakVerified++; - iPeakGolden = iPeakGolden < iiPeakGolden - ? iiPeakGolden - : iPeakGolden; - } - else - { - // - if (iPeakVerified > 0 && - iPeakVerified < validation) - { - // - // Reset ... - iPeak = iiPeak; - iPeakVerified = 0; - iPeakGolden = iiPeakGolden; - iPeakTo = GetBarTime( - GetSymbol(), - GetPeriod(), - i // - ); - } - } - - // - if (iiVale == iVale) - { - // - iValeVerified++; - iValeGolden = iValeGolden > iiValeGolden - ? iiValeGolden - : iValeGolden; - } - else - { - // - if (iValeVerified > 0 && - iValeVerified < validation) - { - // - // Reset ... - iVale = iiVale; - iValeVerified = 0; - iValeGolden = iiValeGolden; - iValeTo = GetBarTime( - GetSymbol(), - GetPeriod(), - i // - ); - } - } - - // - if (iPeakVerified >= validation && - iValeVerified >= validation) - { - break; - } - } - - // - // Checking PV Pivots ... - - // - if (iPeakVerified >= validation) - { - // - XPVPivot iPivot; - - // - iPivot.to = iPeakTo; - iPivot.value = iPeak; - iPivot.type = X_PV_PEAK; - iPivot.golden = iPeakGolden; - iPivot.symbol = GetSymbol(); - iPivot.period = GetPeriod(); - iPivot.from = ((datetime)iPeakTo - (PeriodSeconds(GetPeriod()) * iPeakVerified)); - - // - if (iPivot.IsValid()) - { - // - AddRef( - iPivot, - mPVPivots // - ); - - // - XBoxZone iBox; - XCBoxObject *iObj; - bool iHas = iPivot.AsBox(iBox); - if (iHas) - { - // - iHas = mPOIDrawer.DrawBox( - iBox, - iObj // - ); - if (iHas) - { - Print("Peak Pivot ..."); - } - } - } - - // - iPivot.Clean(); - } - - // - if (iValeVerified >= validation) - { - // - XPVPivot iPivot; - - // - iPivot.to = iValeTo; - iPivot.value = iVale; - iPivot.type = X_PV_VALE; - iPivot.symbol = GetSymbol(); - iPivot.period = GetPeriod(); - iPivot.golden = iValeGolden; - iPivot.from = ((datetime)iValeTo - (PeriodSeconds(GetPeriod()) * iValeVerified)); - - // - if (iPivot.IsValid()) - { - // - AddRef( - iPivot, - mPVPivots // - ); - - // - XBoxZone iBox; - XCBoxObject *iObj; - bool iHas = iPivot.AsBox(iBox); - if (iHas) - { - // - iHas = mPOIDrawer.DrawBox( - iBox, - iObj // - ); - if (iHas) - { - Print("Vale Pivot ..."); - } - } - } - - // - iPivot.Clean(); - } - - // -} - -// -DetectPVPivots(barIndex); - -///////////////////////////////////////////////////////// -// -// Detect Support and Resistances ... -XBoxZone tmpBoxes[]; -XBoxZone selectedSupRes[]; -count = provider.triggerState.SupportResistancesAsBox(tmpBoxes); -has = IsValidSize(count); -if (has) -{ - // - for (int i = 0; i < count; i++) - { - // - XBoxZone iBox = tmpBoxes[i]; - - // - // Validate Box ... - bool isDirPassed = iBox.dir == selectedBox.dir; - bool isPlacePassed = IsBoxInsideOr(iBox, selectedBox, true); - has = isDirPassed && - isPlacePassed; - if (has) - { - // - AddRef( - iBox, - selectedSupRes // - ); - } - - // - iBox.Clean(); - } - - // - Clean(tmpBoxes); -} -has = HasChild(selectedSupRes); -if (has) -{ - // - count = ArraySize(selectedSupRes); - for (int i = 0; i < count; i++) - { - // - selectedSupRes[i].to = TimeCurrent(); - - // - XCBoxObject *iObj; - has = drawer.DrawBox( - selectedSupRes[i], - iObj // - ); - } -} - -///////////////////////////////////////////////////////// - // - // double strSupport = 0; - // datetime strIn = NULL; - // datetime strOut = NULL; - // bool isStrInBox = false; - // double strResistance = 0; - // bool isStrOutBox = false; - // Checking STR Variables ... - // CheckBoxStr( - // cHelper, - // selectedBox, - // isStrInBox, - // strIn, - // isStrOutBox, - // strOut, - // strSupport, - // strResistance // - // ); - - -///////////////////////////////////////////////////////// - -// -bool IsFVGBoxValid( - XBoxZone &box, - ENUM_X_CYCLES cycle, - X121SMCStrategySignalProviderData &provider // -) -{ - // - bool result = false; - - // - result = box.IsValid(); - if (!result) - { - return result; - } - - // - // Fil Selected Data ... - XPOIState cState; - X121Conditions cXConditions; - XPOIStateEvents cStateEvents; - XC121SMCCycleHelper *cHelper; - X121SMCCycleConditions cConditions; - result = provider.SelectCycle( - cycle, - cState, - cStateEvents, - cXConditions, - cHelper, - cConditions // - ); - if (!result) - { - // - cState.Clean(); - ZeroMemory(cHelper); - cConditions.Clean(); - cXConditions.Clean(); - cStateEvents.Clean(); - - // - return result; - } - - // - bool isBoxBullish = box.IsBullish(); - - // - int count = 0; - bool has = false; - - // - XBoxZone tmpBoxes[]; - count = cState.FairValueGapsAsBox(tmpBoxes); - has = IsValidSize(count); - - // - // Check Must Contains Inner Cycle FVG ... - XBoxZone selectedBox; - bool hasSelectedBox = false; - if (has) - { - // - for (int i = 0; i < count; i++) - { - // - XBoxZone iBox = tmpBoxes[i]; - - // - // Regular Validation of Boxes ... - bool isValid = IsBoxValid( - iBox, - 0, - iBox.period // - ); - bool isTypePassed = iBox.dir == box.dir; - bool isFromPssed = iBox.from >= box.from; - bool isPlacePassed = - IsBoxInsideOr( - iBox, - box // - ) && - (isBoxBullish - ? iBox.lower >= box.lower - : iBox.upper <= box.upper); - has = - isValid && - isFromPssed && - isTypePassed && - isPlacePassed; - if (!has) - { - // - iBox.Clean(); - continue; - } - - // - has = - !hasSelectedBox - ? true - : isBoxBullish - ? selectedBox.upper > iBox.upper - : selectedBox.lower < iBox.lower; - if (has) - { - // - selectedBox = iBox; - hasSelectedBox = selectedBox.IsValid(); - } - - // - iBox.Clean(); - } - } - - // - result = hasSelectedBox; - - // - // IGNORE Box Validations ... - // if (result) - // { - // // // - // // // From Index ... - // // int fromIndex = GetBarIndex( - // // selectedBox.symbol, - // // selectedBox.period, - // // selectedBox.from // - // // ) + - // // 1; - // // result = IsValidIndex(fromIndex); - - // // // - // // // To Index ... - // // int toIndex = GetBarIndex( - // // selectedBox.symbol, - // // selectedBox.period, - // // selectedBox.to // - // // ); - // // if (toIndex < 1) - // // { - // // toIndex = 1; - // // } - // // result = IsValidIndex(toIndex); - - // // // - // // // Now we Have Retrieve X121Conditions between from and to Indexes ... - // // // for Check States ... - - // // // - // // bool hasNewValeUnderLast = false; - // // bool isStrSwitchedToBullish = false; - // // bool isSarSwitchedToBullish = false; - // // bool hasValueGoldenZoneBreak = false; - // // bool isSMHKSwitchedToBullish = false; - // // bool isVWapSwitchedToBullishState = false; - // // bool isX3MaSwitchedToBullishState = false; - // // bool isVWapSwitchedToBullishOrdered = false; - // // bool isX3MaSwitchedToBullishOrdered = false; - - // // // - // // bool hasNewPeakOverLast = false; - // // bool isStrSwitchedToBearish = false; - // // bool isSarSwitchedToBearish = false; - // // bool hasPeakGoldenZoneBreak = false; - // // bool isSMHKSwitchedToBearish = false; - // // bool isVWapSwitchedToBearishState = false; - // // bool isX3MaSwitchedToBearishState = false; - // // bool isVWapSwitchedToBearishOrdered = false; - // // bool isX3MaSwitchedToBearishOrdered = false; - - // // // - // // for (int i = fromIndex; i >= toIndex; i--) - // // { - // // // - // // XOHCL iBar; - // // has = iBar.Init( - // // cState.symbol, - // // cState.period, - // // i // - // // ); - // // X121Conditions iConditions; - // // has = has && - // // cHelper.mX121Helper.GetConditions( - // // iConditions, - // // i // - // // ); - // // if (!has) - // // { - // // continue; - // // } - - // // // - // // // Bullish ... - - // // // - // // if (!hasNewValeUnderLast) - // // { - // // hasNewValeUnderLast = iConditions.isNewValeUnderLast; - // // } - - // // // - // // if (!isStrSwitchedToBullish) - // // { - // // isStrSwitchedToBullish = iConditions.isStrSwitchedToBullish; - // // } - - // // // - // // if (!isSarSwitchedToBullish) - // // { - // // isSarSwitchedToBullish = iConditions.isSarSwitchedToBullish; - // // } - - // // // - // // if (!hasValueGoldenZoneBreak) - // // { - // // // - // // hasValueGoldenZoneBreak = - // // iBar.IsBullish() && - // // iBar.GetUp() > iConditions.valesGoldenBuffer[1] && - // // iBar.GetDown() < iConditions.valesGoldenBuffer[1]; - // // } - - // // // - // // if (!isSMHKSwitchedToBullish) - // // { - // // isSMHKSwitchedToBullish = iConditions.isSMHKSwitchedToBullish; - // // } - - // // // - // // if (!isVWapSwitchedToBullishState) - // // { - // // isVWapSwitchedToBullishState = iConditions.isVWapSwitchedToBullishState; - // // } - - // // // - // // if (!isX3MaSwitchedToBullishState) - // // { - // // isX3MaSwitchedToBullishState = iConditions.isX3MaSwitchedToBullishState; - // // } - - // // // - // // if (!isVWapSwitchedToBullishOrdered) - // // { - // // isVWapSwitchedToBullishOrdered = iConditions.isVWapSwitchedToBullishOrdered; - // // } - - // // // - // // if (!isX3MaSwitchedToBullishOrdered) - // // { - // // isX3MaSwitchedToBullishOrdered = iConditions.isX3MaSwitchedToBullishOrdered; - // // } - - // // // - // // // Bearish ... - - // // // - // // if (!hasNewPeakOverLast) - // // { - // // hasNewPeakOverLast = iConditions.isNewPeakOverLast; - // // } - - // // // - // // if (!isStrSwitchedToBearish) - // // { - // // isStrSwitchedToBearish = iConditions.isStrSwitchedToBearish; - // // } - - // // // - // // if (!isSarSwitchedToBearish) - // // { - // // isSarSwitchedToBearish = iConditions.isSarSwitchedToBearish; - // // } - - // // // - // // if (!hasPeakGoldenZoneBreak) - // // { - // // // - // // hasPeakGoldenZoneBreak = - // // iBar.IsBearish() && - // // iBar.GetUp() > iConditions.peaksGoldenBuffer[1] && - // // iBar.GetDown() < iConditions.peaksGoldenBuffer[1]; - // // } - - // // // - // // if (!isSMHKSwitchedToBearish) - // // { - // // isSMHKSwitchedToBearish = iConditions.isSMHKSwitchedToBearish; - // // } - - // // // - // // if (!isVWapSwitchedToBearishState) - // // { - // // isVWapSwitchedToBearishState = iConditions.isVWapSwitchedToBearishState; - // // } - - // // // - // // if (!isX3MaSwitchedToBearishState) - // // { - // // isX3MaSwitchedToBearishState = iConditions.isX3MaSwitchedToBearishState; - // // } - - // // // - // // if (!isVWapSwitchedToBearishOrdered) - // // { - // // isVWapSwitchedToBearishOrdered = iConditions.isVWapSwitchedToBearishOrdered; - // // } - - // // // - // // if (!isX3MaSwitchedToBearishOrdered) - // // { - // // isX3MaSwitchedToBearishOrdered = iConditions.isX3MaSwitchedToBearishOrdered; - // // } - - // // // - // // iConditions.Clean(); - // // } - - // // // - // // // Bullish Conditions Summary ... - - // // // - // // bool hasBullishOrConditions = - // // hasNewValeUnderLast || - // // isStrSwitchedToBullish || - // // isSarSwitchedToBullish || - // // hasValueGoldenZoneBreak || - // // isSMHKSwitchedToBullish || - // // isVWapSwitchedToBullishState || - // // isX3MaSwitchedToBullishState || - // // isVWapSwitchedToBullishOrdered || - // // isX3MaSwitchedToBullishOrdered; - - // // // - // // bool hasBullishAndConditions = - // // hasNewValeUnderLast && - // // hasValueGoldenZoneBreak && - // // (isStrSwitchedToBullish || - // // isSarSwitchedToBullish || - // // isSMHKSwitchedToBullish || - // // isVWapSwitchedToBullishState || - // // isX3MaSwitchedToBullishState || - // // isVWapSwitchedToBullishOrdered || - // // isX3MaSwitchedToBullishOrdered); - - // // // - // // // Bearish Conditions Summary ... - - // // // - // // bool hasBearishOrConditions = - // // hasNewPeakOverLast || - // // isStrSwitchedToBearish || - // // isSarSwitchedToBearish || - // // hasPeakGoldenZoneBreak || - // // isSMHKSwitchedToBearish || - // // isVWapSwitchedToBearishState || - // // isX3MaSwitchedToBearishState || - // // isVWapSwitchedToBearishOrdered || - // // isX3MaSwitchedToBearishOrdered; - - // // // - // // bool hasBearishAndConditions = - // // hasNewPeakOverLast && - // // hasPeakGoldenZoneBreak && - // // (isStrSwitchedToBearish || - // // isSarSwitchedToBearish || - // // isSMHKSwitchedToBearish || - // // isVWapSwitchedToBearishState || - // // isX3MaSwitchedToBearishState || - // // isVWapSwitchedToBearishOrdered || - // // isX3MaSwitchedToBearishOrdered); - - // // - // bool isBullish = - // isBoxBullish - // // && - // // !hasBearishOrConditions && - // // hasBullishOrConditions - // ; - - // // - // bool isBearish = - // !isBoxBullish - // // && - // // !hasBullishOrConditions && - // // hasBearishOrConditions - // ; - - // // - // result = isBullish || - // isBearish; - - // // - // // if (result) - // // { - // // // - // // XCBoxObject *iBoxObj; - // // XCBoxObject *iInBoxObj; - - // // // - // // has = provider - // // .verificationCycleHelper - // // .mPOIDrawer - // // .DrawBox( - // // box, - // // iBoxObj // - // // ); - // // if (has) - // // { - // // // - // // iBoxObj.BoxWidth(2); - // // iBoxObj.BoxStyle(STYLE_SOLID); - // // } - - // // // - // // has = provider - // // .verificationCycleHelper - // // .mPOIDrawer - // // .DrawBox( - // // selectedBox, - // // iInBoxObj // - // // ); - // // if (has) - // // { - // // // - // // iInBoxObj.BoxWidth(2); - // // iInBoxObj.BoxStyle(STYLE_DASH); - // // } - - // // // - // // Print("Inside Selected Box ..."); - // // } - // } - - // - // Cleanup Resources ... - - // - cState.Clean(); - Clean(tmpBoxes); - selectedBox.Clean(); - ZeroMemory(cHelper); - cConditions.Clean(); - cXConditions.Clean(); - cStateEvents.Clean(); - - // - return result; -} - -///////////////////////////////////////////////////////// -// - -bool DetectXCAEAConditions( - XCAEAConditions &conditions, - XBoxZone &box, - ENUM_X_DIRECTION &dir, - XCXCAEAHelper *helper, - int barIndex = 0, - int loopback = 10 // -) -{ - // - bool result = false; - - // - box.Clean(); - conditions.Clean(); - dir = X_DIRECTION_NONE; - - // - if (barIndex < 0) - { - barIndex = 0; - } - loopback = NormalizeInt(loopback, 5); - - // - string symbol = helper.GetSymbol(); - ENUM_TIMEFRAMES period = helper.GetPeriod(); - - // - result = helper.GetConditions( - conditions, - barIndex, - loopback // - ); - if (!result) - { - // - conditions.Clean(); - return result; - } - - // - int zIDX = barIndex; - int cIDX = zIDX + 1; - int pIDX = cIDX + 1; - int ppIDX = pIDX + 1; - int p3IDX = ppIDX + 1; - int p4IDX = p3IDX + 1; - - // - XOHCL zBar; - XOHCL cBar; - XOHCL pBar; - XOHCL ppBar; - XOHCL p3Bar; - XOHCL p4Bar; - result = zBar.Init( - symbol, - period, - zIDX // - ); - result = - result && - zBar.GetPreviousBar(cBar); - result = - result && - cBar.GetPreviousBar(pBar); - result = - result && - pBar.GetPreviousBar(ppBar); - result = - result && - ppBar.GetPreviousBar(p3Bar); - result = - result && - p3Bar.GetPreviousBar(p4Bar); - if (!result) - { - // - zBar.Clean(); - cBar.Clean(); - pBar.Clean(); - ppBar.Clean(); - p3Bar.Clean(); - p4Bar.Clean(); - - // - box.Clean(); - conditions.Clean(); - - // - return result; - } - - // - // Bars Conditions ... - - // - ENUM_X_DIRECTION cBarDir; - - // - // Hammer ... - bool isCBarHammer = helper - .barAnalyser - .IsHammer( - cBar, - cBarDir // - ); - bool isCBarBullishHammer = - isCBarHammer && - IsBullish(cBarDir); - bool isCBarBearishHammer = - isCBarHammer && - IsBearish(cBarDir); - - // - // Rejected ... - bool isCBarRejected = helper - .barAnalyser - .IsRejected( - cBar, - cBarDir, - false, // Force Type ... - true // Force Fibo Pressure ... - ); - bool isCBarBullishRejected = - isCBarRejected && - IsBullish(cBarDir); - bool isCBarBearishRejected = - isCBarRejected && - IsBearish(cBarDir); - - // - // Engulfed ... - bool isCBarEngulfed = helper - .barAnalyser - .IsEngulfed( - cBar, - cBarDir // - ); - bool isCBarBullishEngulfed = - isCBarEngulfed && - IsBullish(cBarDir); - bool isCBarBearishEngulfed = - isCBarEngulfed && - IsBearish(cBarDir); - - // - // Momentum ... - bool isCBarMomentum = helper - .barAnalyser - .IsMomentum( - cBar, - cBarDir, - 1 // - ); - bool isCBarBullishMomentum = - isCBarMomentum && - IsBullish(cBarDir); - bool isCBarBearishMomentum = - isCBarMomentum && - IsBearish(cBarDir); - - // - // Bar Sumarise ... - - // - bool isCBarValidForBullish = - (isCBarBullishHammer || - isCBarBullishRejected || - isCBarBullishMomentum || - isCBarBullishEngulfed); - - // - bool isCBarValidForBearish = - (isCBarBearishHammer || - isCBarBearishRejected || - isCBarBearishMomentum || - isCBarBearishEngulfed); - - // - // Conditions ... - - // - bool isLowsUnderValesGolden = - // - pBar.low < conditions.valesGoldenBuffer[pIDX] && - ppBar.low < conditions.valesGoldenBuffer[ppIDX] && - p3Bar.low < conditions.valesGoldenBuffer[p3IDX] && - p4Bar.low < conditions.valesGoldenBuffer[p4IDX] - // - ; - - // - bool isHighsOverPeaksGolden = - // - pBar.high > conditions.peaksGoldenBuffer[pIDX] && - ppBar.high > conditions.peaksGoldenBuffer[ppIDX] && - p3Bar.high > conditions.peaksGoldenBuffer[p3IDX] && - p4Bar.high > conditions.peaksGoldenBuffer[p4IDX] - // - ; - - // - bool isSwingLowSameAsVale = - conditions.swingLowsBuffer[p4IDX] == conditions.valesBuffer[p4IDX]; - - // - bool isSwingHighSameAsPeak = - conditions.swingHighsBuffer[p4IDX] == conditions.peaksBuffer[p4IDX]; - - // - bool isStrSame = conditions.strBuffer[cIDX] == conditions.strBuffer[pIDX] && - conditions.strBuffer[pIDX] == conditions.strBuffer[ppIDX]; - - // - bool isSameStrBreakedUp = - isStrSame && - conditions.strBuffer[zIDX] > conditions.strBuffer[cIDX]; - - // - bool isSameStrBreakedDown = - isStrSame && - conditions.strBuffer[zIDX] < conditions.strBuffer[cIDX]; - - // - bool isStrBullishVPattern = - // - conditions.strStateBuffer[zIDX] > 0 && - conditions.strStateBuffer[cIDX] > 0 && - conditions.strStateBuffer[pIDX] > 0 && - conditions.strBuffer[pIDX] < conditions.strBuffer[ppIDX] && - conditions.strBuffer[pIDX] < conditions.strBuffer[cIDX] && - conditions.strBuffer[pIDX] < conditions.strBuffer[zIDX] && - conditions.strBuffer[zIDX] > conditions.strBuffer[cIDX] - // - ; - - // - bool isStrBearishVPattern = - // - conditions.strStateBuffer[zIDX] < 0 && - conditions.strStateBuffer[cIDX] < 0 && - conditions.strStateBuffer[pIDX] < 0 && - conditions.strBuffer[pIDX] > conditions.strBuffer[ppIDX] && - conditions.strBuffer[pIDX] > conditions.strBuffer[cIDX] && - conditions.strBuffer[pIDX] > conditions.strBuffer[zIDX] && - conditions.strBuffer[zIDX] < conditions.strBuffer[cIDX] - // - ; - - // - bool isCBarLowInTKZone = - // - cBar.low < conditions.tenkanSenBuffer[cIDX] && - cBar.low > conditions.kijunSenBuffer[cIDX] - // - ; - - // - bool isCBarHighInTKZone = - // - cBar.high > conditions.tenkanSenBuffer[cIDX] && - cBar.high < conditions.kijunSenBuffer[cIDX] - // - ; - - // - // Summarise Conditions ... - - // - bool isBullish = - // - isCBarLowInTKZone && - isCBarBullishRejected && - isCBarValidForBullish && - conditions.isX3MaSlowBullish && - conditions.isTenkanSenOverKijunSen && - conditions.kijunSenBuffer[cIDX] > conditions.x3maSlowBuffer[cIDX] - // - ; - - // - bool isBearish = - // - isCBarHighInTKZone && - isCBarBearishRejected && - isCBarValidForBearish && - conditions.isX3MaSlowBearish && - conditions.isTenkanSenUnderKijunSen && - conditions.kijunSenBuffer[cIDX] < conditions.x3maSlowBuffer[cIDX] - // - ; - - // - result = isBullish || - isBearish; - if (result) - { - // - dir = - isBullish - ? X_DIRECTION_BULLISH - : X_DIRECTION_BEARISH; - - // - double entry = GetEntry( - conditions.symbol, - dir // - ); - double sl = conditions.kijunSenBuffer[cIDX]; - - // - box.dir = dir; - box.symbol = conditions.symbol; - box.period = conditions.period; - - // - box.upper = - isBullish - ? entry - : sl; - - // - box.lower = - isBullish - ? sl - : entry; - - // - box.to = zBar.time; - box.from = p4Bar.time; - - // - box.type = ToString(dir) + "_Signal_" + conditions.symbol + "_" + ToString(conditions.period); - } - - // - result = box.IsValid() && - HasDirection(dir); - - // - // Cleanup Resources ... - - // - if (!result) - { - // - box.Clean(); - conditions.Clean(); - } - - // - zBar.Clean(); - cBar.Clean(); - pBar.Clean(); - ppBar.Clean(); - p3Bar.Clean(); - p4Bar.Clean(); - - // - return result; -} - -///////////////////////////////////////////////////////// - -///////////////////////////////////////////////////////// - -///////////////////////////////////////////////////////// - -///////////////////////////////////////////////////////// - -///////////////////////////////////////////////////////// - -///////////////////////////////////////////////////////// - -///////////////////////////////////////////////////////// - -///////////////////////////////////////////////////////// diff --git a/Documents/BKP/1/signals/3.mq5 b/Documents/BKP/1/signals/3.mq5 deleted file mode 100644 index 4b32c90a..00000000 --- a/Documents/BKP/1/signals/3.mq5 +++ /dev/null @@ -1,36 +0,0 @@ - // isLowsUnderValesGolden && - // conditions.isStrSwitchedToBullish - // - // conditions.isStrBullish && - // conditions.isRejectUpHSM // && - // - // isStrBullishVPattern && - // isSwingLowSameAsVale && - // !conditions.isNewPeakUnderLast - // - // zBar.IsBullish() && - // isSameStrBreakedUp && - // isCBarValidForBullish && - // conditions.isStrBullish && - // conditions.isATROverLast && - // conditions.isVidyaUnderLSM // && - // zBar.close > conditions.strSMHighBuffer[cIDX] - // - - - // isHighsOverPeaksGolden && - // conditions.isStrSwitchedToBearish - // conditions.isStrBearish && - // conditions.isRejectDownLSM // && - // - // isStrBearishVPattern && - // isSwingHighSameAsPeak && - // !conditions.isNewValeOverLast - // - // zBar.IsBearish() && - // isSameStrBreakedDown && - // isCBarValidForBearish && - // conditions.isStrBearish && - // conditions.isATRUnderLast && - // conditions.isVidyaOverHSM // && - // zBar.close < conditions.strSMLowBuffer[cIDX] diff --git a/Documents/BKP/1/signals/f.mq5 b/Documents/BKP/1/signals/f.mq5 deleted file mode 100644 index 759608da..00000000 --- a/Documents/BKP/1/signals/f.mq5 +++ /dev/null @@ -1,959 +0,0 @@ -// -// Detect Signals Based On XPV Indicator Golden Zones ... -// -bool HasXPVConditions( - ENUM_X_CYCLES cycle, - XBoxZone &box, - ENUM_X_DIRECTION &dir, - X121SMCStrategySignalProviderData &provider, - int barIndex = 0 // -) -{ - // - bool result = false; - - // - box.Clean(); - dir = X_DIRECTION_NONE; - - // - // Fil Selected Data ... - XPOIState cState; - X121Conditions cXConditions; - XPOIStateEvents cStateEvents; - XC121SMCCycleHelper *cHelper; - X121SMCCycleConditions cConditions; - result = provider.SelectCycle( - cycle, - cState, - cStateEvents, - cXConditions, - cHelper, - cConditions // - ); - if (!result) - { - // - cState.Clean(); - ZeroMemory(cHelper); - cConditions.Clean(); - cXConditions.Clean(); - cStateEvents.Clean(); - - // - return result; - } - - // - // Normalize Args ... - - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - int idx = -1; - int count = 0; - bool has = false; - - // - int zIDX = barIndex; - int cIDX = zIDX + 1; - int pIDX = cIDX + 1; - int ppIDX = pIDX + 1; - - // - bool isBullish = false; - bool isBearish = false; - - // - XOHCL zBar; - XOHCL cBar; - XOHCL pBar; - XOHCL pPBar; - - // - // Initial Bars ... - result = zBar.Init( - cState.symbol, - cState.period, - barIndex // - ); - result = - result && - zBar.GetPreviousBar(cBar); - result = - result && - cBar.GetPreviousBar(pBar); - result = - result && - pBar.GetPreviousBar(pPBar); - if (!result) - { - // - zBar.Clean(); - cBar.Clean(); - pBar.Clean(); - cState.Clean(); - ZeroMemory(cHelper); - cConditions.Clean(); - cXConditions.Clean(); - - // - return result; - } - - // - // Checking Conditions ... - - // - // Retrieve Some Values ... - - // - double peak = cXConditions.peaksBuffer[cIDX]; - double peakZ = cXConditions.peaksBuffer[zIDX]; - double peakP = cXConditions.peaksBuffer[pIDX]; - double peakPP = cXConditions.peaksBuffer[ppIDX]; - - // - double vale = cXConditions.valesBuffer[cIDX]; - double valeZ = cXConditions.valesBuffer[zIDX]; - double valeP = cXConditions.valesBuffer[pIDX]; - double valePP = cXConditions.valesBuffer[ppIDX]; - - // - double atrUpperSM = cXConditions.atrUpperSMBuffer[cIDX]; - double atrLowerSM = cXConditions.atrLowerSMBuffer[cIDX]; - - // - double atrUpperSMZ = cXConditions.atrUpperSMBuffer[zIDX]; - double atrLowerSMZ = cXConditions.atrLowerSMBuffer[zIDX]; - - // - double atrUpperSMP = cXConditions.atrUpperSMBuffer[pIDX]; - double atrLowerSMP = cXConditions.atrLowerSMBuffer[pIDX]; - - // - double atrUpperSMPP = cXConditions.atrUpperSMBuffer[ppIDX]; - double atrLowerSMPP = cXConditions.atrLowerSMBuffer[ppIDX]; - - // - double rsiChange = cXConditions.rsiChangeBuffer[cIDX]; - double rsiChangeZ = cXConditions.rsiChangeBuffer[zIDX]; - double rsiChangeP = cXConditions.rsiChangeBuffer[pIDX]; - double rsiChangePP = cXConditions.rsiChangeBuffer[ppIDX]; - - // - double rsiChangeSM = cXConditions.rsiChangeSMBuffer[cIDX]; - double rsiChangeSMZ = cXConditions.rsiChangeSMBuffer[zIDX]; - double rsiChangeSMP = cXConditions.rsiChangeSMBuffer[pIDX]; - double rsiChangeSMPP = cXConditions.rsiChangeSMBuffer[ppIDX]; - - // - double peaksGolden = cXConditions.peaksGoldenBuffer[cIDX]; - double peaksGoldenZ = cXConditions.peaksGoldenBuffer[zIDX]; - double peaksGoldenP = cXConditions.peaksGoldenBuffer[pIDX]; - double peaksGoldenPP = cXConditions.peaksGoldenBuffer[ppIDX]; - - // - double valesGolden = cXConditions.valesGoldenBuffer[cIDX]; - double valesGoldenZ = cXConditions.valesGoldenBuffer[zIDX]; - double valesGoldenP = cXConditions.valesGoldenBuffer[pIDX]; - double valesGoldenPP = cXConditions.valesGoldenBuffer[ppIDX]; - - // - double priceChange = cXConditions.priceChangeBuffer[cIDX]; - double priceChangeZ = cXConditions.priceChangeBuffer[zIDX]; - double priceChangeP = cXConditions.priceChangeBuffer[pIDX]; - double priceChangePP = cXConditions.priceChangeBuffer[ppIDX]; - - // - double priceChangeSM = cXConditions.priceChangeSMBuffer[cIDX]; - double priceChangeSMZ = cXConditions.priceChangeSMBuffer[zIDX]; - double priceChangeSMP = cXConditions.priceChangeSMBuffer[pIDX]; - double priceChangeSMPP = cXConditions.priceChangeSMBuffer[ppIDX]; - - // - // - // - - // - bool isPSwingLow = - // - (pBar.low < pPBar.low && - pBar.low < cBar.low && - zBar.open > cBar.low) - // - ; - - // - bool isCSwingLow = - // - (pBar.low < pPBar.low && - cBar.low < pBar.low && - zBar.close > cBar.low) - // - ; - - // - bool isSwingLow = - // - isPSwingLow || - isCSwingLow - // - ; - - // - bool isPSwingHigh = - // - pBar.high >= pPBar.high && - pBar.high > cBar.high && - zBar.open < cBar.high - // - ; - - // - bool isCSwingHigh = - // - (pBar.high >= pPBar.high && - cBar.high > pBar.high && - zBar.close < cBar.high) - // - ; - - // - bool isSwingHigh = - // - isPSwingHigh && - isCSwingHigh - // - ; - - // - bool isBarsOverPeaksGoldenZone = - // - cBar.high > peaksGolden && - pBar.high > peaksGoldenP - // - ; - - // - bool isBarsUnderValesGoldenZone = - // - cBar.low < valesGolden && - pBar.low < valesGoldenP - // - ; - - // - bool isBarsOverAtrUpper = - // - cBar.high > atrUpperSM && - pBar.high > atrUpperSMP - // - ; - - // - bool isBarsUnderAtrLower = - // - cBar.low < atrLowerSM && - pBar.low < atrLowerSMP - // - ; - - // - bool isRsiChangeOverAtrUpper = - rsiChangeP > atrUpperSMP; - - // - bool isRsiChangeUnderAtrLower = - rsiChangeP < atrLowerSMP; - - // - bool isRsiChangeOverPeaksGoldenZone = - rsiChangeP > peaksGoldenP; - - // - bool isRsiChangeUnderValesGoldenZone = - rsiChangeP < valesGoldenP; - - // - bool isPriceChangeOverAtrUpper = - priceChangeP > atrUpperSMP; - - // - bool isPriceChangeUnderAtrLower = - priceChangeP < atrLowerSMP; - - // - bool isPriceChangeOverPeaksGoldenZone = - priceChangeP > peaksGoldenP; - - // - bool isPriceChangeUnderValesGoldenZone = - priceChangeP < valesGoldenP; - - // - // XPV Peaks or Vales ... - - // - bool isCBarEqualsToPeak = cBar.high == peak; - bool isCBarEqualsToVale = cBar.low == vale; - - // - bool isPBarEqualsToPeak = pBar.high == peakP; - bool isPBarEqualsToVale = pBar.low == valeP; - - // - bool isPPBarEqualsToPeak = pPBar.high == peakPP; - bool isPPBarEqualsToVale = pPBar.low == valePP; - - // - bool isBarsEqualsToPeak = isCBarEqualsToPeak || - isPBarEqualsToPeak || - isPPBarEqualsToPeak; - bool isBarsEqualsToVale = isCBarEqualsToVale || - isPBarEqualsToVale || - isPPBarEqualsToVale; - - // - // Detect VPatterns ... - - // - bool isRsiChangeBullishVPattern = - // - rsiChangeP < rsiChangePP && - rsiChangeP < rsiChange && - rsiChangeP < rsiChangeZ - // - ; - - // - bool isRsiChangeBearishVPattern = - // - rsiChangeP > rsiChangePP && - rsiChangeP > rsiChange && - rsiChangeP > rsiChangeZ - // - ; - - // - bool isRsiChangeBullish = - // - (isRsiChangeUnderAtrLower && - isRsiChangeBullishVPattern && - isRsiChangeUnderValesGoldenZone) - // - ; - - bool isRsiChangeBearish = - // - (isRsiChangeOverAtrUpper && - isRsiChangeBearishVPattern && - isRsiChangeOverPeaksGoldenZone) - // - ; - - // - bool isPriceChangeBullishVPattern = - // - priceChangeP < priceChangePP && - priceChangeP < priceChange && - priceChangeP < priceChangeZ - // - ; - - // - bool isPriceChangeBearishVPattern = - // - priceChangeP > priceChangePP && - priceChangeP > priceChange && - priceChangeP > priceChangeZ - // - ; - - // - bool isPriceChangeBullish = - // - (isPriceChangeUnderAtrLower && - isPriceChangeBullishVPattern && - isPriceChangeUnderValesGoldenZone) - // - ; - - // - bool isPriceChangeBearish = - // - (isPriceChangeOverAtrUpper && - isPriceChangeBearishVPattern && - isPriceChangeOverPeaksGoldenZone) - // - ; - - // - // XVWAP ... - - // - bool isVWapIsBullish = - // - (cXConditions.isVWapBullishOrdered && - cXConditions.isVWapSwitchedToBullishState) - // - || - // - (cXConditions.isVWapBullishState && - cXConditions.isVWapSwitchedToBullishOrdered) - // - ; - - // - bool isVWapIsBearish = - // - (cXConditions.isVWapBearishOrdered && - cXConditions.isVWapSwitchedToBearishState) - // - || - // - (cXConditions.isVWapBearishState && - cXConditions.isVWapSwitchedToBearishOrdered) - // - ; - - // - // Checking Bar States ... - - // - ENUM_X_DIRECTION cBarPosDir; - bool isCBarValidForPosition = - cHelper - .mBarAnalyser - .IsValidForPosition( - cBar, - cBarPosDir // - ); - - // - ENUM_X_DIRECTION pBarPosDir; - bool isPBarValidForPosition = - cHelper - .mBarAnalyser - .IsValidForPosition( - pBar, - pBarPosDir // - ); - - // - bool isBarValidForBullish = - // - (isCBarValidForPosition && - IsBullish(cBarPosDir)) - // - && - // - (isPBarValidForPosition && - IsBullish(pBarPosDir)) - // - ; - - // - bool isBarValidForBearish = - // - (isCBarValidForPosition && - IsBearish(cBarPosDir)) - // - && - // - (isPBarValidForPosition && - IsBearish(pBarPosDir)) - // - ; - - // - // Summarize Conditions ... - - // - isBullish = - // - // isVWapIsBullish && - // isBarsEqualsToVale && - // isBarValidForBullish && - isSwingLow && - isBarsUnderAtrLower && - isRsiChangeBullish && - isPriceChangeBullish && - isBarsUnderValesGoldenZone - // - ; - - // - isBearish = - // - // isVWapIsBearish && - // isBarsEqualsToPeak && - // isBarValidForBearish && - isSwingHigh && - isBarsOverAtrUpper && - isRsiChangeBearish && - isPriceChangeBearish && - isBarsOverPeaksGoldenZone - // - ; - - // - // Filling Requirements ... - result = - isBullish || - isBearish; - if (result) - { - // - dir = - isBullish - ? X_DIRECTION_BULLISH - : X_DIRECTION_BEARISH; - - // - box.dir = dir; - box.from = pPBar.time; - box.to = TimeCurrent(); - box.symbol = cBar.symbol; - box.period = cBar.period; - - // - double points = GetPoints(box.symbol); - - // - // Usually is Preffered SL ... - double pivot = 0; - - // - // Usually is Current Price or Entry Price ... - double point = GetEntry( - cBar.symbol, - dir // - ); - - // - box.upper = - isBullish - ? point - : pivot; - - // - box.lower = - isBullish - ? pivot - : point; - - // - XCPOIDrawer *drawer = provider.visionCycleHelper.mPOIDrawer; - bool drawBoxes = true; - if (drawBoxes) - { - // - if (box.IsValid()) - { - // - XCBoxObject *iObj; - bool isCreated = drawer.DrawBox( - box, - iObj // - ); - - // - if (isCreated) - { - // - // TODO: ... - } - } - } - } - - // - // Check All Conditions ... - result = - box.IsValid() && - HasDirection(dir) && - (isBullish || - isBearish); - - // - // Cleanup Resources ... - zBar.Clean(); - cBar.Clean(); - pBar.Clean(); - pPBar.Clean(); - cState.Clean(); - cConditions.Clean(); - cConditions.Clean(); - ZeroMemory(cHelper); - cStateEvents.Clean(); - cXConditions.Clean(); - - // - return result; -} - -// -bool HasXSTRConditions( - ENUM_X_CYCLES cycle, - XBoxZone &box, - ENUM_X_DIRECTION &dir, - X121SMCStrategySignalProviderData &provider, - int barIndex = 0 // -) -{ - // - bool result = false; - - // - box.Clean(); - dir = X_DIRECTION_NONE; - - // - // Fil Selected Data ... - XPOIState cState; - X121Conditions cXConditions; - XPOIStateEvents cStateEvents; - XC121SMCCycleHelper *cHelper; - X121SMCCycleConditions cConditions; - result = provider.SelectCycle( - cycle, - cState, - cStateEvents, - cXConditions, - cHelper, - cConditions // - ); - if (!result) - { - // - cState.Clean(); - ZeroMemory(cHelper); - cConditions.Clean(); - cXConditions.Clean(); - cStateEvents.Clean(); - - // - return result; - } - - // - // Normalize Args ... - - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - int idx = -1; - int count = 0; - bool has = false; - - // - int zIDX = barIndex; - int cIDX = zIDX + 1; - int pIDX = cIDX + 1; - int ppIDX = pIDX + 1; - - // - bool isBullish = false; - bool isBearish = false; - - // - XOHCL zBar; - XOHCL cBar; - XOHCL pBar; - XOHCL pPBar; - - // - // Initial Bars ... - result = zBar.Init( - cState.symbol, - cState.period, - barIndex // - ); - result = - result && - zBar.GetPreviousBar(cBar); - result = - result && - cBar.GetPreviousBar(pBar); - result = - result && - pBar.GetPreviousBar(pPBar); - if (!result) - { - // - zBar.Clean(); - cBar.Clean(); - pBar.Clean(); - cState.Clean(); - ZeroMemory(cHelper); - cConditions.Clean(); - cXConditions.Clean(); - - // - return result; - } - - // - // Checking Conditions ... - - // - // XSTR ... - bool isStrIsBullish = - (cXConditions.isStrBullish || - cXConditions.isStrSwitchedToBullish); - bool isStrIsBearish = - (cXConditions.isStrBearish || - cXConditions.isStrSwitchedToBearish); - - // - // Detecting Str Box ... - XBoxZone strBox; - bool hasStrBox = false; - if (!hasStrBox) - { - // - hasStrBox = - cXConditions.isStrBullish || - cXConditions.isStrBearish; - if (hasStrBox) - { - // - ENUM_X_DIRECTION strDir = - cXConditions.isStrBullish - ? X_DIRECTION_BULLISH - : X_DIRECTION_BEARISH; - - // - XOHCL lastBar; - ENUM_X_DIRECTION lastDir; - bool hasLast = - cHelper - .DetectNearestStrSwitched( - lastBar, - lastDir, - zIDX // - ); - - // - XOHCL prevBar; - ENUM_X_DIRECTION prevDir; - bool hasPrev = - hasLast && - cHelper - .DetectNearestStrSwitched( - prevBar, - prevDir, - lastBar.Index() + 1 // - ); - - // - hasStrBox = - hasLast && - hasPrev; - if (hasStrBox) - { - // - int fromIDX = MathMax( - lastBar.Index(), - prevBar.Index() // - ); - - // - string symbol = cBar.symbol; - ENUM_TIMEFRAMES period = cBar.period; - - // - datetime from = GetBarTime( - symbol, - period, - fromIDX // - ); - - // - int length = fromIDX - barIndex; - - // - double upper = zBar.FindHighest( - length, - MODE_HIGH // - ); - - // - double lower = zBar.FindLowest( - length, - MODE_LOW // - ); - - // - strBox.from = from; - strBox.dir = strDir; - strBox.lower = lower; - strBox.upper = upper; - strBox.symbol = symbol; - strBox.period = period; - strBox.type = "XSTRBox"; - strBox.to = TimeCurrent(); - - // - hasStrBox = strBox.IsValid(); - } - - // - lastBar.Clean(); - prevBar.Clean(); - } - } - - // - // XFastMa ... - - // - bool isFastMaOverStr = - (cXConditions.x3maFastBuffer[cIDX] > cXConditions.strBuffer[cIDX]); - - // - bool isFastMaUnderStr = - (cXConditions.x3maFastBuffer[cIDX] < cXConditions.strBuffer[cIDX]); - - // - bool isFastMaBullishReject = - cBar.low < pBar.low && - cBar.low > cXConditions.strBuffer[cIDX] && - cBar.low < cXConditions.x3maFastBuffer[cIDX] && - cBar.GetDown() > cXConditions.x3maFastBuffer[cIDX]; - - // - bool isFastMaBearishReject = - cBar.high > pBar.high && - cBar.high < cXConditions.strBuffer[cIDX] && - cBar.high > cXConditions.x3maFastBuffer[cIDX] && - cBar.GetUp() < cXConditions.x3maFastBuffer[cIDX]; - - // - // Summarize Conditions ... - - // - isBullish = - // - // false - hasStrBox && - isStrIsBullish && - isFastMaOverStr && - isFastMaBullishReject - // - // - ; - - // - isBearish = - // - // false - hasStrBox && - isStrIsBearish && - isFastMaUnderStr && - isFastMaBearishReject - // - ; - - // - // Filling Requirements ... - result = - isBullish || - isBearish; - if (result) - { - // - XCPOIDrawer *drawer = provider.visionCycleHelper.mPOIDrawer; - XCBoxObject *iObj; - bool isCreated = drawer.DrawBox( - strBox, - iObj // - ); - if (isCreated) - { - // - Print("STRBox"); - } - - // - dir = - isBullish - ? X_DIRECTION_BULLISH - : X_DIRECTION_BEARISH; - - // - box.dir = dir; - box.from = pPBar.time; - box.to = TimeCurrent(); - box.symbol = cBar.symbol; - box.period = cBar.period; - - // - double points = GetPoints(box.symbol); - - // - double pivot = cXConditions.strBuffer[cIDX]; - // isBullish - // ? cBar.low - (points * 5) - // : cBar.high + (points * 5); - - // - double point = GetEntry( - cBar.symbol, - dir // - ); - - // - box.upper = - isBullish - ? point - : pivot; - - // - box.lower = - isBullish - ? pivot - : point; - - // - bool drawBoxes = true; - if (drawBoxes) - { - // - } - } - - // - // Check All Conditions ... - result = - box.IsValid() && - HasDirection(dir) && - (isBullish || - isBearish); - - // - // Cleanup Resources ... - zBar.Clean(); - cBar.Clean(); - pBar.Clean(); - pPBar.Clean(); - cState.Clean(); - strBox.Clean(); - cConditions.Clean(); - cConditions.Clean(); - ZeroMemory(cHelper); - cStateEvents.Clean(); - cXConditions.Clean(); - - // - return result; -} diff --git a/Documents/BKP/Indicators/bos-choch.mq5 b/Documents/BKP/Indicators/bos-choch.mq5 deleted file mode 100644 index f8ea516a..00000000 --- a/Documents/BKP/Indicators/bos-choch.mq5 +++ /dev/null @@ -1,128 +0,0 @@ -#property copyright "Your Name" -#property link "https://www.example.com" -#property version "1.00" -#property indicator_chart_window -#property indicator_buffers 0 -#property indicator_plots 0 - -// Input parameters -input int SwingPeriod = 5; // Lookback period for swing detection - -// Global variables -double LastSwingHigh = 0, LastSwingLow = 0; -bool IsBullish = false; - -//+------------------------------------------------------------------+ -int OnInit() -{ - return(INIT_SUCCEEDED); -} - -//+------------------------------------------------------------------+ -int OnCalculate(const int rates_total, - const int prev_calculated, - const datetime &time[], - const double &open[], - const double &high[], - const double &low[], - const double &close[], - const long &tick_volume[], - const long &volume[], - const int &spread[]) -{ - // Start from the latest bar - for(int i = rates_total - prev_calculated - 1; i >= 0; i--) - { - // Detect swing high and low - if(IsSwingHigh(high, low, i, SwingPeriod)) - { - LastSwingHigh = high[i]; - CheckStructure(i, high[i], low[i], time[i]); - } - if(IsSwingLow(high, low, i, SwingPeriod)) - { - LastSwingLow = low[i]; - CheckStructure(i, high[i], low[i], time[i]); - } - } - return(rates_total); -} - -//+------------------------------------------------------------------+ -bool IsSwingHigh(const double &high[], const double &low[], int index, int period) -{ - if(index < period || index >= ArraySize(high) - period) return false; - for(int i = 1; i <= period; i++) - { - if(high[index] <= high[index - i] || high[index] <= high[index + i]) - return false; - } - return true; -} - -//+------------------------------------------------------------------+ -bool IsSwingLow(const double &high[], const double &low[], int index, int period) -{ - if(index < period || index >= ArraySize(low) - period) return false; - for(int i = 1; i <= period; i++) - { - if(low[index] >= low[index - i] || low[index] >= low[index + i]) - return false; - } - return true; -} - -//+------------------------------------------------------------------+ -void CheckStructure(int index, double high, double low, datetime time) -{ - // Determine trend direction - if(LastSwingHigh > 0 && LastSwingLow > 0) - { - IsBullish = (LastSwingHigh > LastSwingLow); - - // Check for BOS - if(IsBullish && high > LastSwingHigh) - { - LastSwingHigh = high; - ObjectCreate(0, "BOS_" + TimeToString(time), OBJ_TEXT, 0, time, high); - ObjectSetString(0, "BOS_" + TimeToString(time), OBJPROP_TEXT, "BOS"); - ObjectSetInteger(0, "BOS_" + TimeToString(time), OBJPROP_COLOR, clrGreen); - Alert("Break of Structure (BOS) detected at " + DoubleToString(high, 5)); - } - else if(!IsBullish && low < LastSwingLow) - { - LastSwingLow = low; - ObjectCreate(0, "BOS_" + TimeToString(time), OBJ_TEXT, 0, time, low); - ObjectSetString(0, "BOS_" + TimeToString(time), OBJPROP_TEXT, "BOS"); - ObjectSetInteger(0, "BOS_" + TimeToString(time), OBJPROP_COLOR, clrRed); - Alert("Break of Structure (BOS) detected at " + DoubleToString(low, 5)); - } - - // Check for CHoCH - if(IsBullish && low < LastSwingLow) - { - LastSwingLow = low; - ObjectCreate(0, "CHoCH_" + TimeToString(time), OBJ_TEXT, 0, time, low); - ObjectSetString(0, "CHoCH_" + TimeToString(time), OBJPROP_TEXT, "CHoCH"); - ObjectSetInteger(0, "CHoCH_" + TimeToString(time), OBJPROP_COLOR, clrRed); - Alert("Change of Character (CHoCH) detected at " + DoubleToString(low, 5)); - IsBullish = false; // Trend may reverse - } - else if(!IsBullish && high > LastSwingHigh) - { - LastSwingHigh = high; - ObjectCreate(0, "CHoCH_" + TimeToString(time), OBJ_TEXT, 0, time, high); - ObjectSetString(0, "CHoCH_" + TimeToString(time), OBJPROP_TEXT, "CHoCH"); - ObjectSetInteger(0, "CHoCH_" + TimeToString(time), OBJPROP_COLOR, clrGreen); - Alert("Change of Character (CHoCH) detected at " + DoubleToString(high, 5)); - IsBullish = true; // Trend may reverse - } - } -} - -//+------------------------------------------------------------------+ -void OnDeinit(const int reason) -{ - ObjectsDeleteAll(0, "BOS_"); - ObjectsDeleteAll(0, "CHoCH_"); -} \ No newline at end of file diff --git a/Documents/BKP/Indicators/x-saherelm.x121.xsmc.mq5 b/Documents/BKP/Indicators/x-saherelm.x121.xsmc.mq5 deleted file mode 100644 index 44b827b8..00000000 --- a/Documents/BKP/Indicators/x-saherelm.x121.xsmc.mq5 +++ /dev/null @@ -1,888 +0,0 @@ -/////////////////////////////////////////////////////// -// -// SaherElm IT Center MQL5 Indicator -// ------------------------------------------------- -// Name: X121 XSMC -// Description: XSMC ... -// -// -// 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 XSMC Indicator" -#property strict - -// -// Definitions ... - -// -#define ShortName "X121 XSMC" - -// -// Includes Common Library ... -#include "../Libraries/x-saherelm.common.lib.mq5" - -// -// Inputs ... - -// -// Market ... -input group "Market"; -input int swingLength = 5; // Swing Length - -// -input group "Presentation"; - -// -input int startCalculationForLastBars = 1000; // Calculate Last n Bars -input int trendArrowCode = 117; // Trend Arrow -input int swingLowsArrowCode = 159; // Swing Lows Arrow -input int swingHighsArrowCode = 159; // Swing Highs Arrow -input int swingLowBOSArrowCode = 233; // Swing Low BOS Arrow -input int swingHighBOSArrowCode = 234; // Swing High BOS Arrow -input int swingLowCHOCHArrowCode = 225; // Swing Low CHOCH Arrow -input int swingHighCHOCHArrowCode = 226; // Swing High CHOCH Arrow - -// -input bool showTrend = true; // Show Trend -input bool showSwingLows = true; // Show Swing Lows -input bool showSwingHighs = true; // Show Swing Highs -input bool showSwingLowBOS = true; // Show Swing Low BOS -input bool showSwingHighBOS = true; // Show Swing High BOS -input bool showSwingLowCHOCH = true; // Show Swing Low CHOCH -input bool showSwingHighCHOCH = true; // Show Swing High CHOCH - -// -// Buffers ... - -// -#define hideColorIDX 0 -#define bullishColorIDX 1 -#define bearishColorIDX 2 -#define neuturalColorIDX 3 - -// -#define emptyValue 0.0 - -// -#property indicator_chart_window - -// -#property indicator_buffers 9 -#property indicator_plots 7 - -// -// Plot Buffers ... - -// -// Swing Lows ... - -// -#define swingLowsBufferIndex 0 -double swingLowsBuffer[]; - -// -#property indicator_label1 "X121 SWL" -#property indicator_type1 DRAW_ARROW -#property indicator_color1 clrAqua -#property indicator_width1 1 - -// -// Swng Highs ... - -// -#define swingHighsBufferIndex 1 -double swingHighsBuffer[]; - -// -#property indicator_label2 "X121 SWH" -#property indicator_type2 DRAW_ARROW -#property indicator_color2 clrMagenta -#property indicator_width2 1 - -// -// Swing Low BOS ... -#define swingLowsBOSBufferIndex 2 -double swingLowsBOSBuffer[]; - -// -#property indicator_label3 "X121 SWLBOS" -#property indicator_type3 DRAW_ARROW -#property indicator_color3 clrAqua -#property indicator_width3 3 - -// -// Swing High BOS ... -#define swingHighsBOSBufferIndex 3 -double swingHighsBOSBuffer[]; - -// -#property indicator_label4 "X121 SWHBOS" -#property indicator_type4 DRAW_ARROW -#property indicator_color4 clrMagenta -#property indicator_width4 3 - -// -// Swing Low CHOCH ... -#define swingLowsCHOCHBufferIndex 4 -double swingLowsCHOCHBuffer[]; - -// -#property indicator_label5 "X121 SWLCHOCH" -#property indicator_type5 DRAW_ARROW -#property indicator_color5 clrYellow -#property indicator_width5 3 - -// -// Swing High CHOCH ... -#define swingHighsCHOCHBufferIndex 5 -double swingHighsCHOCHBuffer[]; - -// -#property indicator_label6 "X121 SWHCHOCH" -#property indicator_type6 DRAW_ARROW -#property indicator_color6 clrYellow -#property indicator_width6 3 - -// -// Trend ... -#define trendBufferIndex 6 -double trendBuffer[]; - -#define trendColorBufferIndex 7 -double trendColorBuffer[]; - -// -#property indicator_label7 "X121 TRND" -#property indicator_type7 DRAW_COLOR_ARROW -#property indicator_color7 CLR_NONE, clrAqua, clrMagenta, clrGray -#property indicator_width7 3 - -// -// Data Buffers ... - -// -int mLastBufferIndex = 7; - -// -// Trend State ... -#define trendStateBufferIndex mLastBufferIndex + 1 -double trendStateBuffer[]; - -// -// Variables, Properties and etc ... - -// -// this counts Available Bars ... -int limit; - -// -int maxLength; - -// -double lastSwing = 0.0; -ENUM_X_DIRECTION lastSwingDir = X_DIRECTION_NONE; - -// -// Event Handlers ... - -/** - * Initialize Indicator ... - * - * @return ( int ) - */ -int OnInit() -{ - // - // Validate Inputs ... - if (!ValidateInputs()) - { - return INIT_PARAMETERS_INCORRECT; - } - - // - // Initialize Indicator Handlers ... - - // - // 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; -} - -/** - * De Initialize Indicator ... - * - * @param reason: Integer, De Initialization Reason ... - */ -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 -} - -/** - * Calculate Bars ... - * - * @param rates_total: Integer, Total Bars on Chart ... - * @param prev_calculated: Integer, Total Calculated Bars on Charts ... - * @param time: DateTime Array, History of Open Time ... - * @param open: Double Array, History of Open Prices ... - * @param high: Double Array, History of High Prices ... - * @param low: Double Array, History of Low Prices ... - * @param close: Double Array, History of Close Prices ... - * @param tick_volume: Long, History of Tick Volumes on Bar ... - * @param volume: Long, History of Trade Volumes ... - * @param spread: Double, History of Spread Price ... - * - * @return ( int ) - */ -int OnCalculate( - const int rates_total, - const int prev_calculated, - const datetime &time[], - const double &open[], - const double &high[], - const double &low[], - const double &close[], - const long &tick_volume[], - const long &volume[], - const int &spread[] // -) -{ - // - // 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); - - // - limit = (prev_calculated > rates_total || prev_calculated <= 0) - ? rates_total - : (rates_total - prev_calculated) + 1; - - // - // Main Loop ... - for (int i = limit - 1; i >= 0 && !IsStopped(); i--) - { - // - CalculateBuffers( - i, - prev_calculated, - rates_total, - // - open, - high, - close, - low, - tick_volume // - ); - } - - // - return rates_total; -} - -// -// Functions ... - -/** - * Validate Input Args for Initialization ... - * - * @return ( bool ) - */ -bool ValidateInputs() -{ - // - bool result = - // - swingLength > 0 - // - ; - - // - return result; -} - -/** - * Extract Max Length of Inputs ... - * - * @return ( int ) - */ -int ExtractMaxLengthOfInputs() -{ - // - int result = 0; - - // - result = swingLength; - - // - return result; -} - -/** - * Define Required Buffers ... - */ -void DefineBuffers() -{ - // - // Plot Buffers ... - - // - // Swing Lows ... - - // - ENUM_DRAW_TYPE swingLowsDrawType = showSwingLows ? DRAW_ARROW : DRAW_NONE; - - // - ArraySetAsSeries(swingLowsBuffer, true); - SetIndexBuffer(swingLowsBufferIndex, swingLowsBuffer, INDICATOR_DATA); - - // - PlotIndexSetInteger(swingLowsBufferIndex, PLOT_SHOW_DATA, showSwingLows); - PlotIndexSetInteger(swingLowsBufferIndex, PLOT_DRAW_TYPE, swingLowsDrawType); - - // - PlotIndexSetDouble(swingLowsBufferIndex, PLOT_EMPTY_VALUE, emptyValue); - PlotIndexSetInteger(swingLowsBufferIndex, PLOT_ARROW, swingLowsArrowCode); - - // - // Swing Highs ... - - // - ENUM_DRAW_TYPE swingHighsDrawType = showSwingHighs ? DRAW_ARROW : DRAW_NONE; - - // - ArraySetAsSeries(swingHighsBuffer, true); - SetIndexBuffer(swingHighsBufferIndex, swingHighsBuffer, INDICATOR_DATA); - - // - PlotIndexSetInteger(swingHighsBufferIndex, PLOT_SHOW_DATA, showSwingHighs); - PlotIndexSetInteger(swingHighsBufferIndex, PLOT_DRAW_TYPE, swingHighsDrawType); - - // - PlotIndexSetDouble(swingHighsBufferIndex, PLOT_EMPTY_VALUE, emptyValue); - PlotIndexSetInteger(swingHighsBufferIndex, PLOT_ARROW, swingHighsArrowCode); - - // - // Trends ... - - // - ENUM_DRAW_TYPE trendDrawType = showTrend ? DRAW_COLOR_ARROW : DRAW_NONE; - - // - ArraySetAsSeries(trendBuffer, true); - SetIndexBuffer(trendBufferIndex, trendBuffer, INDICATOR_DATA); - - // - PlotIndexSetInteger(trendBufferIndex, PLOT_SHOW_DATA, showTrend); - PlotIndexSetInteger(trendBufferIndex, PLOT_DRAW_TYPE, trendDrawType); - - // - PlotIndexSetDouble(trendBufferIndex, PLOT_EMPTY_VALUE, emptyValue); - PlotIndexSetInteger(trendBufferIndex, PLOT_ARROW, trendArrowCode); - - // - ArraySetAsSeries(trendColorBuffer, true); - SetIndexBuffer(trendColorBufferIndex, trendColorBuffer, INDICATOR_COLOR_INDEX); - - // - // SWLBOS ... - - // - ENUM_DRAW_TYPE swingLowBOSDrawType = showSwingLowBOS ? DRAW_ARROW : DRAW_NONE; - - // - ArraySetAsSeries(swingLowsBOSBuffer, true); - SetIndexBuffer(swingLowsBOSBufferIndex, swingLowsBOSBuffer, INDICATOR_DATA); - - // - PlotIndexSetInteger(swingLowsBOSBufferIndex, PLOT_SHOW_DATA, showSwingLowBOS); - PlotIndexSetInteger(swingLowsBOSBufferIndex, PLOT_DRAW_TYPE, swingLowBOSDrawType); - - // - PlotIndexSetDouble(swingLowsBOSBufferIndex, PLOT_EMPTY_VALUE, emptyValue); - PlotIndexSetInteger(swingLowsBOSBufferIndex, PLOT_ARROW, swingLowBOSArrowCode); - - // - // SWHBOS ... - - // - ENUM_DRAW_TYPE swingHighBOSDrawType = showSwingHighBOS ? DRAW_ARROW : DRAW_NONE; - - // - ArraySetAsSeries(swingHighsBOSBuffer, true); - SetIndexBuffer(swingHighsBOSBufferIndex, swingHighsBOSBuffer, INDICATOR_DATA); - - // - PlotIndexSetInteger(swingHighsBOSBufferIndex, PLOT_SHOW_DATA, showSwingHighBOS); - PlotIndexSetInteger(swingHighsBOSBufferIndex, PLOT_DRAW_TYPE, swingHighBOSDrawType); - - // - PlotIndexSetDouble(swingHighsBOSBufferIndex, PLOT_EMPTY_VALUE, emptyValue); - PlotIndexSetInteger(swingHighsBOSBufferIndex, PLOT_ARROW, swingHighBOSArrowCode); - - // - // SWLCHOCH ... - - // - ENUM_DRAW_TYPE swingLowCHOCHDrawType = showSwingLowCHOCH ? DRAW_ARROW : DRAW_NONE; - - // - ArraySetAsSeries(swingLowsCHOCHBuffer, true); - SetIndexBuffer(swingLowsCHOCHBufferIndex, swingLowsCHOCHBuffer, INDICATOR_DATA); - - // - PlotIndexSetInteger(swingLowsCHOCHBufferIndex, PLOT_SHOW_DATA, showSwingLowCHOCH); - PlotIndexSetInteger(swingLowsCHOCHBufferIndex, PLOT_DRAW_TYPE, swingLowCHOCHDrawType); - - // - PlotIndexSetDouble(swingLowsCHOCHBufferIndex, PLOT_EMPTY_VALUE, emptyValue); - PlotIndexSetInteger(swingLowsCHOCHBufferIndex, PLOT_ARROW, swingLowCHOCHArrowCode); - - // - // SWHCHOCH ... - - // - ENUM_DRAW_TYPE swingHighCHOCHDrawType = showSwingHighCHOCH ? DRAW_ARROW : DRAW_NONE; - - // - ArraySetAsSeries(swingHighsCHOCHBuffer, true); - SetIndexBuffer(swingHighsCHOCHBufferIndex, swingHighsCHOCHBuffer, INDICATOR_DATA); - - // - PlotIndexSetInteger(swingHighsCHOCHBufferIndex, PLOT_SHOW_DATA, showSwingHighCHOCH); - PlotIndexSetInteger(swingHighsCHOCHBufferIndex, PLOT_DRAW_TYPE, swingHighCHOCHDrawType); - - // - PlotIndexSetDouble(swingHighsCHOCHBufferIndex, PLOT_EMPTY_VALUE, emptyValue); - PlotIndexSetInteger(swingHighsCHOCHBufferIndex, PLOT_ARROW, swingHighCHOCHArrowCode); - - // - // Data Buffers ... - - // - ArraySetAsSeries(trendStateBuffer, true); - SetIndexBuffer(trendStateBufferIndex, trendStateBuffer, INDICATOR_CALCULATIONS); -} - -/** - * Set Indicator Short Name and also we can define Buffers Labels ... - */ -void SetIndicatorName() -{ - // - IndicatorSetString(INDICATOR_SHORTNAME, ShortName); - IndicatorSetInteger(INDICATOR_DIGITS, 2); -} - -/** - * Calculate Custom Buffers ... - * - * @param bar_index: Integer, Represent Current Bar ... - * @param prevCalculated: Integer, Represent Previous Calculated Bars ... - * @param ratesTotal: Integer, Represents All Available Bars ... - * @param open: Double Array, History of Open Prices ... - * @param high: Double Array, History of High Prices ... - * @param close: Double Array, History of Close Prices ... - * @param low: Double Array, History of Low Prices ... - * @param tickVolume: Long, History of Tick Volumes on Bar ... - */ -void CalculateBuffers( - int bar_index, // Selected Bar Index - const int prevCalculated, - const int ratesTotal, - const double &open[], - const double &high[], - const double &close[], - const double &low[], - const long &tickVolume[] // -) -{ - // - int barsLimit = startCalculationForLastBars > 0 - ? startCalculationForLastBars - : 0; - // - // bool canCalculate = true; - bool canCalculate = - barsLimit == 0 || - bar_index <= barsLimit; - if (canCalculate) - { - // - CalculateValues( - bar_index, - prevCalculated, - ratesTotal, - open, - high, - close, - low // - ); - } - else - { - FillBuffersZero(bar_index); - } -} - -// -// Custom ... - -/** - * Fill All Bufers to Zero Vlue for Specified Bar Index ... - * - * @param barIndex: Integer ... - */ -void FillBuffersZero(int barIndex) -{ - // - trendBuffer[barIndex] = emptyValue; - swingLowsBuffer[barIndex] = emptyValue; - swingHighsBuffer[barIndex] = emptyValue; - swingLowsBOSBuffer[barIndex] = emptyValue; - swingHighsBOSBuffer[barIndex] = emptyValue; - swingLowsCHOCHBuffer[barIndex] = emptyValue; - swingHighsCHOCHBuffer[barIndex] = emptyValue; - - // - trendColorBuffer[barIndex] = hideColorIDX; - trendStateBuffer[barIndex] = (double)((int)X_DIRECTION_NONE); -} - -/** - * Calculate Values ... - * - * @param bar_index: Integer, Represent Current Bar ... - * @param prevCalculated: Integer, Represent Previous Calculated Bars ... - * @param ratesTotal: Integer, Represents All Available Bars ... - * @param open: Double Array, History of Open Prices ... - * @param high: Double Array, History of High Prices ... - * @param close: Double Array, History of Close Prices ... - * @param low: Double Array, History of Low Prices ... - */ -void CalculateValues( - int bar_index, // Selected Bar Index - const int prevCalculated, - const int ratesTotal, - const double &open[], - const double &high[], - const double &close[], - const double &low[] // -) -{ - // - int lastBarIndex = bar_index + 1; - bool isFirstBar = - startCalculationForLastBars > 0 - ? bar_index == startCalculationForLastBars - : bar_index == ratesTotal; - - // - double iLow = low[bar_index]; - double iHigh = high[bar_index]; - - // - // Swing Low ... - double lastSwingLow = isFirstBar - ? emptyValue - : swingLowsBuffer[lastBarIndex]; - bool isSwingLow = IsSwingLow(high, low, bar_index, swingLength); - double iSwingLow = - !isSwingLow - ? lastSwingLow - : iLow; - swingLowsBuffer[bar_index] = iSwingLow; - - // - // Swing High ... - double lastSwingHigh = isFirstBar - ? emptyValue - : swingHighsBuffer[lastBarIndex]; - bool isSwingHigh = IsSwingHigh(high, low, bar_index, swingLength); - double iSwingHigh = - !isSwingHigh - ? lastSwingHigh - : iHigh; - swingHighsBuffer[bar_index] = iSwingHigh; - - // - // Detect Last Swing/Last Swing Direction ... - bool isSwing = isSwingLow || - isSwingHigh; - if (isSwing) - { - // - if (isSwingLow) - { - // - lastSwing = iSwingLow; - lastSwingDir = X_DIRECTION_BULLISH; - } - else if (isSwingHigh) - { - // - lastSwing = iSwingHigh; - lastSwingDir = X_DIRECTION_BEARISH; - } - } - - // - // Detect Trend ... - - // - // Detecting Trend Direction ... - ENUM_X_DIRECTION lastTendDir = - isFirstBar - ? X_DIRECTION_NONE - : (ENUM_X_DIRECTION)((int)trendStateBuffer[lastBarIndex]); - ENUM_X_DIRECTION iTrendDir = - isSwingLow && - iSwingLow > lastSwingLow - ? X_DIRECTION_BULLISH - : isSwingHigh && - iSwingHigh < lastSwingHigh - ? X_DIRECTION_BEARISH - : lastTendDir; - bool isTrendChanged = - HasDirection(lastTendDir) && - HasDirection(iTrendDir) && - lastTendDir != iTrendDir; - - // - // Detecting Trend State ... - double iTrendState = (int)iTrendDir; - trendStateBuffer[bar_index] = iTrendState; - - // - // Detecting Trend Value ... - double lastTrendValue = - isFirstBar - ? emptyValue - : trendBuffer[lastBarIndex]; - double iTrendValue = - IsBullish(iTrendDir) - ? isTrendChanged - ? iLow - : lastTrendValue - : IsBearish(iTrendDir) - ? isTrendChanged - ? iHigh - : lastTrendValue - : lastTrendValue; - trendBuffer[bar_index] = iTrendValue; - - // - // Detecting Trend Color ... - double iTrendColorValue = - IsBullish(iTrendDir) - ? bullishColorIDX - : IsBearish(iTrendDir) - ? bearishColorIDX - : hideColorIDX; - bool isTrendBreaked = false; - if (IsBullish(iTrendDir)) - { - // - isTrendBreaked = iHigh < lastTrendValue; - if (isTrendBreaked) - { - iTrendColorValue = bearishColorIDX; - } - } - else if (IsBearish(iTrendDir)) - { - // - isTrendBreaked = iLow > lastTrendValue; - if (isTrendBreaked) - { - iTrendColorValue = bullishColorIDX; - } - } - trendColorBuffer[bar_index] = iTrendColorValue; - - // - bool isTrendBullish = iTrendColorValue == bullishColorIDX; - bool isTrendBearish = iTrendColorValue == bearishColorIDX; - - // - // Detecting BOS ... - - // - // Swing Low BOS ... - double lastSwingLowBOSValue = - isFirstBar - ? emptyValue - : swingLowsBOSBuffer[lastBarIndex]; - double iSwingLowBOSValue = - isTrendBullish && - iHigh > lastSwing - ? iLow - : emptyValue; - bool isSwingLowBOSBreaked = - iSwingLowBOSValue != emptyValue && - iLow < iSwingLowBOSValue; - if (isSwingLowBOSBreaked) - { - iSwingLowBOSValue = emptyValue; - } - swingLowsBOSBuffer[bar_index] = iSwingLowBOSValue; - - // - // Swing High BOS ... - double lastSwingHighBOSValue = - isFirstBar - ? emptyValue - : swingHighsBOSBuffer[lastBarIndex]; - double iSwingHighBOSValue = - isTrendBearish && - iLow < lastSwing - ? iHigh - : emptyValue; - bool isSwingHighBOSBreaked = - iSwingHighBOSValue != emptyValue && - iHigh > iSwingHighBOSValue; - if (isSwingHighBOSBreaked) - { - iSwingHighBOSValue = emptyValue; - } - swingHighsBOSBuffer[bar_index] = iSwingHighBOSValue; - - // - // Detecting CHOCHs ... - - // - // Swing Low CHOCH ... - double lastSwingLowCHOCHValue = - isFirstBar - ? emptyValue - : swingLowsCHOCHBuffer[lastBarIndex]; - double iSwingLowCHOCHValue = - isTrendBullish && - iLow < lastSwing - ? iLow - : emptyValue; - swingLowsCHOCHBuffer[bar_index] = iSwingLowCHOCHValue; - - // - // Swing High CHOCH ... - double lastSwingHighCHOCHValue = - isFirstBar - ? emptyValue - : swingHighsCHOCHBuffer[lastBarIndex]; - double iSwingHighCHOCHValue = - isTrendBearish && - iHigh > lastSwing - ? iHigh - : emptyValue; - swingHighsCHOCHBuffer[bar_index] = iSwingHighCHOCHValue; -} - -// -// Tools ... - -// -bool IsSwingLow( - const double &high[], - const double &low[], - int index, - int length // -) -{ - // - bool result = false; - - // - result = index - length > 0; - if (!result) - { - return result; - } - - // - for (int i = 1; i <= length; i++) - { - // - result = low[index] < low[index - 1] && - low[index] < low[index + i]; - if (!result) - { - break; - } - } - - // - return result; -} - -// -bool IsSwingHigh( - const double &high[], - const double &low[], - int index, - int length // -) -{ - // - bool result = false; - - // - result = index - length > 0; - if (!result) - { - return result; - } - - // - for (int i = 1; i <= length; i++) - { - // - result = high[index] > high[index - 1] && - high[index] > high[index + i]; - if (!result) - { - break; - } - } - - // - return result; -} - -// \ No newline at end of file diff --git a/Documents/BKP/Indicators/x-saherelm.x121.xstr.helper.mq5 b/Documents/BKP/Indicators/x-saherelm.x121.xstr.helper.mq5 deleted file mode 100644 index bdfc79ed..00000000 --- a/Documents/BKP/Indicators/x-saherelm.x121.xstr.helper.mq5 +++ /dev/null @@ -1,1142 +0,0 @@ -/////////////////////////////////////////////////////// -// -// SaherElm IT Center MQL5 Helper Class Library -// ---------------------------------------------- -// Name: XCX121XSTRHelper -// Description: provides all Indicator -// Helper requirements ... -// -// -// Maintainer: -// ------------ -// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) -// -////////////////////////////////////////////////////// -// -// Global Properties ... -#property library -#property copyright "Copyright 2023, SaherElm IT Center" -#property link "https://www.saherelm.ir" -#property version "1.00" -#property strict - -// -// Imports ... -#include "../Classes/x-saherelm.x-helper.class.mq5" - -// -// Definitions ... - -// -// Definitions ... -enum ENUM_X121_XSTR_BUFFERS -{ - // - X121_XSTR_LINE = 0, - X121_XSTR_UP_LINE = 2, - X121_XSTR_DOWN_LINE = 3, - X121_XSTR_ATR_LINE = 4, - X121_XSTR_PRICE_LINE = 5, - X121_XSTR_STATE_LINE = 6, -}; - -// -// Input Models ... -struct X121XSTRInputs -{ - // - // Props ... - - int strLength; // Length - double strMultiplier; // Multiplier - ENUM_APPLIED_PRICE strAppliedTo; // Applied To - - // - bool showStr; // Show Upper Zone - bool showStrUpper; // Show Str Upper - bool showStrLower; // Show Str Lower - - // - // Constructor(s) ... - X121XSTRInputs() - { - // - Clean(); - } - - // - // Tools ... - - // - // Clean ... - void Clean() - { - // - strLength = 0; - strMultiplier = 0.0; - strAppliedTo = PRICE_MEDIAN; - - // - showStr = false; - showStrUpper = false; - showStrLower = false; - - // - ZeroMemory(this); - } - - // - // Default ... - void Default() - { - // - strLength = 14; - strMultiplier = 3.0; - strAppliedTo = PRICE_CLOSE; - - // - showStr = true; - showStrUpper = true; - showStrLower = true; - } - - // - // Validate ... - bool IsValid() - { - // - bool result = false; - - // - result = - // - strLength > 0 && - strMultiplier > 0 - // - ; - - // - return result; - } - - // - // Retrieve MAx Length ... - int Max() - { - // - int result = 0; - - // - result = MathMax(1, strLength); - - // - return result; - } -}; - -// -// Conditions ... -struct X121XSTRConditions -{ - // - // Common ... - string symbol; - ENUM_TIMEFRAMES period; - datetime time; - - // - // Buffers ... - double strBuffer[]; - double atrBuffer[]; - double strPriceBuffer[]; - double strUpBuffer[]; - double strDownBuffer[]; - double strStateBuffer[]; - - // - // Conditions ... - - // - bool isStrBullish; - bool isStrBearish; - - // - bool isStrSwitchedToBullish; - bool isStrSwitchedToBearish; - - // - // bool isCloseLower - - // - // Constructor ... - X121XSTRConditions() - { - Clean(); - } - - // - // Tools ... - - /** - * Cleaning Up ... - */ - void Clean() - { - // - // Commons ... - symbol = NULL; - period = NULL; - time = NULL; - - // - // Buffers ... - - // - Clean(strBuffer); - Clean(atrBuffer); - Clean(strPriceBuffer); - Clean(strUpBuffer); - Clean(strDownBuffer); - Clean(strStateBuffer); - - // - ArraySetAsSeries(strBuffer, true); - ArraySetAsSeries(atrBuffer, true); - ArraySetAsSeries(strPriceBuffer, true); - ArraySetAsSeries(strUpBuffer, true); - ArraySetAsSeries(strDownBuffer, true); - ArraySetAsSeries(strStateBuffer, true); - - // - // Conditions ... - - // - isStrBullish = false; - isStrBearish = false; - - // - isStrSwitchedToBullish = false; - isStrSwitchedToBearish = false; - - // - ZeroMemory(this); - } - - /** - * Generate Conditions Scores ... - * - * @param bullishScore: Double, Directional Scores Reference ... - * @param bearishScore: Double, Directional Scores Reference ... - */ - void GenerateScore( - double &bullishScore, - double &bearishScore // - ) - { - // - bullishScore = 0; - bearishScore = 0; - - // - double score = 1; - double minScore = 0.5; - double highScore = 1.5; - - // - if (isStrBullish) - { - bullishScore += minScore; - } - if (isStrSwitchedToBullish) - { - bullishScore += score; - } - - // - if (isStrBearish) - { - bearishScore += minScore; - } - if (isStrSwitchedToBearish) - { - bearishScore += score; - } - } - - /** - * Generate Summary String for Represent Conditions State ... - * - * @param onlyCommons: Boolean, Just Generate Only Commons Conditions ... - * @param onlyConditions: Boolean, Just Generate Only Conditions ... - * @param includeScores: Boolean, Attach Scores Representations on Result ... - * @param ignoreFalseConditions: Boolean, Ignore False Conditions on Result ... - * @param separator: String, Separate Lines ... - * - * @return ( string ) - */ - string GenerateSummary( - bool onlyCommons = false, - bool onlyConditions = false, - bool includeScores = true, - bool ignoreFalseConditions = true, - string separator = "\n" // - ) - { - // - string result = NULL; - - // - double bullishScore = 0; - double bearishScore = 0; - GenerateScore( - bullishScore, - bearishScore // - ); - - // - string scoresStr = - // - "Scores: " + separator + - "---------------" + separator + - "Bullish: " + ToString(bullishScore) + separator + - "Bearish: " + ToString(bearishScore) + separator + - "" - // - ; - - // - string commonStr = GenerateSpecifiedCommonSummary( - this, - separator, - includeScores // - ); - - // - string conditionsStr = - // - "-----------------------" + separator + - "XSTR: " + separator + - "-----------------------" + separator + - ToString("isStrBullish", isStrBullish, ignoreFalseConditions, separator) + - ToString("isStrBearish", isStrBearish, ignoreFalseConditions, separator) + - ToString("isStrSwitchedToBullish", isStrSwitchedToBullish, ignoreFalseConditions, separator) + - ToString("isStrSwitchedToBearish", isStrSwitchedToBearish, ignoreFalseConditions, separator) + - // - "" - // - ; - - // - result = - // - "[" + GetTag() + "]" + separator + - (onlyConditions - ? "" - : commonStr) + - (!includeScores - ? "" - : scoresStr) + - " " + separator + - (onlyCommons - ? "" - : conditionsStr) + - "" - // - ; - - // - return result; - } - - /** - * Retrieve nique Tag Identifier ... - * - * @return ( string ) - */ - string GetTag() - { - return GetTypeName(this); - } - - // -}; - -// -// Class ... -class XCX121XSTRHelper : public XCBaseHelper -{ - // - // Public ... - public: - // - // Props ... - - // - // Constructors ... - XCX121XSTRHelper() - : XCBaseHelper(_Symbol, _Period) - { - } - - // - // Deconstructor ... - ~XCX121XSTRHelper() - { - // - mInputs.Clean(); - - // - Clean(strBuffer); - Clean(atrBuffer); - Clean(strPriceBuffer); - Clean(strUpBuffer); - Clean(strDownBuffer); - Clean(strStateBuffer); - } - - // - // Tools ... - bool Init( - string symbol, // Trading Symbol - ENUM_TIMEFRAMES period, // Trading Period - X121XSTRInputs &inputs // Inputs - ) - { - // - bool result = false; - - // - mSymbol = symbol; - mPeriod = period; - - // - result = inputs.IsValid(); - if (!result) - { - return result; - } - - // - ArraySetAsSeries(strBuffer, true); - ArraySetAsSeries(atrBuffer, true); - ArraySetAsSeries(strPriceBuffer, true); - ArraySetAsSeries(strUpBuffer, true); - ArraySetAsSeries(strDownBuffer, true); - ArraySetAsSeries(strStateBuffer, true); - - // - mInputs = inputs; - - // - mHandler = iCustom( - mSymbol, - mPeriod, - "x-saherelm.x121.xstr", - // - // Inputs ... - // - // Market ... - "", - mInputs.strLength, - mInputs.strMultiplier, - mInputs.strAppliedTo, - // - // Presentation ... - "", - mInputs.showStr, - mInputs.showStrUpper, - mInputs.showStrLower - // - ); - result = mHandler != INVALID_HANDLE; - if (!result) - { - return result; - } - - // - return result; - } - - // - // Inputs ... - - // - X121XSTRInputs GetInputs() - { - return mInputs; - } - - // - bool SetInputs( - X121XSTRInputs &inputs // Configs - ) - { - // - return Init( - mSymbol, - mPeriod, - inputs - // - ); - } - - // - // Readers ... - - // - // ATR ... - - // - double GetATR( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(atrBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return atrBuffer[barIndex]; - } - - // - int CopyATR( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - atrBuffer, - buffer, - forceClean - // - ); - } - - // - double GetSTR( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(strBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return strBuffer[barIndex]; - } - - // - int CopySTR( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - strBuffer, - buffer, - forceClean - // - ); - } - - // - double GetSTRState( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(strStateBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return strStateBuffer[barIndex]; - } - - // - int CopySTRState( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - strStateBuffer, - buffer, - forceClean - // - ); - } - - // - double GetSTRPrice( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(strPriceBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return strPriceBuffer[barIndex]; - } - - // - int CopySTRPrice( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - strPriceBuffer, - buffer, - forceClean - // - ); - } - - // - double GetSTRUp( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(strUpBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return strUpBuffer[barIndex]; - } - - // - int CopySTRUp( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - strUpBuffer, - buffer, - forceClean - // - ); - } - - // - double GetSTRDown( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(strDownBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return strDownBuffer[barIndex]; - } - - // - int CopySTRDown( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - strDownBuffer, - buffer, - forceClean - // - ); - } - - // - double GetLastSTR( - ENUM_X_DIRECTION dir, - int barIndex = 0 // - ) - { - // - double result = 0; - - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - if (!HasDirection(dir)) - { - return result; - } - - // - int index = barIndex; - bool isBullish = IsBullish(dir); - - // - bool canContinue = true; - while (canContinue) - { - // - double iStr = GetSTR(index); - double iState = GetSTRState(index); - - // - canContinue = - isBullish - ? iState < 0 - : iState > 0; - if (!canContinue) - { - // - result = iStr; - break; - } - - // - index++; - } - - // - return result; - } - - // - void Free() override - { - Cleanup(10); - } - - // - bool GetConditions( - X121XSTRConditions &conditions, // - int barIndex = 0, // - int loopback = 5 // - ) - { - // - bool result = true; - - // - if (loopback < 5) - { - loopback = 5; - } - - // - conditions.Clean(); - - // - conditions.symbol = mSymbol; - conditions.period = mPeriod; - conditions.time = TimeCurrent(); - - // - int zIndex = barIndex; - int cIndex = zIndex + 1; - int pIndex = cIndex + 1; - int ppIndex = pIndex + 1; - - // - XOHCL zBar; - result = zBar.Init( - mSymbol, - mPeriod, - zIndex // - ); - if (!result) - { - return result; - } - - // - XOHCL cBar; - result = cBar.Init( - mSymbol, - mPeriod, - cIndex // - ); - if (!result) - { - return result; - } - - // - XOHCL pBar; - result = pBar.Init( - mSymbol, - mPeriod, - pIndex // - ); - if (!result) - { - return result; - } - - // - // Buffers ... - - // - CopyATR( - zIndex, - loopback, - conditions.atrBuffer // - ); - - // - CopySTR( - zIndex, - loopback, - conditions.strBuffer // - ); - - // - CopySTRState( - zIndex, - loopback, - conditions.strStateBuffer // - ); - - // - CopySTRPrice( - zIndex, - loopback, - conditions.strPriceBuffer // - ); - - // - CopySTRUp( - zIndex, - loopback, - conditions.strUpBuffer // - ); - - // - CopySTRDown( - zIndex, - loopback, - conditions.strDownBuffer // - ); - - // - // Conditions ... - - // - int cIDX = 1; - int pIDX = cIDX + 1; - - // - bool isStrBullish = strStateBuffer[cIDX] > 0; - bool isStrBullishPrev = strStateBuffer[pIDX] > 0; - - // - bool isStrBearish = strStateBuffer[cIDX] < 0; - bool isStrBearishPrev = strStateBuffer[pIDX] < 0; - - // - bool isStrSwitchedToBullish = isStrBullish && - !isStrBullishPrev; - bool isStrSwitchedToBearish = isStrBearish && - !isStrBearishPrev; - - // - conditions.isStrBullish = isStrBullish; - conditions.isStrBearish = isStrBearish; - conditions.isStrSwitchedToBullish = isStrSwitchedToBullish; - conditions.isStrSwitchedToBearish = isStrSwitchedToBearish; - - // - Cleanup(); - - // - zBar.Clean(); - cBar.Clean(); - pBar.Clean(); - - // - return result; - } - - // - // Protected ... - protected: - // - // Private ... - private: - // - // Props ... - X121XSTRInputs mInputs; // Inputs ... - - // - // Buffers ... - double strBuffer[]; - double atrBuffer[]; - double strPriceBuffer[]; - double strUpBuffer[]; - double strDownBuffer[]; - double strStateBuffer[]; - - // - void Calculate( - int barIndex = 0, - int maxRequiredBars = 100 // - ) - { - // - // Buffers ... - if (barIndex < 0) - { - barIndex = 0; - } - - // - // STR ... - CopyBuffer( - mHandler, - X121_XSTR_LINE, - barIndex, - maxRequiredBars, - strBuffer - // - ); - - // - // State ... - CopyBuffer( - mHandler, - X121_XSTR_STATE_LINE, - barIndex, - maxRequiredBars, - strStateBuffer - // - ); - - // - // Price ... - CopyBuffer( - mHandler, - X121_XSTR_PRICE_LINE, - barIndex, - maxRequiredBars, - strPriceBuffer - // - ); - - // - // Up ... - CopyBuffer( - mHandler, - X121_XSTR_UP_LINE, - barIndex, - maxRequiredBars, - strUpBuffer - // - ); - - // - // STR ... - CopyBuffer( - mHandler, - X121_XSTR_DOWN_LINE, - barIndex, - maxRequiredBars, - strDownBuffer - // - ); - - // - // ATR ... - - // - CopyBuffer( - mHandler, - X121_XSTR_ATR_LINE, - barIndex, - maxRequiredBars, - atrBuffer - // - ); - } - - // - void Cleanup( - int maxAllowed = 100 // - ) - { - // - CleanupArray( - strBuffer, - maxAllowed // - ); - - // - CleanupArray( - atrBuffer, - maxAllowed // - ); - - // - CleanupArray( - strPriceBuffer, - maxAllowed // - ); - - // - CleanupArray( - strUpBuffer, - maxAllowed // - ); - - // - CleanupArray( - strDownBuffer, - maxAllowed // - ); - - // - CleanupArray( - strStateBuffer, - maxAllowed // - ); - - // - } - - // -}; - -// -// Tools ... \ No newline at end of file diff --git a/Documents/BKP/Indicators/x-saherelm.x121.xstr.mq5 b/Documents/BKP/Indicators/x-saherelm.x121.xstr.mq5 deleted file mode 100644 index bd69c202..00000000 --- a/Documents/BKP/Indicators/x-saherelm.x121.xstr.mq5 +++ /dev/null @@ -1,637 +0,0 @@ -/////////////////////////////////////////////////////// -// -// SaherElm IT Center MQL5 Indicator -// ------------------------------------------------- -// Name: X121 XSTR -// Description: XSTR ... -// -// -// 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 XSTR Indicator" -#property strict - -// -// Definitions ... - -// -#define ShortName "X121 XSTR" - -// -// Includes Common Library ... -#include "../Libraries/x-saherelm.common.lib.mq5" - -// -// Inputs ... - -// -// Market ... -input group "Market"; -input int strLength = 14; // Length -input double strMultiplier = 3; // Multiplier -input ENUM_APPLIED_PRICE strAppliedTo = PRICE_MEDIAN; // Applied To - -// -input group "Presentation"; - -// -input bool showStr = true; // Show Str -input bool showStrUpper = true; // Show Str Upper -input bool showStrLower = true; // Show Str Lower - -// -// Buffers ... - -// -#define hideColorIDX 0 -#define bullishColorIDX 1 -#define bearishColorIDX 2 -#define neuturalColorIDX 3 - -// -#property indicator_chart_window - -// -#property indicator_buffers 7 -#property indicator_plots 3 - -// -// STR ... -#define strBufferIndex 0 -double strBuffer[]; - -#define strColorBufferIndex 1 -double strColorBuffer[]; - -// -#define strPlotBufferIndex 0 -#property indicator_label1 "X121 STR" -#property indicator_type1 DRAW_COLOR_LINE -#property indicator_color1 CLR_NONE, clrLime, clrRed, clrGray -#property indicator_style1 STYLE_SOLID -#property indicator_width1 2 - -// -// Up ... -#define strUpBufferIndex 2 -double strUpBuffer[]; - -// -#define strUpPlotBufferIndex 1 -#property indicator_label2 "X121 STR U" -#property indicator_type2 DRAW_LINE -#property indicator_color2 C'255,106,0' -#property indicator_style2 STYLE_SOLID -#property indicator_width2 1 - -// -// Down ... -#define strDownBufferIndex 3 -double strDownBuffer[]; - -// -#define strDownPlotBufferIndex 2 -#property indicator_label3 "X121 STR D" -#property indicator_type3 DRAW_LINE -#property indicator_color3 C'255,106,0' -#property indicator_style3 STYLE_SOLID -#property indicator_width3 1 - -// -// Data Buffers ... - -// -int mLastBufferIndex = 3; - -// -// STR ... - -// -// Atr ... -#define atrBufferIndex mLastBufferIndex + 1 -double atrBuffer[]; - -// -// Price ... -#define strPriceBufferIndex mLastBufferIndex + 2 -double strPriceBuffer[]; - -// -// Trend ... -#define strStateBufferIndex mLastBufferIndex + 3 -double strStateBuffer[]; - -// -// Variables, Properties and etc ... - -// -// this counts Available Bars ... -int limit; - -// -int maxLength; - -// -// ATR Handler ... -int atrHandler = INVALID_HANDLE; - -// -bool isStrTrendChanged; -bool isStrStartBearishTrend; -bool isStrStartBullishTrend; - -// -int changeOfTrend; -int startBearishTrend; -int startBullishTrend; - -// -// Event Handlers ... - -/** - * Initialize Indicator ... - * - * @return ( int ) - */ -int OnInit() -{ - // - // Validate Inputs ... - if (!ValidateInputs()) - { - return INIT_PARAMETERS_INCORRECT; - } - - // - // Initialize Indicator Handlers ... - - // - // ATR ... - atrHandler = iATR( - _Symbol, - _Period, - strLength // - ); - bool isInited = atrHandler != INVALID_HANDLE; - if (!isInited) - { - return INIT_FAILED; - } - - // - // 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; -} - -/** - * De Initialize Indicator ... - * - * @param reason: Integer, De Initialization Reason ... - */ -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 - - // - IndicatorRelease(atrHandler); -} - -/** - * Calculate Bars ... - * - * @param rates_total: Integer, Total Bars on Chart ... - * @param prev_calculated: Integer, Total Calculated Bars on Charts ... - * @param time: DateTime Array, History of Open Time ... - * @param open: Double Array, History of Open Prices ... - * @param high: Double Array, History of High Prices ... - * @param low: Double Array, History of Low Prices ... - * @param close: Double Array, History of Close Prices ... - * @param tick_volume: Long, History of Tick Volumes on Bar ... - * @param volume: Long, History of Trade Volumes ... - * @param spread: Double, History of Spread Price ... - * - * @return ( int ) - */ -int OnCalculate( - const int rates_total, - const int prev_calculated, - const datetime &time[], - const double &open[], - const double &high[], - const double &low[], - const double &close[], - const long &tick_volume[], - const long &volume[], - const int &spread[] // -) -{ - // - // Prepare Buffers ... - - // - // Validate Calculated Bars ... - - // - // ATR ... - int atrCalculatedBars = BarsCalculated(atrHandler); - - // - bool isPassedRequiredCalculatedBars = - // - // ATR ... - atrCalculatedBars >= 0 - // - ; - if (!isPassedRequiredCalculatedBars) - { - return prev_calculated; - } - - // - // - // checking for the limit start of calculation of an indicator ... - limit = - (prev_calculated > rates_total || prev_calculated <= 0) - ? maxLength - : prev_calculated - 1; - - // - // Buffers Copy ... - - // - // ATR ... - int copiedAtrs = CopyBuffer(atrHandler, 0, 0, rates_total, atrBuffer); - - // - // Validate Copied Items ... - bool isPassedRequiredCopiedItems = - // - // ATR ... - copiedAtrs >= 0 - // - ; - if (!isPassedRequiredCopiedItems) - { - return prev_calculated; - } - - // - // Main Loop ... - for (int i = limit; i < rates_total && !IsStopped(); i++) - { - // - CalculateBuffers( - i, - prev_calculated, - rates_total, - // - open, - high, - close, - low, - tick_volume // - ); - } - - // - return rates_total; -} - -// -// Functions ... - -/** - * Validate Input Args for Initialization ... - * - * @return ( bool ) - */ -bool ValidateInputs() -{ - // - bool result = - // - // STR ... - strLength > 0 && - strMultiplier > 0 - // - ; - - // - return result; -} - -/** - * Extract Max Length of Inputs ... - * - * @return ( int ) - */ -int ExtractMaxLengthOfInputs() -{ - // - int result = 0; - - // - result = MathMax(1, strLength); - - // - return result; -} - -/** - * Define Required Buffers ... - */ -void DefineBuffers() -{ - // - // STR ... - SetIndexBuffer(strBufferIndex, strBuffer, INDICATOR_DATA); - SetIndexBuffer(strColorBufferIndex, strColorBuffer, INDICATOR_COLOR_INDEX); - - // - ENUM_DRAW_TYPE strUpDrawType = showStrUpper ? DRAW_LINE : DRAW_NONE; - SetIndexBuffer(strUpBufferIndex, strUpBuffer, INDICATOR_DATA); - PlotIndexSetDouble(strUpPlotBufferIndex, PLOT_EMPTY_VALUE, EMPTY_VALUE); - PlotIndexSetInteger(strUpPlotBufferIndex, PLOT_SHOW_DATA, showStrUpper); - PlotIndexSetInteger(strUpPlotBufferIndex, PLOT_DRAW_TYPE, strUpDrawType); - - // - ENUM_DRAW_TYPE strDownDrawType = showStrLower ? DRAW_LINE : DRAW_NONE; - SetIndexBuffer(strDownBufferIndex, strDownBuffer, INDICATOR_DATA); - PlotIndexSetDouble(strDownPlotBufferIndex, PLOT_EMPTY_VALUE, EMPTY_VALUE); - PlotIndexSetInteger(strDownPlotBufferIndex, PLOT_SHOW_DATA, showStrLower); - PlotIndexSetInteger(strDownPlotBufferIndex, PLOT_DRAW_TYPE, strDownDrawType); - - // - // Data Buffers ... - - // - // STR ... - - // - SetIndexBuffer(strPriceBufferIndex, strPriceBuffer, INDICATOR_CALCULATIONS); - SetIndexBuffer(strStateBufferIndex, strStateBuffer, INDICATOR_CALCULATIONS); -} - -/** - * Set Indicator Short Name and also we can define Buffers Labels ... - */ -void SetIndicatorName() -{ - IndicatorSetString(INDICATOR_SHORTNAME, ShortName); -} - -/** - * Calculate Custom Buffers ... - * - * @param bar_index: Integer, Represent Current Bar ... - * @param prevCalculated: Integer, Represent Previous Calculated Bars ... - * @param ratesTotal: Integer, Represents All Available Bars ... - * @param open: Double Array, History of Open Prices ... - * @param high: Double Array, History of High Prices ... - * @param close: Double Array, History of Close Prices ... - * @param low: Double Array, History of Low Prices ... - * @param tickVolume: Long, History of Tick Volumes on Bar ... - */ -void CalculateBuffers( - int bar_index, // Selected Bar Index - const int prevCalculated, - const int ratesTotal, - const double &open[], - const double &high[], - const double &close[], - const double &low[], - const long &tickVolume[] // -) -{ - // - CalculateStr( - bar_index, - prevCalculated, - ratesTotal, - open, - high, - close, - low // - ); -} - -// -// Custom ... - -/** - * Fill All Bufers to Zero Vlue for Specified Bar Index ... - * - * @param barIndex: Integer ... - */ -void FillBuffersZero(int barIndex) -{ - // - // STR ... - strBuffer[barIndex] = 0; - strUpBuffer[barIndex] = 0; - strDownBuffer[barIndex] = 0; - strPriceBuffer[barIndex] = 0; - strColorBuffer[barIndex] = hideColorIDX; - strStateBuffer[barIndex] = hideColorIDX; -} - -/** - * Calculate STR ... - * - * @param bar_index: Integer, Represent Current Bar ... - * @param prevCalculated: Integer, Represent Previous Calculated Bars ... - * @param ratesTotal: Integer, Represents All Available Bars ... - * @param open: Double Array, History of Open Prices ... - * @param high: Double Array, History of High Prices ... - * @param close: Double Array, History of Close Prices ... - * @param low: Double Array, History of Low Prices ... - */ -void CalculateStr( - int bar_index, // Selected Bar Index - const int prevCalculated, - const int ratesTotal, - const double &open[], - const double &high[], - const double &close[], - const double &low[] // -) -{ - // - // Calculated Price ... - ENUM_X_PRICE mPTYpe = ToXPrice(strAppliedTo); - double price = GetAppliedPrice( - mPTYpe, - open, - high, - low, - close, - bar_index // - ); - strPriceBuffer[bar_index] = price; - - // - double atr = atrBuffer[bar_index]; - - // - // Up ... - strUpBuffer[bar_index] = price + (strMultiplier * atr); - - // - // Down ... - strDownBuffer[bar_index] = price - (strMultiplier * atr); - - // - if (close[bar_index] > strUpBuffer[bar_index - 1]) - { - // - strStateBuffer[bar_index] = 1; - if (strStateBuffer[bar_index - 1] == -1) - { - changeOfTrend = 1; - } - } - else if (close[bar_index] < strDownBuffer[bar_index - 1]) - { - // - strStateBuffer[bar_index] = -1; - if (strStateBuffer[bar_index - 1] == 1) - { - changeOfTrend = 1; - } - } - else if (strStateBuffer[bar_index - 1] == 1) - { - // - strStateBuffer[bar_index] = 1; - changeOfTrend = 0; - } - else if (strStateBuffer[bar_index - 1] == -1) - { - // - strStateBuffer[bar_index] = -1; - changeOfTrend = 0; - } - - // - // Down Trend Starting ... - if (strStateBuffer[bar_index] < 0 && strStateBuffer[bar_index - 1] > 0) - { - startBearishTrend = 1; - } - else - { - startBearishTrend = 0; - } - - // - // Up Trend Starting ... - if (strStateBuffer[bar_index] > 0 && strStateBuffer[bar_index - 1] < 0) - { - startBullishTrend = 1; - } - else - { - startBullishTrend = 0; - } - - // - if (strStateBuffer[bar_index] > 0 && strDownBuffer[bar_index] < strDownBuffer[bar_index - 1]) - { - strDownBuffer[bar_index] = strDownBuffer[bar_index - 1]; - } - - // - if (strStateBuffer[bar_index] < 0 && strUpBuffer[bar_index] > strUpBuffer[bar_index - 1]) - { - strUpBuffer[bar_index] = strUpBuffer[bar_index - 1]; - } - - // - if (startBearishTrend == 1) - { - strUpBuffer[bar_index] = strPriceBuffer[bar_index] + (strMultiplier * atr); - } - - // - if (startBullishTrend == 1) - { - strDownBuffer[bar_index] = strPriceBuffer[bar_index] - (strMultiplier * atr); - } - - // - // Draw the indicator ... - - // - double colorIDX = hideColorIDX; - strColorBuffer[bar_index] = colorIDX; - - // - if (strStateBuffer[bar_index] == 1) - { - // - strBuffer[bar_index] = strDownBuffer[bar_index]; - if (changeOfTrend == 1) - { - strBuffer[bar_index - 1] = strBuffer[bar_index - 2]; - changeOfTrend = 0; - } - - // - colorIDX = bullishColorIDX; - } - else if (strStateBuffer[bar_index] == -1) - { - // - strBuffer[bar_index] = strUpBuffer[bar_index]; - if (changeOfTrend == 1) - { - // - strBuffer[bar_index - 1] = strBuffer[bar_index - 2]; - changeOfTrend = 0; - } - - // - colorIDX = bearishColorIDX; - } - - // - if (showStr) - { - strColorBuffer[bar_index] = colorIDX; - } -} - -// \ No newline at end of file diff --git a/Documents/BKP/Indicators/x-saherelm.x121.xstr.v2.mq5 b/Documents/BKP/Indicators/x-saherelm.x121.xstr.v2.mq5 deleted file mode 100644 index 915dd23b..00000000 --- a/Documents/BKP/Indicators/x-saherelm.x121.xstr.v2.mq5 +++ /dev/null @@ -1,793 +0,0 @@ -/////////////////////////////////////////////////////// -// -// SaherElm IT Center MQL5 Indicator -// ------------------------------------------------- -// Name: X121 XSTR -// Description: XSTR ... -// -// -// 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 XSTR Indicator" -#property strict - -// -// Definitions ... - -// -#define ShortName "X121 XSTR" - -// -// Includes Common Library ... -#include "../Libraries/x-saherelm.common.lib.mq5" - -// -// Inputs ... - -// -// Market ... -input group "Market"; -input int strLength = 14; // Length -input double strMultiplier = 3; // Multiplier -input ENUM_MA_METHOD strBoundaryMode = MODE_SMA; // Boundary Mode -input ENUM_APPLIED_PRICE strAppliedTo = PRICE_MEDIAN; // Applied To - -// -input group "Presentation"; -input bool showStr = true; // Show Str -input bool showStrMid = true; // Show Str Mid -input bool showStrUpper = true; // Show Str Upper -input bool showStrLower = true; // Show Str Lower -input bool showStrLowMa = true; // Show Low Smoothed Buffer -input bool showStrHighMa = true; // Show High Smoothed Buffer - -// -// Buffers ... - -// -#define hideColorIDX 0 -#define bullishColorIDX 1 -#define bearishColorIDX 2 -#define neuturalColorIDX 3 - -// -#define emptyValue 0.0 - -// -#property indicator_chart_window - -// -#property indicator_buffers 11 -#property indicator_plots 6 - -// -// STR ... -#define strBufferIndex 0 -double strBuffer[]; - -#define strColorBufferIndex 1 -double strColorBuffer[]; - -// -#define strPlotBufferIndex 0 -#property indicator_label1 "X121 STR" -#property indicator_type1 DRAW_COLOR_LINE -#property indicator_color1 CLR_NONE, clrLime, clrRed, clrGray -#property indicator_style1 STYLE_SOLID -#property indicator_width1 2 - -// -// Up ... -#define strUpBufferIndex 2 -double strUpBuffer[]; - -// -#define strUpPlotBufferIndex 1 -#property indicator_label2 "X121 STR U" -#property indicator_type2 DRAW_LINE -#property indicator_color2 clrBlueViolet -#property indicator_style2 STYLE_SOLID -#property indicator_width2 1 - -// -// Down ... -#define strDownBufferIndex 3 -double strDownBuffer[]; - -// -#define strDownPlotBufferIndex 2 -#property indicator_label3 "X121 STR D" -#property indicator_type3 DRAW_LINE -#property indicator_color3 clrBlueViolet -#property indicator_style3 STYLE_SOLID -#property indicator_width3 1 - -// -// High MA ... -#define strHighMaBufferIndex 4 -double strHighMaBuffer[]; - -// -#define strHighMaPlotBufferIndex 3 -#property indicator_label4 "X121 STR HSM" -#property indicator_type4 DRAW_LINE -#property indicator_color4 clrAqua -#property indicator_style4 STYLE_SOLID -#property indicator_width4 1 - -// -// Low Ma ... -#define strLowMaBufferIndex 5 -double strLowMaBuffer[]; - -// -#define strLowMaPlotBufferIndex 4 -#property indicator_label5 "X121 STR LSM" -#property indicator_type5 DRAW_LINE -#property indicator_color5 clrMagenta -#property indicator_style5 STYLE_SOLID -#property indicator_width5 1 - -// -// STR Mmid ... -#define strMidBufferIndex 6 -double strMidBuffer[]; - -#define strMidColorBufferIndex 7 -double strMidColorBuffer[]; - -// -#define strMidPlotBufferIndex 5 -#property indicator_label6 "X121 STR Mid" -#property indicator_type6 DRAW_COLOR_LINE -#property indicator_color6 CLR_NONE, clrLime, clrRed, clrGray -#property indicator_style6 STYLE_SOLID -#property indicator_width6 1 - -// -// Data Buffers ... - -// -int mLastBufferIndex = 7; - -// -// STR ... - -// -// Atr ... -#define atrBufferIndex mLastBufferIndex + 1 -double atrBuffer[]; - -// -// Price ... -#define strPriceBufferIndex mLastBufferIndex + 2 -double strPriceBuffer[]; - -// -// Trend ... -#define strStateBufferIndex mLastBufferIndex + 3 -double strStateBuffer[]; - -// -// Variables, Properties and etc ... - -// -// this counts Available Bars ... -int limit; - -// -int maxLength; - -// -// ATR Handler ... -int atrHandler = INVALID_HANDLE; - -// -// MA Handler ... -int lowMaHandler = INVALID_HANDLE; -int highMaHandler = INVALID_HANDLE; - -// -bool isStrTrendChanged; -bool isStrStartBearishTrend; -bool isStrStartBullishTrend; - -// -int changeOfTrend; -int startBearishTrend; -int startBullishTrend; - -// -// Event Handlers ... - -/** - * Initialize Indicator ... - * - * @return ( int ) - */ -int OnInit() -{ - // - // Validate Inputs ... - if (!ValidateInputs()) - { - return INIT_PARAMETERS_INCORRECT; - } - - // - // Initialize Indicator Handlers ... - - // - // ATR ... - atrHandler = iATR( - _Symbol, - _Period, - strLength // - ); - bool isInited = atrHandler != INVALID_HANDLE; - if (!isInited) - { - return INIT_FAILED; - } - - // - // Low Ma ... - lowMaHandler = iMA( - _Symbol, - _Period, - strLength, - 0, - strBoundaryMode, - PRICE_LOW // - ); - isInited = lowMaHandler != INVALID_HANDLE; - if (!isInited) - { - return INIT_FAILED; - } - - // - // High Ma ... - highMaHandler = iMA( - _Symbol, - _Period, - strLength, - 0, - strBoundaryMode, - PRICE_HIGH // - ); - isInited = highMaHandler != INVALID_HANDLE; - if (!isInited) - { - return INIT_FAILED; - } - - // - // 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; -} - -/** - * De Initialize Indicator ... - * - * @param reason: Integer, De Initialization Reason ... - */ -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 - - // - IndicatorRelease(atrHandler); - IndicatorRelease(lowMaHandler); - IndicatorRelease(highMaHandler); -} - -/** - * Calculate Bars ... - * - * @param rates_total: Integer, Total Bars on Chart ... - * @param prev_calculated: Integer, Total Calculated Bars on Charts ... - * @param time: DateTime Array, History of Open Time ... - * @param open: Double Array, History of Open Prices ... - * @param high: Double Array, History of High Prices ... - * @param low: Double Array, History of Low Prices ... - * @param close: Double Array, History of Close Prices ... - * @param tick_volume: Long, History of Tick Volumes on Bar ... - * @param volume: Long, History of Trade Volumes ... - * @param spread: Double, History of Spread Price ... - * - * @return ( int ) - */ -int OnCalculate( - const int rates_total, - const int prev_calculated, - const datetime &time[], - const double &open[], - const double &high[], - const double &low[], - const double &close[], - const long &tick_volume[], - const long &volume[], - const int &spread[] // -) -{ - // - // Prepare Buffers ... - - // - // Validate Calculated Bars ... - - // - // ATR ... - int atrCalculatedBars = BarsCalculated(atrHandler); - - // - // Low Ma ... - int lowMaCalculatedBars = BarsCalculated(lowMaHandler); - - // - // High Ma ... - int highMaCalculatedBars = BarsCalculated(highMaHandler); - - // - bool isPassedRequiredCalculatedBars = - // - // ATR ... - atrCalculatedBars >= 0 && - // - // Low Ma ... - lowMaCalculatedBars >= 0 && - // - // High Ma ... - highMaCalculatedBars >= 0 - // - ; - if (!isPassedRequiredCalculatedBars) - { - return prev_calculated; - } - - // - // - // checking for the limit start of calculation of an indicator ... - limit = - (prev_calculated > rates_total || prev_calculated <= 0) - ? maxLength - : prev_calculated - 1; - - // - // Buffers Copy ... - - // - // ATR ... - int copiedAtrs = CopyBuffer(atrHandler, 0, 0, rates_total, atrBuffer); - - // - // Low Ma ... - int copiedLowMas = CopyBuffer(lowMaHandler, 0, 0, rates_total, strLowMaBuffer); - - // - // High Ma ... - int copiedHighMas = CopyBuffer(highMaHandler, 0, 0, rates_total, strHighMaBuffer); - - // - // Validate Copied Items ... - bool isPassedRequiredCopiedItems = - // - // ATR ... - copiedAtrs >= 0 && - // - // Low Ma ... - copiedLowMas >= 0 && - // - // Hig Ma ... - copiedHighMas >= 0 - // - ; - if (!isPassedRequiredCopiedItems) - { - return prev_calculated; - } - - // - // Main Loop ... - for (int i = limit; i < rates_total && !IsStopped(); i++) - { - // - CalculateBuffers( - i, - prev_calculated, - rates_total, - // - open, - high, - close, - low, - tick_volume // - ); - } - - // - return rates_total; -} - -// -// Functions ... - -/** - * Validate Input Args for Initialization ... - * - * @return ( bool ) - */ -bool ValidateInputs() -{ - // - bool result = - // - // STR ... - strLength > 0 && - strMultiplier > 0 - // - ; - - // - return result; -} - -/** - * Extract Max Length of Inputs ... - * - * @return ( int ) - */ -int ExtractMaxLengthOfInputs() -{ - // - int result = 0; - - // - result = MathMax(1, strLength); - - // - return result; -} - -/** - * Define Required Buffers ... - */ -void DefineBuffers() -{ - // - // STR ... - SetIndexBuffer(strBufferIndex, strBuffer, INDICATOR_DATA); - SetIndexBuffer(strColorBufferIndex, strColorBuffer, INDICATOR_COLOR_INDEX); - - // - ENUM_DRAW_TYPE strUpDrawType = showStrUpper ? DRAW_LINE : DRAW_NONE; - SetIndexBuffer(strUpBufferIndex, strUpBuffer, INDICATOR_DATA); - PlotIndexSetDouble(strUpPlotBufferIndex, PLOT_EMPTY_VALUE, emptyValue); - PlotIndexSetInteger(strUpPlotBufferIndex, PLOT_SHOW_DATA, showStrUpper); - PlotIndexSetInteger(strUpPlotBufferIndex, PLOT_DRAW_TYPE, strUpDrawType); - - // - ENUM_DRAW_TYPE strDownDrawType = showStrLower ? DRAW_LINE : DRAW_NONE; - SetIndexBuffer(strDownBufferIndex, strDownBuffer, INDICATOR_DATA); - PlotIndexSetDouble(strDownPlotBufferIndex, PLOT_EMPTY_VALUE, emptyValue); - PlotIndexSetInteger(strDownPlotBufferIndex, PLOT_SHOW_DATA, showStrLower); - PlotIndexSetInteger(strDownPlotBufferIndex, PLOT_DRAW_TYPE, strDownDrawType); - - // - ENUM_DRAW_TYPE strLowMaDrawType = showStrLowMa ? DRAW_LINE : DRAW_NONE; - SetIndexBuffer(strLowMaBufferIndex, strLowMaBuffer, INDICATOR_DATA); - PlotIndexSetDouble(strLowMaPlotBufferIndex, PLOT_EMPTY_VALUE, emptyValue); - PlotIndexSetInteger(strLowMaPlotBufferIndex, PLOT_SHOW_DATA, showStrLowMa); - PlotIndexSetInteger(strLowMaPlotBufferIndex, PLOT_DRAW_TYPE, strLowMaDrawType); - - // - ENUM_DRAW_TYPE strHighMaDrawType = showStrHighMa ? DRAW_LINE : DRAW_NONE; - SetIndexBuffer(strHighMaBufferIndex, strHighMaBuffer, INDICATOR_DATA); - PlotIndexSetDouble(strHighMaPlotBufferIndex, PLOT_EMPTY_VALUE, emptyValue); - PlotIndexSetInteger(strHighMaPlotBufferIndex, PLOT_SHOW_DATA, showStrHighMa); - PlotIndexSetInteger(strHighMaPlotBufferIndex, PLOT_DRAW_TYPE, strHighMaDrawType); - - // - ENUM_DRAW_TYPE strMidDrawType = showStrMid ? DRAW_COLOR_LINE : DRAW_NONE; - SetIndexBuffer(strMidBufferIndex, strMidBuffer, INDICATOR_DATA); - SetIndexBuffer(strMidColorBufferIndex, strMidColorBuffer, INDICATOR_COLOR_INDEX); - PlotIndexSetDouble(strMidPlotBufferIndex, PLOT_EMPTY_VALUE, emptyValue); - PlotIndexSetInteger(strMidPlotBufferIndex, PLOT_SHOW_DATA, showStrMid); - PlotIndexSetInteger(strMidPlotBufferIndex, PLOT_DRAW_TYPE, strMidDrawType); - - // - // Data Buffers ... - - // - SetIndexBuffer(strPriceBufferIndex, strPriceBuffer, INDICATOR_CALCULATIONS); - SetIndexBuffer(strStateBufferIndex, strStateBuffer, INDICATOR_CALCULATIONS); -} - -/** - * Set Indicator Short Name and also we can define Buffers Labels ... - */ -void SetIndicatorName() -{ - IndicatorSetString(INDICATOR_SHORTNAME, ShortName); -} - -/** - * Calculate Custom Buffers ... - * - * @param bar_index: Integer, Represent Current Bar ... - * @param prevCalculated: Integer, Represent Previous Calculated Bars ... - * @param ratesTotal: Integer, Represents All Available Bars ... - * @param open: Double Array, History of Open Prices ... - * @param high: Double Array, History of High Prices ... - * @param close: Double Array, History of Close Prices ... - * @param low: Double Array, History of Low Prices ... - * @param tickVolume: Long, History of Tick Volumes on Bar ... - */ -void CalculateBuffers( - int bar_index, // Selected Bar Index - const int prevCalculated, - const int ratesTotal, - const double &open[], - const double &high[], - const double &close[], - const double &low[], - const long &tickVolume[] // -) -{ - // - CalculateStr( - bar_index, - prevCalculated, - ratesTotal, - open, - high, - close, - low // - ); -} - -// -// Custom ... - -/** - * Fill All Bufers to Zero Vlue for Specified Bar Index ... - * - * @param barIndex: Integer ... - */ -void FillBuffersZero(int barIndex) -{ - // - // STR ... - strBuffer[barIndex] = emptyValue; - strUpBuffer[barIndex] = emptyValue; - strMidBuffer[barIndex] = emptyValue; - strMidBuffer[barIndex] = emptyValue; - strDownBuffer[barIndex] = emptyValue; - strPriceBuffer[barIndex] = emptyValue; - strLowMaBuffer[barIndex] = emptyValue; - strHighMaBuffer[barIndex] = emptyValue; - - // - strColorBuffer[barIndex] = hideColorIDX; - strStateBuffer[barIndex] = hideColorIDX; -} - -/** - * Calculate STR ... - * - * @param bar_index: Integer, Represent Current Bar ... - * @param prevCalculated: Integer, Represent Previous Calculated Bars ... - * @param ratesTotal: Integer, Represents All Available Bars ... - * @param open: Double Array, History of Open Prices ... - * @param high: Double Array, History of High Prices ... - * @param close: Double Array, History of Close Prices ... - * @param low: Double Array, History of Low Prices ... - */ -void CalculateStr( - int bar_index, // Selected Bar Index - const int prevCalculated, - const int ratesTotal, - const double &open[], - const double &high[], - const double &close[], - const double &low[] // -) -{ - // - // Calculated Price ... - ENUM_X_PRICE mPType = ToXPrice(strAppliedTo); - double price = GetAppliedPrice( - mPType, - open, - high, - low, - close, - bar_index // - ); - strPriceBuffer[bar_index] = price; - - // - double atr = atrBuffer[bar_index]; - - // - // Up ... - strUpBuffer[bar_index] = price + (strMultiplier * atr); - - // - // Down ... - strDownBuffer[bar_index] = price - (strMultiplier * atr); - - // - if (close[bar_index] > strUpBuffer[bar_index - 1]) - { - // - strStateBuffer[bar_index] = 1; - if (strStateBuffer[bar_index - 1] == -1) - { - changeOfTrend = 1; - } - } - else if (close[bar_index] < strDownBuffer[bar_index - 1]) - { - // - strStateBuffer[bar_index] = -1; - if (strStateBuffer[bar_index - 1] == 1) - { - changeOfTrend = 1; - } - } - else if (strStateBuffer[bar_index - 1] == 1) - { - // - strStateBuffer[bar_index] = 1; - changeOfTrend = 0; - } - else if (strStateBuffer[bar_index - 1] == -1) - { - // - strStateBuffer[bar_index] = -1; - changeOfTrend = 0; - } - - // - // Down Trend Starting ... - if (strStateBuffer[bar_index] < 0 && strStateBuffer[bar_index - 1] > 0) - { - startBearishTrend = 1; - } - else - { - startBearishTrend = 0; - } - - // - // Up Trend Starting ... - if (strStateBuffer[bar_index] > 0 && strStateBuffer[bar_index - 1] < 0) - { - startBullishTrend = 1; - } - else - { - startBullishTrend = 0; - } - - // - if (strStateBuffer[bar_index] > 0 && strDownBuffer[bar_index] < strDownBuffer[bar_index - 1]) - { - strDownBuffer[bar_index] = strDownBuffer[bar_index - 1]; - } - - // - if (strStateBuffer[bar_index] < 0 && strUpBuffer[bar_index] > strUpBuffer[bar_index - 1]) - { - strUpBuffer[bar_index] = strUpBuffer[bar_index - 1]; - } - - // - if (startBearishTrend == 1) - { - strUpBuffer[bar_index] = strPriceBuffer[bar_index] + (strMultiplier * atr); - } - - // - if (startBullishTrend == 1) - { - strDownBuffer[bar_index] = strPriceBuffer[bar_index] - (strMultiplier * atr); - } - - // - // Draw the indicator ... - - // - double colorIDX = hideColorIDX; - strColorBuffer[bar_index] = colorIDX; - - // - if (strStateBuffer[bar_index] == 1) - { - // - strBuffer[bar_index] = strDownBuffer[bar_index]; - if (changeOfTrend == 1) - { - strBuffer[bar_index - 1] = strBuffer[bar_index - 2]; - changeOfTrend = 0; - } - - // - colorIDX = bullishColorIDX; - } - else if (strStateBuffer[bar_index] == -1) - { - // - strBuffer[bar_index] = strUpBuffer[bar_index]; - if (changeOfTrend == 1) - { - // - strBuffer[bar_index - 1] = strBuffer[bar_index - 2]; - changeOfTrend = 0; - } - - // - colorIDX = bearishColorIDX; - } - - // - if (showStr) - { - strColorBuffer[bar_index] = colorIDX; - } - - // - // Str Mid ... - - // - double iStrMid = strDownBuffer[bar_index] + ((strUpBuffer[bar_index] - strDownBuffer[bar_index]) / 2); - strMidBuffer[bar_index] = iStrMid; - - // - double iStrColor = close[bar_index] > strMidBuffer[bar_index] - ? bullishColorIDX - : close[bar_index] < strMidBuffer[bar_index] - ? bearishColorIDX - : neuturalColorIDX; - strMidColorBuffer[bar_index] = iStrColor; - - // -} - -// \ No newline at end of file diff --git a/Documents/BKP/X121HelperTMPs/1.mq5 b/Documents/BKP/X121HelperTMPs/1.mq5 deleted file mode 100644 index b4b6876a..00000000 --- a/Documents/BKP/X121HelperTMPs/1.mq5 +++ /dev/null @@ -1,27 +0,0 @@ - - // - // XCC ... - - // - // XPV ... - - // - // XHK ... - - // - // XMAS ... - - // - // XATR ... - - // - // XSTR ... - - // - // XCHE ... - - // - // X3MA ... - - // - // XVWAP ... diff --git a/Documents/BKP/X121HelperTMPs/2.mq5 b/Documents/BKP/X121HelperTMPs/2.mq5 deleted file mode 100644 index f9ee217a..00000000 --- a/Documents/BKP/X121HelperTMPs/2.mq5 +++ /dev/null @@ -1,82 +0,0 @@ - - // - // XCC ... - - // - // Buffers ... - - // - // Conditions ... - - // - // XPV ... - - // - // Buffers ... - - // - // Conditions ... - - // - // XHK ... - - // - // Buffers ... - - // - // Conditions ... - - // - // XMAS ... - - // - // Buffers ... - - // - // Conditions ... - - // - // XATR ... - - // - // Buffers ... - - // - // Conditions ... - - // - // XSTR ... - - // - // Buffers ... - - // - // Conditions ... - - // - // XCHE ... - - // - // Buffers ... - - // - // Conditions ... - - // - // X3MA ... - - // - // Buffers ... - - // - // Conditions ... - - // - // XVWAP ... - - // - // Buffers ... - - // - // Conditions ... - diff --git a/Documents/BKP/X121HelperTMPs/3.mq5 b/Documents/BKP/X121HelperTMPs/3.mq5 deleted file mode 100644 index 235ec404..00000000 --- a/Documents/BKP/X121HelperTMPs/3.mq5 +++ /dev/null @@ -1,359 +0,0 @@ - - // - // XCC ... - - // - // Buffers ... - - // - // Conditions ... - - // - // XPV ... - - // - // Buffers ... - - // - double sarBuffer[]; - double cHHBuffer[]; - double cLLBuffer[]; - double sHHBuffer[]; - double sLLBuffer[]; - double mHHBuffer[]; - double mLLBuffer[]; - double lHHBuffer[]; - double lLLBuffer[]; - double hHHBuffer[]; - double hLLBuffer[]; - double peaksBuffer[]; - double valesBuffer[]; - double supportsBuffer[]; - double peaksGoldenBuffer[]; - double valesGoldenBuffer[]; - double resistancesBuffer[]; - double fractalsUpperBuffer[]; - double fractalsLowerBuffer[]; - - // - // Conditions ... - - // - bool isSarBullish; - bool isSarBearish; - - // - bool isSarSwitchedToBullish; - bool isSarSwitchedToBearish; - - // - bool isNewPeak; - bool isNewPeakOverLast; - bool isNewPeakUnderLast; - - // - bool isNewVale; - bool isNewValeOverLast; - bool isNewValeUnderLast; - - // - // XHK ... - - // - // Buffers ... - - // - double xhkSMLowBuffer[]; - double xhkRawLowBuffer[]; - double xhkSMOpenBuffer[]; - double xhkSMHighBuffer[]; - double xhkRawOpenBuffer[]; - double xhkRawHighBuffer[]; - double xhkSMCloseBuffer[]; - double xhkRawCloseBuffer[]; - - // - // Conditions ... - - // - bool isSMHKBullish; - bool isRawHKBullish; - bool isSMHKSwitchedToBullish; - bool isRawHKSwitchedToBullish; - - // - bool isSMHKBearish; - bool isRawHKBearish; - bool isSMHKSwitchedToBearish; - bool isRawHKSwitchedToBearish; - - // - bool isClosedOverSMHK; - bool isClosedUnderSMHK; - bool isClosedOverRawHK; - bool isClosedUnderRawHK; - - // - bool isRawHKClosedOverSMHK; - bool isRawHKClosedUnderSMHK; - - // - // XMAS ... - - // - // Buffers ... - - // - double midBuffer[]; - double upperBuffer[]; - double lowerBuffer[]; - - // - // Conditions ... - - // - // XATR ... - - // - // Buffers ... - - // - double rsiBuffer[]; - double atrBuffer[]; - double atrUpperBuffer[]; - double atrLowerBuffer[]; - double atrUpperSMBuffer[]; - double atrLowerSMBuffer[]; - double rsiChangeBuffer[]; - double rsiChangeSMBuffer[]; - double priceChangeBuffer[]; - double priceChangeSMBuffer[]; - - // - // Conditions ... - - // - bool isRsiInRange; - bool isRsiOverSold; - bool isRsiOverBought; - bool isRsiCrossedOverOverSold; - bool isRsiCrossedUnderOverSold; - bool isRsiCrossedOverOverBought; - bool isRsiCrossedUnderOverBought; - - // - bool isRsiSMOverPriceChange; - bool isRsiSMUnderPriceChange; - - // - bool isRsiSMCrossedOverPriceChange; - bool isRsiSMCrossedUnderPriceChange; - - // - bool isPriceChangeSMOverRsi; - bool isPriceChangeSMUnderRsi; - - // - bool isPriceChangeSMCrossedOverRsi; - bool isPriceChangeSMCrossedUnderRsi; - - // - bool isRsiOverRsiSM; - bool isRsiUnderRsiSM; - - // - bool isRsiCrossedOverRsiSM; - bool isRsiCrossedUnderRsiSM; - - // - bool isPriceChangeOverPriceChangeSM; - bool isPriceChangeUnderPriceChangeSM; - - // - bool isPriceChangeCrossedOverPriceChangeSM; - bool isPriceChangeCrossedUnderPriceChangeSM; - - // - // XSTR ... - - // - // Buffers ... - - // - double strBuffer[]; - double strUpBuffer[]; - double strDownBuffer[]; - double strPriceBuffer[]; - double strStateBuffer[]; - - // - // Conditions ... - - // - bool isStrBullish; - bool isStrBearish; - - // - bool isStrSwitchedToBullish; - bool isStrSwitchedToBearish; - - // - // XCHE ... - - // - // Buffers ... - - // - double le1Buffer[]; - double se1Buffer[]; - double le2Buffer[]; - double se2Buffer[]; - double le1StartBuffer[]; - double se1StartBuffer[]; - double le2StartBuffer[]; - double se2StartBuffer[]; - - // - // Conditions ... - - // - bool isChe1Bullish; - bool isChe1Bearish; - - // - bool isChe1SwitchedToBullish; - bool isChe1SwitchedToBearish; - - // - bool isChe2Bullish; - bool isChe2Bearish; - - // - bool isChe2SwitchedToBullish; - bool isChe2SwitchedToBearish; - - // - bool isCheBullish; - bool isCheBearish; - - // - bool isCheSwitchedToBullish; - bool isCheSwitchedToBearish; - - // - // X3MA ... - - // - // Buffers ... - - // - double x3maMidBuffer[]; - double x3maFastBuffer[]; - double x3maSlowBuffer[]; - double x3maMidStateBuffer[]; - double x3maFastStateBuffer[]; - double x3maSlowStateBuffer[]; - - // - // Conditions ... - - // - bool isX3MaFastBullish; - bool isX3MaFastBearish; - bool isX3MaFastNeutural; - - // - bool isX3MaMidBullish; - bool isX3MaMidBearish; - bool isX3MaMidNeutural; - - // - bool isX3MaSlowBullish; - bool isX3MaSlowBearish; - bool isX3MaSlowNeutural; - - // - bool isX3MaFastOverMid; - bool isX3MaMidOverSlow; - - // - bool isX3MaFastUnderMid; - bool isX3MaMidUnderSlow; - - // - bool isX3MaBullishState; - bool isX3MaBearishState; - bool isX3MaNeuturalState; - - // - bool isX3MaBullishOrdered; - bool isX3MaBearishOrdered; - - // - bool isX3MaSwitchedToBullishOrdered; - bool isX3MaSwitchedToBearishOrdered; - - // - bool isX3MaSwitchedToBullishState; - bool isX3MaSwitchedToBearishState; - bool isX3MaSwitchedToNeuturalState; - - // - // XVWAP ... - - // - // Buffers ... - - // - double vwapMidBuffer[]; - double vwapFastBuffer[]; - double vwapSlowBuffer[]; - double vwapPriceBuffer[]; - double vwapVolumeBuffer[]; - double vwapMidStateBuffer[]; - double vwapFastStateBuffer[]; - double vwapSlowStateBuffer[]; - - // - // Conditions ... - - // - bool isVWapFastBullish; - bool isVWapFastBearish; - bool isVWapFastNeutural; - - // - bool isVWapMidBullish; - bool isVWapMidBearish; - bool isVWapMidNeutural; - - // - bool isVWapSlowBullish; - bool isVWapSlowBearish; - bool isVWapSlowNeutural; - - // - bool isVWapFastOverMid; - bool isVWapMidOverSlow; - - // - bool isVWapFastUnderMid; - bool isVWapMidUnderSlow; - - // - bool isVWapBullishState; - bool isVWapBearishState; - bool isVWapNeuturalState; - - // - bool isVWapBullishOrdered; - bool isVWapBearishOrdered; - - // - bool isVWapSwitchedToBullishOrdered; - bool isVWapSwitchedToBearishOrdered; - - // - bool isVWapSwitchedToBullishState; - bool isVWapSwitchedToBearishState; - bool isVWapSwitchedToNeuturalState; diff --git a/Documents/BKP/X121HelperTMPs/4.mq5 b/Documents/BKP/X121HelperTMPs/4.mq5 deleted file mode 100644 index 47b89585..00000000 --- a/Documents/BKP/X121HelperTMPs/4.mq5 +++ /dev/null @@ -1,408 +0,0 @@ - // - // XPV ... - - // - // Buffers ... - - // - // Clean ... - - // - Clean(sarBuffer); - Clean(cHHBuffer); - Clean(cLLBuffer); - Clean(sHHBuffer); - Clean(sLLBuffer); - Clean(mHHBuffer); - Clean(mLLBuffer); - Clean(lHHBuffer); - Clean(lLLBuffer); - Clean(hHHBuffer); - Clean(hLLBuffer); - Clean(peaksBuffer); - Clean(valesBuffer); - Clean(supportsBuffer); - Clean(peaksGoldenBuffer); - Clean(valesGoldenBuffer); - Clean(resistancesBuffer); - Clean(fractalsUpperBuffer); - Clean(fractalsLowerBuffer); - - // - // Set As Series ... - - // - ArraySetAsSeries(sarBuffer, true); - ArraySetAsSeries(cHHBuffer, true); - ArraySetAsSeries(cLLBuffer, true); - ArraySetAsSeries(sHHBuffer, true); - ArraySetAsSeries(sLLBuffer, true); - ArraySetAsSeries(mHHBuffer, true); - ArraySetAsSeries(mLLBuffer, true); - ArraySetAsSeries(lHHBuffer, true); - ArraySetAsSeries(lLLBuffer, true); - ArraySetAsSeries(hHHBuffer, true); - ArraySetAsSeries(hLLBuffer, true); - ArraySetAsSeries(peaksBuffer, true); - ArraySetAsSeries(valesBuffer, true); - ArraySetAsSeries(supportsBuffer, true); - ArraySetAsSeries(peaksGoldenBuffer, true); - ArraySetAsSeries(valesGoldenBuffer, true); - ArraySetAsSeries(resistancesBuffer, true); - ArraySetAsSeries(fractalsUpperBuffer, true); - ArraySetAsSeries(fractalsLowerBuffer, true); - - // - // Conditions ... - - // - isNewPeak = false; - isNewVale = false; - isSarBullish = false; - isSarBearish = false; - isNewPeakOverLast = false; - isNewValeOverLast = false; - isNewPeakUnderLast = false; - isNewValeUnderLast = false; - isSarSwitchedToBullish = false; - isSarSwitchedToBearish = false; - - // - // XHK ... - - // - // Buffers ... - - // - // Clean ... - - // - Clean(xhkSMLowBuffer); - Clean(xhkRawLowBuffer); - Clean(xhkSMOpenBuffer); - Clean(xhkSMHighBuffer); - Clean(xhkRawOpenBuffer); - Clean(xhkRawHighBuffer); - Clean(xhkSMCloseBuffer); - Clean(xhkRawCloseBuffer); - - // - // Set As Series ... - - // - ArraySetAsSeries(xhkSMLowBuffer, true); - ArraySetAsSeries(xhkRawLowBuffer, true); - ArraySetAsSeries(xhkSMOpenBuffer, true); - ArraySetAsSeries(xhkSMHighBuffer, true); - ArraySetAsSeries(xhkRawOpenBuffer, true); - ArraySetAsSeries(xhkRawHighBuffer, true); - ArraySetAsSeries(xhkSMCloseBuffer, true); - ArraySetAsSeries(xhkRawCloseBuffer, true); - - // - // Conditions ... - - // - isSMHKBullish = false; - isSMHKBearish = false; - isRawHKBullish = false; - isRawHKBearish = false; - isClosedOverSMHK = false; - isClosedUnderSMHK = false; - isClosedOverRawHK = false; - isClosedUnderRawHK = false; - isRawHKClosedOverSMHK = false; - isRawHKClosedUnderSMHK = false; - isSMHKSwitchedToBearish = false; - isSMHKSwitchedToBullish = false; - isRawHKSwitchedToBullish = false; - isRawHKSwitchedToBearish = false; - - // - // XMAS ... - - // - // Buffers ... - - // - // Clean ... - - // - Clean(midBuffer); - Clean(upperBuffer); - Clean(lowerBuffer); - - // - // Set As Series ... - - // - ArraySetAsSeries(midBuffer, true); - ArraySetAsSeries(upperBuffer, true); - ArraySetAsSeries(lowerBuffer, true); - - // - // Conditions ... - - // - // XATR ... - - // - // Buffers ... - - // - // Clean ... - - // - Clean(rsiBuffer); - Clean(atrBuffer); - Clean(atrUpperBuffer); - Clean(atrLowerBuffer); - Clean(rsiChangeBuffer); - Clean(atrUpperSMBuffer); - Clean(atrLowerSMBuffer); - Clean(rsiChangeSMBuffer); - Clean(priceChangeBuffer); - Clean(priceChangeSMBuffer); - - // - // Set As Series ... - - // - ArraySetAsSeries(rsiBuffer, true); - ArraySetAsSeries(atrBuffer, true); - ArraySetAsSeries(atrUpperBuffer, true); - ArraySetAsSeries(atrLowerBuffer, true); - ArraySetAsSeries(rsiChangeBuffer, true); - ArraySetAsSeries(atrUpperSMBuffer, true); - ArraySetAsSeries(atrLowerSMBuffer, true); - ArraySetAsSeries(rsiChangeSMBuffer, true); - ArraySetAsSeries(priceChangeBuffer, true); - ArraySetAsSeries(priceChangeSMBuffer, true); - - // - // Conditions ... - - // - isRsiInRange = false; - isRsiOverSold = false; - isRsiOverRsiSM = false; - isRsiUnderRsiSM = false; - isRsiOverBought = false; - isRsiCrossedOverRsiSM = false; - isRsiCrossedUnderRsiSM = false; - isPriceChangeSMOverRsi = false; - isRsiSMOverPriceChange = false; - isRsiSMUnderPriceChange = false; - isPriceChangeSMUnderRsi = false; - isRsiCrossedOverOverSold = false; - isRsiCrossedUnderOverSold = false; - isRsiCrossedOverOverBought = false; - isRsiCrossedUnderOverBought = false; - isRsiSMCrossedOverPriceChange = false; - isPriceChangeSMCrossedOverRsi = false; - isRsiSMCrossedUnderPriceChange = false; - isPriceChangeSMCrossedUnderRsi = false; - isPriceChangeOverPriceChangeSM = false; - isPriceChangeUnderPriceChangeSM = false; - isPriceChangeCrossedOverPriceChangeSM = false; - isPriceChangeCrossedUnderPriceChangeSM = false; - - // - // XSTR ... - - // - // Buffers ... - - // - // Clean ... - - // - Clean(strBuffer); - Clean(strUpBuffer); - Clean(strDownBuffer); - Clean(strPriceBuffer); - Clean(strStateBuffer); - - // - // Set As Series ... - - // - ArraySetAsSeries(strBuffer, true); - ArraySetAsSeries(strUpBuffer, true); - ArraySetAsSeries(strDownBuffer, true); - ArraySetAsSeries(strPriceBuffer, true); - ArraySetAsSeries(strStateBuffer, true); - - // - // Conditions ... - - // - isStrBullish = false; - isStrBearish = false; - isStrSwitchedToBullish = false; - isStrSwitchedToBearish = false; - - // - // XCHE ... - - // - // Buffers ... - - // - // Clean ... - - // - Clean(le1Buffer); - Clean(se1Buffer); - Clean(le2Buffer); - Clean(se2Buffer); - Clean(le1StartBuffer); - Clean(se1StartBuffer); - Clean(le2StartBuffer); - Clean(se2StartBuffer); - - // - // Set As Series ... - - // - ArraySetAsSeries(le1Buffer, true); - ArraySetAsSeries(se1Buffer, true); - ArraySetAsSeries(le2Buffer, true); - ArraySetAsSeries(se2Buffer, true); - ArraySetAsSeries(le1StartBuffer, true); - ArraySetAsSeries(se1StartBuffer, true); - ArraySetAsSeries(le2StartBuffer, true); - ArraySetAsSeries(se2StartBuffer, true); - - // - // Conditions ... - - // - isCheBullish = false; - isCheBearish = false; - isChe1Bullish = false; - isChe1Bearish = false; - isChe2Bullish = false; - isChe2Bearish = false; - isCheSwitchedToBullish = false; - isCheSwitchedToBearish = false; - isChe1SwitchedToBullish = false; - isChe1SwitchedToBearish = false; - isChe2SwitchedToBullish = false; - isChe2SwitchedToBearish = false; - - // - // X3MA ... - - // - // Buffers ... - - // - // Clean ... - - // - Clean(x3maMidBuffer); - Clean(x3maFastBuffer); - Clean(x3maSlowBuffer); - Clean(x3maMidStateBuffer); - Clean(x3maFastStateBuffer); - Clean(x3maSlowStateBuffer); - - // - // Set As Series ... - - // - ArraySetAsSeries(x3maMidBuffer, true); - ArraySetAsSeries(x3maFastBuffer, true); - ArraySetAsSeries(x3maSlowBuffer, true); - ArraySetAsSeries(x3maMidStateBuffer, true); - ArraySetAsSeries(x3maFastStateBuffer, true); - ArraySetAsSeries(x3maSlowStateBuffer, true); - - // - // Conditions ... - - // - isX3MaMidBullish = false; - isX3MaMidBearish = false; - isX3MaFastBullish = false; - isX3MaFastBearish = false; - isX3MaMidNeutural = false; - isX3MaSlowBullish = false; - isX3MaSlowBearish = false; - isX3MaFastOverMid = false; - isX3MaMidOverSlow = false; - isX3MaFastNeutural = false; - isX3MaSlowNeutural = false; - isX3MaFastUnderMid = false; - isX3MaMidUnderSlow = false; - isX3MaBullishState = false; - isX3MaBearishState = false; - isX3MaNeuturalState = false; - isX3MaBullishOrdered = false; - isX3MaBearishOrdered = false; - isX3MaSwitchedToBullishState = false; - isX3MaSwitchedToBearishState = false; - isX3MaSwitchedToNeuturalState = false; - isX3MaSwitchedToBullishOrdered = false; - isX3MaSwitchedToBearishOrdered = false; - - // - // XVWAP ... - - // - // Buffers ... - - // - // Clean ... - - // - Clean(vwapMidBuffer); - Clean(vwapFastBuffer); - Clean(vwapSlowBuffer); - Clean(vwapPriceBuffer); - Clean(vwapVolumeBuffer); - Clean(vwapMidStateBuffer); - Clean(vwapFastStateBuffer); - Clean(vwapSlowStateBuffer); - - // - // Set As Series ... - - // - ArraySetAsSeries(vwapMidBuffer, true); - ArraySetAsSeries(vwapFastBuffer, true); - ArraySetAsSeries(vwapSlowBuffer, true); - ArraySetAsSeries(vwapPriceBuffer, true); - ArraySetAsSeries(vwapVolumeBuffer, true); - ArraySetAsSeries(vwapMidStateBuffer, true); - ArraySetAsSeries(vwapFastStateBuffer, true); - ArraySetAsSeries(vwapSlowStateBuffer, true); - - // - // Conditions ... - - // - isVWapMidBullish = false; - isVWapMidBearish = false; - isVWapMidNeutural = false; - isVWapFastBullish = false; - isVWapFastBearish = false; - isVWapSlowBullish = false; - isVWapSlowBearish = false; - isVWapFastOverMid = false; - isVWapMidOverSlow = false; - isVWapFastNeutural = false; - isVWapSlowNeutural = false; - isVWapFastUnderMid = false; - isVWapMidUnderSlow = false; - isVWapBullishState = false; - isVWapBearishState = false; - isVWapNeuturalState = false; - isVWapBullishOrdered = false; - isVWapBearishOrdered = false; - isVWapSwitchedToBullishState = false; - isVWapSwitchedToBearishState = false; - isVWapSwitchedToNeuturalState = false; - isVWapSwitchedToBullishOrdered = false; - isVWapSwitchedToBearishOrdered = false; diff --git a/Documents/BKP/X121HelperTMPs/5.mq5 b/Documents/BKP/X121HelperTMPs/5.mq5 deleted file mode 100644 index e8d2ee61..00000000 --- a/Documents/BKP/X121HelperTMPs/5.mq5 +++ /dev/null @@ -1,96 +0,0 @@ - - // - // XDON ... - x121Inputs.xdonInputs.showOpen = showAll || false; - x121Inputs.xdonInputs.showClose = showAll || false; - x121Inputs.xdonInputs.showLow = showAll || false; - x121Inputs.xdonInputs.showHigh = showAll || false; - - // - // XICH ... - x121Inputs.xichInputs.showTenkanSen = showAll || false; - x121Inputs.xichInputs.showKijunSen = showAll || false; - x121Inputs.xichInputs.showChikouSpan = showAll || false; - x121Inputs.xichInputs.showSenkouSpanA = showAll || false; - x121Inputs.xichInputs.showSenkouSpanB = showAll || false; - x121Inputs.xichInputs.showKumo = showAll || false; - - // - // XCC ... - x121Inputs.xccInputs.showCandles = showAll || true; - - // - // XPV ... - - // - x121Inputs.xpvInputs.showSar = showAll || false; - x121Inputs.xpvInputs.showPeaks = showAll || true; - x121Inputs.xpvInputs.showVales = showAll || true; - x121Inputs.xpvInputs.showSupports = showAll || false; - x121Inputs.xpvInputs.showResistances = showAll || false; - x121Inputs.xpvInputs.showGoldenZones = showAll || true; - - // - // XHK ... - - // - x121Inputs.xhkInputs.drawRawXHKCandles = showAll || false; - x121Inputs.xhkInputs.drawSmoothedXHKCandles = showAll || false; - - // - // XMAS ... - - // - x121Inputs.xmasInputs.showUpper = showAll || false; - x121Inputs.xmasInputs.showMid = showAll || false; - x121Inputs.xmasInputs.showLower = showAll || false; - - // - // XATR ... - x121Inputs.xatrInputs.showATRUpper = showAll || false; - x121Inputs.xatrInputs.showATRLower = showAll || false; - - // - // XSTR ... - x121Inputs.xstrInputs.showStr = showAll || true; - x121Inputs.xstrInputs.showStrUpper = showAll || false; - x121Inputs.xstrInputs.showStrLower = showAll || false; - - // - // XCHE ... - x121Inputs.xcheInputs.showLE1 = showAll || false; - x121Inputs.xcheInputs.showLE2 = showAll || false; - x121Inputs.xcheInputs.showSE1 = showAll || false; - x121Inputs.xcheInputs.showSE2 = showAll || false; - - // - // XVWAP ... - x121Inputs.xvwapInputs.showVWapFast = showAll || false; - x121Inputs.xvwapInputs.showVWapMedium = showAll || false; - x121Inputs.xvwapInputs.showVWapSlow = showAll || false; - - // - // X3MA ... - x121Inputs.x3maInputs.showX3MaFast = showAll || true; - x121Inputs.x3maInputs.showX3MaMid = showAll || false; - x121Inputs.x3maInputs.showX3MaSlow = showAll || false; - - // - - // - // x121Inputs.xcheInputs.cheLength = 14; - // x121Inputs.xcheInputs.cheLoopback = 7; - // x121Inputs.xcheInputs.cheMultiplier1 = 1.5; - // x121Inputs.xcheInputs.cheMultiplier2 = 2; - - // - // x121Inputs.xstrInputs.strLength = 14; - // x121Inputs.xstrInputs.strMultiplier = 1.5; - - // - // x121Inputs.xccInputs.upColor = clrLime; - // x121Inputs.xccInputs.downColor = clrRed; - // x121Inputs.xccInputs.lineColor = CLR_NONE; - // x121Inputs.xccInputs.bearishColor = clrRed; - // x121Inputs.xccInputs.bullishColor = clrLime; - // x121Inputs.xccInputs.volumesColor = clrGreen; diff --git a/Documents/BKP/autofibgage.pine b/Documents/BKP/autofibgage.pine deleted file mode 100644 index adbdf088..00000000 --- a/Documents/BKP/autofibgage.pine +++ /dev/null @@ -1,411 +0,0 @@ -// This indicator is created under TechnoBlooms - Innovating Trading Indicators and Strategies. -// All rights reserved. Unauthorized copying or distribution is prohibited. -// © TechnoBlooms - -//@version=6 -indicator("AutoFibGauge (TechnoBlooms) ", overlay=true) - -//---------------------------------------------------------------------------- -// Initialize with a default value that's not NaN -//---------------------------------------------------------------------------- -var float highestHigh = 0.0 -var float lowestLow = 0.0 -var float level0 = na -var float level100 = na -var float level236 = na -var float level382 = na -var float level500 = na -var float level618 = na -var float level786 = na - -// Variables for labels -var label label0 = na -var label label100 = na -var label label236 = na -var label label382 = na -var label label500 = na -var label label618 = na -var label label786 = na - -var int positionState = 0 // 0 = neutral, 1 = buy, -1 = sell -Thermometer_position = input.string("Middle right", title="Position", options=["Middle left", "Middle right"], group='Thermometer Settings') - - - -//------------------------------------------------------------------------------- -//input how many candles to consider for drawing fibonacci -//------------------------------------------------------------------------------- -num_of_cand = input(25,"No of Candles to find fib") - -//------------------------------------------------------------------------------- -// Calculate the highest high and lowest low of the last n candles -//------------------------------------------------------------------------------- -highestHigh := ta.highest(high, num_of_cand) -lowestLow := ta.lowest(low, num_of_cand) - -hhBar = ta.highestbars(high, num_of_cand) -llBar = ta.lowestbars(low, num_of_cand) - -// Calculate actual bar indices (negative offsets need to be converted) -currentBar = bar_index -highBarIndex = currentBar + hhBar -lowBarIndex = currentBar + llBar - - -//------------------------------------------------------------------------------- -// Calculate Simple Moving Average (SMA) -//------------------------------------------------------------------------------- -SLength = input(20,"Short Length") -LLength = input(55,"Long Length") // You can adjust this to change the SMA period -Strend = ta.sma(close,SLength) -LTrend = ta.sma(close, LLength) - -//------------------------------------------------------------------------------------------- -// Determine if we're in an uptrend or downtrend based on the current close relative to SMA -//------------------------------------------------------------------------------------------- -isUptrend = Strend > LTrend -barColor = isUptrend ?#26a6c6 : #9c1f98 -barcolor(barColor, title="Trend-Based Bar Color") - - - -//---------------------------------------- -//Choose Visibility of MA lines -//---------------------------------------- -showSMAShort = input.bool(false,"Short SMA") -showSMALong = input.bool(false,"Long SMA") - -//--------------------------------------------------- -//Choose which all fib lines to display -//--------------------------------------------------- -showFib0 = input.bool(true, "Fib 0",group = "Show Fib Lines") -showFib236 = input.bool(true,"Fib 23.6",group = "Show Fib Lines") -showFib382 = input.bool(true,"Fib 38.2",group = "Show Fib Lines") -showFib500 = input.bool(true,"Fib 50",group = "Show Fib Lines") -showFib618 = input.bool(true,"Fib 61.8",group = "Show Fib Lines") -showFib786 = input.bool(true,"Fib 78.6",group = "Show Fib Lines") -showFib100 = input.bool(true,"Fib 100",group = "Show Fib Lines") - -//---------------------------------------------------------------- -// Choose background color of thermometer -//---------------------------------------------------------------- -color0 = color.from_gradient(0, 0, 7, color.aqua, color.purple) -color1 = color.from_gradient(1, 0, 7, color.aqua, color.purple) -color2 = color.from_gradient(2, 0, 7, color.aqua, color.purple) -color3 = color.from_gradient(3, 0, 7, color.aqua, color.purple) -color4 = color.from_gradient(4, 0, 7, color.aqua, color.purple) -color5 = color.from_gradient(5, 0, 7, color.aqua, color.purple) -color6 = color.from_gradient(6, 0, 7, color.aqua, color.purple) -color7 = color.from_gradient(7, 7, 14, color.purple, color.red) -color8 = color.from_gradient(8, 7, 14, color.purple, color.red) -color9 = color.from_gradient(9, 7, 14, color.purple, color.red) -color10 = color.from_gradient(10, 7, 14, color.purple, color.red) -color11 = color.from_gradient(11, 7, 14, color.purple, color.red) -color12 = color.from_gradient(12, 7, 14, color.purple, color.red) -color13 = color.from_gradient(13, 7, 14,color.purple, color.red) - - -//--------------------------------------------------------------------- -// Calculate Fibonacci levels based on trend -//--------------------------------------------------------------------- -if not na(highestHigh) and not na(lowestLow) and highestHigh != lowestLow - float diff = highestHigh - lowestLow - - if isUptrend - level0 := highestHigh - level100 := lowestLow - level236 := highestHigh - (diff * 0.236) - level382 := highestHigh - (diff * 0.382) - level500 := highestHigh - (diff * 0.500) - level618 := highestHigh - (diff * 0.618) - level786 := highestHigh - (diff * 0.786) - else - level0 := lowestLow - level100 := highestHigh - level236 := lowestLow + (diff * 0.236) - level382 := lowestLow + (diff * 0.382) - level500 := lowestLow + (diff * 0.500) - level618 := lowestLow + (diff * 0.618) - level786 := lowestLow + (diff * 0.786) - -//------------------------------------------------- -// Delete old labels -//------------------------------------------------- - label.delete(label0) - label.delete(label100) - label.delete(label236) - label.delete(label382) - label.delete(label500) - label.delete(label618) - label.delete(label786) - -//---------------------------------------------------- -// Draw new labels, considering trend -//---------------------------------------------------- - if showFib0 - label0 := label.new(bar_index+5, level0, text="0.0%", color=color0, textcolor=color.white, style=label.style_label_left) - if showFib100 - label100 := label.new(bar_index+5, level100, text="100.0%", color=color12, textcolor=color.white, style=label.style_label_left) - if showFib236 - label236 := label.new(bar_index+5, level236, text="23.6%", color=color2, textcolor=color.white, style=label.style_label_left) - if showFib382 - label382 := label.new(bar_index+5, level382, text="38.2%", color=color4, textcolor=color.white, style=label.style_label_left) - if showFib500 - label500 := label.new(bar_index+5, level500, text="50.0%", color=color6, textcolor=color.white, style=label.style_label_left) - if showFib618 - label618 := label.new(bar_index+5, level618, text="61.8%", color=color8, textcolor=color.white, style=label.style_label_left) - if showFib786 - label786 := label.new(bar_index+5, level786, text="78.6%", color=color10, textcolor=color.white, style=label.style_label_left) - -//--------------------------------------------------------------- -// Draw straight lines to 20 candles back -//--------------------------------------------------------------- - var line line0 = na - var line line100 = na - var line line236 = na - var line line382 = na - var line line500 = na - var line line618 = na - var line line786 = na - - line.delete(line0) - line.delete(line100) - line.delete(line236) - line.delete(line382) - line.delete(line500) - line.delete(line618) - line.delete(line786) - - if showFib0 - line0 := line.new(bar_index[num_of_cand], level0, bar_index+5, level0, color=color0, width=1) - if showFib100 - line100 := line.new(bar_index[num_of_cand], level100, bar_index+5, level100, color=color12, width=1) - if showFib236 - line236 := line.new(bar_index[num_of_cand], level236, bar_index+5, level236, color=color2, width=1) - if showFib382 - line382 := line.new(bar_index[num_of_cand], level382, bar_index+5, level382, color=color4, width=1) - if showFib500 - line500 := line.new(bar_index[num_of_cand], level500, bar_index+5, level500, color=color6,width = 1) - if showFib618 - line618 := line.new(bar_index[num_of_cand], level618, bar_index+5, level618, color=color8,width = 1) - if showFib786 - line786 := line.new(bar_index[num_of_cand], level786, bar_index+5, level786, color=color10,width = 1) - - // Draw dashed line for showing Fib range - var line fibline = na - - //------------------------------------------------------------------------- - //Highlight Golden Ration region - //------------------------------------------------------------------------- - var box box1 = na - var box box2 = na - var box box3 = na - var box box2_lower = na - var box box2_upper = na - var box box3_lower = na - var box box3_upper = na - // Draw gradient shading with darker areas above and below 61.8%, fading toward 38.2% and 78.6% - // Delete previous boxes - if not na(box1) - box.delete(box1) - if not na(box2_lower) - box.delete(box2_lower) - if not na(box2_upper) - box.delete(box2_upper) - if not na(box3_lower) - box.delete(box3_lower) - if not na(box3_upper) - box.delete(box3_upper) - - // Base layer: Full range (38.2% to 78.6%) - lightest shade - // box1 := box.new(left=bar_index[num_of_cand], top=level786, right=bar_index+5, bottom=level382, bgcolor=color.new(color.yellow, 100), border_width=0) - - // Middle layers: Split around 61.8%, fading outward - box2_lower := box.new(left=bar_index[num_of_cand], top=(level618 + level382)/2, right=bar_index+5, bottom=level382, bgcolor=color.new(color.yellow, 100), border_width=0) - box2_upper := box.new(left=bar_index[num_of_cand], top=level786, right=bar_index+5, bottom=(level786 + level618)/2, bgcolor=color.new(color.yellow, 100), border_width=0) - - // Core layers: Closest to 61.8%, darkest shade - box3_lower := box.new(left=bar_index[num_of_cand], top=level618, right=bar_index+5, bottom=(level618 + level382)/2, bgcolor=color.new(color.yellow, 85), border_width=0) - box3_upper := box.new(left=bar_index[num_of_cand], top=(level786 + level618)/2, right=bar_index+5, bottom=level618, bgcolor=color.new(color.yellow, 85), border_width=0) - if isUptrend - line.delete(fibline) - fibline := line.new(lowBarIndex, lowestLow, highBarIndex, highestHigh, color=color.gray, style=line.style_dashed) - else - line.delete(fibline) - fibline := line.new(highBarIndex, highestHigh, lowBarIndex, lowestLow, color=color.gray, style=line.style_dashed) - -//------------------------- -// Plot SMA -//------------------------- -plot(showSMAShort? Strend:na, title="SMA", color=color.blue, linewidth=1) -plot(showSMALong? LTrend:na, title="Strend", color=#f321b4, linewidth=1) - -//----------------------------------------------------------- -//create labels in Thermometer when trend = 1 (uptrend) -//----------------------------------------------------------- -var table_position = Thermometer_position == 'Top right' ? position.top_right : - Thermometer_position == 'Top left' ? position.top_left : - Thermometer_position == 'Top center' ? position.top_center : - Thermometer_position == 'Bottom right' ? position.bottom_right : - Thermometer_position == 'Bottom left' ? position.bottom_left : - Thermometer_position == 'Bottom center' ? position.bottom_center : - Thermometer_position == 'Middle right' ? position.middle_right : position.middle_right - - -tbl = table.new(position=table_position, columns = 100, rows=100) -closenum=math.round(close,0) - -if level0 < level100 - - table.cell(tbl,0,0,text = label100.get_text() , text_color = #f83f8c) - table.cell(tbl,0,11,text = label236.get_text() ,text_color = #f83f8c) - table.cell(tbl,0,8,text = label382.get_text() ,text_color = #f83f8c) - table.cell(tbl,0,5,text = label618.get_text() , text_color =#f83f8c) - table.cell(tbl,0,2,text = label786.get_text(),text_color = #f83f8c) - table.cell(tbl,0,13,text = label0.get_text(), text_color = #f83f8c) - - - table.cell(tbl,2,13,text = str.tostring(level0," #,###"), text_color = #f83f8c) - table.cell(tbl,2,11,text = str.tostring(level236, " #,###"),text_color = #f83f8c) - table.cell(tbl,2,8,text = str.tostring(level382, " #,###"),text_color = #f83f8c) - table.cell(tbl,2,5,text = str.tostring(level618, " #,###"), text_color =#f83f8c) - table.cell(tbl,2,2,text = str.tostring(level786, " #,###"),text_color = #f83f8c) - table.cell(tbl,2,0,text = str.tostring(level100," #,###"), text_color = #f83f8c) - - for i = 0 to 13 by 1 - table.cell(tbl, 1, i, "", bgcolor = i < 8 ? color.from_gradient(i, 0, 7, color.aqua, color.purple) : color.from_gradient(i, 7, 14, color.purple, color.red)) - - var reg = 0 - bkcolor = color.aqua - - if closenum > level0 and closenum < level236 - reg := 12 - if closenum > level236 and closenum < level382 - reg := 9 - if closenum > level382 and closenum < level618 - reg := 6 - if closenum > level618 and closenum < level786 - reg := 3 - if closenum > level786 and closenum < level100 - reg := 1 - if closenum == level0 - reg := 0 - if closenum == level236 - reg := 11 - if closenum == level382 - reg := 8 - if closenum == level618 - reg := 5 - if closenum == level786 - reg := 2 - - - if reg == 12 - bkcolor := color12 - if reg == 9 - bkcolor := color9 - if reg == 6 - bkcolor := color6 - if reg == 3 - bkcolor := color3 - if reg == 1 - bkcolor := color1 - if reg == 2 - bkcolor := color2 - - if reg == 4 - bkcolor := color4 - if reg == 5 - bkcolor := color5 - if reg == 7 - bkcolor := color7 - if reg == 8 - bkcolor := color8 - if reg == 10 - bkcolor := color10 - if reg == 11 - bkcolor := color11 - if reg == 13 - bkcolor := color13 - - - table.cell(tbl,1,reg,"🌕", text_size = size.small,bgcolor = bkcolor) -//----------------------------------------------------------- -//create labels in Thermometer -//----------------------------------------------------------- -else - table.cell(tbl,0,13,text = label100.get_text() , text_color = #f83f8c) - table.cell(tbl,0,2,text = label236.get_text() ,text_color = #f83f8c) - table.cell(tbl,0,5,text = label382.get_text() ,text_color = #f83f8c) - table.cell(tbl,0,8,text = label618.get_text() , text_color =#f83f8c) - table.cell(tbl,0,11,text = label786.get_text(),text_color = #f83f8c) - table.cell(tbl,0,0,text = label0.get_text(), text_color = #f83f8c) - - - table.cell(tbl,2,0,text = str.tostring(level0," #,###"), text_color = #f83f8c) - table.cell(tbl,2,2,text = str.tostring(level236, " #,###"),text_color = #f83f8c) - table.cell(tbl,2,5,text = str.tostring(level382, " #,###"),text_color = #f83f8c) - table.cell(tbl,2,8,text = str.tostring(level618, " #,###"), text_color =#f83f8c) - table.cell(tbl,2,11,text = str.tostring(level786, " #,###"),text_color = #f83f8c) - table.cell(tbl,2,13,text = str.tostring(level100," #,###"), text_color = #f83f8c) - - for i = 0 to 13 by 1 - table.cell(tbl, 1, i, "", bgcolor = i < 8 ? color.from_gradient(i, 0, 7, color.aqua, color.purple) : color.from_gradient(i, 7, 14, color.purple, color.red)) - - var reg = 0 - bkcolor = color.aqua - - if closenum > level100 and closenum < level786 - reg := 12 - if closenum > level786 and closenum < level618 - reg := 9 - if closenum > level618 and closenum < level382 - reg := 6 - if closenum > level382 and closenum < level236 - reg := 3 - if closenum > level236 and closenum < level0 - reg := 1 - if closenum == level0 - reg := 0 - if closenum == level236 - reg := 11 - if closenum == level382 - reg := 8 - if closenum == level618 - reg := 5 - if closenum == level786 - reg := 2 - - - if reg == 12 - bkcolor := color12 - if reg == 9 - bkcolor := color9 - if reg == 6 - bkcolor := color6 - if reg == 3 - bkcolor := color3 - if reg == 1 - bkcolor := color1 - if reg == 2 - bkcolor := color2 - - if reg == 4 - bkcolor := color4 - if reg == 5 - bkcolor := color5 - if reg == 7 - bkcolor := color7 - if reg == 8 - bkcolor := color8 - if reg == 10 - bkcolor := color10 - if reg == 11 - bkcolor := color11 - if reg == 13 - bkcolor := color13 - - - table.cell(tbl,1,reg,"🌕", text_size = size.small,bgcolor = bkcolor) - - diff --git a/Documents/BKP/cumulative-delta.1.pine b/Documents/BKP/cumulative-delta.1.pine deleted file mode 100644 index 5ced2ed8..00000000 --- a/Documents/BKP/cumulative-delta.1.pine +++ /dev/null @@ -1,75 +0,0 @@ -// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ -// © LonesomeTheBlue - -//@version=4 -study("Cumulative Delta Volume", "CDV") -linestyle = input(defval = 'Candle', title = "Style", options = ['Candle', 'Line']) -hacandle = input(defval = true, title = "Heikin Ashi Candles?") -showma1 = input(defval = false, title = "SMA 1", inline = "ma1") -ma1len = input(defval = 50, title = "", minval = 1, inline = "ma1") -ma1col = input(defval = color.lime, title = "", inline = "ma1") -showma2 = input(defval = false, title = "SMA 2", inline = "ma2") -ma2len = input(defval = 200, title = "", minval = 1, inline = "ma2") -ma2col = input(defval = color.red, title = "", inline = "ma2") -showema1 = input(defval = false, title = "EMA 1", inline = "ema1") -ema1len = input(defval = 50, title = "", minval = 1, inline = "ema1") -ema1col = input(defval = color.lime, title = "", inline = "ema1") -showema2 = input(defval = false, title = "EMA 2", inline = "ema2") -ema2len = input(defval = 200, title = "", minval = 1, inline = "ema2") -ema2col = input(defval = color.red, title = "", inline = "ema2") -colorup = input(defval = color.lime, title = "Body", inline = "bcol") -colordown = input(defval = color.red, title = "", inline = "bcol") -bcolup = input(defval = #74e05e, title = "Border", inline = "bocol") -bcoldown = input(defval = #ffad7d, title = "", inline = "bocol") -wcolup = input(defval = #b5b5b8, title = "Wicks", inline = "wcol") -wcoldown = input(defval = #b5b5b8, title = "", inline = "wcol") - -tw = high - max(open, close) -bw = min(open, close) - low -body = abs(close - open) - -_rate(cond) => - ret = 0.5 * (tw + bw + (cond ? 2 * body : 0)) / (tw + bw + body) - ret := nz(ret) == 0 ? 0.5 : ret - ret - -deltaup = volume * _rate(open <= close) -deltadown = volume * _rate(open > close) -delta = close >= open ? deltaup : -deltadown -cumdelta = cum(delta) -float ctl = na -float o = na -float h = na -float l = na -float c = na -if linestyle == 'Candle' - o := cumdelta[1] - h := max(cumdelta, cumdelta[1]) - l := min(cumdelta, cumdelta[1]) - c := cumdelta - ctl -else - ctl := cumdelta - -plot(ctl, title = "CDV Line", color = color.blue, linewidth = 2) - -float haclose = na -float haopen = na -float hahigh = na -float halow = na -haclose := (o + h + l + c) / 4 -haopen := na(haopen[1]) ? (o + c) / 2 : (haopen[1] + haclose[1]) / 2 -hahigh := max(h, max(haopen, haclose)) -halow := min(l, min(haopen, haclose)) - -c_ = hacandle ? haclose : c -o_ = hacandle ? haopen : o -h_ = hacandle ? hahigh : h -l_ = hacandle ? halow : l - -plotcandle(o_, h_, l_, c_, title='CDV Candles', color = o_ <= c_ ? colorup : colordown, bordercolor = o_ <= c_ ? bcolup : bcoldown, wickcolor = o_ <= c_ ? bcolup : bcoldown) - -plot(showma1 and linestyle == "Candle" ? sma(c_, ma1len) : na, title = "SMA 1", color = ma1col) -plot(showma2 and linestyle == "Candle" ? sma(c_, ma2len) : na, title = "SMA 2", color = ma2col) -plot(showema1 and linestyle == "Candle" ? ema(c_, ema1len) : na, title = "EMA 1", color = ema1col) -plot(showema2 and linestyle == "Candle" ? ema(c_, ema2len) : na, title = "EMA 2", color = ema2col) diff --git a/Documents/BKP/cumulative-delta.pine b/Documents/BKP/cumulative-delta.pine deleted file mode 100644 index cc9afc0c..00000000 --- a/Documents/BKP/cumulative-delta.pine +++ /dev/null @@ -1,37 +0,0 @@ -// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ -// © Ankit_1618 - -//@version=4 -study("Cumulative Volume Delta") - -upper_wick = close>open ? high-close : high-open -lower_wick = close>open ? open-low : close-low -spread = high-low -body_length = spread - (upper_wick + lower_wick) - -percent_upper_wick = upper_wick/spread -percent_lower_wick = lower_wick/spread -percent_body_length = body_length/spread - - -buying_volume = close>open ? (percent_body_length + (percent_upper_wick + percent_lower_wick)/2)*volume : ((percent_upper_wick + percent_lower_wick)/2) * volume -selling_volume = close cumulative_selling_volume ? color.green : cumulative_buying_volume < cumulative_selling_volume ? color.red : color.yellow - -pb = plot(cumulative_buying_volume, color=color.green , transp=70) -ps = plot(cumulative_selling_volume, color=color.red , transp=70) - -fill(pb, ps, color = fill_color) - -volume_strength_wave = cumulative_buying_volume > cumulative_selling_volume ? cumulative_buying_volume : cumulative_selling_volume -ema_volume_strength_wave = ema(volume_strength_wave , cumulation_length) -plot(ema_volume_strength_wave, color=color.gray, transp=80) - -cumulative_volume_delta = cumulative_buying_volume - cumulative_selling_volume -plot(cumulative_volume_delta, color= cumulative_volume_delta>0 ? color.green : color.red, style=plot.style_columns, transp=61) - diff --git a/Documents/BKP/cuvdelta.mq5 b/Documents/BKP/cuvdelta.mq5 deleted file mode 100644 index 92d26fbc..00000000 --- a/Documents/BKP/cuvdelta.mq5 +++ /dev/null @@ -1,135 +0,0 @@ -//+------------------------------------------------------------------+ -//| CumulativeDelta.mq5 | -//| Copyright © 2023, YourName | -//| | -//+------------------------------------------------------------------+ -#property copyright "YourName" -#property link "https://www.yourwebsite.com" -#property version "1.00" - -// -#include "../Libraries/x-saherelm.common.lib.mq5" - -// -#property indicator_separate_window -#property indicator_buffers 3 -#property indicator_plots 3 - -// -//--- Plot settings for Line -#property indicator_label1 "Cumulative Delta" -#property indicator_type1 DRAW_LINE -#property indicator_color1 clrYellow - -// -//--- Plot settings for Histogram -#property indicator_label2 "Delta" -#property indicator_type2 DRAW_HISTOGRAM -#property indicator_color2 clrGray - -// -//--- Plot settings for Moving Average line -#property indicator_label3 "Signal" -#property indicator_type3 DRAW_LINE -#property indicator_color3 clrOrchid - -// -//--- Input parameters -input int MAPeriod = 14; // Period for the moving average - -// -//--- Indicator buffers -double MABuffer[]; -double DeltaBuffer[]; -double CumulativeDeltaBuffer[]; - -//+------------------------------------------------------------------+ -//| Custom indicator initialization function | -//+------------------------------------------------------------------+ -int OnInit() -{ - // - // Attach buffer to the indicator - SetIndexBuffer(2, MABuffer, INDICATOR_DATA); - SetIndexBuffer(1, DeltaBuffer, INDICATOR_DATA); - SetIndexBuffer(0, CumulativeDeltaBuffer, INDICATOR_DATA); - IndicatorSetString(INDICATOR_SHORTNAME, "Cumulative Delta"); - - // - return (INIT_SUCCEEDED); -} - -//+------------------------------------------------------------------+ -//| Custom indicator iteration function | -//+------------------------------------------------------------------+ -int OnCalculate(const int rates_total, - const int prev_calculated, - const datetime &time[], - const double &open[], - const double &high[], - const double &low[], - const double &close[], - const long &tick_volume[], - const long &volume[], - const int &spread[] // -) -{ - // - // Start from the first uncalculated bar - int start = MathMax(prev_calculated - 1, 0); - - // - // Loop through bars - for (int i = start; i < rates_total; i++) - { - // - // Calculate Delta based on bar-level data - double delta = 0.0; - if (close[i] > open[i]) - { - delta = (double)tick_volume[i]; // Buying pressure (bullish bar) - } - else if (close[i] < open[i]) - { - delta = -(double)tick_volume[i]; // Selling pressure (bearish bar) - } - - // - // Accumulate cumulative delta - if (i == 0) - { - // - DeltaBuffer[i] = delta; - CumulativeDeltaBuffer[i] = delta; // First bar starts with delta - } - else - { - // - DeltaBuffer[i] = DeltaBuffer[i - 1] + delta; - CumulativeDeltaBuffer[i] = CumulativeDeltaBuffer[i - 1] + delta; - } - - // - // Calculate Moving Average of Cumulative Delta - if (i >= MAPeriod - 1) - { - // - double sum = 0.0; - for (int j = 0; j < MAPeriod; j++) - { - sum += CumulativeDeltaBuffer[i - j]; - } - - // - MABuffer[i] = sum / MAPeriod; // Simple Moving Average - } - else - { - MABuffer[i] = EMPTY_VALUE; // Not enough data for MA - } - } - - // - return (rates_total); -} -//+------------------------------------------------------------------+ \ No newline at end of file diff --git a/Documents/BKP/forex.sessions.mq5 b/Documents/BKP/forex.sessions.mq5 deleted file mode 100644 index ee310f67..00000000 --- a/Documents/BKP/forex.sessions.mq5 +++ /dev/null @@ -1,347 +0,0 @@ -//+------------------------------------------------------------------+ -//| ForexSessionHighLowIndicator.mq5 | -//| Copyright 2023, MetaQuotes Software Corp. | -//| https://www.metaquotes.net/ | -//+------------------------------------------------------------------+ -#property copyright "Copyright 2023, MetaQuotes Software Corp." -#property link "https://www.metaquotes.net/" -#property version "1.00" -#property indicator_chart_window -#property indicator_buffers 8 -#property indicator_plots 4 - -// Session times (in broker time) -input string SydneyStart = "22:00"; // Sydney session start (GMT+10 when DST) -input string SydneyEnd = "07:00"; // Sydney session end -input string TokyoStart = "00:00"; // Tokyo session start (GMT+9) -input string TokyoEnd = "09:00"; // Tokyo session end -input string LondonStart = "08:00"; // London session start (GMT+0) -input string LondonEnd = "17:00"; // London session end -input string NewYorkStart = "13:00"; // New York session start (GMT-4/5) -input string NewYorkEnd = "22:00"; // New York session end - -input color SydneyColor = clrDodgerBlue; // Sydney session color -input color TokyoColor = clrMediumSeaGreen; // Tokyo session color -input color LondonColor = clrGold; // London session color -input color NewYorkColor = clrTomato; // New York session color -input int LineWidth = 1; // Line width -input bool ShowLabels = true; // Show session labels -input bool ShowHighLow = true; // Show high/low prices - -// Buffers for session high/low -double SydneyHighBuffer[]; -double SydneyLowBuffer[]; -double TokyoHighBuffer[]; -double TokyoLowBuffer[]; -double LondonHighBuffer[]; -double LondonLowBuffer[]; -double NewYorkHighBuffer[]; -double NewYorkLowBuffer[]; - -// Global variables -int SydneyStartHour, SydneyStartMin; -int SydneyEndHour, SydneyEndMin; -int TokyoStartHour, TokyoStartMin; -int TokyoEndHour, TokyoEndMin; -int LondonStartHour, LondonStartMin; -int LondonEndHour, LondonEndMin; -int NewYorkStartHour, NewYorkStartMin; -int NewYorkEndHour, NewYorkEndMin; - -//+------------------------------------------------------------------+ -//| Custom indicator initialization function | -//+------------------------------------------------------------------+ -int OnInit() -{ - // Parse session times - ParseTime(SydneyStart, SydneyStartHour, SydneyStartMin); - ParseTime(SydneyEnd, SydneyEndHour, SydneyEndMin); - ParseTime(TokyoStart, TokyoStartHour, TokyoStartMin); - ParseTime(TokyoEnd, TokyoEndHour, TokyoEndMin); - ParseTime(LondonStart, LondonStartHour, LondonStartMin); - ParseTime(LondonEnd, LondonEndHour, LondonEndMin); - ParseTime(NewYorkStart, NewYorkStartHour, NewYorkStartMin); - ParseTime(NewYorkEnd, NewYorkEndHour, NewYorkEndMin); - - // Set indicator properties - SetIndexBuffer(0, SydneyHighBuffer, INDICATOR_DATA); - SetIndexBuffer(1, SydneyLowBuffer, INDICATOR_DATA); - SetIndexBuffer(2, TokyoHighBuffer, INDICATOR_DATA); - SetIndexBuffer(3, TokyoLowBuffer, INDICATOR_DATA); - SetIndexBuffer(4, LondonHighBuffer, INDICATOR_DATA); - SetIndexBuffer(5, LondonLowBuffer, INDICATOR_DATA); - SetIndexBuffer(6, NewYorkHighBuffer, INDICATOR_DATA); - SetIndexBuffer(7, NewYorkLowBuffer, INDICATOR_DATA); - - // Set drawing styles - PlotIndexSetInteger(0, PLOT_DRAW_TYPE, DRAW_LINE); - PlotIndexSetInteger(0, PLOT_LINE_COLOR, SydneyColor); - PlotIndexSetInteger(0, PLOT_LINE_WIDTH, LineWidth); - PlotIndexSetString(0, PLOT_LABEL, "Sydney High"); - - PlotIndexSetInteger(1, PLOT_DRAW_TYPE, DRAW_LINE); - PlotIndexSetInteger(1, PLOT_LINE_COLOR, SydneyColor); - PlotIndexSetInteger(1, PLOT_LINE_STYLE, STYLE_DOT); - PlotIndexSetInteger(1, PLOT_LINE_WIDTH, LineWidth); - PlotIndexSetString(1, PLOT_LABEL, "Sydney Low"); - - PlotIndexSetInteger(2, PLOT_DRAW_TYPE, DRAW_LINE); - PlotIndexSetInteger(2, PLOT_LINE_COLOR, TokyoColor); - PlotIndexSetInteger(2, PLOT_LINE_WIDTH, LineWidth); - PlotIndexSetString(2, PLOT_LABEL, "Tokyo High"); - - PlotIndexSetInteger(3, PLOT_DRAW_TYPE, DRAW_LINE); - PlotIndexSetInteger(3, PLOT_LINE_COLOR, TokyoColor); - PlotIndexSetInteger(3, PLOT_LINE_STYLE, STYLE_DOT); - PlotIndexSetInteger(3, PLOT_LINE_WIDTH, LineWidth); - PlotIndexSetString(3, PLOT_LABEL, "Tokyo Low"); - - return(INIT_SUCCEEDED); -} - -//+------------------------------------------------------------------+ -//| Custom indicator iteration function | -//+------------------------------------------------------------------+ -int OnCalculate(const int rates_total, - const int prev_calculated, - const datetime &time[], - const double &open[], - const double &high[], - const double &low[], - const double &close[], - const long &tick_volume[], - const long &volume[], - const int &spread[]) -{ - // Check if we have enough data - if(rates_total < 2) return(0); - - // Set all buffers to EMPTY_VALUE initially - ArrayInitialize(SydneyHighBuffer, EMPTY_VALUE); - ArrayInitialize(SydneyLowBuffer, EMPTY_VALUE); - ArrayInitialize(TokyoHighBuffer, EMPTY_VALUE); - ArrayInitialize(TokyoLowBuffer, EMPTY_VALUE); - ArrayInitialize(LondonHighBuffer, EMPTY_VALUE); - ArrayInitialize(LondonLowBuffer, EMPTY_VALUE); - ArrayInitialize(NewYorkHighBuffer, EMPTY_VALUE); - ArrayInitialize(NewYorkLowBuffer, EMPTY_VALUE); - - // Calculate start position - int start = (prev_calculated == 0) ? 0 : prev_calculated - 1; - - // Main calculation loop - for(int i = start; i < rates_total; i++) - { - MqlDateTime dt; - TimeToStruct(time[i], dt); - - // Check if current time is within any session - bool inSydney = IsInSession(dt.hour, dt.min, SydneyStartHour, SydneyStartMin, SydneyEndHour, SydneyEndMin); - bool inTokyo = IsInSession(dt.hour, dt.min, TokyoStartHour, TokyoStartMin, TokyoEndHour, TokyoEndMin); - bool inLondon = IsInSession(dt.hour, dt.min, LondonStartHour, LondonStartMin, LondonEndHour, LondonEndMin); - bool inNewYork = IsInSession(dt.hour, dt.min, NewYorkStartHour, NewYorkStartMin, NewYorkEndHour, NewYorkEndMin); - - // Find session boundaries and calculate high/low - if(inSydney) - { - CalculateSessionHighLow(i, rates_total, time, high, low, SydneyHighBuffer, SydneyLowBuffer, SydneyStartHour, SydneyStartMin, SydneyEndHour, SydneyEndMin); - } - - if(inTokyo) - { - CalculateSessionHighLow(i, rates_total, time, high, low, TokyoHighBuffer, TokyoLowBuffer, TokyoStartHour, TokyoStartMin, TokyoEndHour, TokyoEndMin); - } - - if(inLondon) - { - CalculateSessionHighLow(i, rates_total, time, high, low, LondonHighBuffer, LondonLowBuffer, LondonStartHour, LondonStartMin, LondonEndHour, LondonEndMin); - } - - if(inNewYork) - { - CalculateSessionHighLow(i, rates_total, time, high, low, NewYorkHighBuffer, NewYorkLowBuffer, NewYorkStartHour, NewYorkStartMin, NewYorkEndHour, NewYorkEndMin); - } - - // Add labels if enabled - if(ShowLabels && i == rates_total - 1) - { - AddSessionLabels(time[rates_total-1], high[rates_total-1], low[rates_total-1]); - } - } - - return(rates_total); -} - -//+------------------------------------------------------------------+ -//| Parse time string into hours and minutes | -//+------------------------------------------------------------------+ -void ParseTime(string timeStr, int &hour, int &min) -{ - string parts[]; - StringSplit(timeStr, ':', parts); - hour = (int)StringToInteger(parts[0]); - min = (ArraySize(parts) > 1) ? (int)StringToInteger(parts[1]) : 0; -} - -//+------------------------------------------------------------------+ -//| Check if current time is within a session | -//+------------------------------------------------------------------+ -bool IsInSession(int currentHour, int currentMin, int startHour, int startMin, int endHour, int endMin) -{ - int currentTime = currentHour * 100 + currentMin; - int sessionStart = startHour * 100 + startMin; - int sessionEnd = endHour * 100 + endMin; - - // Handle sessions that cross midnight - if(sessionStart > sessionEnd) - { - return(currentTime >= sessionStart || currentTime < sessionEnd); - } - else - { - return(currentTime >= sessionStart && currentTime < sessionEnd); - } -} - -//+------------------------------------------------------------------+ -//| Calculate session high and low | -//+------------------------------------------------------------------+ -void CalculateSessionHighLow(int index, int rates_total, const datetime &time[], const double &high[], const double &low[], - double &highBuffer[], double &lowBuffer[], int startHour, int startMin, int endHour, int endMin) -{ - // Find the start of the current session - MqlDateTime currentDt, sessionStartDt; - TimeToStruct(time[index], currentDt); - TimeToStruct(time[index], sessionStartDt); - - sessionStartDt.hour = startHour; - sessionStartDt.min = startMin; - sessionStartDt.sec = 0; - - datetime sessionStartTime = StructToTime(sessionStartDt); - - // If session crosses midnight, adjust the start time - int sessionStart = startHour * 100 + startMin; - int sessionEnd = endHour * 100 + endMin; - - if(sessionStart > sessionEnd) - { - // Session crosses midnight, check if we need to use previous day - int currentTime = currentDt.hour * 100 + currentDt.min; - if(currentTime < sessionEnd) - { - sessionStartTime -= 86400; // Subtract one day - } - } - - // Find the bar index for the session start - int sessionStartIndex = iBarShift(NULL, 0, sessionStartTime); - if(sessionStartIndex < 0) sessionStartIndex = 0; - - // Calculate high and low for the session - double sessionHigh = high[sessionStartIndex]; - double sessionLow = low[sessionStartIndex]; - - for(int j = sessionStartIndex; j <= index; j++) - { - if(j >= rates_total) continue; - - if(high[j] > sessionHigh) sessionHigh = high[j]; - if(low[j] < sessionLow) sessionLow = low[j]; - } - - // Store the values in buffers - highBuffer[index] = sessionHigh; - lowBuffer[index] = sessionLow; - - // If ShowHighLow is enabled, draw the levels - if(ShowHighLow && index == rates_total - 1) - { - string sessionName = ""; - color sessionClr = clrNONE; - - if(startHour == SydneyStartHour && startMin == SydneyStartMin) - { - sessionName = "Sydney"; - sessionClr = SydneyColor; - } - else if(startHour == TokyoStartHour && startMin == TokyoStartMin) - { - sessionName = "Tokyo"; - sessionClr = TokyoColor; - } - else if(startHour == LondonStartHour && startMin == LondonStartMin) - { - sessionName = "London"; - sessionClr = LondonColor; - } - else if(startHour == NewYorkStartHour && startMin == NewYorkStartMin) - { - sessionName = "NewYork"; - sessionClr = NewYorkColor; - } - - if(sessionName != "") - { - string highLabel = sessionName + " High: " + DoubleToString(sessionHigh, _Digits); - string lowLabel = sessionName + " Low: " + DoubleToString(sessionLow, _Digits); - - ObjectCreate(0, highLabel, OBJ_HLINE, 0, 0, sessionHigh); - ObjectSetInteger(0, highLabel, OBJPROP_COLOR, sessionClr); - ObjectSetInteger(0, highLabel, OBJPROP_WIDTH, LineWidth); - ObjectSetInteger(0, highLabel, OBJPROP_BACK, true); - - ObjectCreate(0, lowLabel, OBJ_HLINE, 0, 0, sessionLow); - ObjectSetInteger(0, lowLabel, OBJPROP_COLOR, sessionClr); - ObjectSetInteger(0, lowLabel, OBJPROP_WIDTH, LineWidth); - ObjectSetInteger(0, lowLabel, OBJPROP_STYLE, STYLE_DOT); - ObjectSetInteger(0, lowLabel, OBJPROP_BACK, true); - } - } -} - -//+------------------------------------------------------------------+ -//| Add session labels to the chart | -//+------------------------------------------------------------------+ -void AddSessionLabels(datetime currentTime, double currentHigh, double currentLow) -{ - MqlDateTime dt; - TimeToStruct(currentTime, dt); - - // Remove previous labels - ObjectsDeleteAll(0, "SessionLabel_"); - - if(IsInSession(dt.hour, dt.min, SydneyStartHour, SydneyStartMin, SydneyEndHour, SydneyEndMin)) - { - ObjectCreate(0, "SessionLabel_Sydney", OBJ_TEXT, 0, currentTime, currentHigh + 10 * _Point); - ObjectSetString(0, "SessionLabel_Sydney", OBJPROP_TEXT, "Sydney Session"); - ObjectSetInteger(0, "SessionLabel_Sydney", OBJPROP_COLOR, SydneyColor); - ObjectSetInteger(0, "SessionLabel_Sydney", OBJPROP_ANCHOR, ANCHOR_LEFT_UPPER); - } - - if(IsInSession(dt.hour, dt.min, TokyoStartHour, TokyoStartMin, TokyoEndHour, TokyoEndMin)) - { - ObjectCreate(0, "SessionLabel_Tokyo", OBJ_TEXT, 0, currentTime, currentHigh + 20 * _Point); - ObjectSetString(0, "SessionLabel_Tokyo", OBJPROP_TEXT, "Tokyo Session"); - ObjectSetInteger(0, "SessionLabel_Tokyo", OBJPROP_COLOR, TokyoColor); - ObjectSetInteger(0, "SessionLabel_Tokyo", OBJPROP_ANCHOR, ANCHOR_LEFT_UPPER); - } - - if(IsInSession(dt.hour, dt.min, LondonStartHour, LondonStartMin, LondonEndHour, LondonEndMin)) - { - ObjectCreate(0, "SessionLabel_London", OBJ_TEXT, 0, currentTime, currentHigh + 30 * _Point); - ObjectSetString(0, "SessionLabel_London", OBJPROP_TEXT, "London Session"); - ObjectSetInteger(0, "SessionLabel_London", OBJPROP_COLOR, LondonColor); - ObjectSetInteger(0, "SessionLabel_London", OBJPROP_ANCHOR, ANCHOR_LEFT_UPPER); - } - - if(IsInSession(dt.hour, dt.min, NewYorkStartHour, NewYorkStartMin, NewYorkEndHour, NewYorkEndMin)) - { - ObjectCreate(0, "SessionLabel_NewYork", OBJ_TEXT, 0, currentTime, currentHigh + 40 * _Point); - ObjectSetString(0, "SessionLabel_NewYork", OBJPROP_TEXT, "New York Session"); - ObjectSetInteger(0, "SessionLabel_NewYork", OBJPROP_COLOR, NewYorkColor); - ObjectSetInteger(0, "SessionLabel_NewYork", OBJPROP_ANCHOR, ANCHOR_LEFT_UPPER); - } -} - -//+------------------------------------------------------------------+ \ No newline at end of file diff --git a/Documents/BKP/fvg.detection.mq5 b/Documents/BKP/fvg.detection.mq5 deleted file mode 100644 index ae01c30b..00000000 --- a/Documents/BKP/fvg.detection.mq5 +++ /dev/null @@ -1,35 +0,0 @@ - // - XCPOIDrawer *drawer = cHelper.mPOIDrawer; - - // - if (cStateEvents.hasNewFairValueGap) - { - // - int idx = GetYoungest(cState.fairValueGaps); - has = IsValidIndex(idx); - if (has) - { - // - XBoxZone box; - has = ToBox( - box, - cState.fairValueGaps[idx] // - ); - if (has) - { - // - XCBoxObject *iObj; - has = drawer.DrawBox( - box, - iObj // - ); - if (has) - { - Print("Box Drawn ..."); - } - } - } - } - - // - ZeroMemory(drawer); diff --git a/Documents/BKP/percentile.supertrend.pine b/Documents/BKP/percentile.supertrend.pine deleted file mode 100644 index 9859bf95..00000000 --- a/Documents/BKP/percentile.supertrend.pine +++ /dev/null @@ -1,66 +0,0 @@ -// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ -// © Mattes00 - -//@version=6 -indicator("25-75 Percentile SuperTrend | Mattes", shorttitle = "25-75 ST | Mattes", overlay = true) - -subject = input.int (14,"Supertrend length", minval = 2 , group="25-75 Percentile SuperTrend") -mult = input.float (1, "Multiplier", step=0.05,group="25-75 Percentile SuperTrend") -slen = input.int (27, "Percentile length", group="25-75 Percentile SuperTrend") -src_2575 = input.source(high, "Median smoothing source", group="25-75 Percentile SuperTrend") - -smooth_lower = ta.percentile_nearest_rank(src_2575, slen, 25) -smooth_upper = ta.percentile_nearest_rank(src_2575, slen, 75) - - -Percentile_SuperTrend_func(mult, atrPeriod) => - src_long = smooth_upper - src_short = smooth_lower - - atr = ta.atr(atrPeriod) - upper = src_long + mult * atr - lower = src_short - mult * atr - pl = nz(lower[1]) - pu = nz(upper[1]) - - lower := lower > pl or close[1] < pl ? lower : pl - upper := upper < pu or close[1] > pu ? upper : pu - - int dist = na - float st = na - pt = st[1] - if na(atr[1]) - dist := 1 - else if pt == pu - dist := close > upper ? -1 : 1 - else - dist := close < lower ? 1 : -1 - st := dist == -1 ? lower : upper - [st, dist] - - -[x, dist] = Percentile_SuperTrend_func(mult, subject) - -ST_L = ta.crossunder(dist, 0) -ST_S = ta.crossover(dist, 0) - -Long = ST_L -Short = ST_S - -var Mattes = 0 -if (Long and not Short) - Mattes := 1 -if Short - Mattes := -1 - -syscol = Mattes == 1 ? color.rgb(45, 162, 252) : Mattes == -1 ? color.rgb(113, 59, 249) : color.gray -BlueTransParent = color.new(color.rgb(45, 162, 252), 50) -PurpleTransParent = color.new(color.rgb(113, 59, 249), 50) - -plotcandle(open, high, low, close, 'BarColor', color = syscol, bordercolor = syscol, wickcolor = syscol,force_overlay = true) -upTrend = plot(dist < 0 ? x : na, "Up Trend", color = color.rgb(45, 162, 252), style = plot.style_linebr, linewidth = 2) -downTrend = plot(dist < 0 ? na : x, "Down Trend", color = color.rgb(113, 59, 249), style = plot.style_linebr, linewidth = 2) -s = plot((smooth_lower + smooth_upper) / 2, color = syscol) -fill(s, upTrend, BlueTransParent, fillgaps = false) -fill(s, downTrend, PurpleTransParent, fillgaps = false) - diff --git a/Documents/BKP/session.detector.mq5 b/Documents/BKP/session.detector.mq5 deleted file mode 100644 index 8ac3c89e..00000000 --- a/Documents/BKP/session.detector.mq5 +++ /dev/null @@ -1,318 +0,0 @@ -//+------------------------------------------------------------------+ -//| Forex Sessions and Day Range Indicator | -//+------------------------------------------------------------------+ -#property copyright "Your Name" -#property link "https://www.example.com" -#property version "1.00" -#property indicator_chart_window -#property indicator_buffers 8 // 4 sessions * (High + Low) - -#include "../Libraries/x-saherelm.common.lib.mq5" -#include - -// Define an enumeration for DST rules -enum DST_RULE -{ - DST_SYDNEY, - DST_TOKYO, - DST_LONDON, - DST_NEW_YORK -}; - -struct SessionInfo -{ - string name; - int startHour; // Standard start hour (GMT) - int startMinute; - int endHour; // Standard end hour (GMT) - int endMinute; - DST_RULE dstRule; // DST rule for the session - int dstAdjustment; // Hours to add during DST -}; - -SessionInfo sessions[] = { - {"Sydney", 21, 0, 5, 0, DST_SYDNEY, 1}, - {"Tokyo", 23, 0, 8, 0, DST_TOKYO, 0}, - {"London", 7, 0, 15, 0, DST_LONDON, 1}, - {"New York", 12, 0, 17, 0, DST_NEW_YORK, 1}}; - -double sessionHighBuffers[]; // Buffer for session highs -double sessionLowBuffers[]; // Buffer for session lows - -bool sessionActive[]; -double sessionHigh[]; -double sessionLow[]; -datetime sessionStartTime[]; -datetime sessionEndTime[]; - -double dayHigh = 0; -double dayLow = 0; -datetime dayStartTime; - -// Function to extract the year from a datetime value -int GetYear(datetime time) -{ - return (int)StringSubstr(TimeToString(time, TIME_DATE), 0, 4); -} - -// Function to extract the day of the month from a datetime value -int GetDay(datetime time) -{ - MqlDateTime dt; - TimeToStruct(time, dt); - return dt.day; -} - -// Function to extract the day of the week from a datetime value (0=Sunday, 6=Saturday) -int GetDayOfWeek(datetime time) -{ - MqlDateTime dt; - TimeToStruct(time, dt); - return dt.day_of_week; -} - -//+------------------------------------------------------------------+ -//| Custom indicator initialization function | -//+------------------------------------------------------------------+ -int OnInit() -{ - ArrayResize(sessionActive, ArraySize(sessions)); - ArrayResize(sessionHigh, ArraySize(sessions)); - ArrayResize(sessionLow, ArraySize(sessions)); - ArrayResize(sessionStartTime, ArraySize(sessions)); - ArrayResize(sessionEndTime, ArraySize(sessions)); - - for (int i = 0; i < ArraySize(sessions); i++) - { - sessionActive[i] = false; - sessionHigh[i] = 0; - sessionLow[i] = 0; - sessionStartTime[i] = 0; - sessionEndTime[i] = 0; - } - - dayHigh = 0; - dayLow = 0; - dayStartTime = 0; - - // Initialize buffers for session highs and lows - int totalSessions = ArraySize(sessions); - int totalBars = iBars(NULL, 0); // Get the number of bars on the chart - - ArrayResize(sessionHighBuffers, totalBars); // Resize to match the number of bars - ArrayResize(sessionLowBuffers, totalBars); // Resize to match the number of bars - - for (int i = 0; i < totalSessions; i++) - { - SetIndexBuffer(i * 2, sessionHighBuffers, INDICATOR_DATA); - SetIndexBuffer(i * 2 + 1, sessionLowBuffers, INDICATOR_DATA); - - // Optional: Set colors for high and low buffers - PlotIndexSetInteger(i * 2, PLOT_LINE_COLOR, clrGreen); - PlotIndexSetInteger(i * 2 + 1, PLOT_LINE_COLOR, clrRed); - - IndicatorSetInteger(INDICATOR_LEVELS, 0); // No predefined levels - IndicatorSetString(INDICATOR_SHORTNAME, "Forex Sessions"); - } - - return (INIT_SUCCEEDED); -} - -//+------------------------------------------------------------------+ -//| Custom indicator iteration function | -//+------------------------------------------------------------------+ -int OnCalculate(const int rates_total, - const int prev_calculated, - const datetime &time[], - const double &open[], - const double &high[], - const double &low[], - const double &close[], - const long &tick_volume[], - const long &volume[], - const int &spread[]) -{ - // Ensure buffers are resized to match the number of bars - if (ArraySize(sessionHighBuffers) < rates_total) - { - ArrayResize(sessionHighBuffers, rates_total); - ArrayResize(sessionLowBuffers, rates_total); - } - - datetime currentTime = TimeCurrent(); - - // Retrieve Ask and Bid prices dynamically - double askPrice = SymbolInfoDouble(Symbol(), SYMBOL_ASK); - double bidPrice = SymbolInfoDouble(Symbol(), SYMBOL_BID); - - // Check each session - for (int i = 0; i < ArraySize(sessions); i++) - { - SessionInfo session = sessions[i]; - - // Determine if DST is active using the session's DST rule - bool dstActive = IsDSTActive(session.dstRule, currentTime); - int adjStartHour = session.startHour + (dstActive ? session.dstAdjustment : 0); - int adjEndHour = session.endHour + (dstActive ? session.dstAdjustment : 0); - - datetime todayStart = StringToTime(TimeToString(currentTime, TIME_DATE) + " " + - IntegerToString(adjStartHour) + ":" + - IntegerToString(session.startMinute)); - datetime todayEnd = StringToTime(TimeToString(currentTime, TIME_DATE) + " " + - IntegerToString(adjEndHour) + ":" + - IntegerToString(session.endMinute)); - - // Handle sessions spanning midnight - if (adjEndHour < adjStartHour) - { - todayEnd += 24 * 3600; - } - - if (currentTime >= todayStart && currentTime < todayEnd) - { - if (!sessionActive[i]) - { - sessionActive[i] = true; - sessionStartTime[i] = todayStart; - sessionEndTime[i] = todayEnd; - sessionHigh[i] = askPrice; - sessionLow[i] = bidPrice; - } - else - { - if (askPrice > sessionHigh[i]) - sessionHigh[i] = askPrice; - if (bidPrice < sessionLow[i]) - sessionLow[i] = bidPrice; - } - - // Update buffers for the current bar - sessionHighBuffers[rates_total - 1] = sessionHigh[i]; - sessionLowBuffers[rates_total - 1] = sessionLow[i]; - } - else - { - sessionActive[i] = false; - sessionHighBuffers[rates_total - 1] = EMPTY_VALUE; // Clear buffer when session is inactive - sessionLowBuffers[rates_total - 1] = EMPTY_VALUE; - } - } - - // Check day range - bool dstActiveNY = IsDSTActive(DST_NEW_YORK, currentTime); - int dayStartHour = dstActiveNY ? 21 : 22; - datetime todayDayStart = StringToTime(TimeToString(currentTime, TIME_DATE) + " " + - IntegerToString(dayStartHour) + ":00"); - - if (currentTime < todayDayStart) - { - todayDayStart -= 24 * 3600; - } - - if (dayStartTime != todayDayStart) - { - dayStartTime = todayDayStart; - dayHigh = askPrice; - dayLow = bidPrice; - } - else - { - if (askPrice > dayHigh) - dayHigh = askPrice; - if (bidPrice < dayLow) - dayLow = bidPrice; - } - - // Display information on chart - string comment = "Active Forex Sessions:\n"; - for (int i = 0; i < ArraySize(sessions); i++) - { - if (sessionActive[i]) - { - comment += sessions[i].name + " Session\n" + - "High: " + DoubleToString(sessionHigh[i], _Digits) + "\n" + - "Low: " + DoubleToString(sessionLow[i], _Digits) + "\n"; - } - } - comment += "\nDay Range:\n" + - "High: " + DoubleToString(dayHigh, _Digits) + "\n" + - "Low: " + DoubleToString(dayLow, _Digits); - Comment(comment); - - return (rates_total); -} - -//+------------------------------------------------------------------+ -//| Check if DST is active for a given session | -//+------------------------------------------------------------------+ -bool IsDSTActive(DST_RULE dstRule, datetime time) -{ - switch (dstRule) - { - case DST_SYDNEY: - return IsSydneyDST(time); - case DST_TOKYO: - return IsTokyoDST(time); - case DST_LONDON: - return IsLondonDST(time); - case DST_NEW_YORK: - return IsNewYorkDST(time); - default: - return false; - } -} - -//+------------------------------------------------------------------+ -//| DST Check Functions | -//+------------------------------------------------------------------+ -bool IsLondonDST(datetime time) -{ - int year = GetYear(time); - datetime march31 = StringToTime(ToString(year) + ".03.31 00:00"); - int lastSundayMarch = GetDay(march31) - (GetDayOfWeek(march31) % 7); - datetime dstStart = StringToTime(ToString(year) + ".03." + IntegerToString(lastSundayMarch) + " 01:00"); - - datetime oct31 = StringToTime(ToString(year) + ".10.31 00:00"); - int lastSundayOct = GetDay(oct31) - (GetDayOfWeek(oct31) % 7); - datetime dstEnd = StringToTime(ToString(year) + ".10." + IntegerToString(lastSundayOct) + " 01:00"); - - return time >= dstStart && time < dstEnd; -} - -bool IsNewYorkDST(datetime time) -{ - int year = GetYear(time); - datetime march1 = StringToTime(ToString(year) + ".03.01 00:00"); - int dayOfWeekMarch1 = GetDayOfWeek(march1); - int secondSundayMarch = 1 + (7 - dayOfWeekMarch1) % 7 + 7; - datetime dstStart = StringToTime(ToString(year) + ".03." + IntegerToString(secondSundayMarch) + " 07:00"); - - datetime nov1 = StringToTime(ToString(year) + ".11.01 00:00"); - int dayOfWeekNov1 = GetDayOfWeek(nov1); - int firstSundayNov = 1 + (7 - dayOfWeekNov1) % 7; - datetime dstEnd = StringToTime(ToString(year) + ".11." + IntegerToString(firstSundayNov) + " 06:00"); - - return time >= dstStart && time < dstEnd; -} - -bool IsSydneyDST(datetime time) -{ - int year = GetYear(time); - datetime oct1 = StringToTime(ToString(year) + ".10.01 00:00"); - int dayOfWeekOct1 = GetDayOfWeek(oct1); - int firstSundayOct = 1 + (7 - dayOfWeekOct1) % 7; - datetime dstStart = StringToTime(ToString(year) + ".10." + IntegerToString(firstSundayOct) + " 13:00"); - - datetime apr1 = StringToTime(ToString(year) + ".04.01 00:00"); - int dayOfWeekApr1 = GetDayOfWeek(apr1); - int firstSundayApr = 1 + (7 - dayOfWeekApr1) % 7; - datetime dstEnd = StringToTime(ToString(year) + ".04." + IntegerToString(firstSundayApr) + " 15:00"); - - return time >= dstStart && time < dstEnd; -} - -bool IsTokyoDST(datetime time) -{ - // Tokyo does not observe Daylight Saving Time (DST) - return false; -} \ No newline at end of file diff --git a/Documents/BKP/tmp.sig.codes.mq5 b/Documents/BKP/tmp.sig.codes.mq5 deleted file mode 100644 index 70060d09..00000000 --- a/Documents/BKP/tmp.sig.codes.mq5 +++ /dev/null @@ -1,798 +0,0 @@ - -// -// Checking Bar Based on Positions State ... -ENUM_X_DIRECTION iBarPosDir; -bool isBarValidForDir = cHelper - .mBarAnalyser - .IsValidForPosition( - cBar, - iBarPosDir // - ); -bool isBarValidForBullish = - isBarValidForDir && - IsBullish(iBarPosDir); -bool isBarValidForBearish = - isBarValidForDir && - IsBearish(iBarPosDir); - -// -// Check Bar Place Based on Golden Zones ... - -// -bool isBarInPeaksGoldenZone = - cBar.high <= cXConditions.peaksBuffer[cIDX] && - cBar.low >= cXConditions.peaksGoldenBuffer[cIDX]; - -// -bool isBarInValesGoldenZone = - cBar.high >= cXConditions.valesBuffer[cIDX] && - cBar.low <= cXConditions.valesGoldenBuffer[cIDX]; - -// -XCPOIDrawer *drawer = provider.visionCycleHelper.mPOIDrawer; - -// -// X3MA ... - -// -bool isX3MaFastMidOverPeaksGoldeZone = - isX3MaFastOverPeaksGoldenZone && - isX3MaMidOverPeaksGoldenZone; - -// -bool isX3MaFastMidUnderValesGoldeZone = - isX3MaFastUnderValesGoldenZone && - isX3MaMidUnderValesGoldenZone; - -// -// XVWAP ... - -// -bool isVWapFastMidOverPeaksGoldeZone = - isVWapFastOverPeaksGoldenZone && - isVWapMidOverPeaksGoldenZone; - -// -bool isVWapFastMidUnderValesGoldeZone = - isVWapFastUnderValesGoldenZone && - isVWapMidUnderValesGoldenZone; - -// -// - -// -bool isX3MaVWapFastUnderValuesGoldenZone = - isX3MaFastUnderValesGoldenZone && - isVWapFastUnderValesGoldenZone; - -// -bool isX3MaVWapFastOverPeaksGoldenZone = - isX3MaFastOverPeaksGoldenZone && - isVWapFastOverPeaksGoldenZone; - -// -// - -// -double x3MaFastMidMax = MathMax( - cXConditions.x3maFastBuffer[cIDX], - cXConditions.x3maMidBuffer[cIDX] // -); - -// -double x3MaFastMidMin = MathMin( - cXConditions.x3maFastBuffer[cIDX], - cXConditions.x3maMidBuffer[cIDX] // -); - -// -double vwapFastMidMax = MathMax( - cXConditions.vwapFastBuffer[cIDX], - cXConditions.vwapMidBuffer[cIDX] // -); - -// -double vwapFastMidMin = MathMin( - cXConditions.vwapFastBuffer[cIDX], - cXConditions.vwapMidBuffer[cIDX] // -); - -// -// - -// -double x3maVWapFastMidMax = MathMax(x3MaFastMidMax, vwapFastMidMax); -double x3maVWapFastMidMin = MathMin(x3MaFastMidMin, vwapFastMidMin); - -// -double x3maVWapMax = MathMax(cXConditions.x3maMax, cXConditions.vwapMax); -double x3maVWapMin = MathMin(cXConditions.x3maMin, cXConditions.vwapMin); - -// -double x3maVWapDiff = x3maVWapMax - x3maVWapMin; - -// -double atr = cXConditions.atrBuffer[cIDX]; - -// -bool isConsolidate = x3maVWapDiff <= (3 * atr); - -// -bool isX3MaVWapSwitchedToBullish = - // - // VWap ... - ( - // - (cXConditions.isVWapBullishOrdered && - cXConditions.isVWapSwitchedToBullishState) || - (cXConditions.isVWapBullishState && - cXConditions.isVWapSwitchedToBullishOrdered) - // - ) - // - || - // - // X3Ma ... - ( - // - (cXConditions.isX3MaBullishOrdered && - cXConditions.isX3MaSwitchedToBullishState) || - (cXConditions.isX3MaBullishState && - cXConditions.isX3MaSwitchedToBullishOrdered) - // - ) - // - ; - -// -bool isX3MaVWapSwitchedToBearish = - // - // VWap ... - ( - // - (cXConditions.isVWapBearishOrdered && - cXConditions.isVWapSwitchedToBearishState) || - (cXConditions.isVWapBearishState && - cXConditions.isVWapSwitchedToBearishOrdered) - // - ) - // - || - // - // X3Ma ... - ( - // - (cXConditions.isX3MaBearishOrdered && - cXConditions.isX3MaSwitchedToBearishState) || - (cXConditions.isX3MaBearishState && - cXConditions.isX3MaSwitchedToBearishOrdered) - // - ) - // - ; - -// -// Bullish Conditions ... -isBullish = - // - // Base Condition ... - ( - // - false - // - // isConsolidate && - // isBarValidForBullish && - // cXConditions.isSarBullish && - // isX3MaVWapSwitchedToBullish && - // cXConditions.isNewPeakOverLast // && - // isVWapFastMidUnderValesGoldeZone // && - // cXConditions.isAtrLowerSlopeBullish - // - ) - // - ; - -// -// Bearish Conditions ... -isBearish = - // - // Base Condition ... - ( - // - false - // - // isConsolidate && - // isBarValidForBearish && - // cXConditions.isSarBearish && - // isX3MaVWapSwitchedToBearish && - // cXConditions.isNewValeUnderLast // && - // isVWapFastMidOverPeaksGoldeZone // && - // cXConditions.isAtrUpperSlopeBearish - // - ) - // - ; - -//////////////////////////////////////////////////////////////////// - -// -// XWPVZ ... -bool HasXWPVZConditions( - ENUM_X_CYCLES cycle, - XSignalBox &box, - ENUM_X_DIRECTION &dir, - X121SMCStrategySignalProviderData &provider, - int barIndex = 0 // -) -{ - // - bool result = false; - - // - box.Clean(); - dir = X_DIRECTION_NONE; - - // - // Fil Selected Data ... - XPOIState cState; - X121Conditions cXConditions; - XPOIStateEvents cStateEvents; - XC121SMCCycleHelper *cHelper; - X121SMCCycleConditions cConditions; - result = provider.SelectCycle( - cycle, - cState, - cStateEvents, - cXConditions, - cHelper, - cConditions // - ); - if (!result) - { - // - cState.Clean(); - ZeroMemory(cHelper); - cConditions.Clean(); - cXConditions.Clean(); - cStateEvents.Clean(); - - // - return result; - } - Parse(cXConditions); - - // - // Normalize Args ... - - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - int idx = -1; - int count = 0; - bool has = false; - - // - int zIDX = barIndex; - int cIDX = zIDX + 1; - int pIDX = cIDX + 1; - int ppIDX = pIDX + 1; - - // - bool isBullish = false; - bool isBearish = false; - - // - XOHCL zBar; - XOHCL cBar; - XOHCL pBar; - - // - // Initial Bars ... - result = zBar.Init( - cState.symbol, - cState.period, - barIndex // - ); - result = - result && - zBar.GetPreviousBar(cBar); - result = - result && - cBar.GetPreviousBar(pBar); - if (!result) - { - // - zBar.Clean(); - cBar.Clean(); - pBar.Clean(); - cState.Clean(); - ZeroMemory(cHelper); - cConditions.Clean(); - cXConditions.Clean(); - - // - return result; - } - - // - XCPOIDrawer *drawer = provider.visionCycleHelper.mPOIDrawer; - - // - // Checking Other Conditions ... - - // - // Checking Bar Based on Positions State ... - ENUM_X_DIRECTION iBarPosDir; - bool isBarValidForDir = cHelper - .mBarAnalyser - .IsValidForPosition( - cBar, - iBarPosDir // - ); - bool isBarValidForBullish = - isBarValidForDir && - IsBullish(iBarPosDir); - bool isBarValidForBearish = - isBarValidForDir && - IsBearish(iBarPosDir); - - // // - // // Continuation Bullish ... - // bool isContinuationBullish = - // // - // isBarValidForBullish && - // cXConditions.isSarBullish && - // cXConditions.isStrBullish && - // cXConditions.isNewPeakOverLast - // // - // ; - - // // - // // Continuation Bearish ... - // bool isContinuationBearish = - // // - // isBarValidForBearish && - // cXConditions.isSarBearish && - // cXConditions.isStrBearish && - // cXConditions.isNewValeUnderLast - // // - // ; - - // - XBoxZone obBox; - XBoxZone fvgBox; - XBoxZone supResBox; - XBoxZone tmpBoxes[]; - bool isBullishFVGRejected = false; - bool isBearishFVGRejected = false; - bool isFVGLowerBullishRejected = false; - bool isFVGUpperBullishRejected = false; - bool isFVGLowerBearishRejected = false; - bool isFVGUpperBearishRejected = false; - has = cState.HasFairValueGaps(); - if (has) - { - // - // Converts FairValueGaps to Box ... - ToBox( - cState.fairValueGaps, - tmpBoxes // - ); - - // - // Select FVG ... - while (HasChild(tmpBoxes)) - { - // - idx = GetYoungest(tmpBoxes); - has = IsValidIndex(idx); - if (!has) - { - break; - } - - // - XBoxZone iBox = tmpBoxes[idx]; - ArrayRemove( - tmpBoxes, - idx, - 1 // - ); - - // - isFVGLowerBullishRejected = - // - cBar.low < iBox.lower && - cBar.GetDown() > iBox.lower - // - ; - - // - isFVGUpperBullishRejected = - // - cBar.low < iBox.upper && - cBar.GetDown() > iBox.upper - // - ; - - // - isFVGLowerBearishRejected = - // - cBar.high > iBox.lower && - cBar.GetUp() < iBox.lower - // - ; - - // - isFVGUpperBearishRejected = - // - cBar.high > iBox.upper && - cBar.GetUp() < iBox.upper - // - ; - - // - // - - // - isBullishFVGRejected = - // - iBox.IsBullish() && - cBar.IsBullish() && - (isFVGLowerBullishRejected - // || isFVGUpperBullishRejected - ) - // - ; - - // - isBearishFVGRejected = - // - iBox.IsBearish() && - cBar.IsBearish() && - ( // isFVGLowerBearishRejected || - isFVGUpperBearishRejected) - // - ; - - // - has = isBullishFVGRejected || - isBearishFVGRejected; - if (has) - { - // - iBox.to = TimeCurrent(); - fvgBox = iBox; - iBox.Clean(); - break; - } - - // - iBox.Clean(); - } - Clean(tmpBoxes); - - // - // Select Order Block which FVG is Inside it ... - has = fvgBox.IsValid(); - if (has) - { - // - // Converts Order Blocks to Box ... - ToBox( - cState.orderBlocks, - tmpBoxes // - ); - - // - // Select Order Blocks ... - has = HasChild(tmpBoxes); - if (has) - { - // - while (HasChild(tmpBoxes)) - { - // - idx = GetYoungest(tmpBoxes); - has = IsValidIndex(idx); - if (!has) - { - break; - } - - // - XBoxZone iBox = tmpBoxes[idx]; - ArrayRemove( - tmpBoxes, - idx, - 1 // - ); - - // - // Validate Order Blocks ... - bool isSameDir = iBox.dir == fvgBox.dir; - bool isFVGInsideOB = IsBoxInsideOr( - fvgBox, - iBox // - ); - - // - has = - isSameDir && - isFVGInsideOB; - if (has) - { - // - iBox.to = TimeCurrent(); - obBox = iBox; - iBox.Clean(); - break; - } - - // - iBox.Clean(); - } - } - } - - // - has = obBox.IsValid(); - if (!has) - { - // - obBox.Clean(); - fvgBox.Clean(); - - // - isBullishFVGRejected = false; - isBearishFVGRejected = false; - isFVGLowerBullishRejected = false; - isFVGUpperBullishRejected = false; - isFVGLowerBearishRejected = false; - isFVGUpperBearishRejected = false; - } - Clean(tmpBoxes); - - // - // Checking Support nad Resistance ... - bool isDirBullish = - obBox.IsBullish() && - fvgBox.IsBullish(); - has = - obBox.IsValid() && - fvgBox.IsValid(); - if (has) - { - // - // Converts Support or Resistance to Boxes ... - if (isDirBullish) - { - // - ToBox( - cState.supportZones, - tmpBoxes // - ); - } - else - { - // - ToBox( - cState.resistanceZones, - tmpBoxes // - ); - } - - // - // Selecting Support nad Resistance ... - has = HasChild(tmpBoxes); - if (has) - { - // - while (HasChild(tmpBoxes)) - { - // - idx = GetYoungest(tmpBoxes); - has = IsValidIndex(idx); - if (!has) - { - break; - } - - // - XBoxZone iBox = tmpBoxes[idx]; - ArrayRemove( - tmpBoxes, - idx, - 1 // - ); - - // - // Validate Support and Resistane ... - bool isDirPassed = iBox.dir == obBox.dir; - bool isPlacePassed = - IsBoxAbove( - iBox, - fvgBox // - ) || - IsBoxAbove( - fvgBox, - iBox // - ) || - IsBoxInside( - iBox, - fvgBox // - ) || - IsBoxInside( - fvgBox, - iBox // - ); - - has = - isDirPassed && - isPlacePassed; - if (has) - { - // - iBox.to = TimeCurrent(); - supResBox = iBox; - iBox.Clean(); - break; - } - - // - iBox.Clean(); - } - } - - // - has = obBox.IsValid() && - fvgBox.IsValid() && - supResBox.IsValid(); - if (!has) - { - // - obBox.Clean(); - fvgBox.Clean(); - supResBox.Clean(); - - // - isBullishFVGRejected = false; - isBearishFVGRejected = false; - isFVGLowerBullishRejected = false; - isFVGUpperBullishRejected = false; - isFVGLowerBearishRejected = false; - isFVGUpperBearishRejected = false; - } - } - } - Clean(tmpBoxes); - - // - // Checking OB and FVG Validation ... - has = obBox.IsValid() && - fvgBox.IsValid() && - supResBox.IsValid(); - if (has) - { - // - // Draw OB ... - if (obBox.IsValid()) - { - // - XCBoxObject *iObj; - has = drawer.DrawBox( - obBox, - iObj // - ); - if (has) - { - iObj.BoxStyle(STYLE_DASH); - } - } - - // - // Draw FVG ... - if (fvgBox.IsValid()) - { - // - XCBoxObject *iObj; - has = drawer.DrawBox( - fvgBox, - iObj // - ); - if (has) - { - iObj.BoxStyle(STYLE_SOLID); - } - } - - // - // Draw Sup/Res Box ... - if (supResBox.IsValid()) - { - // - XCBoxObject *iObj; - has = drawer.DrawBox( - supResBox, - iObj // - ); - if (has) - { - iObj.BoxStyle(STYLE_DOT); - } - } - } - - // - // Bullish Conditions ... - isBullish = - // - // Base Condition ... - ( - // - // false - isBullishFVGRejected - // - ) - // - ; - - // - // Bearish Conditions ... - isBearish = - // - // Base Condition ... - ( - // - // false - isBearishFVGRejected - // - ) - // - ; - - // - // Filling Requirements ... - result = - isBullish || - isBearish; - if (result) - { - // - dir = - isBullish - ? X_DIRECTION_BULLISH - : X_DIRECTION_BEARISH; - - // - box.ob = obBox; - box.fvg = fvgBox; - box.sharp = supResBox; - } - - // - // Check All Conditions ... - result = - box.IsValid() && - HasDirection(dir) && - (isBullish || - isBearish); - - // - // Cleanup Resources ... - zBar.Clean(); - cBar.Clean(); - pBar.Clean(); - cState.Clean(); - ZeroMemory(cHelper); - cConditions.Clean(); - cStateEvents.Clean(); - cXConditions.Clean(); - - // - return result; -} diff --git a/Documents/BKP/volume.mq5 b/Documents/BKP/volume.mq5 deleted file mode 100644 index 588abc91..00000000 --- a/Documents/BKP/volume.mq5 +++ /dev/null @@ -1,210 +0,0 @@ -//+------------------------------------------------------------------+ -//| BuySellVolumes.mq5 | -//| Copyright © 2023, YourName | -//| | -//+------------------------------------------------------------------+ -#property copyright "YourName" -#property link "https://www.yourwebsite.com" -#property version "1.00" - -// -#property indicator_separate_window -#property indicator_buffers 4 -#property indicator_plots 4 - -//--- Plot settings for Buy Volume -#property indicator_label1 "Buy Volume" -#property indicator_type1 DRAW_HISTOGRAM -#property indicator_color1 clrLime - -//--- Plot settings for Sell Volume -#property indicator_label2 "Sell Volume" -#property indicator_type2 DRAW_HISTOGRAM -#property indicator_color2 clrRed - -//--- Plot settings for Buy Volume MA -#property indicator_label3 "Buy Volume MA" -#property indicator_type3 DRAW_LINE -#property indicator_color3 clrGreen - -//--- Plot settings for Sell Volume MA -#property indicator_label4 "Sell Volume MA" -#property indicator_type4 DRAW_LINE -#property indicator_color4 clrRed - -//--- Input parameters -input int MAPeriod = 14; // Period for the moving average - -//--- Indicator buffers -double BuyVolumeBuffer[]; // Buffer for Buy Volume -double SellVolumeBuffer[]; // Buffer for Sell Volume -double BuyVolumeMABuffer[]; // Buffer for Buy Volume Moving Average -double SellVolumeMABuffer[]; // Buffer for Sell Volume Moving Average - -//+------------------------------------------------------------------+ -//| Custom indicator initialization function | -//+------------------------------------------------------------------+ -int OnInit() -{ - // - // Attach buffers to the indicator - SetIndexBuffer(0, BuyVolumeBuffer, INDICATOR_DATA); - SetIndexBuffer(1, SellVolumeBuffer, INDICATOR_DATA); - SetIndexBuffer(2, BuyVolumeMABuffer, INDICATOR_DATA); - SetIndexBuffer(3, SellVolumeMABuffer, INDICATOR_DATA); - - // - // Set short name for the indicator - IndicatorSetString(INDICATOR_SHORTNAME, "Buy and Sell Volumes"); - - // - return (INIT_SUCCEEDED); -} - -//+------------------------------------------------------------------+ -//| Custom indicator iteration function | -//+------------------------------------------------------------------+ -int OnCalculate(const int rates_total, - const int prev_calculated, - const datetime &time[], - const double &open[], - const double &high[], - const double &low[], - const double &close[], - const long &tick_volume[], - const long &volume[], - const int &spread[] // -) -{ - // - // Start from the first uncalculated bar - int start = MathMax(prev_calculated - 1, 0); - - // - // Loop through bars - for (int i = start; i < rates_total; i++) - { - // - // Calculate Buy and Sell Volumes based on bar-level data - double buyVolume = 0.0; - double sellVolume = 0.0; - - // - if (close[i] > open[i]) - { - // - buyVolume = (double)tick_volume[i]; // Buying pressure (bullish bar) - sellVolume = 0.0; - } - else if (close[i] < open[i]) - { - // - sellVolume = (double)tick_volume[i]; // Selling pressure (bearish bar) - buyVolume = 0.0; - } - else - { - // - // Neutral bar: split volume equally between buy and sell - buyVolume = tick_volume[i] / 2.0; - sellVolume = tick_volume[i] / 2.0; - } - - // - // Store Buy and Sell Volumes in their respective buffers - BuyVolumeBuffer[i] = buyVolume; - SellVolumeBuffer[i] = sellVolume; - - // - // Calculate Moving Averages for Buy and Sell Volumes - if (i >= MAPeriod - 1) - { - // - // Calculate Simple Moving Average for Buy Volume - double buySum = 0.0; - for (int j = 0; j < MAPeriod; j++) - buySum += BuyVolumeBuffer[i - j]; - BuyVolumeMABuffer[i] = buySum / MAPeriod; - - // - // Calculate Simple Moving Average for Sell Volume - double sellSum = 0.0; - for (int j = 0; j < MAPeriod; j++) - sellSum += SellVolumeBuffer[i - j]; - SellVolumeMABuffer[i] = sellSum / MAPeriod; - } - else - { - // - // Not enough data for MA - BuyVolumeMABuffer[i] = EMPTY_VALUE; - SellVolumeMABuffer[i] = EMPTY_VALUE; - } - } - - // - // Normalize all values between 0 and 100 - // NormalizeValues(rates_total); - - // - return (rates_total); -} - -//+------------------------------------------------------------------+ -//| Normalize all values between 0 and 100 | -//+------------------------------------------------------------------+ -void NormalizeValues(int rates_total) -{ - // - // Find the maximum and minimum values across all buffers - double maxValue = 0.0; - double minValue = DBL_MAX; - - // - for (int i = 0; i < rates_total; i++) - { - // - if (BuyVolumeBuffer[i] != EMPTY_VALUE && BuyVolumeBuffer[i] > maxValue) - maxValue = BuyVolumeBuffer[i]; - if (SellVolumeBuffer[i] != EMPTY_VALUE && SellVolumeBuffer[i] > maxValue) - maxValue = SellVolumeBuffer[i]; - if (BuyVolumeMABuffer[i] != EMPTY_VALUE && BuyVolumeMABuffer[i] > maxValue) - maxValue = BuyVolumeMABuffer[i]; - if (SellVolumeMABuffer[i] != EMPTY_VALUE && SellVolumeMABuffer[i] > maxValue) - maxValue = SellVolumeMABuffer[i]; - - // - if (BuyVolumeBuffer[i] != EMPTY_VALUE && BuyVolumeBuffer[i] < minValue) - minValue = BuyVolumeBuffer[i]; - if (SellVolumeBuffer[i] != EMPTY_VALUE && SellVolumeBuffer[i] < minValue) - minValue = SellVolumeBuffer[i]; - if (BuyVolumeMABuffer[i] != EMPTY_VALUE && BuyVolumeMABuffer[i] < minValue) - minValue = BuyVolumeMABuffer[i]; - if (SellVolumeMABuffer[i] != EMPTY_VALUE && SellVolumeMABuffer[i] < minValue) - minValue = SellVolumeMABuffer[i]; - } - - // - // Avoid division by zero - if (maxValue == minValue) - return; - - // - // Normalize all values - for (int i = 0; i < rates_total; i++) - { - // - if (BuyVolumeBuffer[i] != EMPTY_VALUE) - BuyVolumeBuffer[i] = ((BuyVolumeBuffer[i] - minValue) / (maxValue - minValue)) * 100.0; - - if (SellVolumeBuffer[i] != EMPTY_VALUE) - SellVolumeBuffer[i] = ((SellVolumeBuffer[i] - minValue) / (maxValue - minValue)) * 100.0; - - if (BuyVolumeMABuffer[i] != EMPTY_VALUE) - BuyVolumeMABuffer[i] = ((BuyVolumeMABuffer[i] - minValue) / (maxValue - minValue)) * 100.0; - - if (SellVolumeMABuffer[i] != EMPTY_VALUE) - SellVolumeMABuffer[i] = ((SellVolumeMABuffer[i] - minValue) / (maxValue - minValue)) * 100.0; - } -} -//+------------------------------------------------------------------+ diff --git a/Documents/BKP/x-121.smc.market.cycle.helper.class copy.mq5 b/Documents/BKP/x-121.smc.market.cycle.helper.class copy.mq5 deleted file mode 100644 index 827b5c81..00000000 --- a/Documents/BKP/x-121.smc.market.cycle.helper.class copy.mq5 +++ /dev/null @@ -1,4783 +0,0 @@ -/////////////////////////////////////////////////////// -// -// SaherElm IT Center MQL5 Class Library -// -------------------------------------- -// Name: XC121SMCCycleHelper -// Description: provides all based classes for use ... -// -// -// Maintainer: -// ------------ -// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) -// -////////////////////////////////////////////////////// -// -// Global Properties ... -#property library -#property copyright "Copyright 2023, SaherElm IT Center" -#property link "https://www.saherelm.ir" -#property version "1.00" -#property strict - -// -// Imports ... -#include "../../Classes/x-saherelm.x-bar.analyser.class.mq5" -#include "../../Classes/x-saherelm.x-poi.class.mq5" -#include "../Libraries/x-121.smc.lib.mq5" - -// -// Definitions ... - -// -// Implementations ... - -// -// Cycles Enumeration ... -enum ENUM_X_CYCLES -{ - X_CYCLE_NONE, - X_CYCLE_TRIGGER, - X_CYCLE_DECISION, - X_CYCLE_ANALYSE, - X_CYCLE_VERIFICATION, - X_CYCLE_CONSOLIDATION, - X_CYCLE_VISION, -}; - -// -// String Representation of Cycles Enumeration ... -string ToString(ENUM_X_CYCLES value) -{ - // - string result = EnumToString(value); - - // - StringReplace(result, "X_CYCLE_", ""); - - // - return result; -} - -// -// Validate a Cycle ... -bool IsValid(ENUM_X_CYCLES value) -{ - // - bool result = false; - - // - result = - value != X_CYCLE_NONE; - - // - return result; -} - -// -// Cycle Events Enumeration ... -enum ENUM_X_CYCLE_EVENTS -{ - SAR_CHANGE_DETECTED, - NEW_PEAK_DETECTED, - NEW_VALE_DETECTED, - PIVOT_POINT_DETECTED, - VWAP_ORDER_CHANGE_ETECTED, - VWAP_STATE_CHANGE_DETCTED, - CONSOLIDATION_BREAKED_DETECTED, - PEAK_PIVOT_STARTED, - PEAK_PIVOT_ENDED, - VALE_PIVOT_STARTED, - VALE_PIVOT_ENDED, -}; - -// -// Cycle Helper ... -class XC121SMCCycleHelper : public XCBase -{ - // - public: - // - // Props ... - - // - // X121 ... - XCX121Helper *mX121Helper; - - // - // POI Detector ... - XCPOIDrawer *mPOIDrawer; - XCPOIDetector *mPOIDetector; - - // - // Bar Analyser - XCBarAnalyser *mBarAnalyser; - - // - // Constructor(s) ... - XC121SMCCycleHelper() - { - Default(); - } - - // - // Deconstructor ... - ~XC121SMCCycleHelper() - { - DeInit(); - } - - // - // Getter/Setter(s) ... - - // - // Actions ... - - /** - * Initialize ... - * - * @param symbol: String ... - * @param period: ENUM_TIMEFRAMES member ... - * @param x121Inputs: X121Inputs instance ... - * - * @return ( bool ) - */ - bool Init( - string symbol, - ENUM_TIMEFRAMES period, - X121Inputs &x121Inputs, - int requiredPOIs = 50 // - ) - { - // - bool result = false; - - // - if (requiredPOIs < 0) - { - requiredPOIs = 0; - } - - // - result = IsValid(symbol) && - IsValid(period); - if (!result) - { - return result; - } - - // - mSymbol = symbol; - mPeriod = period; - - // - // X121 ... - mX121Helper = new XCX121Helper(); - result = mX121Helper.Init( - symbol, - period, - x121Inputs // - ); - if (!result) - { - return result; - } - - // - mPOIDetector = new XCPOIDetector( - symbol, - period // - ); - mPOIDetector.MaxRequiredPOIs(requiredPOIs); - - // - int maxLoopbackBars = mPOIDetector.MaxAllowedLoopbackForInit(); - int periodSeconds = PeriodSeconds(period); - if (periodSeconds > PeriodSeconds(PERIOD_M15)) - { - // - int multiplier = periodSeconds / PeriodSeconds(PERIOD_M15); - - // - if (multiplier >= 1) - { - maxLoopbackBars *= 2; - } - } - mPOIDetector.MaxAllowedLoopbackForInit(maxLoopbackBars); - mPOIDetector.Init(); - - // - // Initialize Bar Analyser Class Instance ... - mBarAnalyser = new XCBarAnalyser(); - - // - // Initial and Configure POI Drawer if Required ... - mPOIDrawer = new XCPOIDrawer(); - mPOIDrawer.ChartIdentification(0); - mPOIDrawer.SubWindowIdentification(0); - - // - mPOIDrawer.DemandZoneFill(false); - mPOIDrawer.SupplyZoneFill(false); - mPOIDrawer.BullishFVGFill(false); - mPOIDrawer.BearishFVGFill(false); - mPOIDrawer.SupportZoneFill(false); - mPOIDrawer.ResistanceZoneFill(false); - mPOIDrawer.BullishOrderBlockFill(false); - mPOIDrawer.BearishOrderBlockFill(false); - - // - // Set Chart Style ... - ApplyChartStyle(); - - // - return result; - } - - /** - * Retrieve Symbol ... - * - * @return ( string ) - */ - string GetSymbol() - { - return mSymbol; - } - - /** - * Retrieve TimeFrame (Period) ... - * - * @return ( ENUM_TIMEFRAMES ) - */ - ENUM_TIMEFRAMES GetPeriod() - { - return mPeriod; - } - - /** - * Get Specified Bar ... - * - * @param source: XOHCL instance, Source Bar ... - * @param bar: XOHCL instance, Dest Bar ... - * - * @return ( bool ) - */ - bool GetBar( - XOHCL &source, - XOHCL &bar // - ) - { - // - bool result = false; - - // - bar.Clean(); - - // - string symbol = GetSymbol(); - ENUM_TIMEFRAMES period = GetPeriod(); - - // - result = - IsValid(symbol) && - IsValid(period) && - source.IsValid(); - if (!result) - { - return result; - } - - // - int index = iBarShift( - symbol, - period, - source.time // - ); - result = bar.Init( - symbol, - period, - index // - ); - if (!result) - { - // - bar.Clean(); - return result; - } - - // - return result; - } - - /** - * Retrieve Specified Bar ... - * - * @param bar: XOHCL instance ... - * @param index: Integer ... - * - * @return ( bool ) - */ - bool GetBar( - XOHCL &bar, - int index = 0 // - ) - { - // - bool result = false; - - // - bar.Clean(); - - // - if (index < 0) - { - index = 0; - } - - // - string symbol = GetSymbol(); - ENUM_TIMEFRAMES period = GetPeriod(); - - // - result = bar.Init( - symbol, - period, - index // - ); - - // - return result; - } - - /** - * Retrieve Specified Bar ... - * - * @param bar: XOHCL instance ... - * @param time: Datetime ... - * - * @return ( bool ) - */ - bool GetBar( - XOHCL &bar, - datetime time = NULL // - ) - { - // - bool result = false; - - // - int index = GetBarIndex(time); - result = GetBar(bar, - index // - ); - - // - return result; - } - - /** - * Retrieve Specified Time Bar Index ... - * - * @param time: DateTime ... - * - * @return ( int ) - */ - int GetBarIndex(datetime time = NULL) - { - // - int result = -1; - - // - time = NormalizeTime(time); - - // - string symbol = GetSymbol(); - ENUM_TIMEFRAMES period = GetPeriod(); - - // - result = iBarShift( - symbol, - period, - time // - ); - - // - return result; - } - - /** - * Retrieve Cycle Conditions ... - * - * @param events: ENUM_X_CYCLE_EVENTS member, Array ... - * @param conditions: X121SMCCycleConditions instance ... - * @param barIndex: Integer ... - * @param loopback: Integer ... - * - * @return ( bool ) - */ - bool GetConditions( - ENUM_X_CYCLE_EVENTS &events[], - ENUM_XPOI_EVENTS &poiEvents[], - X121SMCCycleConditions &conditions, - int barIndex = 0, - int loopback = 7 // - ) - { - // - bool result = false; - - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - if (loopback < 5) - { - loopback = 5; - } - - // - Clean(events); - Clean(poiEvents); - conditions.Clean(); - - // - result = mX121Helper.GetConditions( - conditions.x121Conditions, - barIndex, - loopback // - ); - if (!result) - { - // - conditions.Clean(); - return result; - } - - // - mPOIDetector.Update(poiEvents); - mPOIDetector.GetState(conditions.state); - - // - conditions.symbol = GetSymbol(); - conditions.period = GetPeriod(); - conditions.time = TimeCurrent(); - - // - // Update(); - - // - result = conditions.IsValid(); - - // - return result; - } - - // - // Tools ... - - // - bool GeneratePVBox( - XBoxZone &box, - int barIndex = 0 // - ) - { - // - bool result = false; - - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - box.Clean(); - box.symbol = GetSymbol(); - box.period = GetPeriod(); - - // - int index = barIndex; - - // - // Peak ... - datetime peaksSameFrom = NULL; - double peak = mX121Helper.xpvHelper.GetPeak(index); - double prevPeak = mX121Helper.xpvHelper.GetPeak(index + 1); - bool startsByPeak = peak == prevPeak; - - // - // Vale ... - datetime valesSameFrom = NULL; - double vale = mX121Helper.xpvHelper.GetVale(index); - double prevVale = mX121Helper.xpvHelper.GetVale(index + 1); - bool startsByVale = - !startsByPeak && - vale == prevVale; - - // - bool canBreak = false; - while (!canBreak) - { - // - index++; - - // - datetime cTime = iTime( - box.symbol, - box.period, - index // - ); - - // - // Peak ... - double iPeak = mX121Helper.xpvHelper.GetPeak(index); - - // - // Vale ... - double iVale = mX121Helper.xpvHelper.GetVale(index); - - // - // Start By Peak or Value ... - bool isSame = false; - if (startsByPeak) - { - // - isSame = iPeak == peak; - bool canSetVale = vale == 0 - ? true - : iVale > vale; - if (canSetVale) - { - vale = iVale; - } - } - else if (startsByVale) - { - // - isSame = iVale == vale; - bool canSetPeak = peak == 0 - ? true - : iPeak < peak; - if (canSetPeak) - { - peak = iPeak; - } - } - - // - if (isSame) - { - // - box.from = cTime; - box.upper = peak; - box.lower = vale; - } - else if (IsValid(box.from)) - { - // - // Complete Box ... - box.to = iTime( - box.symbol, - box.period, - barIndex // - ); - - // - box.type = "XPVBox"; - box.dir = startsByPeak - ? X_DIRECTION_BEARISH - : startsByVale - ? X_DIRECTION_BULLISH - : X_DIRECTION_NONE; - } - - // - canBreak = !isSame; - } - - // - result = box.IsValid(); - if (!result) - { - box.Clean(); - } - - // - return result; - } - - // - int DetectRejections( - XBoxZone &rejections[], - int barIndex = 0, - bool forceBarType = true, - bool forceFiboPressure = true, - bool forceUnUsedRejections = true, - int maxAllowedLoopback = 587 // - ) - { - // - int result = 0; - - // - // Normalize Args ... - Clean(rejections); - - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - int idx = -1; - bool has = false; - for (int i = barIndex + 1; i < barIndex + maxAllowedLoopback; i++) - { - // - // Init Indexed Bar ... - XOHCL iBar; - XOHCL iCBar; - XOHCL iPBar; - has = GetBar(iBar, i); - has = - has && - iBar.GetPreviousBar(iCBar); - has = - has && - iCBar.GetPreviousBar(iPBar); - if (!has) - { - // - iBar.Clean(); - iCBar.Clean(); - iPBar.Clean(); - break; - } - - // - // Check CBar Bullish Fibo Pressure ... - bool cBarHasBullishFiboPressure = - mBarAnalyser - .HasFiboPressure( - iCBar, - X_DIRECTION_BULLISH, - X_FIBO_LEVEL_382 // - ); - - // - // Check CBar Bearish Fibo Pressure ... - bool cBarHasBearishFiboPressure = - mBarAnalyser - .HasFiboPressure( - iCBar, - X_DIRECTION_BEARISH, - X_FIBO_LEVEL_382 // - ); - - // - // Check Bar is Bullish Rejection Swing ... - bool isBullishRejection = - // - iCBar.low < iBar.low && - iCBar.low < iPBar.low && - // - iCBar.low < iCBar.GetDown() && - iCBar.GetLowShadow() > iCBar.GetBody() && - iCBar.GetLowShadow() > iCBar.GetHighShadow() - // - ; - - // - // Check Bar is Bearish Rejection Swing ... - bool isBearishRejection = - // - iCBar.high > iBar.high && - iCBar.high > iPBar.high && - // - iCBar.high > iCBar.GetUp() && - iCBar.GetHighShadow() > iCBar.GetBody() && - iCBar.GetHighShadow() > iCBar.GetLowShadow() - // - ; - - // - // Apply Fibo Pressure ... - if (forceFiboPressure) - { - // - isBullishRejection = - isBullishRejection && - cBarHasBullishFiboPressure; - - // - isBearishRejection = - isBearishRejection && - cBarHasBearishFiboPressure; - } - - // - // Apply Force Bar Type ... - if (forceBarType) - { - // - isBullishRejection = - isBullishRejection && - iCBar.IsBullish(); - - // - isBearishRejection = - isBearishRejection && - iCBar.IsBearish(); - } - - // - // Summarize Result ... - has = isBullishRejection || - isBearishRejection; - if (has) - { - // - XBoxZone iBox; - - // - iBox.to = iBar.time; - iBox.from = iCBar.time; - iBox.period = iBar.period; - iBox.symbol = iBar.symbol; - - // - iBox.dir = - isBullishRejection - ? X_DIRECTION_BULLISH - : X_DIRECTION_BEARISH; - - // - iBox.upper = - isBullishRejection - ? iCBar.GetDown() - : iCBar.high; - - // - iBox.lower = - isBullishRejection - ? iCBar.low - : iCBar.GetUp(); - - // - iBox.type = - isBullishRejection - ? "XSwingLow" - : "XSwingHigh"; - - // - // Validate Box ... - has = iBox.IsValid(); - if (has) - { - // - // Apply Force Unused Rejections ... - if (forceUnUsedRejections) - { - // - has = !IsBoxBreaked( - iBox, - iCBar.Index() + 1, - barIndex // - ); - } - - // - if (has) - { - // - idx = FindIndex( - iBox, - rejections // - ); - has = !IsValidIndex(idx); - if (has) - { - // - AddRef( - iBox, - rejections // - ); - } - } - } - - // - iBox.Clean(); - } - - // - iBar.Clean(); - iCBar.Clean(); - iPBar.Clean(); - } - - // - result = ArraySize(rejections); - - // - return result; - } - - // - datetime DetectNearestCloseOverX3MAFast( - XOHCL &bar, - int maxAllowedBars = 20 // - ) - { - // - datetime result = NULL; - - // - if (!bar.IsValid()) - { - return result; - } - - // - bool has = false; - int idx = bar.Index(); - int start = idx; - int end = start + maxAllowedBars; - bool canContinue = true; - while (canContinue) - { - // - XOHCL iBar; - has = iBar.Init( - bar.symbol, - bar.period, - start // - ); - if (!has) - { - // - iBar.Clean(); - break; - } - - // - double iFast = mX121Helper - .x3maHelper - .GetX3MaFast(start); - - // - has = iBar.close > iFast && - iBar.open < iFast; - if (has) - { - result = iBar.time; - } - - // - canContinue = - start < end && - !IsValid(result); - - // - start++; - - // - iBar.Clean(); - } - - // - return result; - } - - // - datetime DetectNearestCloseUnderX3MAFast( - XOHCL &bar, - int maxAllowedBars = 20 // - ) - { - // - datetime result = NULL; - - // - if (!bar.IsValid()) - { - return result; - } - - // - bool has = false; - int idx = bar.Index(); - int start = idx; - int end = start + maxAllowedBars; - bool canContinue = true; - while (canContinue) - { - // - XOHCL iBar; - has = iBar.Init( - bar.symbol, - bar.period, - start // - ); - if (!has) - { - // - iBar.Clean(); - break; - } - - // - double iFast = mX121Helper - .x3maHelper - .GetX3MaFast(start); - - // - has = iBar.close < iFast && - iBar.open > iFast; - if (has) - { - result = iBar.time; - } - - // - canContinue = - start < end && - !IsValid(result); - - // - start++; - - // - iBar.Clean(); - } - - // - return result; - } - - // - bool DetectNearestStrSwitched( - XOHCL &bar, - ENUM_X_DIRECTION &dir, - int barIndex = 0, - int maxAllowedBars = 20 // - ) - { - // - bool result = false; - - // - bar.Clean(); - dir = X_DIRECTION_NONE; - barIndex = NormalizeInt(barIndex, 0); - maxAllowedBars = NormalizeInt(maxAllowedBars, 20); - - // - // Looping Through LoopBack Period ... - // for Detecting Result ... - for (int i = barIndex; i < barIndex + maxAllowedBars; i++) - { - // - XOHCL iBar; - result = iBar.Init( - GetSymbol(), - GetPeriod(), - i // - ); - if (!result) - { - // - iBar.Clean(); - break; - } - - // - double iStrState = mX121Helper.xstrHelper.GetSTRState(i); - double iStrStateP = mX121Helper.xstrHelper.GetSTRState(i + 1); - - // - bool isStrBullish = iStrState > 0; - bool isStrBullishP = iStrStateP > 0; - - // - bool isStrBearish = iStrState < 0; - bool isStrBearishP = iStrStateP < 0; - - // - bool isBullish = isStrBullish && - !isStrBullishP; - - // - bool isBearish = isStrBearish && - !isStrBearishP; - - // - result = isBullish || - isBearish; - if (result) - { - // - bar = iBar; - - // - dir = isBullish - ? X_DIRECTION_BULLISH - : X_DIRECTION_BEARISH; - - // - iBar.Clean(); - break; - } - - // - iBar.Clean(); - } - - // - return result; - } - - // - // Virtuals ... - - /** - * Set Default Properties Values ... - */ - virtual void Default() - { - } - - // - protected: - // - - // - private: - // - // Props ... - string mSymbol; - ENUM_TIMEFRAMES mPeriod; - - // - // Actions ... - - /** - * Release All Resources ... - */ - void DeInit() - { - // - ZeroMemory(mX121Helper); - ZeroMemory(mPOIDetector); - ZeroMemory(mBarAnalyser); - - // - delete mX121Helper; - delete mPOIDetector; - delete mBarAnalyser; - } - - /** - * Apply Chart Style ... - */ - void ApplyChartStyle() - { - // - // Retrieve Current Chart ID ... - long chartId = ChartID(); - - // - 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 = true; // 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 - - // - ChartSetInteger(chartId, CHART_SHOW_BID_LINE, mShowBidLine); - ChartSetInteger(chartId, CHART_SHOW_ASK_LINE, mShowAskLine); - ChartSetInteger(chartId, CHART_SHOW_GRID, mShowGrid); - ChartSetInteger(chartId, CHART_SHOW_VOLUMES, mShowVolumes); - ChartSetInteger(chartId, CHART_SHOW_TRADE_LEVELS, mShowTradeLevels); - ChartSetInteger(chartId, CHART_AUTOSCROLL, mAutoScroll); - ChartSetInteger(chartId, CHART_QUICK_NAVIGATION, mQuickNavigation); - ChartSetInteger(chartId, CHART_COLOR_FOREGROUND, mForeGroundColor); - ChartSetInteger(chartId, CHART_COLOR_BACKGROUND, mBackGroundColor); - ChartSetInteger(chartId, CHART_COLOR_GRID, mGridColor); - ChartSetInteger(chartId, CHART_COLOR_BID, mBidLineColor); - ChartSetInteger(chartId, CHART_COLOR_ASK, mAskLineColor); - ChartSetInteger(chartId, CHART_COLOR_STOP_LEVEL, mStopColor); - ChartSetInteger(chartId, CHART_COLOR_VOLUME, mVolumesColor); - - // - // For Enabling XCC ... - // ChartSetInteger(chartId, CHART_MODE, mMode); - // ChartSetInteger(chartId, CHART_COLOR_CHART_UP, mUpColor); - // ChartSetInteger(chartId, CHART_COLOR_CHART_DOWN, mDownColor); - // ChartSetInteger(chartId, CHART_COLOR_CANDLE_BULL, mBullishColor); - // ChartSetInteger(chartId, CHART_COLOR_CANDLE_BEAR, mBearishColor); - // ChartSetInteger(chartId, CHART_COLOR_CHART_LINE, mLineColor); - } - - // -}; - -// -// Signal Provider Data ... -struct X121SMCStrategySignalProviderData -{ - // - // Props ... - - // - // Trigger ... - XPOIState triggerState; - double triggerBullishScore; - double triggerBearishScore; - X121Conditions triggerXConditions; - ENUM_XPOI_EVENTS triggerPoiEvents[]; - XC121SMCCycleHelper *triggerCycleHelper; - ENUM_X_CYCLE_EVENTS triggerCycleEvents[]; - X121SMCCycleConditions triggerConditions; - - // - // Decision ... - XPOIState decisionState; - double decisionBullishScore; - double decisionBearishScore; - X121Conditions decisionXConditions; - ENUM_XPOI_EVENTS decisionPoiEvents[]; - XC121SMCCycleHelper *decisionCycleHelper; - ENUM_X_CYCLE_EVENTS decisionCycleEvents[]; - X121SMCCycleConditions decisionConditions; - - // - // Analyse ... - XPOIState analyseState; - double analyseBullishScore; - double analyseBearishScore; - X121Conditions analyseXConditions; - ENUM_XPOI_EVENTS analysePoiEvents[]; - XC121SMCCycleHelper *analyseCycleHelper; - ENUM_X_CYCLE_EVENTS analyseCycleEvents[]; - X121SMCCycleConditions analyseConditions; - - // - // Verification ... - XPOIState verificationState; - double verificationBullishScore; - double verificationBearishScore; - X121Conditions verificationXConditions; - ENUM_XPOI_EVENTS verificationPoiEvents[]; - XC121SMCCycleHelper *verificationCycleHelper; - ENUM_X_CYCLE_EVENTS verificationCycleEvents[]; - X121SMCCycleConditions verificationConditions; - - // - // Consolidation ... - XPOIState consolidationState; - double consolidationBullishScore; - double consolidationBearishScore; - X121Conditions consolidationXConditions; - ENUM_XPOI_EVENTS consolidationPoiEvents[]; - XC121SMCCycleHelper *consolidationCycleHelper; - ENUM_X_CYCLE_EVENTS consolidationCycleEvents[]; - X121SMCCycleConditions consolidationConditions; - - // - // Vision ... - XPOIState visionState; - double visionBullishScore; - double visionBearishScore; - X121Conditions visionXConditions; - ENUM_XPOI_EVENTS visionPoiEvents[]; - XC121SMCCycleHelper *visionCycleHelper; - ENUM_X_CYCLE_EVENTS visionCycleEvents[]; - X121SMCCycleConditions visionConditions; - - // - // Constructor ... - X121SMCStrategySignalProviderData() - { - Clean(); - } - - // - // Tools ... - - // - // Cleanup ... - void Clean() - { - // - // Trigger ... - triggerState.Clean(); - triggerBullishScore = 0; - triggerBearishScore = 0; - Clean(triggerPoiEvents); - Clean(triggerCycleEvents); - triggerConditions.Clean(); - triggerXConditions.Clean(); - - // - // Decision ... - decisionState.Clean(); - decisionBullishScore = 0; - decisionBearishScore = 0; - Clean(decisionPoiEvents); - Clean(decisionCycleEvents); - decisionConditions.Clean(); - decisionXConditions.Clean(); - - // - // Analyse ... - analyseState.Clean(); - analyseBullishScore = 0; - analyseBearishScore = 0; - Clean(analysePoiEvents); - Clean(analyseCycleEvents); - analyseConditions.Clean(); - analyseXConditions.Clean(); - - // - // Verification ... - verificationState.Clean(); - verificationBullishScore = 0; - verificationBearishScore = 0; - Clean(verificationPoiEvents); - Clean(verificationCycleEvents); - verificationConditions.Clean(); - verificationXConditions.Clean(); - - // - // Consolidation ... - consolidationState.Clean(); - consolidationBullishScore = 0; - consolidationBearishScore = 0; - Clean(consolidationPoiEvents); - Clean(consolidationCycleEvents); - consolidationConditions.Clean(); - consolidationXConditions.Clean(); - - // - // Vision ... - visionState.Clean(); - visionBullishScore = 0; - visionBearishScore = 0; - Clean(visionPoiEvents); - Clean(visionCycleEvents); - visionConditions.Clean(); - visionXConditions.Clean(); - } - - // - void Destroy() - { - // - Clean(); - - // - ZeroMemory(visionCycleHelper); - ZeroMemory(triggerCycleHelper); - ZeroMemory(analyseCycleHelper); - ZeroMemory(decisionCycleHelper); - ZeroMemory(verificationCycleHelper); - ZeroMemory(consolidationCycleHelper); - - // - ZeroMemory(this); - } - - // - bool IsValid() - { - // - bool result = false; - - // - result = - visionCycleHelper != NULL && - triggerCycleHelper != NULL && - analyseCycleHelper != NULL && - decisionCycleHelper != NULL && - verificationCycleHelper != NULL && - consolidationCycleHelper != NULL; - - // - return result; - } - - // - // Initialize ... - bool Init( - XC121SMCCycleHelper *_triggerCycleHelper, - XC121SMCCycleHelper *_decisionCycleHelper, - XC121SMCCycleHelper *_analyseCycleHelper, - XC121SMCCycleHelper *_verificationCycleHelper, - XC121SMCCycleHelper *_consolidationCycleHelper, - XC121SMCCycleHelper *_visionCycleHelper // - ) - { - // - bool result = false; - - // - // Validate Cycle Helpers ... - result = - // - _visionCycleHelper != NULL && - _triggerCycleHelper != NULL && - _analyseCycleHelper != NULL && - _decisionCycleHelper != NULL && - _verificationCycleHelper != NULL && - _consolidationCycleHelper != NULL - // - ; - if (!result) - { - return result; - } - - // - visionCycleHelper = _visionCycleHelper; - triggerCycleHelper = _triggerCycleHelper; - analyseCycleHelper = _analyseCycleHelper; - decisionCycleHelper = _decisionCycleHelper; - verificationCycleHelper = _verificationCycleHelper; - consolidationCycleHelper = _consolidationCycleHelper; - - // - result = IsValid(); - - // - return result; - } - - // - // Prepare all ... - bool Prepare( - int barIndex = 0, - int loopback = 10, - bool trigger = false, - bool decision = true, - bool analyse = true, - bool verification = false, - bool consolidation = true, - bool vision = true // - ) - { - // - bool result = false; - - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - if (loopback < 7) - { - loopback = 7; - } - - // - result = IsValid(); - if (!result) - { - return result; - } - - // - // Trigger ... - if (trigger) - { - // - result = triggerCycleHelper.GetConditions( - triggerCycleEvents, - triggerPoiEvents, - triggerConditions, - barIndex, - loopback // - ); - if (!result) - { - // - Clean(triggerPoiEvents); - Clean(triggerCycleEvents); - - // - triggerConditions.Clean(); - - // - return result; - } - } - - // - // Decision ... - if (decision) - { - // - result = decisionCycleHelper.GetConditions( - decisionCycleEvents, - decisionPoiEvents, - decisionConditions, - barIndex, - loopback // - ); - if (!result) - { - // - Clean(triggerPoiEvents); - Clean(decisionPoiEvents); - Clean(triggerCycleEvents); - triggerConditions.Clean(); - Clean(decisionCycleEvents); - decisionConditions.Clean(); - - // - return result; - } - } - - // - // Analyse ... - if (analyse) - { - // - result = analyseCycleHelper.GetConditions( - analyseCycleEvents, - analysePoiEvents, - analyseConditions, - barIndex, - loopback // - ); - if (!result) - { - // - Clean(triggerPoiEvents); - Clean(analysePoiEvents); - Clean(decisionPoiEvents); - Clean(triggerCycleEvents); - Clean(analyseCycleEvents); - triggerConditions.Clean(); - analyseConditions.Clean(); - Clean(decisionCycleEvents); - decisionConditions.Clean(); - - // - return result; - } - } - - // - // Verification ... - if (verification) - { - // - result = verificationCycleHelper.GetConditions( - verificationCycleEvents, - verificationPoiEvents, - verificationConditions, - barIndex, - loopback // - ); - if (!result) - { - // - Clean(triggerPoiEvents); - Clean(analysePoiEvents); - Clean(decisionPoiEvents); - Clean(triggerCycleEvents); - Clean(analyseCycleEvents); - triggerConditions.Clean(); - analyseConditions.Clean(); - Clean(decisionCycleEvents); - decisionConditions.Clean(); - Clean(verificationPoiEvents); - Clean(verificationCycleEvents); - verificationConditions.Clean(); - - // - return result; - } - } - - // - // Consolidation ... - if (consolidation) - { - // - result = consolidationCycleHelper.GetConditions( - consolidationCycleEvents, - consolidationPoiEvents, - consolidationConditions, - barIndex, - loopback // - ); - if (!result) - { - // - Clean(triggerPoiEvents); - Clean(analysePoiEvents); - Clean(decisionPoiEvents); - Clean(triggerCycleEvents); - Clean(analyseCycleEvents); - triggerConditions.Clean(); - analyseConditions.Clean(); - Clean(decisionCycleEvents); - decisionConditions.Clean(); - Clean(verificationPoiEvents); - Clean(consolidationPoiEvents); - Clean(verificationCycleEvents); - verificationConditions.Clean(); - Clean(consolidationCycleEvents); - consolidationConditions.Clean(); - - // - return result; - } - } - - // - // Vision ... - if (vision) - { - result = visionCycleHelper.GetConditions( - visionCycleEvents, - visionPoiEvents, - visionConditions, - barIndex, - loopback // - ); - if (!result) - { - // - Clean(visionPoiEvents); - Clean(triggerPoiEvents); - Clean(analysePoiEvents); - Clean(visionCycleEvents); - visionConditions.Clean(); - Clean(decisionPoiEvents); - Clean(triggerCycleEvents); - Clean(analyseCycleEvents); - triggerConditions.Clean(); - analyseConditions.Clean(); - Clean(decisionCycleEvents); - decisionConditions.Clean(); - Clean(verificationPoiEvents); - Clean(consolidationPoiEvents); - Clean(verificationCycleEvents); - verificationConditions.Clean(); - Clean(consolidationCycleEvents); - consolidationConditions.Clean(); - - // - return result; - } - } - - // - // Cycles POI States ... - visionState = visionConditions.state; - triggerState = triggerConditions.state; - analyseState = analyseConditions.state; - decisionState = decisionConditions.state; - verificationState = verificationConditions.state; - consolidationState = consolidationConditions.state; - - // - // Cycle X121Conditions ... - visionXConditions = visionConditions.x121Conditions; - triggerXConditions = triggerConditions.x121Conditions; - analyseXConditions = analyseConditions.x121Conditions; - decisionXConditions = decisionConditions.x121Conditions; - verificationXConditions = verificationConditions.x121Conditions; - consolidationXConditions = consolidationConditions.x121Conditions; - - // - // Trigger ... - triggerXConditions.GenerateScore( - triggerBullishScore, - triggerBearishScore // - ); - - // - // Decision ... - decisionXConditions.GenerateScore( - decisionBullishScore, - decisionBearishScore // - ); - - // - // Analyse ... - analyseXConditions.GenerateScore( - analyseBullishScore, - analyseBearishScore // - ); - - // - // Verification ... - verificationXConditions.GenerateScore( - verificationBullishScore, - verificationBearishScore // - ); - - // - // Consolidation ... - consolidationXConditions.GenerateScore( - consolidationBullishScore, - consolidationBearishScore // - ); - - // - // Vision ... - visionXConditions.GenerateScore( - visionBullishScore, - visionBearishScore // - ); - - // - return result; - } - - // - bool SelectCycle( - ENUM_X_CYCLES cycle, - XPOIState &cState, - XPOIStateEvents &cStateEvents, - X121Conditions &cXConditions, - XC121SMCCycleHelper *&cHelper, - X121SMCCycleConditions &cConditions // - ) - { - // - bool result = false; - - // - cState.Clean(); - ZeroMemory(cHelper); - cConditions.Clean(); - cStateEvents.Clean(); - cXConditions.Clean(); - - // - result = cycle != X_CYCLE_NONE; - if (!result) - { - return result; - } - - // - if (cycle == X_CYCLE_TRIGGER) - { - // - cState = triggerState; - cHelper = triggerCycleHelper; - cConditions = triggerConditions; - cXConditions = triggerXConditions; - cStateEvents.Init(triggerPoiEvents); - } - else if (cycle == X_CYCLE_DECISION) - { - // - cState = decisionState; - cHelper = decisionCycleHelper; - cConditions = decisionConditions; - cXConditions = decisionXConditions; - cStateEvents.Init(decisionPoiEvents); - } - else if (cycle == X_CYCLE_ANALYSE) - { - // - cState = analyseState; - cHelper = analyseCycleHelper; - cConditions = analyseConditions; - cXConditions = analyseXConditions; - cStateEvents.Init(analysePoiEvents); - } - else if (cycle == X_CYCLE_VERIFICATION) - { - // - cState = verificationState; - cHelper = verificationCycleHelper; - cConditions = verificationConditions; - cXConditions = verificationXConditions; - cStateEvents.Init(verificationPoiEvents); - } - else if (cycle == X_CYCLE_CONSOLIDATION) - { - // - cState = consolidationState; - cHelper = consolidationCycleHelper; - cConditions = consolidationConditions; - cXConditions = consolidationXConditions; - cStateEvents.Init(consolidationPoiEvents); - } - else if (cycle == X_CYCLE_VISION) - { - // - cState = visionState; - cHelper = visionCycleHelper; - cConditions = visionConditions; - cXConditions = visionXConditions; - cStateEvents.Init(visionPoiEvents); - } - - // - result = cState.IsValid() && - cHelper != NULL; - - // - return result; - } - - // - void MaxRequiredPOIs(int value) - { - // - if (!IsValid()) - { - return; - } - - // - visionCycleHelper.mPOIDetector.MaxRequiredPOIs(value); - analyseCycleHelper.mPOIDetector.MaxRequiredPOIs(value); - decisionCycleHelper.mPOIDetector.MaxRequiredPOIs(value); - consolidationCycleHelper.mPOIDetector.MaxRequiredPOIs(value); - } - - // - void MaxAllowedLoopbackForInit(int value) - { - // - if (!IsValid()) - { - return; - } - - // - visionCycleHelper.mPOIDetector.MaxAllowedLoopbackForInit(value); - analyseCycleHelper.mPOIDetector.MaxAllowedLoopbackForInit(value); - decisionCycleHelper.mPOIDetector.MaxAllowedLoopbackForInit(value); - consolidationCycleHelper.mPOIDetector.MaxAllowedLoopbackForInit(value); - } - - // -}; - -// -// Condition Parser ... -struct X121SMCStrategyConditionParser -{ - // - // Props ... - - // - // XMA ... - - // - bool isX3MaFastUnderValesGoldenZone; - bool isX3MaMidUnderValesGoldenZone; - bool isX3MaSlowUnderValesGoldenZone; - - // - bool isX3MaFastCrossedUnderValesGoldenZone; - bool isX3MaMidCrossedUnderValesGoldenZone; - bool isX3MaSlowCrossedUnderValesGoldenZone; - - // - bool isX3MaFastOverPeaksGoldenZone; - bool isX3MaMidOverPeaksGoldenZone; - bool isX3MaSlowOverPeaksGoldenZone; - - // - bool isX3MaFastCrossedOverPeaksGoldenZone; - bool isX3MaMidCrossedOverPeaksGoldenZone; - bool isX3MaSlowCrossedOverPeaksGoldenZone; - - // - // XVWAP ... - - // - bool isVWapFastUnderValesGoldenZone; - bool isVWapMidUnderValesGoldenZone; - bool isVWapSlowUnderValesGoldenZone; - - // - bool isVWapFastCrossedUnderValesGoldenZone; - bool isVWapMidCrossedUnderValesGoldenZone; - bool isVWapSlowCrossedUnderValesGoldenZone; - - // - bool isVWapFastOverPeaksGoldenZone; - bool isVWapMidOverPeaksGoldenZone; - bool isVWapSlowOverPeaksGoldenZone; - - // - bool isVWapFastCrossedOverPeaksGoldenZone; - bool isVWapMidCrossedOverPeaksGoldenZone; - bool isVWapSlowCrossedOverPeaksGoldenZone; - - // - // XHK ... - - // - bool isSMHKUnderValesGoldenZone; - bool isRawHKUnderValesGoldenZone; - - // - bool isSMHKCrossedUnderValesGoldenZone; - bool isRawHKCrossedUnderValesGoldenZone; - - // - bool isSMHKOverPeaksGoldenZone; - bool isRawHKOverPeaksGoldenZone; - - // - bool isSMHKCrossedOverPeaksGoldenZone; - bool isRawHKCrossedOverPeaksGoldenZone; - - // - // XSTR ... - - // - bool isStrUnderValesGoldenZone; - bool isStrCrossedUnderValesGoldenZone; - - // - bool isStrOverPeaksGoldenZone; - bool isStrCrossedOverPeaksGoldenZone; - - // - - // - // Constructor ... - X121SMCStrategyConditionParser() - { - Clean(); - } - - // - // Tools ... - - // - void Clean() - { - // - isX3MaFastUnderValesGoldenZone = false; - isX3MaFastCrossedUnderValesGoldenZone = false; - - // - isX3MaMidUnderValesGoldenZone = false; - isX3MaMidCrossedUnderValesGoldenZone = false; - - // - isX3MaSlowUnderValesGoldenZone = false; - isX3MaSlowCrossedUnderValesGoldenZone = false; - - // - isX3MaFastOverPeaksGoldenZone = false; - isX3MaFastCrossedOverPeaksGoldenZone = false; - - // - isX3MaMidOverPeaksGoldenZone = false; - isX3MaMidCrossedOverPeaksGoldenZone = false; - - // - isX3MaSlowOverPeaksGoldenZone = false; - isX3MaSlowCrossedOverPeaksGoldenZone = false; - - // - isVWapFastUnderValesGoldenZone = false; - isVWapFastCrossedUnderValesGoldenZone = false; - - // - isVWapMidUnderValesGoldenZone = false; - isVWapMidCrossedUnderValesGoldenZone = false; - - // - isVWapSlowUnderValesGoldenZone = false; - isVWapSlowCrossedUnderValesGoldenZone = false; - - // - isVWapFastOverPeaksGoldenZone = false; - isVWapFastCrossedOverPeaksGoldenZone = false; - - // - isVWapMidOverPeaksGoldenZone = false; - isVWapMidCrossedOverPeaksGoldenZone = false; - - // - isVWapSlowOverPeaksGoldenZone = false; - isVWapSlowCrossedOverPeaksGoldenZone = false; - - // - isSMHKUnderValesGoldenZone = false; - isSMHKCrossedUnderValesGoldenZone = false; - - // - isRawHKUnderValesGoldenZone = false; - isRawHKCrossedUnderValesGoldenZone = false; - - // - isSMHKOverPeaksGoldenZone = false; - isSMHKCrossedOverPeaksGoldenZone = false; - - // - isRawHKOverPeaksGoldenZone = false; - isRawHKCrossedOverPeaksGoldenZone = false; - - // - isStrUnderValesGoldenZone = false; - isStrCrossedUnderValesGoldenZone = false; - - // - isStrOverPeaksGoldenZone = false; - isStrCrossedOverPeaksGoldenZone = false; - - // - ZeroMemory(this); - } - - // - void Parse( - X121Conditions &conditions // - ) - { - // - Clean(); - - // - // - int zIDX = 0; - int cIDX = zIDX + 1; - int pIDX = cIDX + 1; - - // - // Reading Required Materials ... - - // - // - - // - double peak = conditions.peaksBuffer[cIDX]; - double vale = conditions.valesBuffer[cIDX]; - - // - double peakP = conditions.peaksBuffer[pIDX]; - double valeP = conditions.valesBuffer[pIDX]; - - // - // - - // - double str = conditions.strBuffer[cIDX]; - double strP = conditions.strBuffer[pIDX]; - - // - // - - // - double smhkO = conditions.xhkSMOpenBuffer[cIDX]; - double smhkC = conditions.xhkSMCloseBuffer[cIDX]; - - // - double smhkMax = MathMax(smhkO, smhkC); - double smhkMin = MathMin(smhkO, smhkC); - - // - double smhkOP = conditions.xhkSMOpenBuffer[pIDX]; - double smhkCP = conditions.xhkSMCloseBuffer[pIDX]; - - // - double smhkMaxP = MathMax(smhkOP, smhkCP); - double smhkMinP = MathMin(smhkOP, smhkCP); - - // - double rawhkO = conditions.xhkRawOpenBuffer[cIDX]; - double rawhkH = conditions.xhkRawHighBuffer[cIDX]; - double rawhkC = conditions.xhkRawCloseBuffer[cIDX]; - double rawhkL = conditions.xhkRawLowBuffer[cIDX]; - - // - double rawhkOP = conditions.xhkRawOpenBuffer[pIDX]; - double rawhkHP = conditions.xhkRawHighBuffer[pIDX]; - double rawhkCP = conditions.xhkRawCloseBuffer[pIDX]; - double rawhkLP = conditions.xhkRawLowBuffer[pIDX]; - - // - // - - // - double support = conditions.supportsBuffer[cIDX]; - double resistance = conditions.resistancesBuffer[cIDX]; - - // - double supportP = conditions.supportsBuffer[pIDX]; - double resistanceP = conditions.resistancesBuffer[pIDX]; - - // - double peakGolden = conditions.peaksGoldenBuffer[cIDX]; - double valeGolden = conditions.valesGoldenBuffer[cIDX]; - - // - double peakGoldenP = conditions.peaksGoldenBuffer[pIDX]; - double valeGoldenP = conditions.valesGoldenBuffer[pIDX]; - - // - // - - // - double x3maFast = conditions.x3maFastBuffer[cIDX]; - double x3maMid = conditions.x3maMidBuffer[cIDX]; - double x3maSlow = conditions.x3maSlowBuffer[cIDX]; - - // - double x3maFastP = conditions.x3maFastBuffer[pIDX]; - double x3maMidP = conditions.x3maMidBuffer[pIDX]; - double x3maSlowP = conditions.x3maSlowBuffer[pIDX]; - - // - double vwapFast = conditions.vwapFastBuffer[cIDX]; - double vwapMid = conditions.vwapMidBuffer[cIDX]; - double vwapSlow = conditions.vwapSlowBuffer[cIDX]; - - // - double vwapFastP = conditions.vwapFastBuffer[pIDX]; - double vwapMidP = conditions.vwapMidBuffer[pIDX]; - double vwapSlowP = conditions.vwapSlowBuffer[pIDX]; - - // - // X3MA ... - - // - isX3MaFastUnderValesGoldenZone = - x3maFast >= vale && - x3maFast <= valeGolden; - - // - bool isX3MaFastUnderValesGoldenZoneP = - x3maFastP >= valeP && - x3maFastP <= valeGoldenP; - - // - isX3MaFastCrossedUnderValesGoldenZone = - isX3MaFastUnderValesGoldenZone && - !isX3MaFastUnderValesGoldenZoneP; - - // - // - - // - isX3MaMidUnderValesGoldenZone = - x3maMid >= vale && - x3maMid <= valeGolden; - - // - bool isX3MaMidUnderValesGoldenZoneP = - x3maMidP >= valeP && - x3maMidP <= valeGoldenP; - - // - isX3MaMidCrossedUnderValesGoldenZone = - isX3MaMidUnderValesGoldenZone && - !isX3MaMidUnderValesGoldenZoneP; - - // - // - - // - isX3MaSlowUnderValesGoldenZone = - x3maSlow >= vale && - x3maSlow <= valeGolden; - - // - bool isX3MaSlowUnderValesGoldenZoneP = - x3maSlowP >= valeP && - x3maSlowP <= valeGoldenP; - - // - isX3MaSlowCrossedUnderValesGoldenZone = - isX3MaSlowUnderValesGoldenZone && - !isX3MaSlowUnderValesGoldenZoneP; - - // - // - - // - isX3MaFastOverPeaksGoldenZone = - x3maFast <= peak && - x3maFast >= peakGolden; - - // - bool isX3MaFastOverPeaksGoldenZoneP = - x3maFastP <= peakP && - x3maFastP >= peakGoldenP; - - // - isX3MaFastCrossedOverPeaksGoldenZone = - isX3MaFastOverPeaksGoldenZone && - !isX3MaFastOverPeaksGoldenZoneP; - - // - // - - // - isX3MaMidOverPeaksGoldenZone = - x3maMid <= peak && - x3maMid >= peakGolden; - - // - bool isX3MaMidOverPeaksGoldenZoneP = - x3maMidP <= peakP && - x3maMidP >= peakGoldenP; - - // - isX3MaMidCrossedOverPeaksGoldenZone = - isX3MaMidOverPeaksGoldenZone && - !isX3MaMidOverPeaksGoldenZoneP; - - // - // - - // - isX3MaSlowOverPeaksGoldenZone = - x3maSlow <= peak && - x3maSlow >= peakGolden; - - // - bool isX3MaSlowOverPeaksGoldenZoneP = - x3maSlowP <= peakP && - x3maSlowP >= peakGoldenP; - - // - isX3MaSlowCrossedOverPeaksGoldenZone = - isX3MaSlowOverPeaksGoldenZone && - !isX3MaSlowOverPeaksGoldenZoneP; - - // - // XVWAP ... - - // - // - - // - isVWapFastUnderValesGoldenZone = - vwapFast >= vale && - vwapFast <= valeGolden; - - // - bool isVWapFastUnderValesGoldenZoneP = - vwapFastP >= valeP && - vwapFastP <= valeGoldenP; - - // - isVWapFastCrossedUnderValesGoldenZone = - isVWapFastUnderValesGoldenZone && - !isVWapFastUnderValesGoldenZoneP; - - // - // - - // - isVWapMidUnderValesGoldenZone = - vwapMid >= vale && - vwapMid <= valeGolden; - - // - bool isVWapMidUnderValesGoldenZoneP = - vwapMidP >= valeP && - vwapMidP <= valeGoldenP; - - // - isVWapMidCrossedUnderValesGoldenZone = - isVWapMidUnderValesGoldenZone && - !isVWapMidUnderValesGoldenZoneP; - - // - // - - // - isVWapSlowUnderValesGoldenZone = - vwapSlow >= vale && - vwapSlow <= valeGolden; - - // - bool isVWapSlowUnderValesGoldenZoneP = - vwapSlowP >= valeP && - vwapSlowP <= valeGoldenP; - - // - isVWapSlowCrossedUnderValesGoldenZone = - isVWapSlowUnderValesGoldenZone && - !isVWapSlowUnderValesGoldenZoneP; - - // - // - - // - isVWapFastOverPeaksGoldenZone = - vwapFast <= peak && - vwapFast >= peakGolden; - - // - bool isVWapFastOverPeaksGoldenZoneP = - vwapFastP <= peakP && - vwapFastP >= peakGoldenP; - - // - isVWapFastCrossedOverPeaksGoldenZone = - isVWapFastOverPeaksGoldenZone && - !isVWapFastOverPeaksGoldenZoneP; - - // - // - - // - isVWapMidOverPeaksGoldenZone = - vwapMid <= peak && - vwapMid >= peakGolden; - - // - bool isVWapMidOverPeaksGoldenZoneP = - vwapMidP <= peakP && - vwapMidP >= peakGoldenP; - - // - isVWapMidCrossedOverPeaksGoldenZone = - isVWapMidOverPeaksGoldenZone && - !isVWapMidOverPeaksGoldenZoneP; - - // - // - - // - isVWapSlowOverPeaksGoldenZone = - vwapSlow <= peak && - vwapSlow >= peakGolden; - - // - bool isVWapSlowOverPeaksGoldenZoneP = - vwapSlowP <= peakP && - vwapSlowP >= peakGoldenP; - - // - isVWapSlowCrossedOverPeaksGoldenZone = - isVWapSlowOverPeaksGoldenZone && - !isVWapSlowOverPeaksGoldenZoneP; - - // - // XHK ... - - // - // - - // - isSMHKUnderValesGoldenZone = - smhkMax >= vale && - smhkMax <= valeGolden; - - // - bool isSMHKUnderValesGoldenZoneP = - smhkMaxP >= valeP && - smhkMaxP <= valeGoldenP; - - // - isSMHKCrossedUnderValesGoldenZone = - isSMHKUnderValesGoldenZone && - !isSMHKUnderValesGoldenZoneP; - - // - // - - // - isRawHKUnderValesGoldenZone = - rawhkH >= vale && - rawhkH <= valeGolden; - - // - bool isRawHKUnderValesGoldenZoneP = - rawhkHP >= valeP && - rawhkHP <= valeGoldenP; - - // - isRawHKCrossedUnderValesGoldenZone = - isRawHKUnderValesGoldenZone && - !isRawHKUnderValesGoldenZoneP; - - // - // - - // - isSMHKOverPeaksGoldenZone = - smhkMin <= peak && - smhkMin >= peakGolden; - - // - bool isSMHKOverPeaksGoldenZoneP = - smhkMinP <= peakP && - smhkMinP >= peakGoldenP; - - // - isSMHKCrossedOverPeaksGoldenZone = - isSMHKOverPeaksGoldenZone && - !isSMHKOverPeaksGoldenZoneP; - - // - // - - // - isRawHKOverPeaksGoldenZone = - rawhkL <= peak && - rawhkL >= peakGolden; - - // - bool isRawHKOverPeaksGoldenZoneP = - rawhkLP <= peakP && - rawhkLP >= peakGoldenP; - - // - isRawHKCrossedOverPeaksGoldenZone = - isRawHKOverPeaksGoldenZone && - !isRawHKOverPeaksGoldenZoneP; - - // - // XSTR ... - - // - // - - // - isStrUnderValesGoldenZone = - str >= vale && - str <= valeGolden; - - // - bool isStrUnderValesGoldenZoneP = - strP >= valeP && - strP <= valeGoldenP; - - // - isStrCrossedUnderValesGoldenZone = - isStrUnderValesGoldenZone && - !isStrUnderValesGoldenZoneP; - - // - // - - // - isStrOverPeaksGoldenZone = - str <= peak && - str >= peakGolden; - - // - bool isStrOverPeaksGoldenZoneP = - strP <= peakP && - strP >= peakGoldenP; - - // - isStrCrossedOverPeaksGoldenZone = - isStrOverPeaksGoldenZone && - !isStrOverPeaksGoldenZoneP; - } - - // - // Rejected Boxes ... - bool HasRejectedBoxConditions( - ENUM_X_CYCLES cycle, - XSignalBox &box, - ENUM_X_DIRECTION &dir, - XSignalBox &waitingBoxes[], - X121SMCStrategySignalProviderData &provider, - int barIndex = 0 // - ) - { - // - bool result = false; - - // - box.Clean(); - dir = X_DIRECTION_NONE; - - // - // Checking Waiting Baoxes Exists ... - result = HasChild(waitingBoxes); - if (!result) - { - return result; - } - - // - // Fil Selected Data ... - XPOIState cState; - X121Conditions cXConditions; - XPOIStateEvents cStateEvents; - XC121SMCCycleHelper *cHelper; - X121SMCCycleConditions cConditions; - result = provider.SelectCycle( - cycle, - cState, - cStateEvents, - cXConditions, - cHelper, - cConditions // - ); - if (!result) - { - // - cState.Clean(); - ZeroMemory(cHelper); - cConditions.Clean(); - cXConditions.Clean(); - cStateEvents.Clean(); - - // - return result; - } - Parse(cXConditions); - - // - // Normalize Args ... - - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - int idx = -1; - int count = 0; - bool has = false; - - // - int zIDX = barIndex; - int cIDX = zIDX + 1; - int pIDX = cIDX + 1; - int ppIDX = pIDX + 1; - - // - bool isBullish = false; - bool isBearish = false; - - // - XOHCL zBar; - XOHCL cBar; - XOHCL pBar; - - // - // Initial Bars ... - result = zBar.Init( - cState.symbol, - cState.period, - barIndex // - ); - result = - result && - zBar.GetPreviousBar(cBar); - result = - result && - cBar.GetPreviousBar(pBar); - if (!result) - { - // - zBar.Clean(); - cBar.Clean(); - pBar.Clean(); - cState.Clean(); - ZeroMemory(cHelper); - cConditions.Clean(); - cXConditions.Clean(); - - // - return result; - } - - // - // Checking Bar Based on Positions State ... - ENUM_X_DIRECTION iBarPosDir; - bool isBarValidForDir = cHelper - .mBarAnalyser - .IsValidForPosition( - cBar, - iBarPosDir // - ); - bool isBarValidForBullish = - isBarValidForDir && - IsBullish(iBarPosDir); - bool isBarValidForBearish = - isBarValidForDir && - IsBearish(iBarPosDir); - - // - // Extract Selected Boxes ... - XBoxZone selectedBox; - XSignalBox iSignalBox; - count = ArraySize(waitingBoxes); - has = IsValidSize(count); - if (has) - { - // - for (int i = 0; i < count; i++) - { - // - XSignalBox iBox = waitingBoxes[i]; - - // - bool isBullish = iBox.ob.IsBullish(); - - // - bool isOBBullishRejected = - // - cBar.low < iBox.ob.upper && - cBar.GetDown() > iBox.ob.upper - // - ; - - // - bool isOBBearishRejected = - // - cBar.high > iBox.ob.lower && - cBar.GetUp() < iBox.ob.lower - // - ; - - // - has = - isBullish - ? isOBBullishRejected - : isOBBearishRejected; - - // - // Force Using OB ... - if (has) - { - // - iSignalBox = iBox; - if (!selectedBox.IsValid()) - { - selectedBox = iBox.ob; - } - iBox.Clean(); - break; - } - - // - iBox.Clean(); - } - } - result = - iSignalBox.IsValid() && - selectedBox.IsValid(); - if (!result) - { - // - zBar.Clean(); - cBar.Clean(); - pBar.Clean(); - cState.Clean(); - iSignalBox.Clean(); - selectedBox.Clean(); - ZeroMemory(cHelper); - cConditions.Clean(); - cXConditions.Clean(); - - // - return result; - } - - // - bool hasSignalBox = iSignalBox.IsValid(); - bool isSignalBoxBullish = IsBullish(iSignalBox.ob.dir); - - // - // Checking Other Conditions ... - bool isVWapSlowPassed = - isSignalBoxBullish - ? cXConditions.isVWapSlowBullish - : cXConditions.isVWapSlowBearish; - - // - // Bullish Conditions ... - isBullish = - // - // Base Condition ... - ( - // - hasSignalBox && - isVWapSlowPassed && - isSignalBoxBullish && - isBarValidForBullish - // - ) - // - ; - - // - // Bearish Conditions ... - isBearish = - // - // Base Condition ... - ( - // - hasSignalBox && - isVWapSlowPassed && - !isSignalBoxBullish && - isBarValidForBearish - // - ) - // - ; - - // - // Filling Requirements ... - result = - isBullish || - isBearish; - if (result) - { - // - dir = - isBullish - ? X_DIRECTION_BULLISH - : X_DIRECTION_BEARISH; - - // - box = iSignalBox; - box.UpdateTo(TimeCurrent()); - } - - // - // Check All Conditions ... - result = - box.IsValid() && - HasDirection(dir) && - (isBullish || - isBearish); - - // - // Cleanup Resources ... - zBar.Clean(); - cBar.Clean(); - pBar.Clean(); - cState.Clean(); - iSignalBox.Clean(); - selectedBox.Clean(); - ZeroMemory(cHelper); - cConditions.Clean(); - cStateEvents.Clean(); - cXConditions.Clean(); - - // - return result; - } - - // - // Activated Boxes ... - bool HasActivatedBoxConditions( - ENUM_X_CYCLES cycle, - XSignalBox &box, - ENUM_X_DIRECTION &dir, - XSignalBox &waitingBoxes[], - X121SMCStrategySignalProviderData &provider, - int barIndex = 0 // - ) - { - // - bool result = false; - - // - box.Clean(); - dir = X_DIRECTION_NONE; - - // - // Checking Waiting Baoxes Exists ... - result = HasChild(waitingBoxes); - if (!result) - { - return result; - } - - // - // Fil Selected Data ... - XPOIState cState; - X121Conditions cXConditions; - XPOIStateEvents cStateEvents; - XC121SMCCycleHelper *cHelper; - X121SMCCycleConditions cConditions; - result = provider.SelectCycle( - cycle, - cState, - cStateEvents, - cXConditions, - cHelper, - cConditions // - ); - if (!result) - { - // - cState.Clean(); - ZeroMemory(cHelper); - cConditions.Clean(); - cXConditions.Clean(); - cStateEvents.Clean(); - - // - return result; - } - Parse(cXConditions); - - // - // Normalize Args ... - - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - int idx = -1; - int count = 0; - bool has = false; - - // - int zIDX = barIndex; - int cIDX = zIDX + 1; - int pIDX = cIDX + 1; - int ppIDX = pIDX + 1; - - // - bool isBullish = false; - bool isBearish = false; - - // - XOHCL zBar; - XOHCL cBar; - XOHCL pBar; - - // - // Initial Bars ... - result = zBar.Init( - cState.symbol, - cState.period, - barIndex // - ); - result = - result && - zBar.GetPreviousBar(cBar); - result = - result && - cBar.GetPreviousBar(pBar); - if (!result) - { - // - zBar.Clean(); - cBar.Clean(); - pBar.Clean(); - cState.Clean(); - ZeroMemory(cHelper); - cConditions.Clean(); - cXConditions.Clean(); - - // - return result; - } - - // - // Checking Bar Based on Positions State ... - ENUM_X_DIRECTION iBarPosDir; - bool isBarValidForDir = cHelper - .mBarAnalyser - .IsValidForPosition( - cBar, - iBarPosDir // - ); - bool isBarValidForBullish = - isBarValidForDir && - IsBullish(iBarPosDir); - bool isBarValidForBearish = - isBarValidForDir && - IsBearish(iBarPosDir); - - // - // Extract Selected Boxes ... - XBoxZone selectedBox; - XSignalBox iSignalBox; - count = ArraySize(waitingBoxes); - has = IsValidSize(count); - if (has) - { - // - for (int i = 0; i < count; i++) - { - // - XSignalBox iBox = waitingBoxes[i]; - - // - bool isBullish = iBox.ob.IsBullish(); - - // - has = cBar.low < iBox.sharp.upper && - cBar.low > iBox.sharp.lower && - cBar.high > iBox.sharp.lower && - cBar.high < iBox.sharp.upper; - - // - // Force Using OB ... - if (has) - { - // - iSignalBox = iBox; - if (!selectedBox.IsValid()) - { - selectedBox = iBox.ob; - } - iBox.Clean(); - break; - } - - // - iBox.Clean(); - } - } - result = - iSignalBox.IsValid() && - selectedBox.IsValid(); - if (!result) - { - // - zBar.Clean(); - cBar.Clean(); - pBar.Clean(); - cState.Clean(); - iSignalBox.Clean(); - selectedBox.Clean(); - ZeroMemory(cHelper); - cConditions.Clean(); - cXConditions.Clean(); - - // - return result; - } - - // - bool hasSignalBox = iSignalBox.IsValid(); - bool isSignalBoxBullish = IsBullish(iSignalBox.ob.dir); - - // - // Checking Other Conditions ... - - // - // XVWAP ... - - // - bool isVWapSlopeBullish = - cXConditions.isVwapFastSlopeBullish && - cXConditions.isVwapMidSlopeBullish && - cXConditions.isVwapSlowSlopeBullish; - - // - bool isVWapSlopeBearish = - cXConditions.isVwapFastSlopeBearish && - cXConditions.isVwapMidSlopeBearish && - cXConditions.isVwapSlowSlopeBearish; - - // - bool isVWapBullishCondition = - (cXConditions.isVWapBullishOrdered && - cXConditions.isVWapSwitchedToBullishState) || - (cXConditions.isVWapBullishState && - cXConditions.isVWapSwitchedToBullishOrdered); - - // - bool isVWapBearishCondition = - (cXConditions.isVWapBearishOrdered && - cXConditions.isVWapSwitchedToBearishState) || - (cXConditions.isVWapBearishState && - cXConditions.isVWapSwitchedToBearishOrdered); - - // - // Bullish Conditions ... - isBullish = - // - // Base Condition ... - ( - // - hasSignalBox && - isSignalBoxBullish && - isVWapSlopeBullish && - isBarValidForBullish && - isVWapBullishCondition - // - ) - // - ; - - // - // Bearish Conditions ... - isBearish = - // - // Base Condition ... - ( - // - hasSignalBox && - isVWapSlopeBearish && - !isSignalBoxBullish && - isBarValidForBearish && - isVWapBearishCondition - // - ) - // - ; - - // - // Filling Requirements ... - result = - isBullish || - isBearish; - if (result) - { - // - dir = - isBullish - ? X_DIRECTION_BULLISH - : X_DIRECTION_BEARISH; - - // - box = iSignalBox; - box.UpdateTo(TimeCurrent()); - - // - // Provide TP/SL ... - - // - box.sl = isBullish - ? cXConditions.vwapMin - : cXConditions.vwapMax; - - // - box.tp = isBullish - ? box.sharp.upper - : box.sharp.lower; - } - - // - // Check All Conditions ... - result = - box.IsValid() && - HasDirection(dir) && - (isBullish || - isBearish); - - // - // Cleanup Resources ... - zBar.Clean(); - cBar.Clean(); - pBar.Clean(); - cState.Clean(); - iSignalBox.Clean(); - selectedBox.Clean(); - ZeroMemory(cHelper); - cConditions.Clean(); - cStateEvents.Clean(); - cXConditions.Clean(); - - // - return result; - } - - // - // Breaked Boxes ... - bool HasBreakedBoxConditions( - ENUM_X_CYCLES cycle, - XSignalBox &box, - ENUM_X_DIRECTION &dir, - XSignalBox &breakedBoxes[], - X121SMCStrategySignalProviderData &provider, - int barIndex = 0 // - ) - { - // - bool result = false; - - // - box.Clean(); - dir = X_DIRECTION_NONE; - - // - // Checking Waiting Baoxes Exists ... - result = HasChild(breakedBoxes); - if (!result) - { - return result; - } - - // - // Fil Selected Data ... - XPOIState cState; - X121Conditions cXConditions; - XPOIStateEvents cStateEvents; - XC121SMCCycleHelper *cHelper; - X121SMCCycleConditions cConditions; - result = provider.SelectCycle( - cycle, - cState, - cStateEvents, - cXConditions, - cHelper, - cConditions // - ); - if (!result) - { - // - cState.Clean(); - ZeroMemory(cHelper); - cConditions.Clean(); - cXConditions.Clean(); - cStateEvents.Clean(); - - // - return result; - } - Parse(cXConditions); - - // - // Normalize Args ... - - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - int idx = -1; - int count = 0; - bool has = false; - - // - int zIDX = barIndex; - int cIDX = zIDX + 1; - int pIDX = cIDX + 1; - int ppIDX = pIDX + 1; - - // - bool isBullish = false; - bool isBearish = false; - - // - XOHCL zBar; - XOHCL cBar; - XOHCL pBar; - - // - // Initial Bars ... - result = zBar.Init( - cState.symbol, - cState.period, - barIndex // - ); - result = - result && - zBar.GetPreviousBar(cBar); - result = - result && - cBar.GetPreviousBar(pBar); - if (!result) - { - // - zBar.Clean(); - cBar.Clean(); - pBar.Clean(); - cState.Clean(); - ZeroMemory(cHelper); - cConditions.Clean(); - cXConditions.Clean(); - - // - return result; - } - - // - // Checking Bar Based on Positions State ... - ENUM_X_DIRECTION iBarPosDir; - bool isBarValidForDir = cHelper - .mBarAnalyser - .IsValidForPosition( - cBar, - iBarPosDir // - ); - bool isBarValidForBullish = - isBarValidForDir && - IsBullish(iBarPosDir); - bool isBarValidForBearish = - isBarValidForDir && - IsBearish(iBarPosDir); - - // - // Extract Selected Boxes ... - XBoxZone selectedBox; - XSignalBox iSignalBox; - count = ArraySize(breakedBoxes); - has = IsValidSize(count); - if (has) - { - // - for (int i = 0; i < count; i++) - { - // - XSignalBox iBox = breakedBoxes[i]; - - // - bool isBullish = iBox.ob.IsBullish(); - - // - has = cBar.low < iBox.sharp.upper && - cBar.low > iBox.sharp.lower && - cBar.high > iBox.sharp.lower && - cBar.high < iBox.sharp.upper; - - // - // Force Using OB ... - if (has) - { - // - iSignalBox = iBox; - if (!selectedBox.IsValid()) - { - selectedBox = iBox.ob; - } - iBox.Clean(); - break; - } - - // - iBox.Clean(); - } - } - result = - iSignalBox.IsValid() && - selectedBox.IsValid(); - if (!result) - { - // - zBar.Clean(); - cBar.Clean(); - pBar.Clean(); - cState.Clean(); - iSignalBox.Clean(); - selectedBox.Clean(); - ZeroMemory(cHelper); - cConditions.Clean(); - cXConditions.Clean(); - - // - return result; - } - - // - bool hasSignalBox = iSignalBox.IsValid(); - bool isSignalBoxBullish = IsBullish(iSignalBox.ob.dir); - - // - // Checking Other Conditions ... - - // - // XVWAP ... - - // - bool isVWapSlopeBullish = - cXConditions.isVwapFastSlopeBullish && - cXConditions.isVwapMidSlopeBullish && - cXConditions.isVwapSlowSlopeBullish; - - // - bool isVWapSlopeBearish = - cXConditions.isVwapFastSlopeBearish && - cXConditions.isVwapMidSlopeBearish && - cXConditions.isVwapSlowSlopeBearish; - - // - bool isVWapBullishCondition = - (cXConditions.isVWapBullishOrdered && - cXConditions.isVWapSwitchedToBullishState) || - (cXConditions.isVWapBullishState && - cXConditions.isVWapSwitchedToBullishOrdered); - - // - bool isVWapBearishCondition = - (cXConditions.isVWapBearishOrdered && - cXConditions.isVWapSwitchedToBearishState) || - (cXConditions.isVWapBearishState && - cXConditions.isVWapSwitchedToBearishOrdered); - - // - // Bullish Conditions ... - isBullish = - // - // Base Condition ... - ( - // - hasSignalBox && - isSignalBoxBullish && - isVWapSlopeBullish && - isBarValidForBullish && - isVWapBullishCondition - // - ) - // - ; - - // - // Bearish Conditions ... - isBearish = - // - // Base Condition ... - ( - // - hasSignalBox && - isVWapSlopeBearish && - !isSignalBoxBullish && - isBarValidForBearish && - isVWapBearishCondition - // - ) - // - ; - - // - // Filling Requirements ... - result = - isBullish || - isBearish; - if (result) - { - // - dir = - isBullish - ? X_DIRECTION_BULLISH - : X_DIRECTION_BEARISH; - - // - box = iSignalBox; - box.UpdateTo(TimeCurrent()); - - // - // Provide TP/SL ... - - // - box.sl = isBullish - ? cXConditions.vwapMin - : cXConditions.vwapMax; - - // - box.tp = isBullish - ? box.sharp.upper - : box.sharp.lower; - } - - // - // Check All Conditions ... - result = - box.IsValid() && - HasDirection(dir) && - (isBullish || - isBearish); - - // - // Cleanup Resources ... - zBar.Clean(); - cBar.Clean(); - pBar.Clean(); - cState.Clean(); - iSignalBox.Clean(); - selectedBox.Clean(); - ZeroMemory(cHelper); - cConditions.Clean(); - cStateEvents.Clean(); - cXConditions.Clean(); - - // - return result; - } - - // - // XFVGMA ... - bool HasXFVGMAConditions( - ENUM_X_CYCLES cycle, - XSignalBox &box, - ENUM_X_DIRECTION &dir, - XSignalBox &waitingBoxes[], - X121SMCStrategySignalProviderData &provider, - int barIndex = 0 // - ) - { - // - bool result = false; - - // - box.Clean(); - dir = X_DIRECTION_NONE; - - // - result = HasChild(waitingBoxes); - if (!result) - { - return result; - } - - // - // Fil Selected Data ... - XPOIState cState; - X121Conditions cXConditions; - XPOIStateEvents cStateEvents; - XC121SMCCycleHelper *cHelper; - X121SMCCycleConditions cConditions; - result = provider.SelectCycle( - cycle, - cState, - cStateEvents, - cXConditions, - cHelper, - cConditions // - ); - if (!result) - { - // - cState.Clean(); - ZeroMemory(cHelper); - cConditions.Clean(); - cXConditions.Clean(); - cStateEvents.Clean(); - - // - return result; - } - Parse(cXConditions); - - // - // Normalize Args ... - - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - int idx = -1; - int count = 0; - bool has = false; - - // - int zIDX = barIndex; - int cIDX = zIDX + 1; - int pIDX = cIDX + 1; - int ppIDX = pIDX + 1; - - // - bool isBullish = false; - bool isBearish = false; - - // - XOHCL zBar; - XOHCL cBar; - XOHCL pBar; - - // - // Initial Bars ... - result = zBar.Init( - cState.symbol, - cState.period, - barIndex // - ); - result = - result && - zBar.GetPreviousBar(cBar); - result = - result && - cBar.GetPreviousBar(pBar); - if (!result) - { - // - zBar.Clean(); - cBar.Clean(); - pBar.Clean(); - cState.Clean(); - ZeroMemory(cHelper); - cConditions.Clean(); - cXConditions.Clean(); - - // - return result; - } - - // - // Select Waiting Box ... - XBoxZone selectedBox; - XSignalBox selectedSignalBox; - count = ArraySize(waitingBoxes); - for (int i = 0; i < count; i++) - { - // - XSignalBox iSBox = waitingBoxes[i]; - bool isBullish = iSBox.ob.IsBullish(); - - // - bool isInsidePassed = - isBullish - ? cBar.low < iSBox.ob.upper && - cBar.low > iSBox.ob.lower - : cBar.high > iSBox.ob.lower && - cBar.high < iSBox.ob.upper; - - // - bool isTypePassed = iSBox.sharp.type == "XSHPOBX"; - - // - has = isTypePassed && - isInsidePassed; - if (has) - { - // - selectedBox = iSBox.ob; - selectedSignalBox = iSBox; - break; - } - } - result = selectedBox.IsValid() && - selectedSignalBox.IsValid(); - if (!result) - { - // - zBar.Clean(); - cBar.Clean(); - pBar.Clean(); - cState.Clean(); - ZeroMemory(cHelper); - cConditions.Clean(); - selectedBox.Clean(); - cXConditions.Clean(); - selectedSignalBox.Clean(); - - // - return result; - } - - // - bool isSignalBoxBullish = selectedBox.IsBullish(); - - // - // Checking Other Conditions ... - - // - // Checking Bar Based on Positions State ... - ENUM_X_DIRECTION iBarPosDir; - bool isBarValidForDir = cHelper - .mBarAnalyser - .IsValidForPosition( - cBar, - iBarPosDir // - ); - bool isBarValidForBullish = - isBarValidForDir && - IsBullish(iBarPosDir); - bool isBarValidForBearish = - isBarValidForDir && - IsBearish(iBarPosDir); - - // - // Bullish Conditions ... - isBullish = - // - // Base Condition ... - ( - // - isSignalBoxBullish && - isBarValidForBullish - // - ) - // - ; - - // - // Bearish Conditions ... - isBearish = - // - // Base Condition ... - ( - // - !isSignalBoxBullish && - isBarValidForBearish - // - ) - // - ; - - // - // Filling Requirements ... - result = - isBullish || - isBearish; - if (result) - { - // - dir = - isBullish - ? X_DIRECTION_BULLISH - : X_DIRECTION_BEARISH; - - // - box = selectedSignalBox; - box.ob.to = TimeCurrent(); - } - - // - // Check All Conditions ... - result = - box.IsValid() && - HasDirection(dir) && - (isBullish || - isBearish); - - // - // Cleanup Resources ... - zBar.Clean(); - cBar.Clean(); - pBar.Clean(); - cState.Clean(); - selectedBox.Clean(); - ZeroMemory(cHelper); - cConditions.Clean(); - cStateEvents.Clean(); - cXConditions.Clean(); - selectedSignalBox.Clean(); - - // - return result; - } - - // - // XWPVZ ... - bool HasXWPVZConditions( - ENUM_X_CYCLES cycle, - ENUM_X_CYCLES vCycle, - XSignalBox &box, - ENUM_X_DIRECTION &dir, - X121SMCStrategySignalProviderData &provider, - int barIndex = 0 // - ) - { - // - bool result = false; - - // - box.Clean(); - dir = X_DIRECTION_NONE; - - // - // Fil Selected Data ... - XPOIState cState; - X121Conditions cXConditions; - XPOIStateEvents cStateEvents; - XC121SMCCycleHelper *cHelper; - X121SMCCycleConditions cConditions; - result = provider.SelectCycle( - cycle, - cState, - cStateEvents, - cXConditions, - cHelper, - cConditions // - ); - if (!result) - { - // - cState.Clean(); - ZeroMemory(cHelper); - cConditions.Clean(); - cXConditions.Clean(); - cStateEvents.Clean(); - - // - return result; - } - Parse(cXConditions); - - // - // Fil Selected Data ... - XPOIState vState; - X121Conditions vXConditions; - XPOIStateEvents vStateEvents; - XC121SMCCycleHelper *vHelper; - X121SMCCycleConditions vConditions; - result = provider.SelectCycle( - vCycle, - vState, - vStateEvents, - vXConditions, - vHelper, - vConditions // - ); - if (!result) - { - // - cState.Clean(); - ZeroMemory(cHelper); - cConditions.Clean(); - cXConditions.Clean(); - cStateEvents.Clean(); - - // - vState.Clean(); - ZeroMemory(vHelper); - cConditions.Clean(); - vXConditions.Clean(); - vStateEvents.Clean(); - - // - return result; - } - Parse(vXConditions); - - // - // Normalize Args ... - - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - int idx = -1; - int count = 0; - bool has = false; - - // - int zIDX = barIndex; - int cIDX = zIDX + 1; - int pIDX = cIDX + 1; - int ppIDX = pIDX + 1; - - // - bool isBullish = false; - bool isBearish = false; - - // - XOHCL zBar; - XOHCL cBar; - XOHCL pBar; - XOHCL pPBar; - - // - // Initial Bars ... - result = zBar.Init( - cState.symbol, - cState.period, - barIndex // - ); - result = - result && - zBar.GetPreviousBar(cBar); - result = - result && - cBar.GetPreviousBar(pBar); - result = - result && - pBar.GetPreviousBar(pPBar); - if (!result) - { - // - zBar.Clean(); - cBar.Clean(); - pBar.Clean(); - cState.Clean(); - ZeroMemory(cHelper); - cConditions.Clean(); - cXConditions.Clean(); - - // - return result; - } - - // - XCPOIDrawer *drawer = provider.visionCycleHelper.mPOIDrawer; - - // - // Checking Other Conditions ... - - // - // Checking Bar Based on Positions State ... - ENUM_X_DIRECTION iBarPosDir; - bool isBarValidForDir = cHelper - .mBarAnalyser - .IsValidForPosition( - cBar, - iBarPosDir // - ); - bool isBarValidForBullish = - isBarValidForDir && - IsBullish(iBarPosDir); - bool isBarValidForBearish = - isBarValidForDir && - IsBearish(iBarPosDir); - - // - // Senkou Span A/B Rejections ... - - // - bool forceType = false; - bool forcePressure = true; - - // - bool isBullishRejectSenkouAB = cBar.IsRejected( - cXConditions.senkouMax, - X_DIRECTION_BULLISH, - forceType, // Force Type ... - forcePressure // Force Pressure ... - ); - - // - bool isBearishRejectSenkouAB = cBar.IsRejected( - cXConditions.senkouMin, - X_DIRECTION_BEARISH, - forceType, // Force Type ... - forcePressure // Force Pressure ... - ); - - // - // TenkanSen/KijunSen Rejections ... - - // - bool isBullishRejectTenKij = cBar.IsRejected( - cXConditions.tenKijMax, - X_DIRECTION_BULLISH, - forceType, // Force Type ... - forcePressure // Force Pressure ... - ); - - // - bool isBearishRejectTenKij = cBar.IsRejected( - cXConditions.tenKijMin, - X_DIRECTION_BEARISH, - forceType, // Force Type ... - forcePressure // Force Pressure ... - ); - - // - // X3MaFast Rejections ... - - // - bool isBullishRejectedFastMa = cBar.IsRejected( - cXConditions.x3maFastBuffer[cIDX], - X_DIRECTION_BULLISH, - forceType, // Force Type ... - forcePressure // Force Pressure ... - ); - - // - bool isBearishRejectedFastMa = cBar.IsRejected( - cXConditions.x3maFastBuffer[cIDX], - X_DIRECTION_BEARISH, - forceType, // Force Type ... - forcePressure // Force Pressure ... - ); - - // - bool isValidBullishRejectedFastMa = - isBullishRejectedFastMa && - cBar.low > cXConditions.senkouMax; - - // - bool isValidBearishRejectedFastMa = - isBearishRejectedFastMa && - cBar.high < cXConditions.senkouMin; - - // - // Bigger Cycle Verification ... - - // - double vBullishScore = 0; - double vBearishScore = 0; - vXConditions.GenerateScore( - vBullishScore, - vBearishScore // - ); - - // - bool isVBUllishPassed = - cBar.low > vXConditions.senkouMax && - vBullishScore > (vBearishScore * 1.5); - - // - bool isVBearishPassed = - cBar.high < vXConditions.senkouMin && - vBearishScore > (vBullishScore * 1.5); - - // - // ichimokou ... - - // - // Bullish Conditions ... - isBullish = - // - isVBUllishPassed && - isBullishRejectSenkouAB - // - ; - - // - // Bearish Conditions ... - isBearish = - // - isVBearishPassed && - isBearishRejectSenkouAB - // - ; - - // - result = isBullish || - isBearish; - if (result) - { - // - dir = - isBullish - ? X_DIRECTION_BULLISH - : X_DIRECTION_BEARISH; - } - - // - // Detecting a Zone and Validate it ... - - // - XBoxZone tmpBoxes[]; - - // - XBoxZone obBox; - XBoxZone fvgBox; - XBoxZone supResBox; - bool hasOB = false; - bool hasFVG = false; - bool hasSupRes = false; - - // - // Select Support and Resistance ... - if (result) - { - // - if (!hasSupRes) - { - // - cState.OrderBlocksAsBox(tmpBoxes); - cState.FairValueGapsAsBox(tmpBoxes); - cState.SupplyDemandsAsBox(tmpBoxes); - cState.SupportResistancesAsBox(tmpBoxes); - - // - has = HasChild(tmpBoxes); - if (has) - { - // - while (HasChild(tmpBoxes)) - { - // - idx = GetOldest(tmpBoxes); - has = IsValidIndex(idx); - if (!has) - { - break; - } - - // - XBoxZone iBox = tmpBoxes[idx]; - ArrayRemove( - tmpBoxes, - idx, - 1 // - ); - iBox.to = TimeCurrent(); - - // - // Try to Validate Support and Resistance ... - int retests = CountBoxRetest( - iBox, - dir, - cBar.period // - ); - bool isTyped = - isBullish - ? iBox.IsBullish() - : iBox.IsBearish(); - bool isRetested = retests >= 1; - bool isPlaced = - isBullish - ? ( - // - (cBar.low < iBox.upper && - cBar.low > iBox.lower) - // - ) - : ( - // - (cBar.high < iBox.upper && - cBar.high > iBox.lower) - // - ); - - // - has = - isTyped && - isPlaced && - isRetested; - if (has) - { - // - supResBox = iBox; - iBox.Clean(); - break; - } - - // - iBox.Clean(); - } - } - - // - hasSupRes = supResBox.IsValid(); - Clean(tmpBoxes); - } - } - - // - Clean(tmpBoxes); - - // - // Bullish Conditions ... - isBullish = - // - isBullish && - hasSupRes - // - ; - - // - // Bearish Conditions ... - isBearish = - // - isBearish && - hasSupRes - // - ; - - // - // Filling Requirements ... - result = - isBullish || - isBearish; - if (result) - { - // - bool drawBoxes = true; - if (drawBoxes) - { - // - if (hasSupRes) - { - // - supResBox.to = TimeCurrent(); - - // - XCBoxObject *iObj; - has = drawer.DrawBox( - supResBox, - iObj // - ); - - // - if (has) - { - iObj.BoxWidth(2); - iObj.BoxStyle(STYLE_DOT); - } - } - } - - // - Print("Signal ..."); - result = false; - isBearish = false; - isBullish = false; - } - - // - // Check All Conditions ... - result = - box.IsValid() && - HasDirection(dir) && - (isBullish || - isBearish); - - // - // Cleanup Resources ... - zBar.Clean(); - cBar.Clean(); - pBar.Clean(); - pPBar.Clean(); - cState.Clean(); - vState.Clean(); - cConditions.Clean(); - cConditions.Clean(); - ZeroMemory(cHelper); - ZeroMemory(vHelper); - cStateEvents.Clean(); - cXConditions.Clean(); - vXConditions.Clean(); - vStateEvents.Clean(); - - // - return result; - } - - // - bool HasXICHConditions( - ENUM_X_CYCLES cycle, - XBoxZone &box, - ENUM_X_DIRECTION &dir, - X121SMCStrategySignalProviderData &provider, - int barIndex = 0 // - ) - { - // - bool result = false; - - // - box.Clean(); - dir = X_DIRECTION_NONE; - - // - // Fil Selected Data ... - XPOIState cState; - X121Conditions cXConditions; - XPOIStateEvents cStateEvents; - XC121SMCCycleHelper *cHelper; - X121SMCCycleConditions cConditions; - result = provider.SelectCycle( - cycle, - cState, - cStateEvents, - cXConditions, - cHelper, - cConditions // - ); - if (!result) - { - // - cState.Clean(); - ZeroMemory(cHelper); - cConditions.Clean(); - cXConditions.Clean(); - cStateEvents.Clean(); - - // - return result; - } - Parse(cXConditions); - - // - // Normalize Args ... - - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - int idx = -1; - int count = 0; - bool has = false; - - // - int zIDX = barIndex; - int cIDX = zIDX + 1; - int pIDX = cIDX + 1; - int ppIDX = pIDX + 1; - - // - bool isBullish = false; - bool isBearish = false; - - // - XOHCL zBar; - XOHCL cBar; - XOHCL pBar; - XOHCL pPBar; - - // - // Initial Bars ... - result = zBar.Init( - cState.symbol, - cState.period, - barIndex // - ); - result = - result && - zBar.GetPreviousBar(cBar); - result = - result && - cBar.GetPreviousBar(pBar); - result = - result && - pBar.GetPreviousBar(pPBar); - if (!result) - { - // - zBar.Clean(); - cBar.Clean(); - pBar.Clean(); - cState.Clean(); - ZeroMemory(cHelper); - cConditions.Clean(); - cXConditions.Clean(); - - // - return result; - } - - // - // Checking Conditions ... - // - // XDELTA ... - - // - bool isDeltaSwitchedToBullish = - (cXConditions.isDeltaCrossedOverMa && - cXConditions.isDeltaSwitchedToBullish); - bool isDeltaBullish = - (cXConditions.isDeltaOverMa && - cXConditions.isDeltaBullish); - bool isDeltaIsBullish = - isDeltaBullish || - isDeltaSwitchedToBullish; - - // - bool isDeltaSwitchedToBearish = - (cXConditions.isDeltaCrossedUnderMa && - cXConditions.isDeltaSwitchedToBearish); - bool isDeltaBearish = - (cXConditions.isDeltaUnderMa && - cXConditions.isDeltaBearish); - bool isDeltaIsBearish = - isDeltaBearish || - isDeltaSwitchedToBearish; - - // - // XVOLUME ... - - // - bool isVolumeSwitchedToBullish = - (cXConditions.isVolumeSwitchedToBullish && - cXConditions.isBullishVolumeSwitchedToIncreased); - bool isVolumeBullish = - (cXConditions.isBullishVolumeIncreased && - cXConditions.isBullishVolumeMaOverBearishVolumeMa); - bool isVolumeIsBullish = - isVolumeBullish || - isVolumeSwitchedToBullish; - - // - bool isVolumeSwitchedToBearish = - (cXConditions.isVolumeSwitchedToBearish && - cXConditions.isBearishVolumeSwitchedToIncreased); - bool isVolumeBearish = - (cXConditions.isBullishVolumeMaUnderBearishVolumeMa && - cXConditions.isBearishVolumeIncreased); - bool isVolumeIsBearish = - isVolumeBearish || - isVolumeSwitchedToBearish; - - // - // XSTR ... - bool isStrIsBullish = - (cXConditions.isStrBullish || - cXConditions.isStrSwitchedToBullish); - bool isStrIsBearish = - (cXConditions.isStrBearish || - cXConditions.isStrSwitchedToBearish); - - // - // XICH ... - bool isIchIsBullish = - (cXConditions.isTenkanSenOverKijunSen || - cXConditions.isTenkanSenCrossedOverKijunSen); - bool isIchIsBearish = - (cXConditions.isTenkanSenUnderKijunSen || - cXConditions.isTenkanSenCrossedUnderKijunSen); - - // - // Checking TK Zone ... - - // - bool isBullishTKZone = - isIchIsBullish && - cBar.low < cXConditions.tenkanSenBuffer[cIDX] && - cBar.low > cXConditions.kijunSenBuffer[cIDX] && - cBar.low < pBar.low && - zBar.open > cBar.low; - - // - bool isBearishTKZone = - isIchIsBearish && - cBar.high > cXConditions.tenkanSenBuffer[cIDX] && - cBar.high < cXConditions.kijunSenBuffer[cIDX] && - cBar.high > pBar.high && - zBar.open < cBar.high; - - // - // Summarize Conditions ... - - // - isBullish = - // - // false - isStrIsBullish && - isIchIsBullish && - isBullishTKZone && - isDeltaIsBullish && - isVolumeIsBullish - // - // - ; - - // - isBearish = - // - // false - isStrIsBearish && - isIchIsBearish && - isBearishTKZone && - isDeltaIsBearish && - isVolumeIsBearish - // - ; - - // - // Filling Requirements ... - result = - isBullish || - isBearish; - if (result) - { - // - dir = - isBullish - ? X_DIRECTION_BULLISH - : X_DIRECTION_BEARISH; - - // - box.dir = dir; - box.from = pPBar.time; - box.to = TimeCurrent(); - box.symbol = cBar.symbol; - box.period = cBar.period; - - // - double points = GetPoints(box.symbol); - - // - double pivot = isBullish - ? cBar.low - (points * 5) - : cBar.high + (points * 5); - - // - double point = GetEntry( - cBar.symbol, - dir // - ); - - // - box.upper = - isBullish - ? point - : pivot; - - // - box.lower = - isBullish - ? pivot - : point; - - // - bool drawBoxes = true; - if (drawBoxes) - { - // - } - } - - // - // Check All Conditions ... - result = - box.IsValid() && - HasDirection(dir) && - (isBullish || - isBearish); - - // - // Cleanup Resources ... - zBar.Clean(); - cBar.Clean(); - pBar.Clean(); - pPBar.Clean(); - cState.Clean(); - cConditions.Clean(); - cConditions.Clean(); - ZeroMemory(cHelper); - cStateEvents.Clean(); - cXConditions.Clean(); - - // - return result; - } - - // - bool HasXSTRConditions( - ENUM_X_CYCLES cycle, - XBoxZone &box, - ENUM_X_DIRECTION &dir, - X121SMCStrategySignalProviderData &provider, - int barIndex = 0 // - ) - { - // - bool result = false; - - // - box.Clean(); - dir = X_DIRECTION_NONE; - - // - // Fil Selected Data ... - XPOIState cState; - X121Conditions cXConditions; - XPOIStateEvents cStateEvents; - XC121SMCCycleHelper *cHelper; - X121SMCCycleConditions cConditions; - result = provider.SelectCycle( - cycle, - cState, - cStateEvents, - cXConditions, - cHelper, - cConditions // - ); - if (!result) - { - // - cState.Clean(); - ZeroMemory(cHelper); - cConditions.Clean(); - cXConditions.Clean(); - cStateEvents.Clean(); - - // - return result; - } - Parse(cXConditions); - - // - // Normalize Args ... - - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - int idx = -1; - int count = 0; - bool has = false; - - // - int zIDX = barIndex; - int cIDX = zIDX + 1; - int pIDX = cIDX + 1; - int ppIDX = pIDX + 1; - - // - bool isBullish = false; - bool isBearish = false; - - // - XOHCL zBar; - XOHCL cBar; - XOHCL pBar; - XOHCL pPBar; - - // - // Initial Bars ... - result = zBar.Init( - cState.symbol, - cState.period, - barIndex // - ); - result = - result && - zBar.GetPreviousBar(cBar); - result = - result && - cBar.GetPreviousBar(pBar); - result = - result && - pBar.GetPreviousBar(pPBar); - if (!result) - { - // - zBar.Clean(); - cBar.Clean(); - pBar.Clean(); - cState.Clean(); - ZeroMemory(cHelper); - cConditions.Clean(); - cXConditions.Clean(); - - // - return result; - } - - // - // Checking Conditions ... - // - // XDELTA ... - - // - bool isDeltaSwitchedToBullish = - (cXConditions.isDeltaCrossedOverMa && - cXConditions.isDeltaSwitchedToBullish); - bool isDeltaBullish = - (cXConditions.isDeltaOverMa && - cXConditions.isDeltaBullish); - bool isDeltaIsBullish = - isDeltaBullish || - isDeltaSwitchedToBullish; - - // - bool isDeltaSwitchedToBearish = - (cXConditions.isDeltaCrossedUnderMa && - cXConditions.isDeltaSwitchedToBearish); - bool isDeltaBearish = - (cXConditions.isDeltaUnderMa && - cXConditions.isDeltaBearish); - bool isDeltaIsBearish = - isDeltaBearish || - isDeltaSwitchedToBearish; - - // - // XVOLUME ... - - // - bool isVolumeSwitchedToBullish = - (cXConditions.isVolumeSwitchedToBullish && - cXConditions.isBullishVolumeSwitchedToIncreased); - bool isVolumeBullish = - (cXConditions.isBullishVolumeIncreased && - cXConditions.isBullishVolumeMaOverBearishVolumeMa); - bool isVolumeIsBullish = - isVolumeBullish || - isVolumeSwitchedToBullish; - - // - bool isVolumeSwitchedToBearish = - (cXConditions.isVolumeSwitchedToBearish && - cXConditions.isBearishVolumeSwitchedToIncreased); - bool isVolumeBearish = - (cXConditions.isBullishVolumeMaUnderBearishVolumeMa && - cXConditions.isBearishVolumeIncreased); - bool isVolumeIsBearish = - isVolumeBearish || - isVolumeSwitchedToBearish; - - // - // XSTR ... - bool isStrIsBullish = - (cXConditions.isStrBullish || - cXConditions.isStrSwitchedToBullish); - bool isStrIsBearish = - (cXConditions.isStrBearish || - cXConditions.isStrSwitchedToBearish); - - // - // Detecting Str Box ... - XBoxZone strBox; - bool hasStrBox = false; - if (!hasStrBox) - { - // - hasStrBox = - cXConditions.isStrBullish || - cXConditions.isStrBearish; - if (hasStrBox) - { - // - ENUM_X_DIRECTION strDir = - cXConditions.isStrBullish - ? X_DIRECTION_BULLISH - : X_DIRECTION_BEARISH; - - // - XOHCL lastBar; - ENUM_X_DIRECTION lastDir; - bool hasLast = - cHelper - .DetectNearestStrSwitched( - lastBar, - lastDir, - zIDX // - ); - - // - XOHCL prevBar; - ENUM_X_DIRECTION prevDir; - bool hasPrev = - hasLast && - cHelper - .DetectNearestStrSwitched( - prevBar, - prevDir, - lastBar.Index() + 1 // - ); - - // - hasStrBox = - hasLast && - hasPrev; - if (hasStrBox) - { - // - int fromIDX = MathMax( - lastBar.Index(), - prevBar.Index() // - ); - - // - string symbol = cBar.symbol; - ENUM_TIMEFRAMES period = cBar.period; - - // - datetime from = GetBarTime( - symbol, - period, - fromIDX // - ); - - // - int length = fromIDX - barIndex; - - // - double upper = zBar.FindHighest( - length, - MODE_HIGH // - ); - - // - double lower = zBar.FindLowest( - length, - MODE_LOW // - ); - - // - strBox.from = from; - strBox.dir = strDir; - strBox.lower = lower; - strBox.upper = upper; - strBox.symbol = symbol; - strBox.period = period; - strBox.type = "XSTRBox"; - strBox.to = TimeCurrent(); - - // - hasStrBox =strBox.IsValid(); - } - - // - lastBar.Clean(); - prevBar.Clean(); - } - } - - // - // XFastMa ... - - // - bool isFastMaOverStr = - (cXConditions.x3maFastBuffer[cIDX] > cXConditions.strBuffer[cIDX]); - - // - bool isFastMaUnderStr = - (cXConditions.x3maFastBuffer[cIDX] < cXConditions.strBuffer[cIDX]); - - // - bool isFastMaBullishReject = - cBar.low < pBar.low && - cBar.low > cXConditions.strBuffer[cIDX] && - cBar.low < cXConditions.x3maFastBuffer[cIDX] && - cBar.GetDown() > cXConditions.x3maFastBuffer[cIDX]; - - // - bool isFastMaBearishReject = - cBar.high > pBar.high && - cBar.high < cXConditions.strBuffer[cIDX] && - cBar.high > cXConditions.x3maFastBuffer[cIDX] && - cBar.GetUp() < cXConditions.x3maFastBuffer[cIDX]; - - // - // Summarize Conditions ... - - // - isBullish = - // - // false - hasStrBox && - isStrIsBullish && - isFastMaOverStr && - // isDeltaIsBullish && - // isVolumeIsBullish && - isFastMaBullishReject - // - // - ; - - // - isBearish = - // - // false - hasStrBox && - isStrIsBearish && - isFastMaUnderStr && - // isDeltaIsBearish && - // isVolumeIsBearish && - isFastMaBearishReject - // - ; - - // - // Filling Requirements ... - result = - isBullish || - isBearish; - if (result) - { - // - XCPOIDrawer *drawer = provider.visionCycleHelper.mPOIDrawer; - XCBoxObject *iObj; - bool isCreated = drawer.DrawBox( - strBox, - iObj // - ); - if (isCreated) { - // - Print("STRBox"); - } - - // - dir = - isBullish - ? X_DIRECTION_BULLISH - : X_DIRECTION_BEARISH; - - // - box.dir = dir; - box.from = pPBar.time; - box.to = TimeCurrent(); - box.symbol = cBar.symbol; - box.period = cBar.period; - - // - double points = GetPoints(box.symbol); - - // - double pivot = cXConditions.strBuffer[cIDX]; - // isBullish - // ? cBar.low - (points * 5) - // : cBar.high + (points * 5); - - // - double point = GetEntry( - cBar.symbol, - dir // - ); - - // - box.upper = - isBullish - ? point - : pivot; - - // - box.lower = - isBullish - ? pivot - : point; - - // - bool drawBoxes = true; - if (drawBoxes) - { - // - } - } - - // - // Check All Conditions ... - result = - box.IsValid() && - HasDirection(dir) && - (isBullish || - isBearish); - - // - // Cleanup Resources ... - zBar.Clean(); - cBar.Clean(); - pBar.Clean(); - pPBar.Clean(); - cState.Clean(); - strBox.Clean(); - cConditions.Clean(); - cConditions.Clean(); - ZeroMemory(cHelper); - cStateEvents.Clean(); - cXConditions.Clean(); - - // - return result; - } - - // -}; diff --git a/Documents/BKP/x-121.smc.market.cycle.helper.class.mq5 b/Documents/BKP/x-121.smc.market.cycle.helper.class.mq5 deleted file mode 100644 index e3e96a05..00000000 --- a/Documents/BKP/x-121.smc.market.cycle.helper.class.mq5 +++ /dev/null @@ -1,4024 +0,0 @@ -/////////////////////////////////////////////////////// -// -// SaherElm IT Center MQL5 Class Library -// -------------------------------------- -// Name: XC121SMCCycleHelper -// Description: provides all based classes for use ... -// -// -// Maintainer: -// ------------ -// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) -// -////////////////////////////////////////////////////// -// -// Global Properties ... -#property library -#property copyright "Copyright 2023, SaherElm IT Center" -#property link "https://www.saherelm.ir" -#property version "1.00" -#property strict - -// -// Imports ... -#include "../../Classes/x-saherelm.x-bar.analyser.class.mq5" -#include "../../Classes/x-saherelm.x-poi.class.mq5" -#include "../Libraries/x-121.smc.lib.mq5" - -// -// Definitions ... - -// -// Implementations ... - -// -// Cycles Enumeration ... -enum ENUM_X_CYCLES -{ - X_CYCLE_NONE, - X_CYCLE_TRIGGER, - X_CYCLE_DECISION, - X_CYCLE_ANALYSE, - X_CYCLE_VERIFICATION, - X_CYCLE_CONSOLIDATION, - X_CYCLE_VISION, -}; - -// -// String Representation of Cycles Enumeration ... -string ToString(ENUM_X_CYCLES value) -{ - // - string result = EnumToString(value); - - // - StringReplace(result, "X_CYCLE_", ""); - - // - return result; -} - -// -// Validate a Cycle ... -bool IsValid(ENUM_X_CYCLES value) -{ - // - bool result = false; - - // - result = - value != X_CYCLE_NONE; - - // - return result; -} - -// -// Cycle Events Enumeration ... -enum ENUM_X_CYCLE_EVENTS -{ - SAR_CHANGE_DETECTED, - NEW_PEAK_DETECTED, - NEW_VALE_DETECTED, - PIVOT_POINT_DETECTED, - VWAP_ORDER_CHANGE_ETECTED, - VWAP_STATE_CHANGE_DETCTED, - CONSOLIDATION_BREAKED_DETECTED, - PEAK_PIVOT_STARTED, - PEAK_PIVOT_ENDED, - VALE_PIVOT_STARTED, - VALE_PIVOT_ENDED, -}; - -// -// Cycle Helper ... -class XC121SMCCycleHelper : public XCBase -{ - // - public: - // - // Props ... - - // - // X121 ... - XCX121Helper *mX121Helper; - - // - // POI Detector ... - XCPOIDrawer *mPOIDrawer; - XCPOIDetector *mPOIDetector; - - // - // Bar Analyser - XCBarAnalyser *mBarAnalyser; - - // - // Constructor(s) ... - XC121SMCCycleHelper() - { - Default(); - } - - // - // Deconstructor ... - ~XC121SMCCycleHelper() - { - DeInit(); - } - - // - // Getter/Setter(s) ... - - // - // Actions ... - - /** - * Initialize ... - * - * @param symbol: String ... - * @param period: ENUM_TIMEFRAMES member ... - * @param x121Inputs: X121Inputs instance ... - * - * @return ( bool ) - */ - bool Init( - string symbol, - ENUM_TIMEFRAMES period, - X121Inputs &x121Inputs, - int requiredPOIs = 50 // - ) - { - // - bool result = false; - - // - if (requiredPOIs < 0) - { - requiredPOIs = 0; - } - - // - result = IsValid(symbol) && - IsValid(period); - if (!result) - { - return result; - } - - // - mSymbol = symbol; - mPeriod = period; - - // - // X121 ... - mX121Helper = new XCX121Helper(); - result = mX121Helper.Init( - symbol, - period, - x121Inputs // - ); - if (!result) - { - return result; - } - - // - mPOIDetector = new XCPOIDetector( - symbol, - period // - ); - mPOIDetector.MaxRequiredPOIs(requiredPOIs); - - // - int maxLoopbackBars = mPOIDetector.MaxAllowedLoopbackForInit(); - int periodSeconds = PeriodSeconds(period); - if (periodSeconds > PeriodSeconds(PERIOD_M15)) - { - // - int multiplier = periodSeconds / PeriodSeconds(PERIOD_M15); - - // - if (multiplier >= 1) - { - maxLoopbackBars *= 2; - } - } - mPOIDetector.MaxAllowedLoopbackForInit(maxLoopbackBars); - mPOIDetector.Init(); - - // - // Initialize Bar Analyser Class Instance ... - mBarAnalyser = new XCBarAnalyser(); - - // - // Initial and Configure POI Drawer if Required ... - mPOIDrawer = new XCPOIDrawer(); - mPOIDrawer.ChartIdentification(0); - mPOIDrawer.SubWindowIdentification(0); - - // - mPOIDrawer.DemandZoneFill(false); - mPOIDrawer.SupplyZoneFill(false); - mPOIDrawer.BullishFVGFill(false); - mPOIDrawer.BearishFVGFill(false); - mPOIDrawer.SupportZoneFill(false); - mPOIDrawer.ResistanceZoneFill(false); - mPOIDrawer.BullishOrderBlockFill(false); - mPOIDrawer.BearishOrderBlockFill(false); - - // - // Set Chart Style ... - ApplyChartStyle(); - - // - return result; - } - - /** - * Retrieve Symbol ... - * - * @return ( string ) - */ - string GetSymbol() - { - return mSymbol; - } - - /** - * Retrieve TimeFrame (Period) ... - * - * @return ( ENUM_TIMEFRAMES ) - */ - ENUM_TIMEFRAMES GetPeriod() - { - return mPeriod; - } - - /** - * Get Specified Bar ... - * - * @param source: XOHCL instance, Source Bar ... - * @param bar: XOHCL instance, Dest Bar ... - * - * @return ( bool ) - */ - bool GetBar( - XOHCL &source, - XOHCL &bar // - ) - { - // - bool result = false; - - // - bar.Clean(); - - // - string symbol = GetSymbol(); - ENUM_TIMEFRAMES period = GetPeriod(); - - // - result = - IsValid(symbol) && - IsValid(period) && - source.IsValid(); - if (!result) - { - return result; - } - - // - int index = iBarShift( - symbol, - period, - source.time // - ); - result = bar.Init( - symbol, - period, - index // - ); - if (!result) - { - // - bar.Clean(); - return result; - } - - // - return result; - } - - /** - * Retrieve Specified Bar ... - * - * @param bar: XOHCL instance ... - * @param index: Integer ... - * - * @return ( bool ) - */ - bool GetBar( - XOHCL &bar, - int index = 0 // - ) - { - // - bool result = false; - - // - bar.Clean(); - - // - if (index < 0) - { - index = 0; - } - - // - string symbol = GetSymbol(); - ENUM_TIMEFRAMES period = GetPeriod(); - - // - result = bar.Init( - symbol, - period, - index // - ); - - // - return result; - } - - /** - * Retrieve Specified Bar ... - * - * @param bar: XOHCL instance ... - * @param time: Datetime ... - * - * @return ( bool ) - */ - bool GetBar( - XOHCL &bar, - datetime time = NULL // - ) - { - // - bool result = false; - - // - int index = GetBarIndex(time); - result = GetBar(bar, - index // - ); - - // - return result; - } - - /** - * Retrieve Specified Time Bar Index ... - * - * @param time: DateTime ... - * - * @return ( int ) - */ - int GetBarIndex(datetime time = NULL) - { - // - int result = -1; - - // - time = NormalizeTime(time); - - // - string symbol = GetSymbol(); - ENUM_TIMEFRAMES period = GetPeriod(); - - // - result = iBarShift( - symbol, - period, - time // - ); - - // - return result; - } - - /** - * Retrieve Cycle Conditions ... - * - * @param events: ENUM_X_CYCLE_EVENTS member, Array ... - * @param conditions: X121SMCCycleConditions instance ... - * @param barIndex: Integer ... - * @param loopback: Integer ... - * - * @return ( bool ) - */ - bool GetConditions( - ENUM_X_CYCLE_EVENTS &events[], - ENUM_XPOI_EVENTS &poiEvents[], - X121SMCCycleConditions &conditions, - int barIndex = 0, - int loopback = 7 // - ) - { - // - bool result = false; - - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - if (loopback < 5) - { - loopback = 5; - } - - // - Clean(events); - Clean(poiEvents); - conditions.Clean(); - - // - result = mX121Helper.GetConditions( - conditions.x121Conditions, - barIndex, - loopback // - ); - if (!result) - { - // - conditions.Clean(); - return result; - } - - // - mPOIDetector.Update(poiEvents); - mPOIDetector.GetState(conditions.state); - - // - conditions.symbol = GetSymbol(); - conditions.period = GetPeriod(); - conditions.time = TimeCurrent(); - - // - // Update(); - - // - result = conditions.IsValid(); - - // - return result; - } - - // - bool GeneratePVBox( - XBoxZone &box, - int barIndex = 0 // - ) - { - // - bool result = false; - - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - box.Clean(); - box.symbol = GetSymbol(); - box.period = GetPeriod(); - - // - int index = barIndex; - - // - // Peak ... - datetime peaksSameFrom = NULL; - double peak = mX121Helper.xpvHelper.GetPeak(index); - double prevPeak = mX121Helper.xpvHelper.GetPeak(index + 1); - bool startsByPeak = peak == prevPeak; - - // - // Vale ... - datetime valesSameFrom = NULL; - double vale = mX121Helper.xpvHelper.GetVale(index); - double prevVale = mX121Helper.xpvHelper.GetVale(index + 1); - bool startsByVale = - !startsByPeak && - vale == prevVale; - - // - bool canBreak = false; - while (!canBreak) - { - // - index++; - - // - datetime cTime = iTime( - box.symbol, - box.period, - index // - ); - - // - // Peak ... - double iPeak = mX121Helper.xpvHelper.GetPeak(index); - - // - // Vale ... - double iVale = mX121Helper.xpvHelper.GetVale(index); - - // - // Start By Peak or Value ... - bool isSame = false; - if (startsByPeak) - { - // - isSame = iPeak == peak; - bool canSetVale = vale == 0 - ? true - : iVale > vale; - if (canSetVale) - { - vale = iVale; - } - } - else if (startsByVale) - { - // - isSame = iVale == vale; - bool canSetPeak = peak == 0 - ? true - : iPeak < peak; - if (canSetPeak) - { - peak = iPeak; - } - } - - // - if (isSame) - { - // - box.from = cTime; - box.upper = peak; - box.lower = vale; - } - else if (IsValid(box.from)) - { - // - // Complete Box ... - box.to = iTime( - box.symbol, - box.period, - barIndex // - ); - - // - box.type = "XPVBox"; - box.dir = startsByPeak - ? X_DIRECTION_BEARISH - : startsByVale - ? X_DIRECTION_BULLISH - : X_DIRECTION_NONE; - } - - // - canBreak = !isSame; - } - - // - result = box.IsValid(); - if (!result) - { - box.Clean(); - } - - // - return result; - } - - // - int DetectRejections( - XBoxZone &rejections[], - int barIndex = 0, - bool forceBarType = true, - bool forceFiboPressure = true, - bool forceUnUsedRejections = true, - int maxAllowedLoopback = 587 // - ) - { - // - int result = 0; - - // - // Normalize Args ... - Clean(rejections); - - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - int idx = -1; - bool has = false; - for (int i = barIndex + 1; i < barIndex + maxAllowedLoopback; i++) - { - // - // Init Indexed Bar ... - XOHCL iBar; - XOHCL iCBar; - XOHCL iPBar; - has = GetBar(iBar, i); - has = - has && - iBar.GetPreviousBar(iCBar); - has = - has && - iCBar.GetPreviousBar(iPBar); - if (!has) - { - // - iBar.Clean(); - iCBar.Clean(); - iPBar.Clean(); - break; - } - - // - // Check CBar Bullish Fibo Pressure ... - bool cBarHasBullishFiboPressure = - mBarAnalyser - .HasFiboPressure( - iCBar, - X_DIRECTION_BULLISH, - X_FIBO_LEVEL_382 // - ); - - // - // Check CBar Bearish Fibo Pressure ... - bool cBarHasBearishFiboPressure = - mBarAnalyser - .HasFiboPressure( - iCBar, - X_DIRECTION_BEARISH, - X_FIBO_LEVEL_382 // - ); - - // - // Check Bar is Bullish Rejection Swing ... - bool isBullishRejection = - // - iCBar.low < iBar.low && - iCBar.low < iPBar.low && - // - iCBar.low < iCBar.GetDown() && - iCBar.GetLowShadow() > iCBar.GetBody() && - iCBar.GetLowShadow() > iCBar.GetHighShadow() - // - ; - - // - // Check Bar is Bearish Rejection Swing ... - bool isBearishRejection = - // - iCBar.high > iBar.high && - iCBar.high > iPBar.high && - // - iCBar.high > iCBar.GetUp() && - iCBar.GetHighShadow() > iCBar.GetBody() && - iCBar.GetHighShadow() > iCBar.GetLowShadow() - // - ; - - // - // Apply Fibo Pressure ... - if (forceFiboPressure) - { - // - isBullishRejection = - isBullishRejection && - cBarHasBullishFiboPressure; - - // - isBearishRejection = - isBearishRejection && - cBarHasBearishFiboPressure; - } - - // - // Apply Force Bar Type ... - if (forceBarType) - { - // - isBullishRejection = - isBullishRejection && - iCBar.IsBullish(); - - // - isBearishRejection = - isBearishRejection && - iCBar.IsBearish(); - } - - // - // Summarize Result ... - has = isBullishRejection || - isBearishRejection; - if (has) - { - // - XBoxZone iBox; - - // - iBox.to = iBar.time; - iBox.from = iCBar.time; - iBox.period = iBar.period; - iBox.symbol = iBar.symbol; - - // - iBox.dir = - isBullishRejection - ? X_DIRECTION_BULLISH - : X_DIRECTION_BEARISH; - - // - iBox.upper = - isBullishRejection - ? iCBar.GetDown() - : iCBar.high; - - // - iBox.lower = - isBullishRejection - ? iCBar.low - : iCBar.GetUp(); - - // - iBox.type = - isBullishRejection - ? "XSwingLow" - : "XSwingHigh"; - - // - // Validate Box ... - has = iBox.IsValid(); - if (has) - { - // - // Apply Force Unused Rejections ... - if (forceUnUsedRejections) - { - // - has = !IsBoxBreaked( - iBox, - iCBar.Index() + 1, - barIndex // - ); - } - - // - if (has) - { - // - idx = FindIndex( - iBox, - rejections // - ); - has = !IsValidIndex(idx); - if (has) - { - // - AddRef( - iBox, - rejections // - ); - } - } - } - - // - iBox.Clean(); - } - - // - iBar.Clean(); - iCBar.Clean(); - iPBar.Clean(); - } - - // - result = ArraySize(rejections); - - // - return result; - } - - // - datetime DetectNearestCloseOverX3MAFast( - XOHCL &bar, - int maxAllowedBars = 20 // - ) - { - // - datetime result = NULL; - - // - if (!bar.IsValid()) - { - return result; - } - - // - bool has = false; - int idx = bar.Index(); - int start = idx; - int end = start + maxAllowedBars; - bool canContinue = true; - while (canContinue) - { - // - XOHCL iBar; - has = iBar.Init( - bar.symbol, - bar.period, - start // - ); - if (!has) - { - // - iBar.Clean(); - break; - } - - // - double iFast = mX121Helper - .x3maHelper - .GetX3MaFast(start); - - // - has = iBar.close > iFast && - iBar.open < iFast; - if (has) - { - result = iBar.time; - } - - // - canContinue = - start < end && - !IsValid(result); - - // - start++; - - // - iBar.Clean(); - } - - // - return result; - } - - // - datetime DetectNearestCloseUnderX3MAFast( - XOHCL &bar, - int maxAllowedBars = 20 // - ) - { - // - datetime result = NULL; - - // - if (!bar.IsValid()) - { - return result; - } - - // - bool has = false; - int idx = bar.Index(); - int start = idx; - int end = start + maxAllowedBars; - bool canContinue = true; - while (canContinue) - { - // - XOHCL iBar; - has = iBar.Init( - bar.symbol, - bar.period, - start // - ); - if (!has) - { - // - iBar.Clean(); - break; - } - - // - double iFast = mX121Helper - .x3maHelper - .GetX3MaFast(start); - - // - has = iBar.close < iFast && - iBar.open > iFast; - if (has) - { - result = iBar.time; - } - - // - canContinue = - start < end && - !IsValid(result); - - // - start++; - - // - iBar.Clean(); - } - - // - return result; - } - - // - // Virtuals ... - - /** - * Set Default Properties Values ... - */ - virtual void Default() - { - } - - // - protected: - // - - // - private: - // - // Props ... - string mSymbol; - ENUM_TIMEFRAMES mPeriod; - - // - // Actions ... - - /** - * Release All Resources ... - */ - void DeInit() - { - // - ZeroMemory(mX121Helper); - ZeroMemory(mPOIDetector); - ZeroMemory(mBarAnalyser); - - // - delete mX121Helper; - delete mPOIDetector; - delete mBarAnalyser; - } - - /** - * Apply Chart Style ... - */ - void ApplyChartStyle() - { - // - // Retrieve Current Chart ID ... - long chartId = ChartID(); - - // - 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 = true; // 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 - - // - ChartSetInteger(chartId, CHART_SHOW_BID_LINE, mShowBidLine); - ChartSetInteger(chartId, CHART_SHOW_ASK_LINE, mShowAskLine); - ChartSetInteger(chartId, CHART_SHOW_GRID, mShowGrid); - ChartSetInteger(chartId, CHART_SHOW_VOLUMES, mShowVolumes); - ChartSetInteger(chartId, CHART_SHOW_TRADE_LEVELS, mShowTradeLevels); - ChartSetInteger(chartId, CHART_AUTOSCROLL, mAutoScroll); - ChartSetInteger(chartId, CHART_QUICK_NAVIGATION, mQuickNavigation); - ChartSetInteger(chartId, CHART_COLOR_FOREGROUND, mForeGroundColor); - ChartSetInteger(chartId, CHART_COLOR_BACKGROUND, mBackGroundColor); - ChartSetInteger(chartId, CHART_COLOR_GRID, mGridColor); - ChartSetInteger(chartId, CHART_COLOR_BID, mBidLineColor); - ChartSetInteger(chartId, CHART_COLOR_ASK, mAskLineColor); - ChartSetInteger(chartId, CHART_COLOR_STOP_LEVEL, mStopColor); - ChartSetInteger(chartId, CHART_COLOR_VOLUME, mVolumesColor); - - // - // For Enabling XCC ... - // ChartSetInteger(chartId, CHART_MODE, mMode); - // ChartSetInteger(chartId, CHART_COLOR_CHART_UP, mUpColor); - // ChartSetInteger(chartId, CHART_COLOR_CHART_DOWN, mDownColor); - // ChartSetInteger(chartId, CHART_COLOR_CANDLE_BULL, mBullishColor); - // ChartSetInteger(chartId, CHART_COLOR_CANDLE_BEAR, mBearishColor); - // ChartSetInteger(chartId, CHART_COLOR_CHART_LINE, mLineColor); - } - - // -}; - -// -// Signal Provider Data ... -struct X121SMCStrategySignalProviderData -{ - // - // Props ... - - // - // Trigger ... - XPOIState triggerState; - double triggerBullishScore; - double triggerBearishScore; - X121Conditions triggerXConditions; - ENUM_XPOI_EVENTS triggerPoiEvents[]; - XC121SMCCycleHelper *triggerCycleHelper; - ENUM_X_CYCLE_EVENTS triggerCycleEvents[]; - X121SMCCycleConditions triggerConditions; - - // - // Decision ... - XPOIState decisionState; - double decisionBullishScore; - double decisionBearishScore; - X121Conditions decisionXConditions; - ENUM_XPOI_EVENTS decisionPoiEvents[]; - XC121SMCCycleHelper *decisionCycleHelper; - ENUM_X_CYCLE_EVENTS decisionCycleEvents[]; - X121SMCCycleConditions decisionConditions; - - // - // Analyse ... - XPOIState analyseState; - double analyseBullishScore; - double analyseBearishScore; - X121Conditions analyseXConditions; - ENUM_XPOI_EVENTS analysePoiEvents[]; - XC121SMCCycleHelper *analyseCycleHelper; - ENUM_X_CYCLE_EVENTS analyseCycleEvents[]; - X121SMCCycleConditions analyseConditions; - - // - // Verification ... - XPOIState verificationState; - double verificationBullishScore; - double verificationBearishScore; - X121Conditions verificationXConditions; - ENUM_XPOI_EVENTS verificationPoiEvents[]; - XC121SMCCycleHelper *verificationCycleHelper; - ENUM_X_CYCLE_EVENTS verificationCycleEvents[]; - X121SMCCycleConditions verificationConditions; - - // - // Consolidation ... - XPOIState consolidationState; - double consolidationBullishScore; - double consolidationBearishScore; - X121Conditions consolidationXConditions; - ENUM_XPOI_EVENTS consolidationPoiEvents[]; - XC121SMCCycleHelper *consolidationCycleHelper; - ENUM_X_CYCLE_EVENTS consolidationCycleEvents[]; - X121SMCCycleConditions consolidationConditions; - - // - // Vision ... - XPOIState visionState; - double visionBullishScore; - double visionBearishScore; - X121Conditions visionXConditions; - ENUM_XPOI_EVENTS visionPoiEvents[]; - XC121SMCCycleHelper *visionCycleHelper; - ENUM_X_CYCLE_EVENTS visionCycleEvents[]; - X121SMCCycleConditions visionConditions; - - // - // Constructor ... - X121SMCStrategySignalProviderData() - { - Clean(); - } - - // - // Tools ... - - // - // Cleanup ... - void Clean() - { - // - // Trigger ... - triggerState.Clean(); - triggerBullishScore = 0; - triggerBearishScore = 0; - Clean(triggerPoiEvents); - Clean(triggerCycleEvents); - triggerConditions.Clean(); - triggerXConditions.Clean(); - - // - // Decision ... - decisionState.Clean(); - decisionBullishScore = 0; - decisionBearishScore = 0; - Clean(decisionPoiEvents); - Clean(decisionCycleEvents); - decisionConditions.Clean(); - decisionXConditions.Clean(); - - // - // Analyse ... - analyseState.Clean(); - analyseBullishScore = 0; - analyseBearishScore = 0; - Clean(analysePoiEvents); - Clean(analyseCycleEvents); - analyseConditions.Clean(); - analyseXConditions.Clean(); - - // - // Verification ... - verificationState.Clean(); - verificationBullishScore = 0; - verificationBearishScore = 0; - Clean(verificationPoiEvents); - Clean(verificationCycleEvents); - verificationConditions.Clean(); - verificationXConditions.Clean(); - - // - // Consolidation ... - consolidationState.Clean(); - consolidationBullishScore = 0; - consolidationBearishScore = 0; - Clean(consolidationPoiEvents); - Clean(consolidationCycleEvents); - consolidationConditions.Clean(); - consolidationXConditions.Clean(); - - // - // Vision ... - visionState.Clean(); - visionBullishScore = 0; - visionBearishScore = 0; - Clean(visionPoiEvents); - Clean(visionCycleEvents); - visionConditions.Clean(); - visionXConditions.Clean(); - } - - // - void Destroy() - { - // - Clean(); - - // - ZeroMemory(visionCycleHelper); - ZeroMemory(triggerCycleHelper); - ZeroMemory(analyseCycleHelper); - ZeroMemory(decisionCycleHelper); - ZeroMemory(verificationCycleHelper); - ZeroMemory(consolidationCycleHelper); - - // - ZeroMemory(this); - } - - // - bool IsValid() - { - // - bool result = false; - - // - result = - visionCycleHelper != NULL && - triggerCycleHelper != NULL && - analyseCycleHelper != NULL && - decisionCycleHelper != NULL && - verificationCycleHelper != NULL && - consolidationCycleHelper != NULL; - - // - return result; - } - - // - // Initialize ... - bool Init( - XC121SMCCycleHelper *_triggerCycleHelper, - XC121SMCCycleHelper *_decisionCycleHelper, - XC121SMCCycleHelper *_analyseCycleHelper, - XC121SMCCycleHelper *_verificationCycleHelper, - XC121SMCCycleHelper *_consolidationCycleHelper, - XC121SMCCycleHelper *_visionCycleHelper // - ) - { - // - bool result = false; - - // - // Validate Cycle Helpers ... - result = - // - _visionCycleHelper != NULL && - _triggerCycleHelper != NULL && - _analyseCycleHelper != NULL && - _decisionCycleHelper != NULL && - _verificationCycleHelper != NULL && - _consolidationCycleHelper != NULL - // - ; - if (!result) - { - return result; - } - - // - visionCycleHelper = _visionCycleHelper; - triggerCycleHelper = _triggerCycleHelper; - analyseCycleHelper = _analyseCycleHelper; - decisionCycleHelper = _decisionCycleHelper; - verificationCycleHelper = _verificationCycleHelper; - consolidationCycleHelper = _consolidationCycleHelper; - - // - result = IsValid(); - - // - return result; - } - - // - // Prepare all ... - bool Prepare( - int barIndex = 0, - int loopback = 10, - bool trigger = false, - bool decision = true, - bool analyse = true, - bool verification = false, - bool consolidation = true, - bool vision = true // - ) - { - // - bool result = false; - - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - if (loopback < 7) - { - loopback = 7; - } - - // - result = IsValid(); - if (!result) - { - return result; - } - - // - // Trigger ... - if (trigger) - { - // - result = triggerCycleHelper.GetConditions( - triggerCycleEvents, - triggerPoiEvents, - triggerConditions, - barIndex, - loopback // - ); - if (!result) - { - // - Clean(triggerPoiEvents); - Clean(triggerCycleEvents); - - // - triggerConditions.Clean(); - - // - return result; - } - } - - // - // Decision ... - if (decision) - { - // - result = decisionCycleHelper.GetConditions( - decisionCycleEvents, - decisionPoiEvents, - decisionConditions, - barIndex, - loopback // - ); - if (!result) - { - // - Clean(triggerPoiEvents); - Clean(decisionPoiEvents); - Clean(triggerCycleEvents); - triggerConditions.Clean(); - Clean(decisionCycleEvents); - decisionConditions.Clean(); - - // - return result; - } - } - - // - // Analyse ... - if (analyse) - { - // - result = analyseCycleHelper.GetConditions( - analyseCycleEvents, - analysePoiEvents, - analyseConditions, - barIndex, - loopback // - ); - if (!result) - { - // - Clean(triggerPoiEvents); - Clean(analysePoiEvents); - Clean(decisionPoiEvents); - Clean(triggerCycleEvents); - Clean(analyseCycleEvents); - triggerConditions.Clean(); - analyseConditions.Clean(); - Clean(decisionCycleEvents); - decisionConditions.Clean(); - - // - return result; - } - } - - // - // Verification ... - if (verification) - { - // - result = verificationCycleHelper.GetConditions( - verificationCycleEvents, - verificationPoiEvents, - verificationConditions, - barIndex, - loopback // - ); - if (!result) - { - // - Clean(triggerPoiEvents); - Clean(analysePoiEvents); - Clean(decisionPoiEvents); - Clean(triggerCycleEvents); - Clean(analyseCycleEvents); - triggerConditions.Clean(); - analyseConditions.Clean(); - Clean(decisionCycleEvents); - decisionConditions.Clean(); - Clean(verificationPoiEvents); - Clean(verificationCycleEvents); - verificationConditions.Clean(); - - // - return result; - } - } - - // - // Consolidation ... - if (consolidation) - { - // - result = consolidationCycleHelper.GetConditions( - consolidationCycleEvents, - consolidationPoiEvents, - consolidationConditions, - barIndex, - loopback // - ); - if (!result) - { - // - Clean(triggerPoiEvents); - Clean(analysePoiEvents); - Clean(decisionPoiEvents); - Clean(triggerCycleEvents); - Clean(analyseCycleEvents); - triggerConditions.Clean(); - analyseConditions.Clean(); - Clean(decisionCycleEvents); - decisionConditions.Clean(); - Clean(verificationPoiEvents); - Clean(consolidationPoiEvents); - Clean(verificationCycleEvents); - verificationConditions.Clean(); - Clean(consolidationCycleEvents); - consolidationConditions.Clean(); - - // - return result; - } - } - - // - // Vision ... - if (vision) - { - result = visionCycleHelper.GetConditions( - visionCycleEvents, - visionPoiEvents, - visionConditions, - barIndex, - loopback // - ); - if (!result) - { - // - Clean(visionPoiEvents); - Clean(triggerPoiEvents); - Clean(analysePoiEvents); - Clean(visionCycleEvents); - visionConditions.Clean(); - Clean(decisionPoiEvents); - Clean(triggerCycleEvents); - Clean(analyseCycleEvents); - triggerConditions.Clean(); - analyseConditions.Clean(); - Clean(decisionCycleEvents); - decisionConditions.Clean(); - Clean(verificationPoiEvents); - Clean(consolidationPoiEvents); - Clean(verificationCycleEvents); - verificationConditions.Clean(); - Clean(consolidationCycleEvents); - consolidationConditions.Clean(); - - // - return result; - } - } - - // - // Cycles POI States ... - visionState = visionConditions.state; - triggerState = triggerConditions.state; - analyseState = analyseConditions.state; - decisionState = decisionConditions.state; - verificationState = verificationConditions.state; - consolidationState = consolidationConditions.state; - - // - // Cycle X121Conditions ... - visionXConditions = visionConditions.x121Conditions; - triggerXConditions = triggerConditions.x121Conditions; - analyseXConditions = analyseConditions.x121Conditions; - decisionXConditions = decisionConditions.x121Conditions; - verificationXConditions = verificationConditions.x121Conditions; - consolidationXConditions = consolidationConditions.x121Conditions; - - // - // Trigger ... - triggerXConditions.GenerateScore( - triggerBullishScore, - triggerBearishScore // - ); - - // - // Decision ... - decisionXConditions.GenerateScore( - decisionBullishScore, - decisionBearishScore // - ); - - // - // Analyse ... - analyseXConditions.GenerateScore( - analyseBullishScore, - analyseBearishScore // - ); - - // - // Verification ... - verificationXConditions.GenerateScore( - verificationBullishScore, - verificationBearishScore // - ); - - // - // Consolidation ... - consolidationXConditions.GenerateScore( - consolidationBullishScore, - consolidationBearishScore // - ); - - // - // Vision ... - visionXConditions.GenerateScore( - visionBullishScore, - visionBearishScore // - ); - - // - return result; - } - - // - bool SelectCycle( - ENUM_X_CYCLES cycle, - XPOIState &cState, - XPOIStateEvents &cStateEvents, - X121Conditions &cXConditions, - XC121SMCCycleHelper *&cHelper, - X121SMCCycleConditions &cConditions // - ) - { - // - bool result = false; - - // - cState.Clean(); - ZeroMemory(cHelper); - cConditions.Clean(); - cStateEvents.Clean(); - cXConditions.Clean(); - - // - result = cycle != X_CYCLE_NONE; - if (!result) - { - return result; - } - - // - if (cycle == X_CYCLE_TRIGGER) - { - // - cState = triggerState; - cHelper = triggerCycleHelper; - cConditions = triggerConditions; - cXConditions = triggerXConditions; - cStateEvents.Init(triggerPoiEvents); - } - else if (cycle == X_CYCLE_DECISION) - { - // - cState = decisionState; - cHelper = decisionCycleHelper; - cConditions = decisionConditions; - cXConditions = decisionXConditions; - cStateEvents.Init(decisionPoiEvents); - } - else if (cycle == X_CYCLE_ANALYSE) - { - // - cState = analyseState; - cHelper = analyseCycleHelper; - cConditions = analyseConditions; - cXConditions = analyseXConditions; - cStateEvents.Init(analysePoiEvents); - } - else if (cycle == X_CYCLE_VERIFICATION) - { - // - cState = verificationState; - cHelper = verificationCycleHelper; - cConditions = verificationConditions; - cXConditions = verificationXConditions; - cStateEvents.Init(verificationPoiEvents); - } - else if (cycle == X_CYCLE_CONSOLIDATION) - { - // - cState = consolidationState; - cHelper = consolidationCycleHelper; - cConditions = consolidationConditions; - cXConditions = consolidationXConditions; - cStateEvents.Init(consolidationPoiEvents); - } - else if (cycle == X_CYCLE_VISION) - { - // - cState = visionState; - cHelper = visionCycleHelper; - cConditions = visionConditions; - cXConditions = visionXConditions; - cStateEvents.Init(visionPoiEvents); - } - - // - result = cState.IsValid() && - cHelper != NULL; - - // - return result; - } - - // - void MaxRequiredPOIs(int value) - { - // - if (!IsValid()) - { - return; - } - - // - visionCycleHelper.mPOIDetector.MaxRequiredPOIs(value); - analyseCycleHelper.mPOIDetector.MaxRequiredPOIs(value); - decisionCycleHelper.mPOIDetector.MaxRequiredPOIs(value); - consolidationCycleHelper.mPOIDetector.MaxRequiredPOIs(value); - } - - // - void MaxAllowedLoopbackForInit(int value) - { - // - if (!IsValid()) - { - return; - } - - // - visionCycleHelper.mPOIDetector.MaxAllowedLoopbackForInit(value); - analyseCycleHelper.mPOIDetector.MaxAllowedLoopbackForInit(value); - decisionCycleHelper.mPOIDetector.MaxAllowedLoopbackForInit(value); - consolidationCycleHelper.mPOIDetector.MaxAllowedLoopbackForInit(value); - } - - // -}; - -// -// Condition Parser ... -struct X121SMCStrategyConditionParser -{ - // - // Props ... - - // - // XSAR ... - - // - bool isSarBullishOverPeaksGoldenZone; - bool isSarSwitchedToBullishOverPeaksGoldenZone; - bool isSarBearishOverPeaksGoldenZone; - bool isSarSwitchedToBearishOverPeaksGoldenZone; - bool isSarBullishUnderValesGoldenZone; - bool isSarSwitchedToBullishUnderValesGoldenZone; - bool isSarBearishUnderValesGoldenZone; - bool isSarSwitchedToBearishUnderValesGoldenZone; - - // - // XMA ... - - // - bool isX3MaFastUnderValesGoldenZone; - bool isX3MaMidUnderValesGoldenZone; - bool isX3MaSlowUnderValesGoldenZone; - bool isX3MaFastCrossedUnderValesGoldenZone; - - // - bool isX3MaFastOverPeaksGoldenZone; - bool isX3MaMidOverPeaksGoldenZone; - bool isX3MaFastCrossedOverPeaksGoldenZone; - - // - bool isX3MaInsidePeaksGoldenZone; - bool isX3MaCrossedInsidePeaksGoldenZone; - bool isX3MaInsideValesGoldenZone; - bool isX3MaCrossedInsideValesGoldenZone; - - // - bool isX3MaBullishStateOverPeaksGoldenZone; - bool isX3MaBearishStateOverPeaksGoldenZone; - bool isX3MaSwitchedToBullishStateOverPeaksGoldenZone; - bool isX3MaSwitchedToBearishStateOverPeaksGoldenZone; - - // - bool isX3MaBullishOrderedOverPeaksGoldenZone; - bool isX3MaBearishOrderedOverPeaksGoldenZone; - bool isX3MaSwitchedToBullishOrderedOverPeaksGoldenZone; - bool isX3MaSwitchedToBearishOrderedOverPeaksGoldenZone; - - // - bool isX3MaBullishStateUnderValesGoldenZone; - bool isX3MaBearishStateUnderValesGoldenZone; - bool isX3MaSwitchedToBullishStateUnderValesGoldenZone; - bool isX3MaSwitchedToBearishStateUnderValesGoldenZone; - - // - bool isX3MaBullishOrderedUnderValesGoldenZone; - bool isX3MaBearishOrderedUnderValesGoldenZone; - bool isX3MaSwitchedToBullishOrderedUnderValesGoldenZone; - bool isX3MaSwitchedToBearishOrderedUnderValesGoldenZone; - - // - // XVWAP ... - - // - bool isVWapFastUnderValesGoldenZone; - bool isVWapMidUnderValesGoldenZone; - bool isVWapFastCrossedUnderValesGoldenZone; - - // - bool isVWapFastOverPeaksGoldenZone; - bool isVWapMidOverPeaksGoldenZone; - bool isVWapFastCrossedOverPeaksGoldenZone; - - // - bool isVWapInsidePeaksGoldenZone; - bool isVWapCrossedInsidePeaksGoldenZone; - bool isVWapInsideValesGoldenZone; - bool isVWapCrossedInsideValesGoldenZone; - - // - bool isVWapBullishStateOverPeaksGoldenZone; - bool isVWapBearishStateOverPeaksGoldenZone; - bool isVWapSwitchedToBullishStateOverPeaksGoldenZone; - bool isVWapSwitchedToBearishStateOverPeaksGoldenZone; - - // - bool isVWapBullishOrderedOverPeaksGoldenZone; - bool isVWapBearishOrderedOverPeaksGoldenZone; - bool isVWapSwitchedToBullishOrderedOverPeaksGoldenZone; - bool isVWapSwitchedToBearishOrderedOverPeaksGoldenZone; - - // - bool isVWapBullishStateUnderValesGoldenZone; - bool isVWapBearishStateUnderValesGoldenZone; - bool isVWapSwitchedToBullishStateUnderValesGoldenZone; - bool isVWapSwitchedToBearishStateUnderValesGoldenZone; - - // - bool isVWapBullishOrderedUnderValesGoldenZone; - bool isVWapBearishOrderedUnderValesGoldenZone; - bool isVWapSwitchedToBullishOrderedUnderValesGoldenZone; - bool isVWapSwitchedToBearishOrderedUnderValesGoldenZone; - - // - // XHK ... - - // - // XRWHK ... - - // - bool isRawHKBearishOverPeaksGoldenZone; - bool isRawHKSwitchedToBearishOverPeaksGoldenZone; - bool isRawHKBullishUnderValesGoldenZone; - bool isRawHKSwitchedToBullishUnderValesGoldenZone; - - // - // XSMHK ... - - // - bool isSMHKBearishOverPeaksGoldenZone; - bool isSMHKSwitchedToBearishOverPeaksGoldenZone; - bool isSMHKBullishUnderValesGoldenZone; - bool isSMHKSwitchedToBullishUnderValesGoldenZone; - - // - // XATR ... - - // - bool isAtrUpperOverPeaksGoldenZone; - bool isAtrLowerOverPeaksGoldenZone; - bool isAtrOverPeaksGoldenZone; - bool isAtrCrossedOverPeaksGoldenZone; - - // - bool isAtrUpperUnderValesGoldenZone; - bool isAtrLowerUnderValesGoldenZone; - bool isAtrUnderValesGoldenZone; - bool isAtrCrossedUnderValesGoldenZone; - - // - // XSTR ... - - // - bool isStrBullishOverPeaksGoldenZone; - bool isStrBearishOverPeaksGoldenZone; - bool isStrSwitchedToBullishOverPeaksGoldenZone; - bool isStrSwitchedToBearishOverPeaksGoldenZone; - - // - bool isStrBullishUnderValesGoldenZone; - bool isStrBearishUnderValesGoldenZone; - bool isStrSwitchedToBullishUnderValesGoldenZone; - bool isStrSwitchedToBearishUnderValesGoldenZone; - - // - // XCHE ... - - // - bool isCheBullishOverPeaksGoldenZone; - bool isCheBearishOverPeaksGoldenZone; - bool isCheSwitchedBullishOverPeaksGoldenZone; - bool isCheSwitchedBearishOverPeaksGoldenZone; - - // - bool isCheBullishUnderValesGoldenZone; - bool isCheBearishUnderValesGoldenZone; - bool isCheSwitchedBullishUnderValesGoldenZone; - bool isCheSwitchedBearishUnderValesGoldenZone; - - // - // Constructor ... - X121SMCStrategyConditionParser() - { - Clean(); - } - - // - // Tools ... - - // - void Clean() - { - // - // XSAR ... - - // - isSarBullishOverPeaksGoldenZone = false; - isSarSwitchedToBullishOverPeaksGoldenZone = false; - isSarBearishOverPeaksGoldenZone = false; - isSarSwitchedToBearishOverPeaksGoldenZone = false; - isSarBullishUnderValesGoldenZone = false; - isSarSwitchedToBullishUnderValesGoldenZone = false; - isSarBearishUnderValesGoldenZone = false; - isSarSwitchedToBearishUnderValesGoldenZone = false; - - // - // X3MA ... - - // - isX3MaFastUnderValesGoldenZone = false; - isX3MaFastCrossedUnderValesGoldenZone = false; - isX3MaFastOverPeaksGoldenZone = false; - isX3MaFastCrossedOverPeaksGoldenZone = false; - - // - isX3MaInsidePeaksGoldenZone = false; - isX3MaCrossedInsidePeaksGoldenZone = false; - isX3MaInsideValesGoldenZone = false; - isX3MaCrossedInsideValesGoldenZone = false; - - // - isX3MaBullishStateOverPeaksGoldenZone = false; - isX3MaBearishStateOverPeaksGoldenZone = false; - isX3MaSwitchedToBullishStateOverPeaksGoldenZone = false; - isX3MaSwitchedToBearishStateOverPeaksGoldenZone = false; - - // - isX3MaBullishOrderedOverPeaksGoldenZone = false; - isX3MaBearishOrderedOverPeaksGoldenZone = false; - isX3MaSwitchedToBullishOrderedOverPeaksGoldenZone = false; - isX3MaSwitchedToBearishOrderedOverPeaksGoldenZone = false; - - // - isX3MaBullishStateUnderValesGoldenZone = false; - isX3MaBearishStateUnderValesGoldenZone = false; - isX3MaSwitchedToBullishStateUnderValesGoldenZone = false; - isX3MaSwitchedToBearishStateUnderValesGoldenZone = false; - - // - isX3MaBullishOrderedUnderValesGoldenZone = false; - isX3MaBearishOrderedUnderValesGoldenZone = false; - isX3MaSwitchedToBullishOrderedUnderValesGoldenZone = false; - isX3MaSwitchedToBearishOrderedUnderValesGoldenZone = false; - - // - // XVWAP ... - - // - isVWapFastUnderValesGoldenZone = false; - isVWapMidUnderValesGoldenZone = false; - isVWapFastCrossedUnderValesGoldenZone = false; - - // - isVWapFastOverPeaksGoldenZone = false; - isVWapMidOverPeaksGoldenZone = false; - isVWapFastCrossedOverPeaksGoldenZone = false; - - // - isVWapInsidePeaksGoldenZone = false; - isVWapCrossedInsidePeaksGoldenZone = false; - isVWapInsideValesGoldenZone = false; - isVWapCrossedInsideValesGoldenZone = false; - - // - isVWapBullishStateOverPeaksGoldenZone = false; - isVWapBearishStateOverPeaksGoldenZone = false; - isVWapSwitchedToBullishStateOverPeaksGoldenZone = false; - isVWapSwitchedToBearishStateOverPeaksGoldenZone = false; - - // - isVWapBullishOrderedOverPeaksGoldenZone = false; - isVWapBearishOrderedOverPeaksGoldenZone = false; - isVWapSwitchedToBullishOrderedOverPeaksGoldenZone = false; - isVWapSwitchedToBearishOrderedOverPeaksGoldenZone = false; - - // - isVWapBullishStateUnderValesGoldenZone = false; - isVWapBearishStateUnderValesGoldenZone = false; - isVWapSwitchedToBullishStateUnderValesGoldenZone = false; - isVWapSwitchedToBearishStateUnderValesGoldenZone = false; - - // - isVWapBullishOrderedUnderValesGoldenZone = false; - isVWapBearishOrderedUnderValesGoldenZone = false; - isVWapSwitchedToBullishOrderedUnderValesGoldenZone = false; - isVWapSwitchedToBearishOrderedUnderValesGoldenZone = false; - - // - // XHK ... - - // - // XRWHK ... - - // - isRawHKBearishOverPeaksGoldenZone = false; - isRawHKSwitchedToBearishOverPeaksGoldenZone = false; - isRawHKBullishUnderValesGoldenZone = false; - isRawHKSwitchedToBullishUnderValesGoldenZone = false; - - // - // XSMHK ... - - // - isSMHKBearishOverPeaksGoldenZone = false; - isSMHKSwitchedToBearishOverPeaksGoldenZone = false; - isSMHKBullishUnderValesGoldenZone = false; - isSMHKSwitchedToBullishUnderValesGoldenZone = false; - - // - // XATR ... - - // - isAtrUpperOverPeaksGoldenZone = false; - isAtrLowerOverPeaksGoldenZone = false; - isAtrOverPeaksGoldenZone = false; - isAtrCrossedOverPeaksGoldenZone = false; - - // - isAtrUpperUnderValesGoldenZone = false; - isAtrLowerUnderValesGoldenZone = false; - isAtrUnderValesGoldenZone = false; - isAtrCrossedUnderValesGoldenZone = false; - - // - // XSTR ... - - // - isStrBullishOverPeaksGoldenZone = false; - isStrBearishOverPeaksGoldenZone = false; - isStrSwitchedToBullishOverPeaksGoldenZone = false; - isStrSwitchedToBearishOverPeaksGoldenZone = false; - - // - isStrBullishUnderValesGoldenZone = false; - isStrBearishUnderValesGoldenZone = false; - isStrSwitchedToBullishUnderValesGoldenZone = false; - isStrSwitchedToBearishUnderValesGoldenZone = false; - - // - // XCHE ... - - // - isCheBullishOverPeaksGoldenZone = false; - isCheBearishOverPeaksGoldenZone = false; - isCheSwitchedBullishOverPeaksGoldenZone = false; - isCheSwitchedBearishOverPeaksGoldenZone = false; - - // - isCheBullishUnderValesGoldenZone = false; - isCheBearishUnderValesGoldenZone = false; - isCheSwitchedBullishUnderValesGoldenZone = false; - isCheSwitchedBearishUnderValesGoldenZone = false; - - // - ZeroMemory(this); - } - - // - void Parse( - X121Conditions &conditions // - ) - { - // - Clean(); - - // - // - int zIDX = 0; - int cIDX = zIDX + 1; - int pIDX = cIDX + 1; - - // - // XSAR ... - - // - isSarBullishOverPeaksGoldenZone = - conditions.isSarBullish && - conditions.sarBuffer[cIDX] > conditions.peaksGoldenBuffer[cIDX]; - - // - isSarSwitchedToBullishOverPeaksGoldenZone = - conditions.isSarSwitchedToBullish && - conditions.sarBuffer[cIDX] > conditions.peaksGoldenBuffer[cIDX]; - - // - isSarBearishOverPeaksGoldenZone = - conditions.isSarBearish && - conditions.sarBuffer[cIDX] > conditions.peaksGoldenBuffer[cIDX]; - - // - isSarSwitchedToBearishOverPeaksGoldenZone = - conditions.isSarSwitchedToBearish && - conditions.sarBuffer[cIDX] > conditions.peaksGoldenBuffer[cIDX]; - - // - isSarBullishUnderValesGoldenZone = - conditions.isSarBullish && - conditions.sarBuffer[cIDX] < conditions.valesGoldenBuffer[cIDX]; - - // - isSarSwitchedToBullishUnderValesGoldenZone = - conditions.isSarSwitchedToBullish && - conditions.sarBuffer[cIDX] < conditions.valesGoldenBuffer[cIDX]; - - // - isSarBearishUnderValesGoldenZone = - conditions.isSarBearish && - conditions.sarBuffer[cIDX] < conditions.valesGoldenBuffer[cIDX]; - - // - isSarSwitchedToBearishUnderValesGoldenZone = - conditions.isSarSwitchedToBearish && - conditions.sarBuffer[cIDX] < conditions.valesGoldenBuffer[cIDX]; - - // - // X3MA ... - - // - isX3MaFastUnderValesGoldenZone = - conditions.x3maFastBuffer[cIDX] < conditions.valesGoldenBuffer[cIDX]; - - // - isX3MaFastCrossedUnderValesGoldenZone = - isX3MaFastUnderValesGoldenZone && - conditions.x3maFastBuffer[pIDX] >= conditions.valesGoldenBuffer[pIDX]; - - // - isX3MaFastOverPeaksGoldenZone = - conditions.x3maFastBuffer[cIDX] > conditions.peaksGoldenBuffer[cIDX]; - - // - isX3MaFastCrossedOverPeaksGoldenZone = - isX3MaFastOverPeaksGoldenZone && - conditions.x3maFastBuffer[pIDX] <= conditions.peaksGoldenBuffer[pIDX]; - - // - isX3MaInsidePeaksGoldenZone = - // - conditions.x3maMin < conditions.peaksBuffer[cIDX] && - conditions.x3maMin > conditions.peaksGoldenBuffer[cIDX] && - // - conditions.x3maMax < conditions.peaksBuffer[cIDX] && - conditions.x3maMax > conditions.peaksGoldenBuffer[cIDX] - // - ; - - // - isX3MaCrossedInsidePeaksGoldenZone = - isX3MaInsidePeaksGoldenZone && - !( - // - conditions.x3maMin < conditions.peaksBuffer[pIDX] && - conditions.x3maMin > conditions.peaksGoldenBuffer[pIDX] && - // - conditions.x3maMax < conditions.peaksBuffer[pIDX] && - conditions.x3maMax > conditions.peaksGoldenBuffer[pIDX] - // - ); - - // - isX3MaInsideValesGoldenZone = - // - conditions.x3maMin > conditions.valesBuffer[cIDX] && - conditions.x3maMin < conditions.valesGoldenBuffer[cIDX] && - // - conditions.x3maMax > conditions.valesBuffer[cIDX] && - conditions.x3maMax < conditions.valesGoldenBuffer[cIDX] - // - ; - - isX3MaCrossedInsideValesGoldenZone = - isX3MaInsideValesGoldenZone && - !( - // - conditions.x3maMin > conditions.valesBuffer[pIDX] && - conditions.x3maMin < conditions.valesGoldenBuffer[pIDX] && - // - conditions.x3maMax > conditions.valesBuffer[pIDX] && - conditions.x3maMax < conditions.valesGoldenBuffer[pIDX] - // - ); - - // - isX3MaBullishStateOverPeaksGoldenZone = - isX3MaInsidePeaksGoldenZone && - conditions.isX3MaBullishState; - - // - isX3MaBearishStateOverPeaksGoldenZone = - isX3MaInsidePeaksGoldenZone && - conditions.isX3MaBearishState; - - // - isX3MaSwitchedToBullishStateOverPeaksGoldenZone = - isX3MaInsidePeaksGoldenZone && - conditions.isX3MaSwitchedToBullishState; - - // - isX3MaSwitchedToBearishStateOverPeaksGoldenZone = - isX3MaInsidePeaksGoldenZone && - conditions.isX3MaSwitchedToBearishState; - - // - isX3MaBullishOrderedOverPeaksGoldenZone = - isX3MaInsidePeaksGoldenZone && - conditions.isX3MaBullishOrdered; - - // - isX3MaBearishOrderedOverPeaksGoldenZone = - isX3MaInsidePeaksGoldenZone && - conditions.isX3MaBearishOrdered; - - // - isX3MaSwitchedToBullishOrderedOverPeaksGoldenZone = - isX3MaInsidePeaksGoldenZone && - conditions.isX3MaSwitchedToBullishOrdered; - - // - isX3MaSwitchedToBearishOrderedOverPeaksGoldenZone = - isX3MaInsidePeaksGoldenZone && - conditions.isX3MaSwitchedToBearishOrdered; - - // - isX3MaBullishStateUnderValesGoldenZone = - isX3MaInsideValesGoldenZone && - conditions.isX3MaBullishState; - - // - isX3MaBearishStateUnderValesGoldenZone = - isX3MaInsideValesGoldenZone && - conditions.isX3MaBearishState; - - // - isX3MaSwitchedToBullishStateUnderValesGoldenZone = - isX3MaInsideValesGoldenZone && - conditions.isX3MaSwitchedToBullishState; - - // - isX3MaSwitchedToBearishStateUnderValesGoldenZone = - isX3MaInsideValesGoldenZone && - conditions.isX3MaSwitchedToBearishState; - - // - isX3MaBullishOrderedUnderValesGoldenZone = - isX3MaInsideValesGoldenZone && - conditions.isX3MaBullishOrdered; - - // - isX3MaBearishOrderedUnderValesGoldenZone = - isX3MaInsideValesGoldenZone && - conditions.isX3MaBearishOrdered; - - // - isX3MaSwitchedToBullishOrderedUnderValesGoldenZone = - isX3MaInsideValesGoldenZone && - conditions.isX3MaSwitchedToBullishOrdered; - - // - isX3MaSwitchedToBearishOrderedUnderValesGoldenZone = - isX3MaInsideValesGoldenZone && - conditions.isX3MaSwitchedToBearishOrdered; - - // - // XVWAP ... - - // - isVWapFastUnderValesGoldenZone = - conditions.vwapFastBuffer[cIDX] < conditions.valesGoldenBuffer[cIDX]; - - // - isVWapMidUnderValesGoldenZone = - conditions.vwapMidBuffer[cIDX] < conditions.valesGoldenBuffer[cIDX]; - - // - isVWapFastCrossedUnderValesGoldenZone = - isVWapFastUnderValesGoldenZone && - conditions.vwapFastBuffer[pIDX] >= conditions.valesGoldenBuffer[pIDX]; - - // - isVWapFastOverPeaksGoldenZone = - conditions.vwapFastBuffer[cIDX] > conditions.peaksGoldenBuffer[cIDX]; - - // - isVWapMidOverPeaksGoldenZone = - conditions.vwapFastBuffer[cIDX] > conditions.peaksGoldenBuffer[cIDX]; - - // - isVWapFastCrossedOverPeaksGoldenZone = - isVWapFastOverPeaksGoldenZone && - conditions.vwapFastBuffer[pIDX] <= conditions.peaksGoldenBuffer[pIDX]; - - // - isVWapInsidePeaksGoldenZone = - // - conditions.vwapMin < conditions.peaksBuffer[cIDX] && - conditions.vwapMin > conditions.peaksGoldenBuffer[cIDX] && - // - conditions.vwapMax < conditions.peaksBuffer[cIDX] && - conditions.vwapMax > conditions.peaksGoldenBuffer[cIDX] - // - ; - - // - isVWapCrossedInsidePeaksGoldenZone = - isVWapInsidePeaksGoldenZone && - !( - // - conditions.vwapMin < conditions.peaksBuffer[pIDX] && - conditions.vwapMin > conditions.peaksGoldenBuffer[pIDX] && - // - conditions.vwapMax < conditions.peaksBuffer[pIDX] && - conditions.vwapMax > conditions.peaksGoldenBuffer[pIDX] - // - ); - - // - isVWapInsideValesGoldenZone = - // - conditions.vwapMin > conditions.valesBuffer[cIDX] && - conditions.vwapMin < conditions.valesGoldenBuffer[cIDX] && - // - conditions.vwapMax > conditions.valesBuffer[cIDX] && - conditions.vwapMax < conditions.valesGoldenBuffer[cIDX] - // - ; - - // - isVWapCrossedInsideValesGoldenZone = - isVWapInsideValesGoldenZone && - !( - // - conditions.vwapMin > conditions.valesBuffer[pIDX] && - conditions.vwapMin < conditions.valesGoldenBuffer[pIDX] && - // - conditions.vwapMax > conditions.valesBuffer[pIDX] && - conditions.vwapMax < conditions.valesGoldenBuffer[pIDX] - // - ); - - // - isVWapBullishStateOverPeaksGoldenZone = - isVWapInsidePeaksGoldenZone && - conditions.isVWapBullishState; - - // - isVWapBearishStateOverPeaksGoldenZone = - isVWapInsidePeaksGoldenZone && - conditions.isVWapBearishState; - - // - isVWapSwitchedToBullishStateOverPeaksGoldenZone = - isVWapInsidePeaksGoldenZone && - conditions.isVWapSwitchedToBullishState; - - // - isVWapSwitchedToBearishStateOverPeaksGoldenZone = - isVWapInsidePeaksGoldenZone && - conditions.isVWapSwitchedToBearishState; - - // - isVWapBullishOrderedOverPeaksGoldenZone = - isVWapInsidePeaksGoldenZone && - conditions.isVWapBullishOrdered; - - // - isVWapBearishOrderedOverPeaksGoldenZone = - isVWapInsidePeaksGoldenZone && - conditions.isVWapBearishOrdered; - - // - isVWapSwitchedToBullishOrderedOverPeaksGoldenZone = - isVWapInsidePeaksGoldenZone && - conditions.isVWapSwitchedToBullishOrdered; - - // - isVWapSwitchedToBearishOrderedOverPeaksGoldenZone = - isVWapInsidePeaksGoldenZone && - conditions.isVWapSwitchedToBearishOrdered; - - // - isVWapBullishStateUnderValesGoldenZone = - isVWapInsideValesGoldenZone && - conditions.isVWapBullishState; - - // - isVWapBearishStateUnderValesGoldenZone = - isVWapInsideValesGoldenZone && - conditions.isVWapBearishState; - - // - isVWapSwitchedToBullishStateUnderValesGoldenZone = - isVWapInsideValesGoldenZone && - conditions.isVWapSwitchedToBullishState; - - // - isVWapSwitchedToBearishStateUnderValesGoldenZone = - isVWapInsideValesGoldenZone && - conditions.isVWapSwitchedToBearishState; - - // - isVWapBullishOrderedUnderValesGoldenZone = - isVWapInsideValesGoldenZone && - conditions.isVWapBullishOrdered; - - // - isVWapBearishOrderedUnderValesGoldenZone = - isVWapInsideValesGoldenZone && - conditions.isVWapBearishOrdered; - - // - isVWapSwitchedToBullishOrderedUnderValesGoldenZone = - isVWapInsideValesGoldenZone && - conditions.isVWapSwitchedToBullishOrdered; - - // - isVWapSwitchedToBearishOrderedUnderValesGoldenZone = - isVWapInsideValesGoldenZone && - conditions.isVWapSwitchedToBearishOrdered; - - // - // XHK ... - - // - // XRWHK ... - - // - isRawHKBearishOverPeaksGoldenZone = - conditions.isRawHKBearish && - conditions.xhkRawHighBuffer[cIDX] > conditions.peaksGoldenBuffer[cIDX]; - - // - isRawHKSwitchedToBearishOverPeaksGoldenZone = - conditions.isRawHKSwitchedToBearish && - conditions.xhkRawHighBuffer[cIDX] > conditions.peaksGoldenBuffer[cIDX]; - - // - isRawHKBullishUnderValesGoldenZone = - conditions.isRawHKBullish && - conditions.xhkRawLowBuffer[cIDX] < conditions.valesGoldenBuffer[cIDX]; - - // - isRawHKSwitchedToBullishUnderValesGoldenZone = - conditions.isRawHKSwitchedToBullish && - conditions.xhkRawLowBuffer[cIDX] < conditions.valesGoldenBuffer[cIDX]; - - // - // XSMHK ... - - // - isSMHKBearishOverPeaksGoldenZone = - conditions.isSMHKBearish && - conditions.xhkSMHighBuffer[cIDX] > conditions.peaksGoldenBuffer[cIDX]; - - // - isSMHKSwitchedToBearishOverPeaksGoldenZone = - conditions.isSMHKSwitchedToBearish && - conditions.xhkSMHighBuffer[cIDX] > conditions.peaksGoldenBuffer[cIDX]; - - // - isSMHKBullishUnderValesGoldenZone = - conditions.isSMHKBullish && - conditions.xhkSMLowBuffer[cIDX] < conditions.valesGoldenBuffer[cIDX]; - - // - isSMHKSwitchedToBullishUnderValesGoldenZone = - conditions.isSMHKSwitchedToBullish && - conditions.xhkSMLowBuffer[cIDX] < conditions.valesGoldenBuffer[cIDX]; - - // - // XATR ... - - // - isAtrUpperOverPeaksGoldenZone = - conditions.atrUpperBuffer[cIDX] < conditions.peaksBuffer[cIDX] && - conditions.atrUpperBuffer[cIDX] > conditions.peaksGoldenBuffer[cIDX]; - - // - isAtrLowerOverPeaksGoldenZone = - conditions.atrLowerBuffer[cIDX] < conditions.peaksBuffer[cIDX] && - conditions.atrLowerBuffer[cIDX] > conditions.peaksGoldenBuffer[cIDX]; - - // - isAtrOverPeaksGoldenZone = - isAtrUpperOverPeaksGoldenZone && - isAtrLowerOverPeaksGoldenZone; - - // - isAtrCrossedOverPeaksGoldenZone = - isAtrOverPeaksGoldenZone && - !( - // - conditions.atrUpperBuffer[pIDX] < conditions.peaksBuffer[pIDX] && - conditions.atrUpperBuffer[pIDX] > conditions.peaksGoldenBuffer[pIDX] - // - && - // - conditions.atrLowerBuffer[pIDX] < conditions.peaksBuffer[pIDX] && - conditions.atrLowerBuffer[pIDX] > conditions.peaksGoldenBuffer[pIDX] - // - ); - - // - isAtrUpperUnderValesGoldenZone = - conditions.atrUpperBuffer[cIDX] > conditions.valesBuffer[cIDX] && - conditions.atrUpperBuffer[cIDX] < conditions.valesGoldenBuffer[cIDX]; - - // - isAtrLowerUnderValesGoldenZone = - conditions.atrLowerBuffer[cIDX] > conditions.valesBuffer[cIDX] && - conditions.atrLowerBuffer[cIDX] < conditions.valesGoldenBuffer[cIDX]; - - // - isAtrUnderValesGoldenZone = - isAtrUpperUnderValesGoldenZone && - isAtrLowerUnderValesGoldenZone; - - // - isAtrCrossedUnderValesGoldenZone = - isAtrUnderValesGoldenZone && - !( - // - conditions.atrUpperBuffer[pIDX] > conditions.valesBuffer[pIDX] && - conditions.atrUpperBuffer[pIDX] < conditions.valesGoldenBuffer[pIDX] - // - && - // - conditions.atrLowerBuffer[pIDX] > conditions.valesBuffer[pIDX] && - conditions.atrLowerBuffer[pIDX] < conditions.valesGoldenBuffer[pIDX] - // - ); - - // - // XSTR ... - - // - isStrBullishOverPeaksGoldenZone = - conditions.isStrBullish && - conditions.strBuffer[cIDX] < conditions.peaksBuffer[cIDX] && - conditions.strBuffer[cIDX] > conditions.peaksGoldenBuffer[cIDX]; - - // - isStrBearishOverPeaksGoldenZone = - conditions.isStrBearish && - conditions.strBuffer[cIDX] < conditions.peaksBuffer[cIDX] && - conditions.strBuffer[cIDX] > conditions.peaksGoldenBuffer[cIDX]; - - // - isStrSwitchedToBullishOverPeaksGoldenZone = - conditions.isStrSwitchedToBullish && - conditions.strBuffer[cIDX] < conditions.peaksBuffer[cIDX] && - conditions.strBuffer[cIDX] > conditions.peaksGoldenBuffer[cIDX]; - - // - isStrSwitchedToBearishOverPeaksGoldenZone = - conditions.isStrSwitchedToBearish && - conditions.strBuffer[cIDX] < conditions.peaksBuffer[cIDX] && - conditions.strBuffer[cIDX] > conditions.peaksGoldenBuffer[cIDX]; - - // - isStrBullishUnderValesGoldenZone = - conditions.isStrBullish && - conditions.strBuffer[cIDX] > conditions.valesBuffer[cIDX] && - conditions.strBuffer[cIDX] < conditions.valesGoldenBuffer[cIDX]; - - // - isStrBearishUnderValesGoldenZone = - conditions.isStrBearish && - conditions.strBuffer[cIDX] > conditions.valesBuffer[cIDX] && - conditions.strBuffer[cIDX] < conditions.valesGoldenBuffer[cIDX]; - - // - isStrSwitchedToBullishUnderValesGoldenZone = - conditions.isStrSwitchedToBullish && - conditions.strBuffer[cIDX] > conditions.valesBuffer[cIDX] && - conditions.strBuffer[cIDX] < conditions.valesGoldenBuffer[cIDX]; - - // - isStrSwitchedToBearishUnderValesGoldenZone = - conditions.isStrSwitchedToBearish && - conditions.strBuffer[cIDX] > conditions.valesBuffer[cIDX] && - conditions.strBuffer[cIDX] < conditions.valesGoldenBuffer[cIDX]; - - // - // XCHE ... - - // - isCheBullishOverPeaksGoldenZone = - conditions.isCheBullish && - conditions.le1Buffer[cIDX] < conditions.peaksBuffer[cIDX] && - conditions.le1Buffer[cIDX] > conditions.peaksGoldenBuffer[cIDX] && - conditions.le2Buffer[cIDX] < conditions.peaksBuffer[cIDX] && - conditions.le2Buffer[cIDX] > conditions.peaksGoldenBuffer[cIDX]; - - // - isCheBearishOverPeaksGoldenZone = - conditions.isCheSwitchedToBullish && - conditions.se1Buffer[cIDX] < conditions.peaksBuffer[cIDX] && - conditions.se1Buffer[cIDX] > conditions.peaksGoldenBuffer[cIDX] && - conditions.se2Buffer[cIDX] < conditions.peaksBuffer[cIDX] && - conditions.se2Buffer[cIDX] > conditions.peaksGoldenBuffer[cIDX]; - - // - isCheSwitchedBullishOverPeaksGoldenZone = - conditions.isCheSwitchedToBullish && - conditions.le1Buffer[cIDX] < conditions.peaksBuffer[cIDX] && - conditions.le1Buffer[cIDX] > conditions.peaksGoldenBuffer[cIDX] && - conditions.le2Buffer[cIDX] < conditions.peaksBuffer[cIDX] && - conditions.le2Buffer[cIDX] > conditions.peaksGoldenBuffer[cIDX]; - - // - isCheSwitchedBearishOverPeaksGoldenZone = - conditions.isCheSwitchedToBearish && - conditions.se1Buffer[cIDX] < conditions.peaksBuffer[cIDX] && - conditions.se1Buffer[cIDX] > conditions.peaksGoldenBuffer[cIDX] && - conditions.se2Buffer[cIDX] < conditions.peaksBuffer[cIDX] && - conditions.se2Buffer[cIDX] > conditions.peaksGoldenBuffer[cIDX]; - - // - isCheBullishUnderValesGoldenZone = - conditions.isCheBullish && - conditions.cheMin > conditions.valesBuffer[cIDX] && - conditions.cheMin < conditions.valesGoldenBuffer[cIDX] && - conditions.cheMax > conditions.valesBuffer[cIDX] && - conditions.cheMax < conditions.valesGoldenBuffer[cIDX]; - - // - isCheBearishUnderValesGoldenZone = - conditions.isCheBearish && - conditions.cheMin > conditions.valesBuffer[cIDX] && - conditions.cheMin < conditions.valesGoldenBuffer[cIDX] && - conditions.cheMax > conditions.valesBuffer[cIDX] && - conditions.cheMax < conditions.valesGoldenBuffer[cIDX]; - - // - isCheSwitchedBullishUnderValesGoldenZone = - conditions.isCheSwitchedToBullish && - conditions.cheMin > conditions.valesBuffer[cIDX] && - conditions.cheMin < conditions.valesGoldenBuffer[cIDX] && - conditions.cheMax > conditions.valesBuffer[cIDX] && - conditions.cheMax < conditions.valesGoldenBuffer[cIDX]; - - // - isCheSwitchedBearishUnderValesGoldenZone = - conditions.isCheSwitchedToBearish && - conditions.cheMin > conditions.valesBuffer[cIDX] && - conditions.cheMin < conditions.valesGoldenBuffer[cIDX] && - conditions.cheMax > conditions.valesBuffer[cIDX] && - conditions.cheMax < conditions.valesGoldenBuffer[cIDX]; - } - - // - // Rejected Boxes ... - bool HasRejectedBoxConditions( - ENUM_X_CYCLES cycle, - XSignalBox &box, - ENUM_X_DIRECTION &dir, - XSignalBox &waitingBoxes[], - X121SMCStrategySignalProviderData &provider, - int barIndex = 0 // - ) - { - // - bool result = false; - - // - box.Clean(); - dir = X_DIRECTION_NONE; - - // - // Checking Waiting Baoxes Exists ... - result = HasChild(waitingBoxes); - if (!result) - { - return result; - } - - // - // Fil Selected Data ... - XPOIState cState; - X121Conditions cXConditions; - XPOIStateEvents cStateEvents; - XC121SMCCycleHelper *cHelper; - X121SMCCycleConditions cConditions; - result = provider.SelectCycle( - cycle, - cState, - cStateEvents, - cXConditions, - cHelper, - cConditions // - ); - if (!result) - { - // - cState.Clean(); - ZeroMemory(cHelper); - cConditions.Clean(); - cXConditions.Clean(); - cStateEvents.Clean(); - - // - return result; - } - Parse(cXConditions); - - // - // Normalize Args ... - - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - int idx = -1; - int count = 0; - bool has = false; - - // - int zIDX = barIndex; - int cIDX = zIDX + 1; - int pIDX = cIDX + 1; - int ppIDX = pIDX + 1; - - // - bool isBullish = false; - bool isBearish = false; - - // - XOHCL zBar; - XOHCL cBar; - XOHCL pBar; - - // - // Initial Bars ... - result = zBar.Init( - cState.symbol, - cState.period, - barIndex // - ); - result = - result && - zBar.GetPreviousBar(cBar); - result = - result && - cBar.GetPreviousBar(pBar); - if (!result) - { - // - zBar.Clean(); - cBar.Clean(); - pBar.Clean(); - cState.Clean(); - ZeroMemory(cHelper); - cConditions.Clean(); - cXConditions.Clean(); - - // - return result; - } - - // - // Checking Bar Based on Positions State ... - ENUM_X_DIRECTION iBarPosDir; - bool isBarValidForDir = cHelper - .mBarAnalyser - .IsValidForPosition( - cBar, - iBarPosDir // - ); - bool isBarValidForBullish = - isBarValidForDir && - IsBullish(iBarPosDir); - bool isBarValidForBearish = - isBarValidForDir && - IsBearish(iBarPosDir); - - // - // Extract Selected Boxes ... - XBoxZone selectedBox; - XSignalBox iSignalBox; - count = ArraySize(waitingBoxes); - has = IsValidSize(count); - if (has) - { - // - for (int i = 0; i < count; i++) - { - // - XSignalBox iBox = waitingBoxes[i]; - - // - bool isBullish = iBox.ob.IsBullish(); - - // - bool isOBBullishRejected = - // - cBar.low < iBox.ob.upper && - cBar.GetDown() > iBox.ob.upper - // - ; - - // - bool isOBBearishRejected = - // - cBar.high > iBox.ob.lower && - cBar.GetUp() < iBox.ob.lower - // - ; - - // - has = - isBullish - ? isOBBullishRejected - : isOBBearishRejected; - - // - // Force Using OB ... - if (has) - { - // - iSignalBox = iBox; - if (!selectedBox.IsValid()) - { - selectedBox = iBox.ob; - } - iBox.Clean(); - break; - } - - // - iBox.Clean(); - } - } - result = - iSignalBox.IsValid() && - selectedBox.IsValid(); - if (!result) - { - // - zBar.Clean(); - cBar.Clean(); - pBar.Clean(); - cState.Clean(); - iSignalBox.Clean(); - selectedBox.Clean(); - ZeroMemory(cHelper); - cConditions.Clean(); - cXConditions.Clean(); - - // - return result; - } - - // - bool hasSignalBox = iSignalBox.IsValid(); - bool isSignalBoxBullish = IsBullish(iSignalBox.ob.dir); - - // - // Checking Other Conditions ... - bool isVWapSlowPassed = - isSignalBoxBullish - ? cXConditions.isVWapSlowBullish - : cXConditions.isVWapSlowBearish; - - // - // Bullish Conditions ... - isBullish = - // - // Base Condition ... - ( - // - hasSignalBox && - isVWapSlowPassed && - isSignalBoxBullish && - isBarValidForBullish - // - ) - // - ; - - // - // Bearish Conditions ... - isBearish = - // - // Base Condition ... - ( - // - hasSignalBox && - isVWapSlowPassed && - !isSignalBoxBullish && - isBarValidForBearish - // - ) - // - ; - - // - // Filling Requirements ... - result = - isBullish || - isBearish; - if (result) - { - // - dir = - isBullish - ? X_DIRECTION_BULLISH - : X_DIRECTION_BEARISH; - - // - box = iSignalBox; - box.UpdateTo(TimeCurrent()); - } - - // - // Check All Conditions ... - result = - box.IsValid() && - HasDirection(dir) && - (isBullish || - isBearish); - - // - // Cleanup Resources ... - zBar.Clean(); - cBar.Clean(); - pBar.Clean(); - cState.Clean(); - iSignalBox.Clean(); - selectedBox.Clean(); - ZeroMemory(cHelper); - cConditions.Clean(); - cStateEvents.Clean(); - cXConditions.Clean(); - - // - return result; - } - - // - // Activated Boxes ... - bool HasActivatedBoxConditions( - ENUM_X_CYCLES cycle, - XSignalBox &box, - ENUM_X_DIRECTION &dir, - XSignalBox &waitingBoxes[], - X121SMCStrategySignalProviderData &provider, - int barIndex = 0 // - ) - { - // - bool result = false; - - // - box.Clean(); - dir = X_DIRECTION_NONE; - - // - // Checking Waiting Baoxes Exists ... - result = HasChild(waitingBoxes); - if (!result) - { - return result; - } - - // - // Fil Selected Data ... - XPOIState cState; - X121Conditions cXConditions; - XPOIStateEvents cStateEvents; - XC121SMCCycleHelper *cHelper; - X121SMCCycleConditions cConditions; - result = provider.SelectCycle( - cycle, - cState, - cStateEvents, - cXConditions, - cHelper, - cConditions // - ); - if (!result) - { - // - cState.Clean(); - ZeroMemory(cHelper); - cConditions.Clean(); - cXConditions.Clean(); - cStateEvents.Clean(); - - // - return result; - } - Parse(cXConditions); - - // - // Normalize Args ... - - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - int idx = -1; - int count = 0; - bool has = false; - - // - int zIDX = barIndex; - int cIDX = zIDX + 1; - int pIDX = cIDX + 1; - int ppIDX = pIDX + 1; - - // - bool isBullish = false; - bool isBearish = false; - - // - XOHCL zBar; - XOHCL cBar; - XOHCL pBar; - - // - // Initial Bars ... - result = zBar.Init( - cState.symbol, - cState.period, - barIndex // - ); - result = - result && - zBar.GetPreviousBar(cBar); - result = - result && - cBar.GetPreviousBar(pBar); - if (!result) - { - // - zBar.Clean(); - cBar.Clean(); - pBar.Clean(); - cState.Clean(); - ZeroMemory(cHelper); - cConditions.Clean(); - cXConditions.Clean(); - - // - return result; - } - - // - // Checking Bar Based on Positions State ... - ENUM_X_DIRECTION iBarPosDir; - bool isBarValidForDir = cHelper - .mBarAnalyser - .IsValidForPosition( - cBar, - iBarPosDir // - ); - bool isBarValidForBullish = - isBarValidForDir && - IsBullish(iBarPosDir); - bool isBarValidForBearish = - isBarValidForDir && - IsBearish(iBarPosDir); - - // - // Extract Selected Boxes ... - XBoxZone selectedBox; - XSignalBox iSignalBox; - count = ArraySize(waitingBoxes); - has = IsValidSize(count); - if (has) - { - // - for (int i = 0; i < count; i++) - { - // - XSignalBox iBox = waitingBoxes[i]; - - // - bool isBullish = iBox.ob.IsBullish(); - - // - has = cBar.low < iBox.sharp.upper && - cBar.low > iBox.sharp.lower && - cBar.high > iBox.sharp.lower && - cBar.high < iBox.sharp.upper; - - // - // Force Using OB ... - if (has) - { - // - iSignalBox = iBox; - if (!selectedBox.IsValid()) - { - selectedBox = iBox.ob; - } - iBox.Clean(); - break; - } - - // - iBox.Clean(); - } - } - result = - iSignalBox.IsValid() && - selectedBox.IsValid(); - if (!result) - { - // - zBar.Clean(); - cBar.Clean(); - pBar.Clean(); - cState.Clean(); - iSignalBox.Clean(); - selectedBox.Clean(); - ZeroMemory(cHelper); - cConditions.Clean(); - cXConditions.Clean(); - - // - return result; - } - - // - bool hasSignalBox = iSignalBox.IsValid(); - bool isSignalBoxBullish = IsBullish(iSignalBox.ob.dir); - - // - // Checking Other Conditions ... - - // - // XVWAP ... - - // - bool isVWapSlopeBullish = - cXConditions.isVwapFastSlopeBullish && - cXConditions.isVwapMidSlopeBullish && - cXConditions.isVwapSlowSlopeBullish; - - // - bool isVWapSlopeBearish = - cXConditions.isVwapFastSlopeBearish && - cXConditions.isVwapMidSlopeBearish && - cXConditions.isVwapSlowSlopeBearish; - - // - bool isVWapBullishCondition = - (cXConditions.isVWapBullishOrdered && - cXConditions.isVWapSwitchedToBullishState) || - (cXConditions.isVWapBullishState && - cXConditions.isVWapSwitchedToBullishOrdered); - - // - bool isVWapBearishCondition = - (cXConditions.isVWapBearishOrdered && - cXConditions.isVWapSwitchedToBearishState) || - (cXConditions.isVWapBearishState && - cXConditions.isVWapSwitchedToBearishOrdered); - - // - // Bullish Conditions ... - isBullish = - // - // Base Condition ... - ( - // - hasSignalBox && - isSignalBoxBullish && - isVWapSlopeBullish && - isBarValidForBullish && - isVWapBullishCondition - // - ) - // - ; - - // - // Bearish Conditions ... - isBearish = - // - // Base Condition ... - ( - // - hasSignalBox && - isVWapSlopeBearish && - !isSignalBoxBullish && - isBarValidForBearish && - isVWapBearishCondition - // - ) - // - ; - - // - // Filling Requirements ... - result = - isBullish || - isBearish; - if (result) - { - // - dir = - isBullish - ? X_DIRECTION_BULLISH - : X_DIRECTION_BEARISH; - - // - box = iSignalBox; - box.UpdateTo(TimeCurrent()); - - // - // Provide TP/SL ... - - // - box.sl = isBullish - ? cXConditions.vwapMin - : cXConditions.vwapMax; - - // - box.tp = isBullish - ? box.sharp.upper - : box.sharp.lower; - } - - // - // Check All Conditions ... - result = - box.IsValid() && - HasDirection(dir) && - (isBullish || - isBearish); - - // - // Cleanup Resources ... - zBar.Clean(); - cBar.Clean(); - pBar.Clean(); - cState.Clean(); - iSignalBox.Clean(); - selectedBox.Clean(); - ZeroMemory(cHelper); - cConditions.Clean(); - cStateEvents.Clean(); - cXConditions.Clean(); - - // - return result; - } - - // - // Breaked Boxes ... - bool HasBreakedBoxConditions( - ENUM_X_CYCLES cycle, - XSignalBox &box, - ENUM_X_DIRECTION &dir, - XSignalBox &breakedBoxes[], - X121SMCStrategySignalProviderData &provider, - int barIndex = 0 // - ) - { - // - bool result = false; - - // - box.Clean(); - dir = X_DIRECTION_NONE; - - // - // Checking Waiting Baoxes Exists ... - result = HasChild(breakedBoxes); - if (!result) - { - return result; - } - - // - // Fil Selected Data ... - XPOIState cState; - X121Conditions cXConditions; - XPOIStateEvents cStateEvents; - XC121SMCCycleHelper *cHelper; - X121SMCCycleConditions cConditions; - result = provider.SelectCycle( - cycle, - cState, - cStateEvents, - cXConditions, - cHelper, - cConditions // - ); - if (!result) - { - // - cState.Clean(); - ZeroMemory(cHelper); - cConditions.Clean(); - cXConditions.Clean(); - cStateEvents.Clean(); - - // - return result; - } - Parse(cXConditions); - - // - // Normalize Args ... - - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - int idx = -1; - int count = 0; - bool has = false; - - // - int zIDX = barIndex; - int cIDX = zIDX + 1; - int pIDX = cIDX + 1; - int ppIDX = pIDX + 1; - - // - bool isBullish = false; - bool isBearish = false; - - // - XOHCL zBar; - XOHCL cBar; - XOHCL pBar; - - // - // Initial Bars ... - result = zBar.Init( - cState.symbol, - cState.period, - barIndex // - ); - result = - result && - zBar.GetPreviousBar(cBar); - result = - result && - cBar.GetPreviousBar(pBar); - if (!result) - { - // - zBar.Clean(); - cBar.Clean(); - pBar.Clean(); - cState.Clean(); - ZeroMemory(cHelper); - cConditions.Clean(); - cXConditions.Clean(); - - // - return result; - } - - // - // Checking Bar Based on Positions State ... - ENUM_X_DIRECTION iBarPosDir; - bool isBarValidForDir = cHelper - .mBarAnalyser - .IsValidForPosition( - cBar, - iBarPosDir // - ); - bool isBarValidForBullish = - isBarValidForDir && - IsBullish(iBarPosDir); - bool isBarValidForBearish = - isBarValidForDir && - IsBearish(iBarPosDir); - - // - // Extract Selected Boxes ... - XBoxZone selectedBox; - XSignalBox iSignalBox; - count = ArraySize(breakedBoxes); - has = IsValidSize(count); - if (has) - { - // - for (int i = 0; i < count; i++) - { - // - XSignalBox iBox = breakedBoxes[i]; - - // - bool isBullish = iBox.ob.IsBullish(); - - // - has = cBar.low < iBox.sharp.upper && - cBar.low > iBox.sharp.lower && - cBar.high > iBox.sharp.lower && - cBar.high < iBox.sharp.upper; - - // - // Force Using OB ... - if (has) - { - // - iSignalBox = iBox; - if (!selectedBox.IsValid()) - { - selectedBox = iBox.ob; - } - iBox.Clean(); - break; - } - - // - iBox.Clean(); - } - } - result = - iSignalBox.IsValid() && - selectedBox.IsValid(); - if (!result) - { - // - zBar.Clean(); - cBar.Clean(); - pBar.Clean(); - cState.Clean(); - iSignalBox.Clean(); - selectedBox.Clean(); - ZeroMemory(cHelper); - cConditions.Clean(); - cXConditions.Clean(); - - // - return result; - } - - // - bool hasSignalBox = iSignalBox.IsValid(); - bool isSignalBoxBullish = IsBullish(iSignalBox.ob.dir); - - // - // Checking Other Conditions ... - - // - // XVWAP ... - - // - bool isVWapSlopeBullish = - cXConditions.isVwapFastSlopeBullish && - cXConditions.isVwapMidSlopeBullish && - cXConditions.isVwapSlowSlopeBullish; - - // - bool isVWapSlopeBearish = - cXConditions.isVwapFastSlopeBearish && - cXConditions.isVwapMidSlopeBearish && - cXConditions.isVwapSlowSlopeBearish; - - // - bool isVWapBullishCondition = - (cXConditions.isVWapBullishOrdered && - cXConditions.isVWapSwitchedToBullishState) || - (cXConditions.isVWapBullishState && - cXConditions.isVWapSwitchedToBullishOrdered); - - // - bool isVWapBearishCondition = - (cXConditions.isVWapBearishOrdered && - cXConditions.isVWapSwitchedToBearishState) || - (cXConditions.isVWapBearishState && - cXConditions.isVWapSwitchedToBearishOrdered); - - // - // Bullish Conditions ... - isBullish = - // - // Base Condition ... - ( - // - hasSignalBox && - isSignalBoxBullish && - isVWapSlopeBullish && - isBarValidForBullish && - isVWapBullishCondition - // - ) - // - ; - - // - // Bearish Conditions ... - isBearish = - // - // Base Condition ... - ( - // - hasSignalBox && - isVWapSlopeBearish && - !isSignalBoxBullish && - isBarValidForBearish && - isVWapBearishCondition - // - ) - // - ; - - // - // Filling Requirements ... - result = - isBullish || - isBearish; - if (result) - { - // - dir = - isBullish - ? X_DIRECTION_BULLISH - : X_DIRECTION_BEARISH; - - // - box = iSignalBox; - box.UpdateTo(TimeCurrent()); - - // - // Provide TP/SL ... - - // - box.sl = isBullish - ? cXConditions.vwapMin - : cXConditions.vwapMax; - - // - box.tp = isBullish - ? box.sharp.upper - : box.sharp.lower; - } - - // - // Check All Conditions ... - result = - box.IsValid() && - HasDirection(dir) && - (isBullish || - isBearish); - - // - // Cleanup Resources ... - zBar.Clean(); - cBar.Clean(); - pBar.Clean(); - cState.Clean(); - iSignalBox.Clean(); - selectedBox.Clean(); - ZeroMemory(cHelper); - cConditions.Clean(); - cStateEvents.Clean(); - cXConditions.Clean(); - - // - return result; - } - - // - // XFVGMA ... - bool HasXFVGMAConditions( - ENUM_X_CYCLES cycle, - XSignalBox &box, - ENUM_X_DIRECTION &dir, - XSignalBox &waitingBoxes[], - X121SMCStrategySignalProviderData &provider, - int barIndex = 0 // - ) - { - // - bool result = false; - - // - box.Clean(); - dir = X_DIRECTION_NONE; - - // - result = HasChild(waitingBoxes); - if (!result) - { - return result; - } - - // - // Fil Selected Data ... - XPOIState cState; - X121Conditions cXConditions; - XPOIStateEvents cStateEvents; - XC121SMCCycleHelper *cHelper; - X121SMCCycleConditions cConditions; - result = provider.SelectCycle( - cycle, - cState, - cStateEvents, - cXConditions, - cHelper, - cConditions // - ); - if (!result) - { - // - cState.Clean(); - ZeroMemory(cHelper); - cConditions.Clean(); - cXConditions.Clean(); - cStateEvents.Clean(); - - // - return result; - } - Parse(cXConditions); - - // - // Normalize Args ... - - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - int idx = -1; - int count = 0; - bool has = false; - - // - int zIDX = barIndex; - int cIDX = zIDX + 1; - int pIDX = cIDX + 1; - int ppIDX = pIDX + 1; - - // - bool isBullish = false; - bool isBearish = false; - - // - XOHCL zBar; - XOHCL cBar; - XOHCL pBar; - - // - // Initial Bars ... - result = zBar.Init( - cState.symbol, - cState.period, - barIndex // - ); - result = - result && - zBar.GetPreviousBar(cBar); - result = - result && - cBar.GetPreviousBar(pBar); - if (!result) - { - // - zBar.Clean(); - cBar.Clean(); - pBar.Clean(); - cState.Clean(); - ZeroMemory(cHelper); - cConditions.Clean(); - cXConditions.Clean(); - - // - return result; - } - - // - // Select Waiting Box ... - XBoxZone selectedBox; - XSignalBox selectedSignalBox; - count = ArraySize(waitingBoxes); - for (int i = 0; i < count; i++) - { - // - XSignalBox iSBox = waitingBoxes[i]; - bool isBullish = iSBox.ob.IsBullish(); - - // - bool isInsidePassed = - isBullish - ? cBar.low < iSBox.ob.upper && - cBar.low > iSBox.ob.lower - : cBar.high > iSBox.ob.lower && - cBar.high < iSBox.ob.upper; - - // - bool isTypePassed = iSBox.sharp.type == "XSHPOBX"; - - // - has = isTypePassed && - isInsidePassed; - if (has) - { - // - selectedBox = iSBox.ob; - selectedSignalBox = iSBox; - break; - } - } - result = selectedBox.IsValid() && - selectedSignalBox.IsValid(); - if (!result) - { - // - zBar.Clean(); - cBar.Clean(); - pBar.Clean(); - cState.Clean(); - ZeroMemory(cHelper); - cConditions.Clean(); - selectedBox.Clean(); - cXConditions.Clean(); - selectedSignalBox.Clean(); - - // - return result; - } - - // - bool isSignalBoxBullish = selectedBox.IsBullish(); - - // - // Checking Other Conditions ... - - // - // Checking Bar Based on Positions State ... - ENUM_X_DIRECTION iBarPosDir; - bool isBarValidForDir = cHelper - .mBarAnalyser - .IsValidForPosition( - cBar, - iBarPosDir // - ); - bool isBarValidForBullish = - isBarValidForDir && - IsBullish(iBarPosDir); - bool isBarValidForBearish = - isBarValidForDir && - IsBearish(iBarPosDir); - - // - // Bullish Conditions ... - isBullish = - // - // Base Condition ... - ( - // - isSignalBoxBullish && - isBarValidForBullish - // - ) - // - ; - - // - // Bearish Conditions ... - isBearish = - // - // Base Condition ... - ( - // - !isSignalBoxBullish && - isBarValidForBearish - // - ) - // - ; - - // - // Filling Requirements ... - result = - isBullish || - isBearish; - if (result) - { - // - dir = - isBullish - ? X_DIRECTION_BULLISH - : X_DIRECTION_BEARISH; - - // - box = selectedSignalBox; - box.ob.to = TimeCurrent(); - } - - // - // Check All Conditions ... - result = - box.IsValid() && - HasDirection(dir) && - (isBullish || - isBearish); - - // - // Cleanup Resources ... - zBar.Clean(); - cBar.Clean(); - pBar.Clean(); - cState.Clean(); - selectedBox.Clean(); - ZeroMemory(cHelper); - cConditions.Clean(); - cStateEvents.Clean(); - cXConditions.Clean(); - selectedSignalBox.Clean(); - - // - return result; - } - - // - // XWPVZ ... - bool HasXWPVZConditions( - ENUM_X_CYCLES cycle, - XSignalBox &box, - ENUM_X_DIRECTION &dir, - X121SMCStrategySignalProviderData &provider, - int barIndex = 0 // - ) - { - // - bool result = false; - - // - box.Clean(); - dir = X_DIRECTION_NONE; - - // - // Fil Selected Data ... - XPOIState cState; - X121Conditions cXConditions; - XPOIStateEvents cStateEvents; - XC121SMCCycleHelper *cHelper; - X121SMCCycleConditions cConditions; - result = provider.SelectCycle( - cycle, - cState, - cStateEvents, - cXConditions, - cHelper, - cConditions // - ); - if (!result) - { - // - cState.Clean(); - ZeroMemory(cHelper); - cConditions.Clean(); - cXConditions.Clean(); - cStateEvents.Clean(); - - // - return result; - } - Parse(cXConditions); - - // - // Normalize Args ... - - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - int idx = -1; - int count = 0; - bool has = false; - - // - int zIDX = barIndex; - int cIDX = zIDX + 1; - int pIDX = cIDX + 1; - int ppIDX = pIDX + 1; - - // - bool isBullish = false; - bool isBearish = false; - - // - XOHCL zBar; - XOHCL cBar; - XOHCL pBar; - - // - // Initial Bars ... - result = zBar.Init( - cState.symbol, - cState.period, - barIndex // - ); - result = - result && - zBar.GetPreviousBar(cBar); - result = - result && - cBar.GetPreviousBar(pBar); - if (!result) - { - // - zBar.Clean(); - cBar.Clean(); - pBar.Clean(); - cState.Clean(); - ZeroMemory(cHelper); - cConditions.Clean(); - cXConditions.Clean(); - - // - return result; - } - - // - // Checking Other Conditions ... - - // - // Checking Bar Based on Positions State ... - ENUM_X_DIRECTION iBarPosDir; - bool isBarValidForDir = cHelper - .mBarAnalyser - .IsValidForPosition( - cBar, - iBarPosDir // - ); - bool isBarValidForBullish = - isBarValidForDir && - IsBullish(iBarPosDir); - bool isBarValidForBearish = - isBarValidForDir && - IsBearish(iBarPosDir); - - // - XCPOIDrawer *drawer = provider.visionCycleHelper.mPOIDrawer; - - if (result) - { - // - result = false; - Print("Salam"); - } - - // - // Bullish Conditions ... - isBullish = - // - // Base Condition ... - ( - // - false - // - ) - // - ; - - // - // Bearish Conditions ... - isBearish = - // - // Base Condition ... - ( - // - false - // - ) - // - ; - - // - // Filling Requirements ... - result = - isBullish || - isBearish; - if (result) - { - // - dir = - isBullish - ? X_DIRECTION_BULLISH - : X_DIRECTION_BEARISH; - - // - } - - // - // Check All Conditions ... - result = - box.IsValid() && - HasDirection(dir) && - (isBullish || - isBearish); - - // - // Cleanup Resources ... - zBar.Clean(); - cBar.Clean(); - pBar.Clean(); - cState.Clean(); - ZeroMemory(cHelper); - cConditions.Clean(); - cStateEvents.Clean(); - cXConditions.Clean(); - - // - return result; - } - - // -}; diff --git a/Documents/BKP/x-cycle.helper.tmp.mq5 b/Documents/BKP/x-cycle.helper.tmp.mq5 deleted file mode 100644 index 0ce99ea3..00000000 --- a/Documents/BKP/x-cycle.helper.tmp.mq5 +++ /dev/null @@ -1,580 +0,0 @@ - - // - bool DetectNearestTenKijCross( - XOHCL &bar, - ENUM_X_DIRECTION &dir, - int barIndex = 0, - int maxAllowedBars = 20 // - ) - { - // - bool result = false; - - // - bar.Clean(); - dir = X_DIRECTION_NONE; - barIndex = NormalizeInt(barIndex, 0); - maxAllowedBars = NormalizeInt(maxAllowedBars, 20); - - // - // Looping Through LoopBack Period ... - // for Detecting Result ... - for (int i = barIndex; i < barIndex + maxAllowedBars; i++) - { - // - XOHCL iBar; - result = iBar.Init( - GetSymbol(), - GetPeriod(), - i // - ); - if (!result) - { - // - iBar.Clean(); - break; - } - - // - double iTSen = mX121Helper.xichHelper.GetTenkanSen(i); - double iTSenP = mX121Helper.xichHelper.GetTenkanSen(i + 1); - - // - double iKSen = mX121Helper.xichHelper.GetKijunSen(i); - double iKSenP = mX121Helper.xichHelper.GetKijunSen(i + 1); - - // - bool isTSenOverKSen = iTSen > iKSen; - bool isTSenOverKSenP = iTSenP > iKSenP; - - // - bool isTSenUnderKSen = iTSen < iKSen; - bool isTSenUnderKSenP = iTSenP < iKSenP; - - // - - // - bool isTSenCrossedOverKSen = isTSenOverKSen && - !isTSenOverKSenP; - - // - bool isTSenCrossedUnderKSen = isTSenUnderKSen && - !isTSenUnderKSenP; - - // - result = isTSenCrossedOverKSen || - isTSenCrossedUnderKSen; - if (result) - { - // - bar = iBar; - - // - dir = isTSenCrossedOverKSen - ? X_DIRECTION_BULLISH - : X_DIRECTION_BEARISH; - - // - iBar.Clean(); - break; - } - - // - iBar.Clean(); - } - - // - return result; - } - - // - bool DetectNearestVolumeSwitched( - XOHCL &bar, - ENUM_X_DIRECTION &dir, - int barIndex = 0, - int maxAllowedBars = 20 // - ) - { - // - bool result = false; - - // - bar.Clean(); - dir = X_DIRECTION_NONE; - barIndex = NormalizeInt(barIndex, 0); - maxAllowedBars = NormalizeInt(maxAllowedBars, 20); - - // - // Looping Through LoopBack Period ... - // for Detecting Result ... - for (int i = barIndex; i < barIndex + maxAllowedBars; i++) - { - // - XOHCL iBar; - result = iBar.Init( - GetSymbol(), - GetPeriod(), - i // - ); - if (!result) - { - // - iBar.Clean(); - break; - } - - // - double iBullVMa = mX121Helper.xvolumeHelper.GetBullishVolumeMa(i); - double iBullVMaP = mX121Helper.xvolumeHelper.GetBullishVolumeMa(i + 1); - - // - double iBearVMa = mX121Helper.xvolumeHelper.GetBearishVolumeMa(i); - double iBearVMaP = mX121Helper.xvolumeHelper.GetBearishVolumeMa(i + 1); - - // - bool isBullVMaOverBearVMa = iBullVMa > iBearVMa; - bool isBullVMaOverBearVMaP = iBullVMaP > iBearVMaP; - bool isCrossOver = isBullVMaOverBearVMa && - !isBullVMaOverBearVMaP; - - // - bool isBullVMaUnderBearVMa = iBullVMa < iBearVMa; - bool isBullVMaUnderBearVMaP = iBullVMaP < iBearVMaP; - bool isCrossUnder = isBullVMaUnderBearVMa && - !isBullVMaUnderBearVMaP; - - // - result = isCrossOver || - isCrossUnder; - if (result) - { - // - bar = iBar; - - // - dir = isCrossOver - ? X_DIRECTION_BULLISH - : X_DIRECTION_BEARISH; - - // - iBar.Clean(); - break; - } - - // - iBar.Clean(); - } - - // - return result; - } - - // - bool DetectNearestDeltaSwitched( - XOHCL &bar, - ENUM_X_DIRECTION &dir, - int barIndex = 0, - int maxAllowedBars = 20 // - ) - { - // - bool result = false; - - // - bar.Clean(); - dir = X_DIRECTION_NONE; - barIndex = NormalizeInt(barIndex, 0); - maxAllowedBars = NormalizeInt(maxAllowedBars, 20); - - // - // Looping Through LoopBack Period ... - // for Detecting Result ... - for (int i = barIndex; i < barIndex + maxAllowedBars; i++) - { - // - XOHCL iBar; - result = iBar.Init( - GetSymbol(), - GetPeriod(), - i // - ); - if (!result) - { - // - iBar.Clean(); - break; - } - - // - double iDelta = mX121Helper.xdeltaHelper.GetDelta(i); - double iDeltaP = mX121Helper.xdeltaHelper.GetDelta(i + 1); - - // - double iDeltaMa = mX121Helper.xdeltaHelper.GetDeltaMa(i); - double iDeltaMaP = mX121Helper.xdeltaHelper.GetDeltaMa(i + 1); - - // - bool isDeltaOverMa = iDelta > iDeltaMa; - bool isDeltaOverMaP = iDeltaP > iDeltaMaP; - - // - bool isDeltaUnderMa = iDelta < iDeltaMa; - bool isDeltaUnderMaP = iDeltaP < iDeltaMaP; - - // - bool isCrossOver = isDeltaOverMa && - !isDeltaOverMaP; - - // - bool isCrossUnder = isDeltaUnderMa && - !isDeltaUnderMaP; - - // - result = isCrossOver || - isCrossUnder; - if (result) - { - // - bar = iBar; - - // - dir = isCrossOver - ? X_DIRECTION_BULLISH - : X_DIRECTION_BEARISH; - - // - iBar.Clean(); - break; - } - - // - iBar.Clean(); - } - - // - return result; - } - - - //////////////////////////////////////////////////////////////////////////// - - - - // - // Activated Boxes ... - bool HasActivatedBoxConditions( - ENUM_X_CYCLES cycle, - XSignalBox &box, - ENUM_X_DIRECTION &dir, - XSignalBox &waitingBoxes[], - X121SMCStrategySignalProviderData &provider, - int barIndex = 0 // - ) - { - // - bool result = false; - - // - box.Clean(); - dir = X_DIRECTION_NONE; - - // - // Checking Waiting Baoxes Exists ... - result = HasChild(waitingBoxes); - if (!result) - { - return result; - } - - // - // Fil Selected Data ... - XPOIState cState; - X121Conditions cXConditions; - XPOIStateEvents cStateEvents; - XC121SMCCycleHelper *cHelper; - X121SMCCycleConditions cConditions; - result = provider.SelectCycle( - cycle, - cState, - cStateEvents, - cXConditions, - cHelper, - cConditions // - ); - if (!result) - { - // - cState.Clean(); - ZeroMemory(cHelper); - cConditions.Clean(); - cXConditions.Clean(); - cStateEvents.Clean(); - - // - return result; - } - Parse(cXConditions); - - // - // Normalize Args ... - - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - int idx = -1; - int count = 0; - bool has = false; - - // - int zIDX = barIndex; - int cIDX = zIDX + 1; - int pIDX = cIDX + 1; - int ppIDX = pIDX + 1; - - // - bool isBullish = false; - bool isBearish = false; - - // - XOHCL zBar; - XOHCL cBar; - XOHCL pBar; - - // - // Initial Bars ... - result = zBar.Init( - cState.symbol, - cState.period, - barIndex // - ); - result = - result && - zBar.GetPreviousBar(cBar); - result = - result && - cBar.GetPreviousBar(pBar); - if (!result) - { - // - zBar.Clean(); - cBar.Clean(); - pBar.Clean(); - cState.Clean(); - ZeroMemory(cHelper); - cConditions.Clean(); - cXConditions.Clean(); - - // - return result; - } - - // - // Checking Bar Based on Positions State ... - ENUM_X_DIRECTION iBarPosDir; - bool isBarValidForDir = cHelper - .mBarAnalyser - .IsValidForPosition( - cBar, - iBarPosDir // - ); - bool isBarValidForBullish = - isBarValidForDir && - IsBullish(iBarPosDir); - bool isBarValidForBearish = - isBarValidForDir && - IsBearish(iBarPosDir); - - // - // Extract Selected Boxes ... - XBoxZone selectedBox; - XSignalBox iSignalBox; - count = ArraySize(waitingBoxes); - has = IsValidSize(count); - if (has) - { - // - for (int i = 0; i < count; i++) - { - // - XSignalBox iBox = waitingBoxes[i]; - - // - bool isBullish = iBox.ob.IsBullish(); - - // - has = cBar.low < iBox.sharp.upper && - cBar.low > iBox.sharp.lower && - cBar.high > iBox.sharp.lower && - cBar.high < iBox.sharp.upper; - - // - // Force Using OB ... - if (has) - { - // - iSignalBox = iBox; - if (!selectedBox.IsValid()) - { - selectedBox = iBox.ob; - } - iBox.Clean(); - break; - } - - // - iBox.Clean(); - } - } - result = - iSignalBox.IsValid() && - selectedBox.IsValid(); - if (!result) - { - // - zBar.Clean(); - cBar.Clean(); - pBar.Clean(); - cState.Clean(); - iSignalBox.Clean(); - selectedBox.Clean(); - ZeroMemory(cHelper); - cConditions.Clean(); - cXConditions.Clean(); - - // - return result; - } - - // - bool hasSignalBox = iSignalBox.IsValid(); - bool isSignalBoxBullish = IsBullish(iSignalBox.ob.dir); - - // - // Checking Other Conditions ... - - // - // XVWAP ... - - // - bool isVWapSlopeBullish = - cXConditions.isVwapFastSlopeBullish && - cXConditions.isVwapMidSlopeBullish && - cXConditions.isVwapSlowSlopeBullish; - - // - bool isVWapSlopeBearish = - cXConditions.isVwapFastSlopeBearish && - cXConditions.isVwapMidSlopeBearish && - cXConditions.isVwapSlowSlopeBearish; - - // - bool isVWapBullishCondition = - (cXConditions.isVWapBullishOrdered && - cXConditions.isVWapSwitchedToBullishState) || - (cXConditions.isVWapBullishState && - cXConditions.isVWapSwitchedToBullishOrdered); - - // - bool isVWapBearishCondition = - (cXConditions.isVWapBearishOrdered && - cXConditions.isVWapSwitchedToBearishState) || - (cXConditions.isVWapBearishState && - cXConditions.isVWapSwitchedToBearishOrdered); - - // - // Bullish Conditions ... - isBullish = - // - // Base Condition ... - ( - // - hasSignalBox && - isSignalBoxBullish && - isVWapSlopeBullish && - isBarValidForBullish && - isVWapBullishCondition - // - ) - // - ; - - // - // Bearish Conditions ... - isBearish = - // - // Base Condition ... - ( - // - hasSignalBox && - isVWapSlopeBearish && - !isSignalBoxBullish && - isBarValidForBearish && - isVWapBearishCondition - // - ) - // - ; - - // - // Filling Requirements ... - result = - isBullish || - isBearish; - if (result) - { - // - dir = - isBullish - ? X_DIRECTION_BULLISH - : X_DIRECTION_BEARISH; - - // - box = iSignalBox; - box.UpdateTo(TimeCurrent()); - - // - // Provide TP/SL ... - - // - box.sl = isBullish - ? cXConditions.vwapMin - : cXConditions.vwapMax; - - // - box.tp = isBullish - ? box.sharp.upper - : box.sharp.lower; - } - - // - // Check All Conditions ... - result = - box.IsValid() && - HasDirection(dir) && - (isBullish || - isBearish); - - // - // Cleanup Resources ... - zBar.Clean(); - cBar.Clean(); - pBar.Clean(); - cState.Clean(); - iSignalBox.Clean(); - selectedBox.Clean(); - ZeroMemory(cHelper); - cConditions.Clean(); - cStateEvents.Clean(); - cXConditions.Clean(); - - // - return result; - } - - ///////////////////////////////////////////////////////////////////////////////////// - - \ No newline at end of file diff --git a/Documents/BKP/x-pv.qween.ea.mq5 b/Documents/BKP/x-pv.qween.ea.mq5 deleted file mode 100644 index 683980d2..00000000 --- a/Documents/BKP/x-pv.qween.ea.mq5 +++ /dev/null @@ -1,232 +0,0 @@ -//+------------------------------------------------------------------+ -//| SaherElm IT Center MQL5 Expert Advisor | -//| | -//| Name: X121 XPV EA | -//| Description: Multi-Timeframe Peak & Vale Breakout Strategy | -//| Maintainer: Hadi Khazaee Asl | -//+------------------------------------------------------------------+ -#property copyright "Copyright 2023, SaherElm IT Center" -#property link "https://saherelm.ir" -#property version "1.00" -#property strict - -// -#include "../Helpers/x-saherelm.x121.xpv.helper.mq5" - -// Input Parameters -input double RiskPercent = 1.0; // Risk per trade in percentage -input int StopLossPips = 50; // Stop Loss in pips -input int TakeProfitPips = 100; // Take Profit in pips -input bool UseTrailingStop = true; // Enable trailing stop -input int TrailingStopPips = 30; // Trailing stop distance in pips -input int MagicNumber = 123456; // Unique identifier for trades -input bool DebugMode = true; // Enable debug messages - -// -// Global Variables ... -X121XPVInputs mXPVInputs; -XCX121XPVHelper *mXPVHelper; - -//+------------------------------------------------------------------+ -//| Expert Initialization Function | -//+------------------------------------------------------------------+ -int OnInit() -{ - // - // Attach the X121 XPV indicator ... - mXPVInputs.Default(); - mXPVHelper = new XCX121XPVHelper(); - bool isInited = mXPVHelper.Init( - _Symbol, - _Period, - mXPVInputs // - ); - if (!isInited) - { - return INIT_FAILED; - } - - // - Print("X121 XPV EA Initialized."); - return INIT_SUCCEEDED; -} - -//+------------------------------------------------------------------+ -//| Expert Deinitialization Function | -//+------------------------------------------------------------------+ -void OnDeinit(const int reason) -{ - // - mXPVInputs.Clean(); - ZeroMemory(mXPVHelper); - Print("X121 XPV EA Deinitialized."); -} - -//+------------------------------------------------------------------+ -//| Expert Tick Function | -//+------------------------------------------------------------------+ -void OnTick() -{ - // - // Check if there are open positions for this symbol - if (PositionSelect(_Symbol)) - { - ManageOpenPosition(); - return; - } - - // - X121XPVConditions pvConditions; - bool isRetrieved = mXPVHelper.GetConditions( - pvConditions, - 1 // - ); - if (!isRetrieved) - { - return; - } - - // - // Get indicator values - double peak = pvConditions.peaksBuffer[0]; - double vale = pvConditions.valesBuffer[0]; - double peakGoldenZone = pvConditions.peaksGoldenBuffer[0]; - double valeGoldenZone = pvConditions.valesGoldenBuffer[0]; - - // - // Validate indicator values - if (peak == EMPTY_VALUE || vale == EMPTY_VALUE || peakGoldenZone == EMPTY_VALUE || valeGoldenZone == EMPTY_VALUE) - { - // - if (DebugMode) - Print("Invalid indicator values. Skipping..."); - return; - } - - // - // Entry Conditions - double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID); - double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK); - - // - // Long Entry - if (bid > peak && bid > peakGoldenZone) - { - OpenTrade(ORDER_TYPE_BUY, peak, valeGoldenZone); - } - - // - // Short Entry - if (ask < vale && ask < valeGoldenZone) - { - OpenTrade(ORDER_TYPE_SELL, vale, peakGoldenZone); - } -} - -//+------------------------------------------------------------------+ -//| Open a Trade | -//+------------------------------------------------------------------+ -void OpenTrade(int orderType, double entryLevel, double targetLevel) -{ - // - double lotSize = CalculateLotSize(entryLevel, targetLevel); - double sl = (orderType == ORDER_TYPE_BUY) ? entryLevel - StopLossPips * Point() : entryLevel + StopLossPips * Point(); - double tp = (orderType == ORDER_TYPE_BUY) ? entryLevel + TakeProfitPips * Point() : entryLevel - TakeProfitPips * Point(); - - // - // Prepare trade request - MqlTradeRequest request = {}; - MqlTradeResult result = {}; - - // - request.action = TRADE_ACTION_DEAL; - request.symbol = _Symbol; - request.volume = lotSize; - request.type = (ENUM_ORDER_TYPE)orderType; - request.price = (orderType == ORDER_TYPE_BUY) ? SymbolInfoDouble(_Symbol, SYMBOL_ASK) : SymbolInfoDouble(_Symbol, SYMBOL_BID); - request.sl = sl; - request.tp = tp; - request.deviation = 10; - request.magic = MagicNumber; - - // - // Send trade request - if (!OrderSend(request, result)) - { - Print("Trade failed: ", result.retcode); - } - else - { - Print("Trade opened successfully."); - } -} - -//+------------------------------------------------------------------+ -//| Manage Open Position | -//+------------------------------------------------------------------+ -void ManageOpenPosition() -{ - ulong ticket = PositionGetInteger(POSITION_TICKET); - double currentPrice = (PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY) ? SymbolInfoDouble(_Symbol, SYMBOL_BID) : SymbolInfoDouble(_Symbol, SYMBOL_ASK); - double openPrice = PositionGetDouble(POSITION_PRICE_OPEN); - double sl = PositionGetDouble(POSITION_SL); - double tp = PositionGetDouble(POSITION_TP); - - // Trailing Stop Logic - if (UseTrailingStop) - { - double newSL = (PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY) - ? currentPrice - TrailingStopPips * Point() - : currentPrice + TrailingStopPips * Point(); - - if ((PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY && newSL > sl) || - (PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL && newSL < sl)) - { - ModifyPosition(ticket, newSL, tp); - } - } -} - -//+------------------------------------------------------------------+ -//| Modify Position | -//+------------------------------------------------------------------+ -void ModifyPosition(ulong ticket, double newSL, double newTP) -{ - MqlTradeRequest request = {}; - MqlTradeResult result = {}; - - request.action = TRADE_ACTION_SLTP; - request.position = ticket; - request.sl = newSL; - request.tp = newTP; - - if (!OrderSend(request, result)) - { - Print("Failed to modify position: ", result.retcode); - } - else - { - Print("Position modified successfully."); - } -} - -//+------------------------------------------------------------------+ -//| Calculate Lot Size | -//+------------------------------------------------------------------+ -double CalculateLotSize(double entryLevel, double targetLevel) -{ - double riskAmount = AccountInfoDouble(ACCOUNT_BALANCE) * RiskPercent / 100; - double stopLossDistance = MathAbs(entryLevel - targetLevel) / Point(); - double tickValue = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_VALUE); - double lotSize = riskAmount / (stopLossDistance * tickValue); - - // Normalize lot size - double minLot = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MIN); - double maxLot = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MAX); - double stepLot = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_STEP); - - lotSize = MathFloor(lotSize / stepLot) * stepLot; - lotSize = MathMax(minLot, MathMin(maxLot, lotSize)); - - return lotSize; -} \ No newline at end of file diff --git a/Documents/BKP/x-saherelm.x121.helper.mq5 b/Documents/BKP/x-saherelm.x121.helper.mq5 deleted file mode 100644 index 5dbfce6d..00000000 --- a/Documents/BKP/x-saherelm.x121.helper.mq5 +++ /dev/null @@ -1,4949 +0,0 @@ -/////////////////////////////////////////////////////// -// -// SaherElm IT Center MQL5 Helper Class Library -// ---------------------------------------------- -// Name: XCX121Helper -// Description: provides all Indicator -// Helper requirements ... -// -// -// Maintainer: -// ------------ -// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) -// -////////////////////////////////////////////////////// -// -// Global Properties ... -#property library -#property copyright "Copyright 2023, SaherElm IT Center" -#property link "https://www.saherelm.ir" -#property version "1.00" -#property strict - -// -// Imports ... -#include "../Helpers/x-saherelm.x121.x3ma.helper.mq5" -#include "../Helpers/x-saherelm.x121.xatr.helper.mq5" -#include "../Helpers/x-saherelm.x121.xcc.helper.mq5" -#include "../Helpers/x-saherelm.x121.xche.helper.mq5" -#include "../Helpers/x-saherelm.x121.xdelta.helper.mq5" -#include "../Helpers/x-saherelm.x121.xdon.helper.mq5" -#include "../Helpers/x-saherelm.x121.xhk.helper.mq5" -#include "../Helpers/x-saherelm.x121.xich.helper.mq5" -#include "../Helpers/x-saherelm.x121.xmas.helper.mq5" -#include "../Helpers/x-saherelm.x121.xpv.helper.mq5" -#include "../Helpers/x-saherelm.x121.xstr.helper.mq5" -#include "../Helpers/x-saherelm.x121.xvolume.helper.mq5" -#include "../Helpers/x-saherelm.x121.xvwap.helper.mq5" - -// -// Inputs ... -struct X121Inputs -{ - // - // Props ... - bool showRSI; - X121XCCInputs xccInputs; - X121XPVInputs xpvInputs; - X121XHKInputs xhkInputs; - X121XICHInputs xichInputs; - X121XMASInputs xmasInputs; - X121XATRInputs xatrInputs; - X121XSTRInputs xstrInputs; - X121XCHEInputs xcheInputs; - X121XDONInputs xdonInputs; - X121X3MAInputs x3maInputs; - X121XVWAPInputs xvwapInputs; - X121XDELTAInputs xdeltaInputs; - X121XVOLUMEInputs xvolumeInputs; - - // - // Constructor ... - X121Inputs() - { - Clean(); - } - - // - // Tools ... - - /** - * Cleaning Up ... - */ - void Clean() - { - // - xccInputs.Clean(); - xpvInputs.Clean(); - xhkInputs.Clean(); - xichInputs.Clean(); - xmasInputs.Clean(); - xatrInputs.Clean(); - xstrInputs.Clean(); - xcheInputs.Clean(); - xdonInputs.Clean(); - xvwapInputs.Clean(); - xdeltaInputs.Clean(); - xvolumeInputs.Clean(); - - // - ZeroMemory(this); - } - - /** - * Set Default Values ... - */ - void Default() - { - // - xccInputs.Default(); - xpvInputs.Default(); - xhkInputs.Default(); - xichInputs.Default(); - xmasInputs.Default(); - xatrInputs.Default(); - xstrInputs.Default(); - xcheInputs.Default(); - xdonInputs.Default(); - x3maInputs.Default(); - xvwapInputs.Default(); - xdeltaInputs.Default(); - xvolumeInputs.Default(); - } - - /** - * Validate ... - * - * @return ( bool ) - */ - bool IsValid() - { - // - bool result = false; - - // - result = - // - xccInputs.IsValid() && - xpvInputs.IsValid() && - xhkInputs.IsValid() && - xichInputs.IsValid() && - xmasInputs.IsValid() && - xatrInputs.IsValid() && - xstrInputs.IsValid() && - xcheInputs.IsValid() && - xdonInputs.IsValid() && - xvwapInputs.IsValid() && - xdeltaInputs.IsValid() && - xvolumeInputs.IsValid() - // - ; - - // - return result; - } - - /** - * Extract Max Input Length ... - * - * @return ( int ) - */ - int Max() - { - // - int result = 0; - - // - int xpvMax = xpvInputs.Max(); - int xhkMax = xhkInputs.Max(); - int xmasMax = xmasInputs.Max(); - int xatrMax = xatrInputs.Max(); - int xstrMax = xstrInputs.Max(); - int xcheMax = xcheInputs.Max(); - int xdonMax = xdonInputs.Max(); - int xichMax = xichInputs.Max(); - int xvwapMax = xvwapInputs.Max(); - int xdeltaMax = xdeltaInputs.Max(); - int xvolumeMax = xvolumeInputs.Max(); - - // - result = MathMax(xpvMax, xhkMax); - result = MathMax(result, xmasMax); - result = MathMax(result, xatrMax); - result = MathMax(result, xstrMax); - result = MathMax(result, xcheMax); - result = MathMax(result, xdonMax); - result = MathMax(result, xichMax); - result = MathMax(result, xvwapMax); - result = MathMax(result, xdeltaMax); - result = MathMax(result, xvolumeMax); - - // - return result; - } -}; - -// -// Conditions ... -struct X121Conditions -{ - // - // Common ... - string symbol; - ENUM_TIMEFRAMES period; - datetime time; - - // - // Buffers ... - double maBuffer[]; - double rsiBuffer[]; - double atrBuffer[]; - double strBuffer[]; - double le1Buffer[]; - double se1Buffer[]; - double le2Buffer[]; - double se2Buffer[]; - double sarBuffer[]; - double cHHBuffer[]; - double cLLBuffer[]; - double sHHBuffer[]; - double sLLBuffer[]; - double mHHBuffer[]; - double mLLBuffer[]; - double lHHBuffer[]; - double lLLBuffer[]; - double hHHBuffer[]; - double hLLBuffer[]; - double upTBuffer[]; - double adxBuffer[]; - double adxPBuffer[]; - double adxMBuffer[]; - long volumeBuffer[]; - double peaksBuffer[]; - double valesBuffer[]; - double strUpBuffer[]; - double downTBuffer[]; - double deltaBuffer[]; - double masMidBuffer[]; - double deltaMaBuffer[]; - double strDownBuffer[]; - double vwapMidBuffer[]; - double upTrendBuffer[]; - double x3maMidBuffer[]; - double masUpperBuffer[]; - double masLowerBuffer[]; - double kijunSenBuffer[]; - double le1StartBuffer[]; - double se1StartBuffer[]; - double le2StartBuffer[]; - double se2StartBuffer[]; - double strPriceBuffer[]; - double atrUpperBuffer[]; - double atrLowerBuffer[]; - double strStateBuffer[]; - double vwapFastBuffer[]; - double vwapSlowBuffer[]; - double xhkSMLowBuffer[]; - double x3maFastBuffer[]; - double x3maSlowBuffer[]; - double supportsBuffer[]; - double tenkanSenBuffer[]; - double downTrendBuffer[]; - double vwapPriceBuffer[]; - double xhkRawLowBuffer[]; - double xhkSMOpenBuffer[]; - double xhkSMHighBuffer[]; - double deltaStateBuffer[]; - double xhkRawOpenBuffer[]; - double xhkRawHighBuffer[]; - double xhkSMCloseBuffer[]; - double vwapVolumeBuffer[]; - double chikouSpanBuffer[]; - double senkouSpanABuffer[]; - double senkouSpanBBuffer[]; - double peaksGoldenBuffer[]; - double valesGoldenBuffer[]; - double xhkRawCloseBuffer[]; - double atrUpperRawBuffer[]; - double atrLowerRawBuffer[]; - double donLowUpperBuffer[]; - double donLowLowerBuffer[]; - double resistancesBuffer[]; - double vwapMidStateBuffer[]; - double donOpenUpperBuffer[]; - double donOpenLowerBuffer[]; - double donHighUpperBuffer[]; - double donHighLowerBuffer[]; - double x3maMidStateBuffer[]; - double bullishVolumeBuffer[]; - double bearishVolumeBuffer[]; - double fractalsUpperBuffer[]; - double fractalsLowerBuffer[]; - double vwapFastStateBuffer[]; - double vwapSlowStateBuffer[]; - double donCloseUpperBuffer[]; - double donCloseLowerBuffer[]; - double x3maFastStateBuffer[]; - double x3maSlowStateBuffer[]; - double bullishVolumeMaBuffer[]; - double bearishVolumeMaBuffer[]; - - // - double rsiSlope; - double strSlope; - double atrUpperSlope; - double atrLowerSlope; - double vwapFastSlope; - double vwapMidSlope; - double vwapSlowSlope; - - // - // Conditions ... - - // - bool isRsiSlopeBullish; - bool isStrSlopeBullish; - bool isAtrUpperSlopeBullish; - bool isAtrLowerSlopeBullish; - bool isVwapFastSlopeBullish; - bool isVwapMidSlopeBullish; - bool isVwapSlowSlopeBullish; - - // - bool isRsiSlopeBearish; - bool isStrSlopeBearish; - bool isAtrUpperSlopeBearish; - bool isAtrLowerSlopeBearish; - bool isVwapFastSlopeBearish; - bool isVwapMidSlopeBearish; - bool isVwapSlowSlopeBearish; - - // - bool isRsiOverSold; - bool isRsiOverBought; - bool isRsiCrossedOverOverSold; - bool isRsiCrossedUnderOverSold; - bool isRsiCrossedOverOverBought; - bool isRsiCrossedUnderOverBought; - - // - bool isClosedOverAtrUpper; - bool isClosedOverAtrLower; - bool isClosedUnderAtrUpper; - bool isClosedUnderAtrLower; - - // - bool isSarBullish; - bool isSarBearish; - bool isSarSwitchedToBullish; - bool isSarSwitchedToBearish; - - // - bool isNewPeak; - bool isNewPeakOverLast; - bool isNewPeakUnderLast; - - // - bool isNewVale; - bool isNewValeOverLast; - bool isNewValeUnderLast; - - // - bool isStrBullish; - bool isStrBearish; - bool isStrSwitchedToBullish; - bool isStrSwitchedToBearish; - - // - bool isChe1Bullish; - bool isChe1Bearish; - bool isChe1SwitchedToBullish; - bool isChe1SwitchedToBearish; - - // - bool isChe2Bullish; - bool isChe2Bearish; - bool isChe2SwitchedToBullish; - bool isChe2SwitchedToBearish; - - // - bool isCheBullish; - bool isCheBearish; - bool isCheSwitchedToBullish; - bool isCheSwitchedToBearish; - - // - bool isVWapMidBullish; - bool isVWapMidBearish; - bool isVWapFastBullish; - bool isVWapFastBearish; - bool isVWapMidNeutural; - bool isVWapSlowBullish; - bool isVWapSlowBearish; - bool isVWapFastOverMid; - bool isVWapMidOverSlow; - bool isVWapFastNeutural; - bool isVWapSlowNeutural; - bool isVWapFastUnderMid; - bool isVWapMidUnderSlow; - bool isVWapBullishState; - bool isVWapBearishState; - bool isVWapNeuturalState; - bool isVWapBullishOrdered; - bool isVWapBearishOrdered; - bool isVWapSwitchedToBullishState; - bool isVWapSwitchedToBearishState; - bool isVWapSwitchedToNeuturalState; - bool isVWapSwitchedToBullishOrdered; - bool isVWapSwitchedToBearishOrdered; - - // - bool isX3MaMidBullish; - bool isX3MaMidBearish; - bool isX3MaFastBullish; - bool isX3MaFastBearish; - bool isX3MaMidNeutural; - bool isX3MaSlowBullish; - bool isX3MaSlowBearish; - bool isX3MaFastOverMid; - bool isX3MaMidOverSlow; - bool isX3MaFastNeutural; - bool isX3MaSlowNeutural; - bool isX3MaFastUnderMid; - bool isX3MaMidUnderSlow; - bool isX3MaBullishState; - bool isX3MaBearishState; - bool isX3MaNeuturalState; - bool isX3MaBullishOrdered; - bool isX3MaBearishOrdered; - bool isX3MaSwitchedToBullishState; - bool isX3MaSwitchedToBearishState; - bool isX3MaSwitchedToNeuturalState; - bool isX3MaSwitchedToBullishOrdered; - bool isX3MaSwitchedToBearishOrdered; - - // - bool isSMHKBullish; - bool isRawHKBullish; - bool isSMHKBearish; - bool isRawHKBearish; - bool isClosedOverSMHK; - bool isClosedUnderSMHK; - bool isClosedOverRawHK; - bool isClosedUnderRawHK; - bool isRawHKClosedOverSMHK; - bool isRawHKClosedUnderSMHK; - bool isSMHKSwitchedToBullish; - bool isSMHKSwitchedToBearish; - bool isRawHKSwitchedToBearish; - bool isRawHKSwitchedToBullish; - - // - // XICH ... - - // - bool isSenkouSpanAOverB; - bool isSenkouSpanAUnderB; - bool isTenkanSenOverKijunSen; - bool isTenkanSenUnderKijunSen; - bool isSenkouSpanACrossedOverB; - bool isSenkouSpanACrossedUnderB; - bool isTenkanSenCrossedOverKijunSen; - bool isTenkanSenCrossedUnderKijunSen; - - // - // XDELTA ... - - // - bool isDeltaBullish; - bool isDeltaBearish; - bool isDeltaSwitchedToBullish; - bool isDeltaSwitchedToBearish; - - // - bool isDeltaOverMa; - bool isDeltaUnderMa; - bool isDeltaCrossedOverMa; - bool isDeltaCrossedUnderMa; - - // - // XVOLUME ... - - bool isBullishVolumeOverMa; - bool isBullishVolumeCrossedOverMa; - - // - bool isBullishVolumeUnderMa; - bool isBullishVolumeCrossedUnderMa; - - // - bool isBullishVolumeIncreased; - bool isBullishVolumeSwitchedToIncreased; - - // - bool isBullishVolumeDecreased; - bool isBullishVolumeSwitchedToDecreased; - - // - bool isBearishVolumeOverMa; - bool isBearishVolumeCrossedOverMa; - - // - bool isBearishVolumeUnderMa; - bool isBearishVolumeCrossedUnderMa; - - // - bool isBearishVolumeIncreased; - bool isBearishVolumeSwitchedToIncreased; - - // - bool isBearishVolumeDecreased; - bool isBearishVolumeSwitchedToDecreased; - - // - bool isVolumeSwitchedToBullish; - bool isVolumeSwitchedToBearish; - - // - bool isBullishVolumeMaOverBearishVolumeMa; - bool isBullishVolumeMaUnderBearishVolumeMa; - - // - // Complex Conditions ... - - // - double cheMin; - double cheMax; - double x3maMin; - double x3maMax; - double vwapMin; - double vwapMax; - double senkouMax; - double senkouMin; - double tenKijMax; - double tenKijMin; - - // - bool isSarIncreased; - bool isSarDecreased; - bool isX3MaFatsOverMid; - bool isSarEqualsToPeak; - bool isSarEqualsToVale; - bool isStrEqualsToPeak; - bool isStrEqualsToVale; - bool isX3MaFatsUnderMid; - bool isX3MaFatsOverSlow; - bool isAtrUpperOverPeak; - bool isPeakOverAtrUpper; - bool isStrUpperOverPeak; - bool isStrLowerOverVale; - bool isClosedOverCheMin; - bool isClosedOverCheMax; - bool isX3MaFatsUnderSlow; - bool isAtrLowerUnderVale; - bool isClosedOverX3MaMin; - bool isClosedOverX3MaMax; - bool isValeUnderAtrLower; - bool isStrUpperUnderPeak; - bool isStrLowerUnderVale; - bool isClosedUnderCheMin; - bool isClosedUnderCheMax; - bool isClosedOverVWapMin; - bool isClosedOverVWapMax; - bool isClosedUnderX3MaMin; - bool isClosedUnderX3MaMax; - bool isStrCrossedOverVale; - bool isSarCrossedOverVale; - bool isClosedUnderVWapMin; - bool isClosedUnderVWapMax; - bool isX3MaFatsOverMidPrev; - bool isSarCrossedUnderPeak; - bool isStrCrossedUnderPeak; - bool isNewPeakOverAtrUpper; - bool isX3MaFatsUnderMidPrev; - bool isX3MaFatsOverSlowPrev; - bool isAtrUpperEqualsToPeak; - bool isAtrLowerEqualsToVale; - bool isStrUpperOverAtrUpper; - bool isStrLowerOverAtrLower; - bool isNewValeUnderAtrLower; - bool isAtrUpperCrossedUpPeak; - bool isAtrLowerCrossedUpVale; - bool isStrUpperUnderAtrUpper; - bool isStrLowerUnderAtrLower; - bool isX3MaFatsUnderSlowPrev; - bool isX3MaFastCrossedOverMid; - bool isVWapFastCrossedOverMid; - bool isX3MaFastCrossedUnderMid; - bool isX3MaFastCrossedOverSlow; - bool isAtrUpperCrossedDownPeak; - bool isAtrLowerCrossedDownVale; - bool isStrLowerOverDonLowLower; - bool isVWapFastCrossedUnderMid; - bool isStrUpperCrossedOverPeak; - bool isStrLowerCrossedOverVale; - bool isDonLowLowerEqualsToVale; - bool isVWapFastCrossedOverSlow; - bool isX3MaFastCrossedUnderSlow; - bool isStrUpperOverDonHighUpper; - bool isStrLowerUnderDonLowLower; - bool isVWapFastCrossedUnderSlow; - bool isStrUpperCrossedUnderPeak; - bool isStrLowerCrossedUnderVale; - bool isDonHighUpperEqualsToPeak; - bool isStrUpperUnderDonHighUpper; - bool isStrUpperCrossedOverAtrUpper; - bool isStrLowerCrossedOverAtrLower; - bool isStrUpperCrossedUnderAtrUpper; - bool isStrLowerCrossedUnderAtrLower; - bool isStrLowerCrossedOverDonLowLower; - bool isStrUpperCrossedOverDonHighUpper; - bool isStrLowerCrossedUnderDonLowLower; - bool isStrUpperCrossedUnderDonHighUpper; - - // - // Constructor ... - X121Conditions() - { - Clean(); - } - - // - // Tools ... - - /** - * Cleaning Up ... - */ - void Clean() - { - // - // Commons ... - symbol = NULL; - period = NULL; - time = NULL; - - // - // Buffers ... - - // - Clean(maBuffer); - Clean(rsiBuffer); - Clean(atrBuffer); - Clean(strBuffer); - Clean(le1Buffer); - Clean(se1Buffer); - Clean(le2Buffer); - Clean(se2Buffer); - Clean(sarBuffer); - Clean(cHHBuffer); - Clean(cLLBuffer); - Clean(sHHBuffer); - Clean(sLLBuffer); - Clean(mHHBuffer); - Clean(mLLBuffer); - Clean(lHHBuffer); - Clean(lLLBuffer); - Clean(hHHBuffer); - Clean(hLLBuffer); - Clean(upTBuffer); - Clean(adxBuffer); - Clean(adxPBuffer); - Clean(adxMBuffer); - Clean(peaksBuffer); - Clean(valesBuffer); - Clean(strUpBuffer); - Clean(downTBuffer); - Clean(deltaBuffer); - Clean(volumeBuffer); - Clean(masMidBuffer); - Clean(strDownBuffer); - Clean(vwapMidBuffer); - Clean(upTrendBuffer); - Clean(x3maMidBuffer); - Clean(deltaMaBuffer); - Clean(masUpperBuffer); - Clean(masLowerBuffer); - Clean(le1StartBuffer); - Clean(se1StartBuffer); - Clean(le2StartBuffer); - Clean(se2StartBuffer); - Clean(strPriceBuffer); - Clean(atrUpperBuffer); - Clean(atrLowerBuffer); - Clean(strStateBuffer); - Clean(vwapFastBuffer); - Clean(vwapSlowBuffer); - Clean(xhkSMLowBuffer); - Clean(x3maFastBuffer); - Clean(x3maSlowBuffer); - Clean(supportsBuffer); - Clean(kijunSenBuffer); - Clean(tenkanSenBuffer); - Clean(downTrendBuffer); - Clean(vwapPriceBuffer); - Clean(xhkRawLowBuffer); - Clean(xhkSMOpenBuffer); - Clean(xhkSMHighBuffer); - Clean(chikouSpanBuffer); - Clean(xhkRawOpenBuffer); - Clean(xhkRawHighBuffer); - Clean(xhkSMCloseBuffer); - Clean(vwapVolumeBuffer); - Clean(deltaStateBuffer); - Clean(senkouSpanABuffer); - Clean(senkouSpanBBuffer); - Clean(peaksGoldenBuffer); - Clean(valesGoldenBuffer); - Clean(xhkRawCloseBuffer); - Clean(atrUpperRawBuffer); - Clean(atrLowerRawBuffer); - Clean(donLowUpperBuffer); - Clean(donLowLowerBuffer); - Clean(resistancesBuffer); - Clean(vwapMidStateBuffer); - Clean(donOpenUpperBuffer); - Clean(donOpenLowerBuffer); - Clean(donHighUpperBuffer); - Clean(donHighLowerBuffer); - Clean(x3maMidStateBuffer); - Clean(bullishVolumeBuffer); - Clean(bearishVolumeBuffer); - Clean(fractalsUpperBuffer); - Clean(fractalsLowerBuffer); - Clean(vwapFastStateBuffer); - Clean(vwapSlowStateBuffer); - Clean(donCloseUpperBuffer); - Clean(donCloseLowerBuffer); - Clean(x3maFastStateBuffer); - Clean(x3maSlowStateBuffer); - Clean(bullishVolumeMaBuffer); - Clean(bearishVolumeMaBuffer); - - // - ArraySetAsSeries(maBuffer, true); - ArraySetAsSeries(rsiBuffer, true); - ArraySetAsSeries(atrBuffer, true); - ArraySetAsSeries(strBuffer, true); - ArraySetAsSeries(le1Buffer, true); - ArraySetAsSeries(se1Buffer, true); - ArraySetAsSeries(le2Buffer, true); - ArraySetAsSeries(se2Buffer, true); - ArraySetAsSeries(sarBuffer, true); - ArraySetAsSeries(cHHBuffer, true); - ArraySetAsSeries(cLLBuffer, true); - ArraySetAsSeries(sHHBuffer, true); - ArraySetAsSeries(sLLBuffer, true); - ArraySetAsSeries(mHHBuffer, true); - ArraySetAsSeries(mLLBuffer, true); - ArraySetAsSeries(lHHBuffer, true); - ArraySetAsSeries(lLLBuffer, true); - ArraySetAsSeries(hHHBuffer, true); - ArraySetAsSeries(hLLBuffer, true); - ArraySetAsSeries(upTBuffer, true); - ArraySetAsSeries(adxBuffer, true); - ArraySetAsSeries(adxPBuffer, true); - ArraySetAsSeries(adxMBuffer, true); - ArraySetAsSeries(peaksBuffer, true); - ArraySetAsSeries(valesBuffer, true); - ArraySetAsSeries(strUpBuffer, true); - ArraySetAsSeries(downTBuffer, true); - ArraySetAsSeries(deltaBuffer, true); - ArraySetAsSeries(volumeBuffer, true); - ArraySetAsSeries(masMidBuffer, true); - ArraySetAsSeries(deltaMaBuffer, true); - ArraySetAsSeries(strDownBuffer, true); - ArraySetAsSeries(vwapMidBuffer, true); - ArraySetAsSeries(upTrendBuffer, true); - ArraySetAsSeries(x3maMidBuffer, true); - ArraySetAsSeries(masUpperBuffer, true); - ArraySetAsSeries(masLowerBuffer, true); - ArraySetAsSeries(le1StartBuffer, true); - ArraySetAsSeries(se1StartBuffer, true); - ArraySetAsSeries(le2StartBuffer, true); - ArraySetAsSeries(se2StartBuffer, true); - ArraySetAsSeries(strPriceBuffer, true); - ArraySetAsSeries(atrUpperBuffer, true); - ArraySetAsSeries(atrLowerBuffer, true); - ArraySetAsSeries(strStateBuffer, true); - ArraySetAsSeries(vwapFastBuffer, true); - ArraySetAsSeries(vwapSlowBuffer, true); - ArraySetAsSeries(xhkSMLowBuffer, true); - ArraySetAsSeries(x3maFastBuffer, true); - ArraySetAsSeries(x3maSlowBuffer, true); - ArraySetAsSeries(supportsBuffer, true); - ArraySetAsSeries(kijunSenBuffer, true); - ArraySetAsSeries(tenkanSenBuffer, true); - ArraySetAsSeries(downTrendBuffer, true); - ArraySetAsSeries(vwapPriceBuffer, true); - ArraySetAsSeries(xhkRawLowBuffer, true); - ArraySetAsSeries(xhkSMOpenBuffer, true); - ArraySetAsSeries(xhkSMHighBuffer, true); - ArraySetAsSeries(deltaStateBuffer, true); - ArraySetAsSeries(chikouSpanBuffer, true); - ArraySetAsSeries(xhkRawOpenBuffer, true); - ArraySetAsSeries(xhkRawHighBuffer, true); - ArraySetAsSeries(xhkSMCloseBuffer, true); - ArraySetAsSeries(vwapVolumeBuffer, true); - ArraySetAsSeries(senkouSpanABuffer, true); - ArraySetAsSeries(senkouSpanBBuffer, true); - ArraySetAsSeries(peaksGoldenBuffer, true); - ArraySetAsSeries(valesGoldenBuffer, true); - ArraySetAsSeries(xhkRawCloseBuffer, true); - ArraySetAsSeries(atrUpperRawBuffer, true); - ArraySetAsSeries(atrLowerRawBuffer, true); - ArraySetAsSeries(donLowUpperBuffer, true); - ArraySetAsSeries(donLowLowerBuffer, true); - ArraySetAsSeries(resistancesBuffer, true); - ArraySetAsSeries(vwapMidStateBuffer, true); - ArraySetAsSeries(donOpenUpperBuffer, true); - ArraySetAsSeries(donOpenLowerBuffer, true); - ArraySetAsSeries(donHighUpperBuffer, true); - ArraySetAsSeries(donHighLowerBuffer, true); - ArraySetAsSeries(x3maMidStateBuffer, true); - ArraySetAsSeries(bullishVolumeBuffer, true); - ArraySetAsSeries(bearishVolumeBuffer, true); - ArraySetAsSeries(fractalsUpperBuffer, true); - ArraySetAsSeries(fractalsLowerBuffer, true); - ArraySetAsSeries(vwapFastStateBuffer, true); - ArraySetAsSeries(vwapSlowStateBuffer, true); - ArraySetAsSeries(donCloseUpperBuffer, true); - ArraySetAsSeries(donCloseLowerBuffer, true); - ArraySetAsSeries(x3maFastStateBuffer, true); - ArraySetAsSeries(x3maSlowStateBuffer, true); - ArraySetAsSeries(bullishVolumeMaBuffer, true); - ArraySetAsSeries(bearishVolumeMaBuffer, true); - - // - cheMin = 0; - cheMax = 0; - vwapMin = 0; - vwapMax = 0; - x3maMin = 0; - x3maMax = 0; - senkouMax = 0; - senkouMin = 0; - tenKijMax = 0; - tenKijMin = 0; - // - // Slopes ... - - rsiSlope = 0; - strSlope = 0; - atrUpperSlope = 0; - atrLowerSlope = 0; - vwapFastSlope = 0; - vwapMidSlope = 0; - vwapSlowSlope = 0; - - // - // Conditions ... - - // - isRsiSlopeBullish = false; - isStrSlopeBullish = false; - isAtrUpperSlopeBullish = false; - isAtrLowerSlopeBullish = false; - isVwapFastSlopeBullish = false; - isVwapMidSlopeBullish = false; - isVwapSlowSlopeBullish = false; - - // - isRsiSlopeBearish = false; - isStrSlopeBearish = false; - isAtrUpperSlopeBearish = false; - isAtrLowerSlopeBearish = false; - isVwapFastSlopeBearish = false; - isVwapMidSlopeBearish = false; - isVwapSlowSlopeBearish = false; - - // - // RSI ... - - // - isRsiOverBought = false; - isRsiCrossedOverOverBought = false; - isRsiCrossedUnderOverBought = false; - - // - isRsiOverSold = false; - isRsiCrossedUnderOverSold = false; - isRsiCrossedOverOverSold = false; - - // - // ATR ... - - // - isClosedOverAtrUpper = false; - isClosedOverAtrLower = false; - isClosedUnderAtrUpper = false; - isClosedUnderAtrLower = false; - - // - // DON ... - - // - // SAR ... - - // - isSarBullish = false; - isSarBearish = false; - isSarSwitchedToBullish = false; - isSarSwitchedToBearish = false; - - // - // PV ... - - // - isNewPeak = false; - isNewPeakOverLast = false; - isNewPeakUnderLast = false; - - // - isNewVale = false; - isNewValeOverLast = false; - isNewValeUnderLast = false; - - // - // STR ... - - // - isStrBullish = false; - isStrBearish = false; - isStrSwitchedToBullish = false; - isStrSwitchedToBearish = false; - - // - // VWAP ... - isVWapMidBullish = false; - isVWapMidBearish = false; - isVWapMidNeutural = false; - isVWapSlowBullish = false; - isVWapSlowBearish = false; - isVWapFastBullish = false; - isVWapFastBearish = false; - isVWapFastOverMid = false; - isVWapMidOverSlow = false; - isVWapFastNeutural = false; - isVWapSlowNeutural = false; - isVWapFastUnderMid = false; - isVWapMidUnderSlow = false; - isVWapBullishState = false; - isVWapBearishState = false; - isVWapNeuturalState = false; - isVWapBullishOrdered = false; - isVWapBearishOrdered = false; - isVWapSwitchedToBullishState = false; - isVWapSwitchedToBearishState = false; - isVWapSwitchedToNeuturalState = false; - isVWapSwitchedToBullishOrdered = false; - isVWapSwitchedToBearishOrdered = false; - - // - // X3MA ... - isX3MaMidBullish = false; - isX3MaMidBearish = false; - isX3MaFastBullish = false; - isX3MaFastBearish = false; - isX3MaMidNeutural = false; - isX3MaSlowBullish = false; - isX3MaSlowBearish = false; - isX3MaFastOverMid = false; - isX3MaMidOverSlow = false; - isX3MaFastNeutural = false; - isX3MaSlowNeutural = false; - isX3MaFastUnderMid = false; - isX3MaMidUnderSlow = false; - isX3MaBullishState = false; - isX3MaBearishState = false; - isX3MaNeuturalState = false; - isX3MaBullishOrdered = false; - isX3MaBearishOrdered = false; - isX3MaSwitchedToBullishState = false; - isX3MaSwitchedToBearishState = false; - isX3MaSwitchedToNeuturalState = false; - isX3MaSwitchedToBullishOrdered = false; - isX3MaSwitchedToBearishOrdered = false; - - // - // CHE ... - - // - isCheBullish = false; - isCheBearish = false; - isChe1Bullish = false; - isChe1Bearish = false; - isChe2Bullish = false; - isChe2Bearish = false; - isClosedOverCheMin = false; - isClosedOverCheMax = false; - isClosedUnderCheMin = false; - isClosedUnderCheMax = false; - isCheSwitchedToBullish = false; - isCheSwitchedToBearish = false; - isChe1SwitchedToBullish = false; - isChe1SwitchedToBearish = false; - isChe2SwitchedToBullish = false; - isChe2SwitchedToBearish = false; - - // - // XHK ... - isSMHKBullish = false; - isRawHKBullish = false; - isSMHKBearish = false; - isRawHKBearish = false; - isClosedOverSMHK = false; - isClosedUnderSMHK = false; - isClosedOverRawHK = false; - isClosedUnderRawHK = false; - isRawHKClosedOverSMHK = false; - isSMHKSwitchedToBearish = false; - isRawHKSwitchedToBearish = false; - isRawHKClosedUnderSMHK = false; - isSMHKSwitchedToBullish = false; - isRawHKSwitchedToBullish = false; - - // - // XICH ... - isSenkouSpanAOverB = false; - isSenkouSpanAUnderB = false; - isTenkanSenOverKijunSen = false; - isTenkanSenUnderKijunSen = false; - isSenkouSpanACrossedOverB = false; - isSenkouSpanACrossedUnderB = false; - isTenkanSenCrossedOverKijunSen = false; - isTenkanSenCrossedUnderKijunSen = false; - - // - // XDELTA ... - - // - isDeltaBullish = false; - isDeltaBearish = false; - isDeltaSwitchedToBullish = false; - isDeltaSwitchedToBearish = false; - - // - isDeltaOverMa = false; - isDeltaUnderMa = false; - isDeltaCrossedOverMa = false; - isDeltaCrossedUnderMa = false; - - // - // XVOLUME ... - - // - isBullishVolumeOverMa = false; - isBullishVolumeCrossedOverMa = false; - - // - isBullishVolumeUnderMa = false; - isBullishVolumeCrossedUnderMa = false; - - // - isBullishVolumeIncreased = false; - isBullishVolumeSwitchedToIncreased = false; - - // - isBullishVolumeDecreased = false; - isBullishVolumeSwitchedToDecreased = false; - - // - isBearishVolumeOverMa = false; - isBearishVolumeCrossedOverMa = false; - - // - isBearishVolumeUnderMa = false; - isBearishVolumeCrossedUnderMa = false; - - // - isBearishVolumeIncreased = false; - isBearishVolumeSwitchedToIncreased = false; - - // - isBearishVolumeDecreased = false; - isBearishVolumeSwitchedToDecreased = false; - - // - isVolumeSwitchedToBullish = false; - isVolumeSwitchedToBearish = false; - - // - isBullishVolumeMaOverBearishVolumeMa = false; - isBullishVolumeMaUnderBearishVolumeMa = false; - - // - // Complex Conditions ... - - // - isSarIncreased = false; - isSarDecreased = false; - isX3MaFatsOverMid = false; - isSarEqualsToPeak = false; - isSarEqualsToVale = false; - isStrEqualsToPeak = false; - isStrEqualsToVale = false; - isX3MaFatsUnderMid = false; - isX3MaFatsOverSlow = false; - isAtrUpperOverPeak = false; - isPeakOverAtrUpper = false; - isStrUpperOverPeak = false; - isStrLowerOverVale = false; - isClosedOverCheMin = false; - isClosedOverCheMax = false; - isX3MaFatsUnderSlow = false; - isAtrLowerUnderVale = false; - isClosedOverX3MaMin = false; - isClosedOverX3MaMax = false; - isValeUnderAtrLower = false; - isStrUpperUnderPeak = false; - isStrLowerUnderVale = false; - isClosedUnderCheMin = false; - isClosedUnderCheMax = false; - isClosedOverVWapMin = false; - isClosedOverVWapMax = false; - isClosedUnderX3MaMin = false; - isClosedUnderX3MaMax = false; - isStrCrossedOverVale = false; - isSarCrossedOverVale = false; - isClosedUnderVWapMin = false; - isClosedUnderVWapMax = false; - isX3MaFatsOverMidPrev = false; - isSarCrossedUnderPeak = false; - isStrCrossedUnderPeak = false; - isNewPeakOverAtrUpper = false; - isX3MaFatsUnderMidPrev = false; - isX3MaFatsOverSlowPrev = false; - isAtrUpperEqualsToPeak = false; - isAtrLowerEqualsToVale = false; - isStrUpperOverAtrUpper = false; - isStrLowerOverAtrLower = false; - isNewValeUnderAtrLower = false; - isAtrUpperCrossedUpPeak = false; - isAtrLowerCrossedUpVale = false; - isStrUpperUnderAtrUpper = false; - isStrLowerUnderAtrLower = false; - isX3MaFatsUnderSlowPrev = false; - isX3MaFastCrossedOverMid = false; - isVWapFastCrossedOverMid = false; - isX3MaFastCrossedUnderMid = false; - isX3MaFastCrossedOverSlow = false; - isAtrUpperCrossedDownPeak = false; - isAtrLowerCrossedDownVale = false; - isStrLowerOverDonLowLower = false; - isVWapFastCrossedUnderMid = false; - isStrUpperCrossedOverPeak = false; - isStrLowerCrossedOverVale = false; - isDonLowLowerEqualsToVale = false; - isVWapFastCrossedOverSlow = false; - isX3MaFastCrossedUnderSlow = false; - isStrUpperOverDonHighUpper = false; - isStrLowerUnderDonLowLower = false; - isVWapFastCrossedUnderSlow = false; - isStrUpperCrossedUnderPeak = false; - isStrLowerCrossedUnderVale = false; - isDonHighUpperEqualsToPeak = false; - isStrUpperUnderDonHighUpper = false; - isStrUpperCrossedOverAtrUpper = false; - isStrLowerCrossedOverAtrLower = false; - isStrUpperCrossedUnderAtrUpper = false; - isStrLowerCrossedUnderAtrLower = false; - isStrLowerCrossedOverDonLowLower = false; - isStrUpperCrossedOverDonHighUpper = false; - isStrLowerCrossedUnderDonLowLower = false; - isStrUpperCrossedUnderDonHighUpper = false; - - // - ZeroMemory(this); - } - - /** - * Generate Conditions Scores ... - * - * @param bullishScore: Double, Directional Scores Reference ... - * @param bearishScore: Double, Directional Scores Reference ... - */ - void GenerateScore( - double &bullishScore, - double &bearishScore // - ) - { - // - bullishScore = 0; - bearishScore = 0; - - // - double score = 1; - double minScore = 0.5; - double highScore = 1.5; - - // - // SLOPES ... - - // - if (isRsiSlopeBullish) - { - bullishScore += minScore; - } - if (isStrSlopeBullish) - { - bullishScore += minScore; - } - if (isAtrUpperSlopeBullish) - { - bullishScore += minScore; - } - if (isAtrLowerSlopeBullish) - { - bullishScore += minScore; - } - if (isVwapFastSlopeBullish) - { - bullishScore += minScore; - } - if (isVwapMidSlopeBullish) - { - bullishScore += minScore; - } - if (isVwapSlowSlopeBullish) - { - bullishScore += minScore; - } - - // - if (isRsiSlopeBearish) - { - bearishScore += minScore; - } - if (isStrSlopeBearish) - { - bearishScore += minScore; - } - if (isAtrUpperSlopeBearish) - { - bearishScore += minScore; - } - if (isAtrLowerSlopeBearish) - { - bearishScore += minScore; - } - if (isVwapFastSlopeBearish) - { - bearishScore += minScore; - } - if (isVwapMidSlopeBearish) - { - bearishScore += minScore; - } - if (isVwapSlowSlopeBearish) - { - bearishScore += minScore; - } - - // - // COMPLEX ... - - // - if (isRsiOverSold) - { - bullishScore += score; - } - if (isRsiCrossedUnderOverSold) - { - bullishScore += highScore; - } - - // - if (isRsiOverBought) - { - bearishScore += score; - } - if (isRsiCrossedOverOverBought) - { - bearishScore += highScore; - } - - // - // XSAR ... - - // - if (isSarBullish) - { - bullishScore += minScore; - } - if (isSarSwitchedToBullish) - { - bullishScore += score; - } - - // - if (isSarBearish) - { - bearishScore += minScore; - } - if (isSarSwitchedToBearish) - { - bearishScore += score; - } - - // - // XSTR ... - - // - if (isStrBullish) - { - bullishScore += minScore; - } - if (isStrSwitchedToBullish) - { - bullishScore += score; - } - - // - if (isStrBearish) - { - bearishScore += minScore; - } - if (isStrSwitchedToBearish) - { - bearishScore += score; - } - - // - // XCHE ... - - // - if (isCheBullish) - { - bullishScore += score; - } - if (isCheSwitchedToBullish) - { - bullishScore += highScore; - } - if (isChe1Bullish && - !isCheBullish && - !isCheSwitchedToBullish) - { - bullishScore += minScore; - } - if (isChe1SwitchedToBullish && - !isCheBullish && - !isCheSwitchedToBullish) - { - bullishScore += minScore; - } - - // - if (isCheBearish) - { - bearishScore += score; - } - if (isCheSwitchedToBearish) - { - bearishScore += highScore; - } - if (isChe1Bearish && - !isCheBearish && - !isCheSwitchedToBearish) - { - bearishScore += minScore; - } - if (isChe1SwitchedToBearish && - !isCheBearish && - !isCheSwitchedToBearish) - { - bearishScore += minScore; - } - - // - // XVWAP ... - - // - if (isVWapBullishState) - { - bullishScore += score; - } - if (isVWapBullishOrdered) - { - bullishScore += score; - } - if (isVWapSwitchedToBullishState) - { - bullishScore += highScore; - } - if (isVWapSwitchedToBullishOrdered) - { - bullishScore += highScore; - } - if (!isVWapBullishState && - !isVWapSwitchedToBullishState) - { - // - if (isVWapFastBullish) - { - bullishScore += minScore; - } - if (isVWapSlowBullish) - { - bullishScore += minScore; - } - } - if (!isVWapBullishOrdered && - !isVWapSwitchedToBullishOrdered) - { - // - if (isVWapFastOverMid) - { - bullishScore += minScore; - } - if (isVWapMidOverSlow) - { - bullishScore += minScore; - } - } - - // - if (isVWapBearishState) - { - bearishScore += score; - } - if (isVWapBearishOrdered) - { - bearishScore += score; - } - if (isVWapSwitchedToBearishState) - { - bearishScore += highScore; - } - if (isVWapSwitchedToBearishOrdered) - { - bearishScore += highScore; - } - if (!isVWapBearishState && - !isVWapSwitchedToBearishState) - { - // - if (isVWapFastBearish) - { - bearishScore += minScore; - } - if (isVWapSlowBearish) - { - bearishScore += minScore; - } - } - if (!isVWapBearishOrdered && - !isVWapSwitchedToBearishOrdered) - { - // - if (isVWapFastUnderMid) - { - bearishScore += minScore; - } - if (isVWapMidUnderSlow) - { - bearishScore += minScore; - } - } - - // - // X3MA ... - - // - if (isX3MaBullishState) - { - bullishScore += score; - } - if (isX3MaBullishOrdered) - { - bullishScore += score; - } - if (isX3MaSwitchedToBullishState) - { - bullishScore += highScore; - } - if (isX3MaSwitchedToBullishOrdered) - { - bullishScore += highScore; - } - if (!isX3MaBullishState && - !isX3MaSwitchedToBullishState) - { - // - if (isX3MaFastBullish) - { - bullishScore += minScore; - } - if (isX3MaSlowBullish) - { - bullishScore += minScore; - } - } - if (!isX3MaBullishOrdered && - !isX3MaSwitchedToBullishOrdered) - { - // - if (isX3MaFastOverMid) - { - bullishScore += minScore; - } - if (isX3MaMidOverSlow) - { - bullishScore += minScore; - } - } - - // - if (isX3MaBearishState) - { - bearishScore += score; - } - if (isX3MaBearishOrdered) - { - bearishScore += score; - } - if (isX3MaSwitchedToBearishState) - { - bearishScore += highScore; - } - if (isX3MaSwitchedToBearishOrdered) - { - bearishScore += highScore; - } - if (!isX3MaBearishState && - !isX3MaSwitchedToBearishState) - { - // - if (isX3MaFastBearish) - { - bearishScore += minScore; - } - if (isX3MaSlowBearish) - { - bearishScore += minScore; - } - } - if (!isX3MaBearishOrdered && - !isX3MaSwitchedToBearishOrdered) - { - // - if (isX3MaFastUnderMid) - { - bearishScore += minScore; - } - if (isX3MaMidUnderSlow) - { - bearishScore += minScore; - } - } - - // - // XSMHK ... - - // - if (isSMHKBullish) - { - bullishScore += minScore; - } - if (isRawHKBullish) - { - bullishScore += minScore; - } - if (isClosedOverSMHK) - { - bullishScore += minScore; - } - if (isClosedOverRawHK) - { - bullishScore += minScore; - } - if (isRawHKClosedOverSMHK) - { - bullishScore += minScore; - } - if (isSMHKSwitchedToBullish) - { - bullishScore += highScore; - } - if (isRawHKSwitchedToBullish) - { - bullishScore += highScore; - } - - // - if (isSMHKBearish) - { - bearishScore += minScore; - } - if (isRawHKBearish) - { - bearishScore += minScore; - } - if (isClosedUnderSMHK) - { - bearishScore += minScore; - } - if (isClosedUnderRawHK) - { - bearishScore += minScore; - } - if (isRawHKClosedUnderSMHK) - { - bearishScore += minScore; - } - if (isSMHKSwitchedToBearish) - { - bearishScore += highScore; - } - if (isRawHKSwitchedToBullish) - { - bearishScore += highScore; - } - - // - // XICH ... - if (isSenkouSpanAOverB) - { - bullishScore += minScore; - } - if (isTenkanSenOverKijunSen) - { - bullishScore += minScore; - } - if (isSenkouSpanACrossedOverB) - { - bullishScore += highScore; - } - if (isTenkanSenCrossedOverKijunSen) - { - bullishScore += highScore; - } - if (isSenkouSpanAUnderB) - { - bearishScore += minScore; - } - if (isTenkanSenUnderKijunSen) - { - bearishScore += minScore; - } - if (isSenkouSpanACrossedUnderB) - { - bearishScore += highScore; - } - if (isTenkanSenCrossedUnderKijunSen) - { - bearishScore += highScore; - } - - // - // Complex Conditions ... - - // - if (isSarIncreased) - { - bullishScore += minScore; - } - if (isSarEqualsToVale) - { - bullishScore += minScore; - } - if (isSarCrossedOverVale) - { - bullishScore += score; - } - - // - if (isAtrLowerUnderVale) - { - bullishScore += minScore; - } - if (isValeUnderAtrLower) - { - bullishScore += minScore; - } - if (isNewValeUnderAtrLower) - { - bullishScore += minScore; - } - if (isAtrLowerEqualsToVale) - { - bullishScore += minScore; - } - if (isStrLowerOverAtrLower) - { - bullishScore += minScore; - } - if (isStrUpperOverAtrUpper) - { - bullishScore += minScore; - } - if (isAtrLowerCrossedUpVale) - { - bullishScore += score; - } - if (isAtrUpperCrossedUpPeak) - { - bullishScore += score; - } - if (isStrLowerCrossedOverAtrLower) - { - bullishScore += score; - } - if (isStrUpperCrossedOverAtrUpper) - { - bullishScore += score; - } - - // - if (isStrEqualsToVale) - { - bullishScore += minScore; - } - if (isStrLowerOverVale) - { - bullishScore += minScore; - } - if (isStrLowerUnderVale) - { - bullishScore += minScore; - } - if (isStrCrossedOverVale) - { - bullishScore += score; - } - if (isStrUpperCrossedOverPeak) - { - bullishScore += score; - } - if (isStrLowerCrossedOverVale) - { - bullishScore += score; - } - if (isStrLowerUnderDonLowLower) - { - bullishScore += minScore; - } - if (isStrLowerCrossedOverDonLowLower) - { - bullishScore += score; - } - if (isStrUpperCrossedOverDonHighUpper) - { - bullishScore += score; - } - - // - if (isClosedOverVWapMin) - { - bullishScore += minScore; - } - if (isClosedOverVWapMax) - { - bullishScore += minScore; - } - if (isVWapFastCrossedOverMid) - { - bullishScore += score; - } - if (isVWapFastCrossedOverSlow) - { - bullishScore += score; - } - - // - if (isClosedOverX3MaMin) - { - bullishScore += minScore; - } - if (isClosedOverX3MaMax) - { - bullishScore += minScore; - } - if (isX3MaFastCrossedOverMid) - { - bullishScore += score; - } - if (isX3MaFastCrossedOverSlow) - { - bullishScore += score; - } - - // - if (isClosedOverCheMin) - { - bullishScore += minScore; - } - if (isClosedOverCheMax) - { - bullishScore += minScore; - } - if (isDonLowLowerEqualsToVale) - { - bullishScore += minScore; - } - - // - // XDELTA ... - - // - if (isDeltaOverMa) - { - bullishScore += minScore; - } - if (isDeltaBullish) - { - bullishScore += minScore; - } - if (isDeltaCrossedOverMa) - { - bullishScore += score; - } - if (isDeltaSwitchedToBullish) - { - bullishScore += score; - } - - if (isDeltaBearish) - { - bearishScore += minScore; - } - if (isDeltaUnderMa) - { - bearishScore += minScore; - } - if (isDeltaCrossedUnderMa) - { - bearishScore += score; - } - if (isDeltaSwitchedToBearish) - { - bearishScore += score; - } - - // - // XVOLUME ... - - // - if (isBullishVolumeOverMa) - { - bullishScore += minScore; - } - if (isBearishVolumeUnderMa) - { - bullishScore += minScore; - } - if (isBullishVolumeIncreased) - { - bullishScore += minScore; - } - if (isBearishVolumeDecreased) - { - bullishScore += minScore; - } - if (isBullishVolumeMaOverBearishVolumeMa) - { - bullishScore += minScore; - } - - // - if (isVolumeSwitchedToBullish) - { - bullishScore += score; - } - if (isBullishVolumeCrossedOverMa) - { - bullishScore += score; - } - if (isBearishVolumeCrossedUnderMa) - { - bullishScore += score; - } - if (isBullishVolumeSwitchedToIncreased) - { - bullishScore += score; - } - if (isBearishVolumeSwitchedToDecreased) - { - bullishScore += score; - } - - // - if (isBearishVolumeOverMa) - { - bearishScore += minScore; - } - if (isBullishVolumeUnderMa) - { - bearishScore += minScore; - } - if (isBullishVolumeDecreased) - { - bearishScore += minScore; - } - if (isBearishVolumeIncreased) - { - bearishScore += minScore; - } - if (isBullishVolumeMaUnderBearishVolumeMa) - { - bearishScore += minScore; - } - - // - if (isVolumeSwitchedToBearish) - { - bearishScore += score; - } - if (isBearishVolumeCrossedOverMa) - { - bearishScore += score; - } - if (isBullishVolumeCrossedUnderMa) - { - bearishScore += score; - } - if (isBullishVolumeSwitchedToDecreased) - { - bearishScore += score; - } - if (isBearishVolumeSwitchedToIncreased) - { - bearishScore += score; - } - - // - // - // - - // - if (isSarDecreased) - { - bearishScore += minScore; - } - if (isSarEqualsToPeak) - { - bearishScore += minScore; - } - if (isSarCrossedUnderPeak) - { - bearishScore += score; - } - - // - if (isAtrUpperOverPeak) - { - bearishScore += minScore; - } - if (isPeakOverAtrUpper) - { - bearishScore += minScore; - } - if (isNewPeakOverAtrUpper) - { - bearishScore += minScore; - } - if (isAtrUpperEqualsToPeak) - { - bearishScore += minScore; - } - if (isStrLowerUnderAtrLower) - { - bearishScore += minScore; - } - if (isStrUpperUnderAtrUpper) - { - bearishScore += minScore; - } - if (isAtrLowerCrossedDownVale) - { - bearishScore += score; - } - if (isAtrUpperCrossedDownPeak) - { - bearishScore += score; - } - if (isStrLowerCrossedUnderAtrLower) - { - bearishScore += score; - } - if (isStrUpperCrossedUnderAtrUpper) - { - bearishScore += score; - } - - // - if (isStrEqualsToPeak) - { - bearishScore += minScore; - } - if (isStrUpperOverPeak) - { - bearishScore += minScore; - } - if (isStrUpperUnderPeak) - { - bearishScore += minScore; - } - if (isStrCrossedUnderPeak) - { - bearishScore += score; - } - if (isStrLowerOverDonLowLower) - { - bearishScore += minScore; - } - if (isStrUpperOverDonHighUpper) - { - bearishScore += minScore; - } - if (isStrUpperCrossedUnderPeak) - { - bearishScore += score; - } - if (isStrLowerCrossedUnderVale) - { - bearishScore += score; - } - if (isStrUpperUnderDonHighUpper) - { - bearishScore += minScore; - } - if (isStrLowerCrossedUnderDonLowLower) - { - bearishScore += score; - } - if (isStrUpperCrossedUnderDonHighUpper) - { - bearishScore += score; - } - - // - if (isClosedUnderVWapMin) - { - bearishScore += minScore; - } - if (isClosedUnderVWapMax) - { - bearishScore += minScore; - } - if (isVWapFastCrossedUnderMid) - { - bearishScore += score; - } - if (isVWapFastCrossedUnderSlow) - { - bearishScore += score; - } - - // - if (isClosedUnderX3MaMin) - { - bearishScore += minScore; - } - if (isClosedUnderX3MaMax) - { - bearishScore += minScore; - } - if (isX3MaFastCrossedUnderMid) - { - bearishScore += score; - } - if (isX3MaFastCrossedUnderSlow) - { - bearishScore += score; - } - - // - if (isClosedUnderCheMin) - { - bearishScore += minScore; - } - if (isClosedUnderCheMax) - { - bearishScore += minScore; - } - if (isDonHighUpperEqualsToPeak) - { - bearishScore += minScore; - } - - // - // - // - } - - /** - * Generate Summary String for Represent Conditions State ... - * - * @param onlyCommons: Boolean, Just Generate Only Commons Conditions ... - * @param onlyConditions: Boolean, Just Generate Only Conditions ... - * @param includeScores: Boolean, Attach Scores Representations on Result ... - * @param ignoreFalseConditions: Boolean, Ignore False Conditions on Result ... - * @param separator: String, Separate Lines ... - * - * @return ( string ) - */ - string GenerateSummary( - bool onlyCommons = false, - bool onlyConditions = false, - bool includeScores = true, - bool ignoreFalseConditions = true, - string separator = "\n" // - ) - { - // - string result = NULL; - - // - double bullishScore = 0; - double bearishScore = 0; - GenerateScore( - bullishScore, - bearishScore // - ); - - // - string scoresStr = - // - "Scores: " + separator + - "---------------" + separator + - "Bullish: " + ToString(bullishScore) + separator + - "Bearish: " + ToString(bearishScore) + separator + - "" - // - ; - - // - string commonStr = GenerateSpecifiedCommonSummary( - this, - separator, - includeScores // - ); - - // - string conditionsStr = - // - "-----------------------" + separator + - "SAR ..." + separator + - "-----------------------" + separator + - ToString("isSarBullish", isSarBullish, ignoreFalseConditions, separator) + - ToString("isSarBearish", isSarBearish, ignoreFalseConditions, separator) + - ToString("isSarSwitchedToBullish", isSarSwitchedToBullish, ignoreFalseConditions, separator) + - ToString("isSarSwitchedToBearish", isSarSwitchedToBearish, ignoreFalseConditions, separator) + - // - "-----------------------" + separator + - "STR ..." + separator + - "-----------------------" + separator + - ToString("isStrBullish", isStrBullish, ignoreFalseConditions, separator) + - ToString("isStrBearish", isStrBearish, ignoreFalseConditions, separator) + - ToString("isStrSwitchedToBullish", isStrSwitchedToBullish, ignoreFalseConditions, separator) + - ToString("isStrSwitchedToBearish", isStrSwitchedToBearish, ignoreFalseConditions, separator) + - // - "-----------------------" + separator + - "PV ..." + separator + - "-----------------------" + separator + - ToString("isNewPeak", isNewPeak, ignoreFalseConditions, separator) + - ToString("isNewPeakOverLast", isNewPeakOverLast, ignoreFalseConditions, separator) + - ToString("isNewPeakUnderLast", isNewPeakUnderLast, ignoreFalseConditions, separator) + - ToString("isNewVale", isNewVale, ignoreFalseConditions, separator) + - ToString("isNewValeOverLast", isNewValeOverLast, ignoreFalseConditions, separator) + - ToString("isNewValeUnderLast", isNewValeUnderLast, ignoreFalseConditions, separator) + - // - "-----------------------" + separator + - "> RSI ..." + separator + - "-----------------------" + separator + - ToString("isRsiOverBought", isRsiOverBought, ignoreFalseConditions, separator) + - ToString("isRsiCrossedOverOverBought", isRsiCrossedOverOverBought, ignoreFalseConditions, separator) + - ToString("isRsiCrossedUnderOverBought", isRsiCrossedUnderOverBought, ignoreFalseConditions, separator) + - ToString("isRsiOverSold", isRsiOverSold, ignoreFalseConditions, separator) + - ToString("isRsiCrossedUnderOverSold", isRsiCrossedUnderOverSold, ignoreFalseConditions, separator) + - ToString("isRsiCrossedOverOverSold", isRsiCrossedOverOverSold, ignoreFalseConditions, separator) + - // - "-----------------------" + separator + - "ATR ..." + separator + - "-----------------------" + separator + - ToString("isClosedOverAtrUpper", isClosedOverAtrUpper, ignoreFalseConditions, separator) + - ToString("isClosedOverAtrLower", isClosedOverAtrLower, ignoreFalseConditions, separator) + - ToString("isClosedUnderAtrUpper", isClosedUnderAtrUpper, ignoreFalseConditions, separator) + - ToString("isClosedUnderAtrLower", isClosedUnderAtrLower, ignoreFalseConditions, separator) + - // - "-----------------------" + separator + - "DON ..." + separator + - "-----------------------" + separator + - // - "-----------------------" + separator + - "VWAP ..." + separator + - "-----------------------" + separator + - ToString("isVWapFastBullish", isVWapFastBullish, ignoreFalseConditions, separator) + - ToString("isVWapFastBearish", isVWapFastBearish, ignoreFalseConditions, separator) + - ToString("isVWapFastNeutural", isVWapFastNeutural, ignoreFalseConditions, separator) + - ToString("isVWapMidBullish", isVWapMidBullish, ignoreFalseConditions, separator) + - ToString("isVWapMidBearish", isVWapMidBearish, ignoreFalseConditions, separator) + - ToString("isVWapMidNeutural", isVWapMidNeutural, ignoreFalseConditions, separator) + - ToString("isVWapSlowBullish", isVWapSlowBullish, ignoreFalseConditions, separator) + - ToString("isVWapSlowBearish", isVWapSlowBearish, ignoreFalseConditions, separator) + - ToString("isVWapSlowNeutural", isVWapSlowNeutural, ignoreFalseConditions, separator) + - ToString("isVWapFastOverMid", isVWapFastOverMid, ignoreFalseConditions, separator) + - ToString("isVWapMidOverSlow", isVWapMidOverSlow, ignoreFalseConditions, separator) + - ToString("isVWapFastUnderMid", isVWapFastUnderMid, ignoreFalseConditions, separator) + - ToString("isVWapMidUnderSlow", isVWapMidUnderSlow, ignoreFalseConditions, separator) + - ToString("isVWapBullishState", isVWapBullishState, ignoreFalseConditions, separator) + - ToString("isVWapBearishState", isVWapBearishState, ignoreFalseConditions, separator) + - ToString("isVWapNeuturalState", isVWapNeuturalState, ignoreFalseConditions, separator) + - ToString("isVWapBullishOrdered", isVWapBullishOrdered, ignoreFalseConditions, separator) + - ToString("isVWapBearishOrdered", isVWapBearishOrdered, ignoreFalseConditions, separator) + - ToString("isVWapSwitchedToBullishOrdered", isVWapSwitchedToBullishOrdered, ignoreFalseConditions, separator) + - ToString("isVWapSwitchedToBearishOrdered", isVWapSwitchedToBearishOrdered, ignoreFalseConditions, separator) + - ToString("isVWapSwitchedToBullishState", isVWapSwitchedToBullishState, ignoreFalseConditions, separator) + - ToString("isVWapSwitchedToBearishState", isVWapSwitchedToBearishState, ignoreFalseConditions, separator) + - ToString("isVWapSwitchedToNeuturalState", isVWapSwitchedToNeuturalState, ignoreFalseConditions, separator) + - // - "-----------------------" + separator + - "X3MA ..." + separator + - "-----------------------" + separator + - ToString("isX3MaMidBullish", isX3MaMidBullish, ignoreFalseConditions, separator) + - ToString("isX3MaMidBearish", isX3MaMidBearish, ignoreFalseConditions, separator) + - ToString("isX3MaFastBullish", isX3MaFastBullish, ignoreFalseConditions, separator) + - ToString("isX3MaFastBearish", isX3MaFastBearish, ignoreFalseConditions, separator) + - ToString("isX3MaMidNeutural", isX3MaMidNeutural, ignoreFalseConditions, separator) + - ToString("isX3MaSlowBullish", isX3MaSlowBullish, ignoreFalseConditions, separator) + - ToString("isX3MaSlowBearish", isX3MaSlowBearish, ignoreFalseConditions, separator) + - ToString("isX3MaFastOverMid", isX3MaFastOverMid, ignoreFalseConditions, separator) + - ToString("isX3MaMidOverSlow", isX3MaMidOverSlow, ignoreFalseConditions, separator) + - ToString("isX3MaFastNeutural", isX3MaFastNeutural, ignoreFalseConditions, separator) + - ToString("isX3MaSlowNeutural", isX3MaSlowNeutural, ignoreFalseConditions, separator) + - ToString("isX3MaFastUnderMid", isX3MaFastUnderMid, ignoreFalseConditions, separator) + - ToString("isX3MaMidUnderSlow", isX3MaMidUnderSlow, ignoreFalseConditions, separator) + - ToString("isX3MaBullishState", isX3MaBullishState, ignoreFalseConditions, separator) + - ToString("isX3MaBearishState", isX3MaBearishState, ignoreFalseConditions, separator) + - ToString("isX3MaNeuturalState", isX3MaNeuturalState, ignoreFalseConditions, separator) + - ToString("isX3MaBullishOrdered", isX3MaBullishOrdered, ignoreFalseConditions, separator) + - ToString("isX3MaBearishOrdered", isX3MaBearishOrdered, ignoreFalseConditions, separator) + - ToString("isX3MaSwitchedToBullishState", isX3MaSwitchedToBullishState, ignoreFalseConditions, separator) + - ToString("isX3MaSwitchedToBearishState", isX3MaSwitchedToBearishState, ignoreFalseConditions, separator) + - ToString("isX3MaSwitchedToNeuturalState", isX3MaSwitchedToNeuturalState, ignoreFalseConditions, separator) + - ToString("isX3MaSwitchedToBullishOrdered", isX3MaSwitchedToBullishOrdered, ignoreFalseConditions, separator) + - ToString("isX3MaSwitchedToBearishOrdered", isX3MaSwitchedToBearishOrdered, ignoreFalseConditions, separator) + - // - "-----------------------" + separator + - "CHE ..." + separator + - "-----------------------" + separator + - ToString("isChe1Bullish", isChe1Bullish, ignoreFalseConditions, separator) + - ToString("isChe1Bearish", isChe1Bearish, ignoreFalseConditions, separator) + - ToString("isChe1SwitchedToBullish", isChe1SwitchedToBullish, ignoreFalseConditions, separator) + - ToString("isChe1SwitchedToBearish", isChe1SwitchedToBearish, ignoreFalseConditions, separator) + - ToString("isChe2Bullish", isChe2Bullish, ignoreFalseConditions, separator) + - ToString("isChe2Bearish", isChe2Bearish, ignoreFalseConditions, separator) + - ToString("isChe2SwitchedToBullish", isChe2SwitchedToBullish, ignoreFalseConditions, separator) + - ToString("isChe2SwitchedToBearish", isChe2SwitchedToBearish, ignoreFalseConditions, separator) + - ToString("isCheBullish", isCheBullish, ignoreFalseConditions, separator) + - ToString("isCheBearish", isCheBearish, ignoreFalseConditions, separator) + - ToString("isCheSwitchedToBullish", isCheSwitchedToBullish, ignoreFalseConditions, separator) + - ToString("isCheSwitchedToBearish", isCheSwitchedToBearish, ignoreFalseConditions, separator) + - ToString("isClosedOverCheMin", isClosedOverCheMin, ignoreFalseConditions, separator) + - ToString("isClosedOverCheMax", isClosedOverCheMax, ignoreFalseConditions, separator) + - ToString("isClosedUnderCheMin", isClosedUnderCheMin, ignoreFalseConditions, separator) + - ToString("isClosedUnderCheMax", isClosedUnderCheMax, ignoreFalseConditions, separator) + - // - "-----------------------" + separator + - "HK ..." + separator + - "-----------------------" + separator + - ToString("isSMHKBullish", isSMHKBullish, ignoreFalseConditions, separator) + - ToString("isRawHKBullish", isRawHKBullish, ignoreFalseConditions, separator) + - ToString("isSMHKBearish", isSMHKBearish, ignoreFalseConditions, separator) + - ToString("isRawHKBearish", isRawHKBearish, ignoreFalseConditions, separator) + - ToString("isClosedOverSMHK", isClosedOverSMHK, ignoreFalseConditions, separator) + - ToString("isClosedUnderSMHK", isClosedUnderSMHK, ignoreFalseConditions, separator) + - ToString("isClosedOverRawHK", isClosedOverRawHK, ignoreFalseConditions, separator) + - ToString("isClosedUnderRawHK", isClosedUnderRawHK, ignoreFalseConditions, separator) + - ToString("isRawHKClosedOverSMHK", isRawHKClosedOverSMHK, ignoreFalseConditions, separator) + - ToString("isSMHKSwitchedToBearish", isSMHKSwitchedToBearish, ignoreFalseConditions, separator) + - ToString("isRawHKSwitchedToBearish", isRawHKSwitchedToBearish, ignoreFalseConditions, separator) + - ToString("isRawHKClosedUnderSMHK", isRawHKClosedUnderSMHK, ignoreFalseConditions, separator) + - ToString("isSMHKSwitchedToBullish", isSMHKSwitchedToBullish, ignoreFalseConditions, separator) + - ToString("isRawHKSwitchedToBullish", isRawHKSwitchedToBullish, ignoreFalseConditions, separator) + - // - "-----------------------" + separator + - "XICH ..." + separator + - "-----------------------" + separator + - ToString("isTenkanSenOverKijunSen", isTenkanSenOverKijunSen, ignoreFalseConditions, separator) + - ToString("isTenkanSenUnderKijunSen", isTenkanSenUnderKijunSen, ignoreFalseConditions, separator) + - ToString("isTenkanSenCrossedOverKijunSen", isTenkanSenCrossedOverKijunSen, ignoreFalseConditions, separator) + - ToString("isTenkanSenCrossedUnderKijunSen", isTenkanSenCrossedUnderKijunSen, ignoreFalseConditions, separator) + - ToString("isSenkouSpanAOverB", isSenkouSpanAOverB, ignoreFalseConditions, separator) + - ToString("isSenkouSpanAUnderB", isSenkouSpanAUnderB, ignoreFalseConditions, separator) + - ToString("isSenkouSpanACrossedOverB", isSenkouSpanACrossedOverB, ignoreFalseConditions, separator) + - ToString("isSenkouSpanACrossedUnderB", isSenkouSpanACrossedUnderB, ignoreFalseConditions, separator) + - // - "-----------------------" + separator + - "XDELTA ..." + separator + - "-----------------------" + separator + - ToString("isDeltaBullish", isDeltaBullish, ignoreFalseConditions, separator) + - ToString("isDeltaBearish", isDeltaBearish, ignoreFalseConditions, separator) + - ToString("isDeltaSwitchedToBullish", isDeltaSwitchedToBullish, ignoreFalseConditions, separator) + - ToString("isDeltaSwitchedToBearish", isDeltaSwitchedToBearish, ignoreFalseConditions, separator) + - ToString("isDeltaOverMa", isDeltaOverMa, ignoreFalseConditions, separator) + - ToString("isDeltaUnderMa", isDeltaUnderMa, ignoreFalseConditions, separator) + - ToString("isDeltaCrossedOverMa", isDeltaCrossedOverMa, ignoreFalseConditions, separator) + - ToString("isDeltaCrossedUnderMa", isDeltaCrossedUnderMa, ignoreFalseConditions, separator) + - // - "-----------------------" + separator + - "XVOLUME ..." + separator + - "-----------------------" + separator + - ToString("isBullishVolumeOverMa", isBullishVolumeOverMa, ignoreFalseConditions, separator) + - ToString("isBullishVolumeCrossedOverMa", isBullishVolumeCrossedOverMa, ignoreFalseConditions, separator) + - ToString("isBullishVolumeUnderMa", isBullishVolumeUnderMa, ignoreFalseConditions, separator) + - ToString("isBullishVolumeCrossedUnderMa", isBullishVolumeCrossedUnderMa, ignoreFalseConditions, separator) + - ToString("isBullishVolumeIncreased", isBullishVolumeIncreased, ignoreFalseConditions, separator) + - ToString("isBullishVolumeSwitchedToIncreased", isBullishVolumeSwitchedToIncreased, ignoreFalseConditions, separator) + - ToString("isBullishVolumeDecreased", isBullishVolumeDecreased, ignoreFalseConditions, separator) + - ToString("isBullishVolumeSwitchedToDecreased", isBullishVolumeSwitchedToDecreased, ignoreFalseConditions, separator) + - ToString("isBearishVolumeOverMa", isBearishVolumeOverMa, ignoreFalseConditions, separator) + - ToString("isBearishVolumeCrossedOverMa", isBearishVolumeCrossedOverMa, ignoreFalseConditions, separator) + - ToString("isBearishVolumeUnderMa", isBearishVolumeUnderMa, ignoreFalseConditions, separator) + - ToString("isBearishVolumeCrossedUnderMa", isBearishVolumeCrossedUnderMa, ignoreFalseConditions, separator) + - ToString("isBearishVolumeIncreased", isBearishVolumeIncreased, ignoreFalseConditions, separator) + - ToString("isBearishVolumeSwitchedToIncreased", isBearishVolumeSwitchedToIncreased, ignoreFalseConditions, separator) + - ToString("isBearishVolumeDecreased", isBearishVolumeDecreased, ignoreFalseConditions, separator) + - ToString("isBearishVolumeSwitchedToDecreased", isBearishVolumeSwitchedToDecreased, ignoreFalseConditions, separator) + - ToString("isVolumeSwitchedToBullish", isVolumeSwitchedToBullish, ignoreFalseConditions, separator) + - ToString("isVolumeSwitchedToBearish", isVolumeSwitchedToBearish, ignoreFalseConditions, separator) + - ToString("isBullishVolumeMaOverBearishVolumeMa", isBullishVolumeMaOverBearishVolumeMa, ignoreFalseConditions, separator) + - ToString("isBullishVolumeMaUnderBearishVolumeMa", isBullishVolumeMaUnderBearishVolumeMa, ignoreFalseConditions, separator) + - // - "-----------------------" + separator + - "Slopes ..." + separator + - "-----------------------" + separator + - ToString("isRsiSlopeBullish", isRsiSlopeBullish, ignoreFalseConditions, separator) + - ToString("isStrSlopeBullish", isStrSlopeBullish, ignoreFalseConditions, separator) + - ToString("isAtrUpperSlopeBullish", isAtrUpperSlopeBullish, ignoreFalseConditions, separator) + - ToString("isAtrLowerSlopeBullish", isAtrLowerSlopeBullish, ignoreFalseConditions, separator) + - ToString("isVwapFastSlopeBullish", isVwapFastSlopeBullish, ignoreFalseConditions, separator) + - ToString("isVwapMidSlopeBullish", isVwapMidSlopeBullish, ignoreFalseConditions, separator) + - ToString("isVwapSlowSlopeBullish", isVwapSlowSlopeBullish, ignoreFalseConditions, separator) + - ToString("isRsiSlopeBearish", isRsiSlopeBearish, ignoreFalseConditions, separator) + - ToString("isStrSlopeBearish", isStrSlopeBearish, ignoreFalseConditions, separator) + - ToString("isAtrUpperSlopeBearish", isAtrUpperSlopeBearish, ignoreFalseConditions, separator) + - ToString("isAtrLowerSlopeBearish", isAtrLowerSlopeBearish, ignoreFalseConditions, separator) + - ToString("isVwapFastSlopeBearish", isVwapFastSlopeBearish, ignoreFalseConditions, separator) + - ToString("isVwapMidSlopeBearish", isVwapMidSlopeBearish, ignoreFalseConditions, separator) + - ToString("isVwapSlowSlopeBearish", isVwapSlowSlopeBearish, ignoreFalseConditions, separator) + - // - "-----------------------" + separator + - "Coplex ..." + separator + - "-----------------------" + separator + - ToString("isSarIncreased", isSarIncreased, ignoreFalseConditions, separator) + - ToString("isSarDecreased", isSarDecreased, ignoreFalseConditions, separator) + - ToString("isSarEqualsToPeak", isSarEqualsToPeak, ignoreFalseConditions, separator) + - ToString("isStrEqualsToPeak", isStrEqualsToPeak, ignoreFalseConditions, separator) + - ToString("isStrEqualsToVale", isStrEqualsToVale, ignoreFalseConditions, separator) + - ToString("isPeakOverAtrUpper", isPeakOverAtrUpper, ignoreFalseConditions, separator) + - ToString("isStrUpperOverPeak", isStrUpperOverPeak, ignoreFalseConditions, separator) + - ToString("isStrLowerOverVale", isStrLowerOverVale, ignoreFalseConditions, separator) + - ToString("isAtrUpperOverPeak", isAtrUpperOverPeak, ignoreFalseConditions, separator) + - ToString("isAtrLowerUnderVale", isAtrLowerUnderVale, ignoreFalseConditions, separator) + - ToString("isClosedOverVWapMin", isClosedOverVWapMin, ignoreFalseConditions, separator) + - ToString("isClosedOverVWapMax", isClosedOverVWapMax, ignoreFalseConditions, separator) + - ToString("isStrUpperUnderPeak", isStrUpperUnderPeak, ignoreFalseConditions, separator) + - ToString("isValeUnderAtrLower", isValeUnderAtrLower, ignoreFalseConditions, separator) + - ToString("isStrLowerUnderVale", isStrLowerUnderVale, ignoreFalseConditions, separator) + - ToString("isClosedUnderVWapMin", isClosedUnderVWapMin, ignoreFalseConditions, separator) + - ToString("isClosedUnderVWapMax", isClosedUnderVWapMax, ignoreFalseConditions, separator) + - ToString("isSarCrossedOverVale", isSarCrossedOverVale, ignoreFalseConditions, separator) + - ToString("isStrCrossedOverVale", isStrCrossedOverVale, ignoreFalseConditions, separator) + - ToString("isSarCrossedUnderPeak", isSarCrossedUnderPeak, ignoreFalseConditions, separator) + - ToString("isStrCrossedUnderPeak", isStrCrossedUnderPeak, ignoreFalseConditions, separator) + - ToString("isNewPeakOverAtrUpper", isNewPeakOverAtrUpper, ignoreFalseConditions, separator) + - ToString("isNewValeUnderAtrLower", isNewValeUnderAtrLower, ignoreFalseConditions, separator) + - ToString("isStrUpperOverAtrUpper", isStrUpperOverAtrUpper, ignoreFalseConditions, separator) + - ToString("isStrLowerOverAtrLower", isStrLowerOverAtrLower, ignoreFalseConditions, separator) + - ToString("isAtrUpperEqualsToPeak", isAtrUpperEqualsToPeak, ignoreFalseConditions, separator) + - ToString("isAtrLowerEqualsToVale", isAtrLowerEqualsToVale, ignoreFalseConditions, separator) + - ToString("isAtrUpperCrossedUpPeak", isAtrUpperCrossedUpPeak, ignoreFalseConditions, separator) + - ToString("isAtrLowerCrossedUpVale", isAtrLowerCrossedUpVale, ignoreFalseConditions, separator) + - ToString("isStrUpperUnderAtrUpper", isStrUpperUnderAtrUpper, ignoreFalseConditions, separator) + - ToString("isStrLowerUnderAtrLower", isStrLowerUnderAtrLower, ignoreFalseConditions, separator) + - ToString("isVWapFastCrossedOverMid", isVWapFastCrossedOverMid, ignoreFalseConditions, separator) + - ToString("isAtrUpperCrossedDownPeak", isAtrUpperCrossedDownPeak, ignoreFalseConditions, separator) + - ToString("isAtrLowerCrossedDownVale", isAtrLowerCrossedDownVale, ignoreFalseConditions, separator) + - ToString("isVWapFastCrossedUnderMid", isVWapFastCrossedUnderMid, ignoreFalseConditions, separator) + - ToString("isVWapFastCrossedOverSlow", isVWapFastCrossedOverSlow, ignoreFalseConditions, separator) + - ToString("isStrUpperCrossedOverPeak", isStrUpperCrossedOverPeak, ignoreFalseConditions, separator) + - ToString("isStrLowerOverDonLowLower", isStrLowerOverDonLowLower, ignoreFalseConditions, separator) + - ToString("isStrLowerCrossedOverVale", isStrLowerCrossedOverVale, ignoreFalseConditions, separator) + - ToString("isDonLowLowerEqualsToVale", isDonLowLowerEqualsToVale, ignoreFalseConditions, separator) + - ToString("isVWapFastCrossedUnderSlow", isVWapFastCrossedUnderSlow, ignoreFalseConditions, separator) + - ToString("isStrUpperCrossedUnderPeak", isStrUpperCrossedUnderPeak, ignoreFalseConditions, separator) + - ToString("isStrLowerCrossedUnderVale", isStrLowerCrossedUnderVale, ignoreFalseConditions, separator) + - ToString("isDonHighUpperEqualsToPeak", isDonHighUpperEqualsToPeak, ignoreFalseConditions, separator) + - ToString("isStrUpperOverDonHighUpper", isStrUpperOverDonHighUpper, ignoreFalseConditions, separator) + - ToString("isStrLowerUnderDonLowLower", isStrLowerUnderDonLowLower, ignoreFalseConditions, separator) + - ToString("isStrUpperUnderDonHighUpper", isStrUpperUnderDonHighUpper, ignoreFalseConditions, separator) + - ToString("isStrUpperCrossedOverAtrUpper", isStrUpperCrossedOverAtrUpper, ignoreFalseConditions, separator) + - ToString("isStrLowerCrossedOverAtrLower", isStrLowerCrossedOverAtrLower, ignoreFalseConditions, separator) + - ToString("isStrUpperCrossedUnderAtrUpper", isStrUpperCrossedUnderAtrUpper, ignoreFalseConditions, separator) + - ToString("isStrLowerCrossedUnderAtrLower", isStrLowerCrossedUnderAtrLower, ignoreFalseConditions, separator) + - ToString("isStrLowerCrossedOverDonLowLower", isStrLowerCrossedOverDonLowLower, ignoreFalseConditions, separator) + - ToString("isStrUpperCrossedOverDonHighUpper", isStrUpperCrossedOverDonHighUpper, ignoreFalseConditions, separator) + - ToString("isStrLowerCrossedUnderDonLowLower", isStrLowerCrossedUnderDonLowLower, ignoreFalseConditions, separator) + - ToString("isStrUpperCrossedUnderDonHighUpper", isStrUpperCrossedUnderDonHighUpper, ignoreFalseConditions, separator) + - // - "" - // - ; - - // - result = - // - "[" + GetTag() + "]" + separator + - (onlyConditions - ? "" - : commonStr) + - (!includeScores - ? "" - : scoresStr) + - " " + separator + - (onlyCommons - ? "" - : conditionsStr) + - "" - // - ; - - // - return result; - } - - /** - * Retrieve nique Tag Identifier ... - * - * @return ( string ) - */ - string GetTag() - { - return GetTypeName(this); - } - - // -}; - -// -// Implementation ... -class XCX121Helper : public XCBase -{ - // - public: - // - - // - // Helpers ... - XCX121XCCHelper *xccHelper; - XCX121XPVHelper *xpvHelper; - XCX121XHKHelper *xhkHelper; - XCX121XICHHelper *xichHelper; - XCX121XMASHelper *xmasHelper; - XCX121XATRHelper *xatrHelper; - XCX121XSTRHelper *xstrHelper; - XCX121XCHEHelper *xcheHelper; - XCX121XDONHelper *xdonHelper; - XCX121X3MAHelper *x3maHelper; - XCX121XVWAPHelper *xvwapHelper; - XCX121XDELTAHelper *xdeltaHelper; - XCX121XVOLUMEHelper *xvolumeHelper; - - // - // Constructors ... - XCX121Helper() - { - } - - // - // Deconstructor ... - ~XCX121Helper() - { - // - mInputs.Clean(); - xccInputs.Clean(); - xpvInputs.Clean(); - xhkInputs.Clean(); - xichInputs.Clean(); - xmasInputs.Clean(); - xatrInputs.Clean(); - xdonInputs.Clean(); - xstrInputs.Clean(); - xcheInputs.Clean(); - x3maInputs.Clean(); - xvwapInputs.Clean(); - xdeltaInputs.Clean(); - xvolumeInputs.Clean(); - - // - delete xccHelper; - delete xpvHelper; - delete xhkHelper; - delete xichHelper; - delete xmasHelper; - delete xatrHelper; - delete xstrHelper; - delete xcheHelper; - delete xdonHelper; - delete x3maHelper; - delete xvwapHelper; - delete xdeltaHelper; - delete xvolumeHelper; - - // - ZeroMemory(xccHelper); - ZeroMemory(xpvHelper); - ZeroMemory(xhkHelper); - ZeroMemory(xichHelper); - ZeroMemory(xmasHelper); - ZeroMemory(xatrHelper); - ZeroMemory(xstrHelper); - ZeroMemory(xcheHelper); - ZeroMemory(xdonHelper); - ZeroMemory(x3maHelper); - ZeroMemory(xvwapHelper); - ZeroMemory(xdeltaHelper); - ZeroMemory(xvolumeHelper); - } - - // - string GetSymbol() - { - return mSymbol; - } - - // - ENUM_TIMEFRAMES GetPeriod() - { - return mPeriod; - } - - // - // Tools ... - - /** - * Initialize Indicator Helper ... - * - * @param symbol: String, Symbol ... - * @param period: ENUM_TIMEFRAMES member, Period ... - * @param inputs: X121Inputs instance, Indicator Inputs ... - * - * @return ( bool ) - */ - bool Init( - string symbol, // Trading Symbol - ENUM_TIMEFRAMES period, // Trading Period - X121Inputs &inputs // Inputs - ) - { - // - bool result = false; - - // - result = - IsValid(symbol) && - IsValid(period) && - inputs.IsValid(); - if (!result) - { - return result; - } - - // - mSymbol = symbol; - mPeriod = period; - - // - // Setting Inputs ... - - // - mInputs = inputs; - xccInputs = inputs.xccInputs; - xpvInputs = inputs.xpvInputs; - xhkInputs = inputs.xhkInputs; - xichInputs = inputs.xichInputs; - xmasInputs = inputs.xmasInputs; - xatrInputs = inputs.xatrInputs; - xstrInputs = inputs.xstrInputs; - xcheInputs = inputs.xcheInputs; - xdonInputs = inputs.xdonInputs; - x3maInputs = inputs.x3maInputs; - xvwapInputs = inputs.xvwapInputs; - xdeltaInputs = inputs.xdeltaInputs; - xvolumeInputs = inputs.xvolumeInputs; - - // - // Initial Helpers ... - - // - // XCC ... - xccHelper = new XCX121XCCHelper(); - result = xccHelper.Init( - symbol, - period, - xccInputs // - ); - if (!result) - { - // - ZeroMemory(xccHelper); - ZeroMemory(xpvHelper); - ZeroMemory(xhkHelper); - ZeroMemory(xmasHelper); - ZeroMemory(xatrHelper); - ZeroMemory(xichHelper); - ZeroMemory(xstrHelper); - ZeroMemory(xcheHelper); - ZeroMemory(xdonHelper); - ZeroMemory(x3maHelper); - ZeroMemory(xvwapHelper); - ZeroMemory(xdeltaHelper); - ZeroMemory(xvolumeHelper); - - // - return result; - } - - // - // XPV ... - xpvHelper = new XCX121XPVHelper(); - result = xpvHelper.Init( - symbol, - period, - xpvInputs // - ); - if (!result) - { - // - ZeroMemory(xccHelper); - ZeroMemory(xpvHelper); - ZeroMemory(xhkHelper); - ZeroMemory(xmasHelper); - ZeroMemory(xatrHelper); - ZeroMemory(xichHelper); - ZeroMemory(xstrHelper); - ZeroMemory(xcheHelper); - ZeroMemory(xdonHelper); - ZeroMemory(x3maHelper); - ZeroMemory(xvwapHelper); - ZeroMemory(xdeltaHelper); - ZeroMemory(xvolumeHelper); - - // - return result; - } - - // - // XHK ... - xhkHelper = new XCX121XHKHelper(); - result = xhkHelper.Init( - symbol, - period, - xhkInputs // - ); - if (!result) - { - // - ZeroMemory(xccHelper); - ZeroMemory(xpvHelper); - ZeroMemory(xhkHelper); - ZeroMemory(xmasHelper); - ZeroMemory(xatrHelper); - ZeroMemory(xichHelper); - ZeroMemory(xstrHelper); - ZeroMemory(xcheHelper); - ZeroMemory(xdonHelper); - ZeroMemory(x3maHelper); - ZeroMemory(xvwapHelper); - ZeroMemory(xdeltaHelper); - ZeroMemory(xvolumeHelper); - - // - return result; - } - - // - // XMAS ... - xmasHelper = new XCX121XMASHelper(); - result = xmasHelper.Init( - symbol, - period, - xmasInputs // - ); - if (!result) - { - // - ZeroMemory(xccHelper); - ZeroMemory(xpvHelper); - ZeroMemory(xhkHelper); - ZeroMemory(xmasHelper); - ZeroMemory(xatrHelper); - ZeroMemory(xichHelper); - ZeroMemory(xstrHelper); - ZeroMemory(xcheHelper); - ZeroMemory(xdonHelper); - ZeroMemory(x3maHelper); - ZeroMemory(xvwapHelper); - ZeroMemory(xdeltaHelper); - ZeroMemory(xvolumeHelper); - - // - return result; - } - - // - // XATR ... - xatrHelper = new XCX121XATRHelper(); - result = xatrHelper.Init( - symbol, - period, - xatrInputs // - ); - if (!result) - { - // - ZeroMemory(xccHelper); - ZeroMemory(xpvHelper); - ZeroMemory(xhkHelper); - ZeroMemory(xmasHelper); - ZeroMemory(xatrHelper); - ZeroMemory(xichHelper); - ZeroMemory(xstrHelper); - ZeroMemory(xcheHelper); - ZeroMemory(xdonHelper); - ZeroMemory(x3maHelper); - ZeroMemory(xvwapHelper); - ZeroMemory(xdeltaHelper); - ZeroMemory(xvolumeHelper); - - // - return result; - } - - // - // XICH ... - xichHelper = new XCX121XICHHelper(); - result = xichHelper.Init( - symbol, - period, - xichInputs // - ); - if (!result) - { - // - ZeroMemory(xccHelper); - ZeroMemory(xpvHelper); - ZeroMemory(xhkHelper); - ZeroMemory(xmasHelper); - ZeroMemory(xatrHelper); - ZeroMemory(xichHelper); - ZeroMemory(xstrHelper); - ZeroMemory(xcheHelper); - ZeroMemory(xdonHelper); - ZeroMemory(x3maHelper); - ZeroMemory(xvwapHelper); - ZeroMemory(xdeltaHelper); - ZeroMemory(xvolumeHelper); - - // - return result; - } - - // - // XSTR ... - xstrHelper = new XCX121XSTRHelper(); - result = xstrHelper.Init( - symbol, - period, - xstrInputs // - ); - if (!result) - { - // - ZeroMemory(xccHelper); - ZeroMemory(xpvHelper); - ZeroMemory(xhkHelper); - ZeroMemory(xmasHelper); - ZeroMemory(xatrHelper); - ZeroMemory(xichHelper); - ZeroMemory(xstrHelper); - ZeroMemory(xcheHelper); - ZeroMemory(xdonHelper); - ZeroMemory(x3maHelper); - ZeroMemory(xvwapHelper); - ZeroMemory(xdeltaHelper); - ZeroMemory(xvolumeHelper); - - // - return result; - } - - // - // XCHE ... - xcheHelper = new XCX121XCHEHelper(); - result = xcheHelper.Init( - symbol, - period, - xcheInputs // - ); - if (!result) - { - // - ZeroMemory(xccHelper); - ZeroMemory(xpvHelper); - ZeroMemory(xhkHelper); - ZeroMemory(xmasHelper); - ZeroMemory(xatrHelper); - ZeroMemory(xichHelper); - ZeroMemory(xstrHelper); - ZeroMemory(xcheHelper); - ZeroMemory(xdonHelper); - ZeroMemory(x3maHelper); - ZeroMemory(xvwapHelper); - ZeroMemory(xdeltaHelper); - ZeroMemory(xvolumeHelper); - - // - return result; - } - - // - // XDON ... - xdonHelper = new XCX121XDONHelper(); - result = xdonHelper.Init( - symbol, - period, - xdonInputs // - ); - if (!result) - { - // - ZeroMemory(xccHelper); - ZeroMemory(xpvHelper); - ZeroMemory(xhkHelper); - ZeroMemory(xmasHelper); - ZeroMemory(xatrHelper); - ZeroMemory(xichHelper); - ZeroMemory(xstrHelper); - ZeroMemory(xcheHelper); - ZeroMemory(xdonHelper); - ZeroMemory(x3maHelper); - ZeroMemory(xvwapHelper); - ZeroMemory(xdeltaHelper); - ZeroMemory(xvolumeHelper); - - // - return result; - } - - // - // X3MA ... - x3maHelper = new XCX121X3MAHelper(); - result = x3maHelper.Init( - symbol, - period, - x3maInputs // - ); - if (!result) - { - // - ZeroMemory(xccHelper); - ZeroMemory(xpvHelper); - ZeroMemory(xhkHelper); - ZeroMemory(xmasHelper); - ZeroMemory(xatrHelper); - ZeroMemory(xichHelper); - ZeroMemory(xstrHelper); - ZeroMemory(xcheHelper); - ZeroMemory(xdonHelper); - ZeroMemory(x3maHelper); - ZeroMemory(xvwapHelper); - ZeroMemory(xdeltaHelper); - ZeroMemory(xvolumeHelper); - - // - return result; - } - - // - // XVWAP ... - xvwapHelper = new XCX121XVWAPHelper(); - result = xvwapHelper.Init( - symbol, - period, - xvwapInputs // - ); - if (!result) - { - // - ZeroMemory(xccHelper); - ZeroMemory(xpvHelper); - ZeroMemory(xhkHelper); - ZeroMemory(xmasHelper); - ZeroMemory(xatrHelper); - ZeroMemory(xichHelper); - ZeroMemory(xstrHelper); - ZeroMemory(xcheHelper); - ZeroMemory(xdonHelper); - ZeroMemory(x3maHelper); - ZeroMemory(xvwapHelper); - ZeroMemory(xdeltaHelper); - ZeroMemory(xvolumeHelper); - - // - return result; - } - - // - // XDELTA ... - xdeltaHelper = new XCX121XDELTAHelper(); - result = xdeltaHelper.Init( - symbol, - period, - xdeltaInputs // - ); - if (!result) - { - // - ZeroMemory(xccHelper); - ZeroMemory(xpvHelper); - ZeroMemory(xhkHelper); - ZeroMemory(xmasHelper); - ZeroMemory(xatrHelper); - ZeroMemory(xichHelper); - ZeroMemory(xstrHelper); - ZeroMemory(xcheHelper); - ZeroMemory(xdonHelper); - ZeroMemory(x3maHelper); - ZeroMemory(xvwapHelper); - ZeroMemory(xdeltaHelper); - ZeroMemory(xvolumeHelper); - - // - return result; - } - - // - // XVOLUME ... - xvolumeHelper = new XCX121XVOLUMEHelper(); - result = xvolumeHelper.Init( - symbol, - period, - xvolumeInputs // - ); - if (!result) - { - // - ZeroMemory(xccHelper); - ZeroMemory(xpvHelper); - ZeroMemory(xhkHelper); - ZeroMemory(xmasHelper); - ZeroMemory(xatrHelper); - ZeroMemory(xichHelper); - ZeroMemory(xstrHelper); - ZeroMemory(xcheHelper); - ZeroMemory(xdonHelper); - ZeroMemory(x3maHelper); - ZeroMemory(xvwapHelper); - ZeroMemory(xdeltaHelper); - ZeroMemory(xvolumeHelper); - - // - return result; - } - - // - if (inputs.showRSI) - { - // - mRSIHandler = iRSI( - symbol, - period, - xatrInputs.rsiLength, - xatrInputs.rsiAppliedTo // - ); - - // - result = mRSIHandler != INVALID_HANDLE; - if (!result) - { - // - ZeroMemory(xccHelper); - ZeroMemory(xpvHelper); - ZeroMemory(xhkHelper); - ZeroMemory(xmasHelper); - ZeroMemory(xatrHelper); - ZeroMemory(xichHelper); - ZeroMemory(xstrHelper); - ZeroMemory(xcheHelper); - ZeroMemory(xdonHelper); - ZeroMemory(x3maHelper); - ZeroMemory(xvwapHelper); - ZeroMemory(xdeltaHelper); - ZeroMemory(xvolumeHelper); - - // - return result; - } - } - - // - return result; - } - - // - // Conditions Readers ... - - // - // XPV ... - bool GetPVConditions( - X121XPVConditions &conditions, // - int barIndex = 0, // - int loopback = 5 // - ) - { - // - bool result = false; - - // - result = xpvHelper.GetConditions( - conditions, - barIndex, - loopback // - ); - - // - return result; - } - - // - // XHK ... - bool GetHKConditions( - X121XHKConditions &conditions, // - int barIndex = 0, // - int loopback = 5 // - ) - { - // - bool result = false; - - // - result = xhkHelper.GetConditions( - conditions, - barIndex, - loopback // - ); - - // - return result; - } - - // - // XMAS ... - bool GetMASConditions( - X121XMASConditions &conditions, // - int barIndex = 0, // - int loopback = 5 // - ) - { - // - bool result = false; - - // - result = xmasHelper.GetConditions( - conditions, - barIndex, - loopback // - ); - - // - return result; - } - - // - // XICH ... - bool GetICHConditions( - X121XICHConditions &conditions, // - int barIndex = 0, // - int loopback = 5 // - ) - { - // - bool result = false; - - // - result = xichHelper.GetConditions( - conditions, - barIndex, - loopback // - ); - - // - return result; - } - - // - // XATR ... - bool GetATRConditions( - X121XATRConditions &conditions, // - int barIndex = 0, // - int loopback = 5 // - ) - { - // - bool result = false; - - // - result = xatrHelper.GetConditions( - conditions, - barIndex, - loopback // - ); - - // - return result; - } - - // - // XSTR ... - bool GetSTRConditions( - X121XSTRConditions &conditions, // - int barIndex = 0, // - int loopback = 5 // - ) - { - // - bool result = false; - - // - result = xstrHelper.GetConditions( - conditions, - barIndex, - loopback // - ); - - // - return result; - } - - // - // XCHE ... - bool GetCHEConditions( - X121XCHEConditions &conditions, // - int barIndex = 0, // - int loopback = 5 // - ) - { - // - bool result = false; - - // - result = xcheHelper.GetConditions( - conditions, - barIndex, - loopback // - ); - - // - return result; - } - - // - // XDON ... - bool GetDONConditions( - X121XDONConditions &conditions, // - int barIndex = 0, // - int loopback = 5 // - ) - { - // - bool result = false; - - // - result = xdonHelper.GetConditions( - conditions, - barIndex, - loopback // - ); - - // - return result; - } - - // - // X3MA ... - bool Get3MAConditions( - X121X3MAConditions &conditions, // - int barIndex = 0, // - int loopback = 5 // - ) - { - // - bool result = false; - - // - result = x3maHelper.GetConditions( - conditions, - barIndex, - loopback // - ); - - // - return result; - } - - // - // XVWAP ... - bool GetVWAPConditions( - X121XVWAPConditions &conditions, // - int barIndex = 0, // - int loopback = 5 // - ) - { - // - bool result = false; - - // - result = xvwapHelper.GetConditions( - conditions, - barIndex, - loopback // - ); - - // - return result; - } - - // - // XDELTA ... - bool GetDELTAConditions( - X121XDELTAConditions &conditions, // - int barIndex = 0, // - int loopback = 5 // - ) - { - // - bool result = false; - - // - result = xdeltaHelper.GetConditions( - conditions, - barIndex, - loopback // - ); - - // - return result; - } - - // - // XVOLUME ... - bool GetVOLUMEConditions( - X121XVOLUMEConditions &conditions, // - int barIndex = 0, // - int loopback = 5 // - ) - { - // - bool result = false; - - // - result = xvolumeHelper.GetConditions( - conditions, - barIndex, - loopback // - ); - - // - return result; - } - - // - void Free() - { - // - xpvHelper.Free(); - xhkHelper.Free(); - xichHelper.Free(); - xmasHelper.Free(); - xatrHelper.Free(); - xstrHelper.Free(); - xcheHelper.Free(); - xdonHelper.Free(); - xvwapHelper.Free(); - } - - // - bool GetConditions( - X121Conditions &conditions, // - int barIndex = 0, // - int loopback = 5 // - ) - { - // - bool result = true; - - // - if (loopback < 5) - { - loopback = 5; - } - - // - conditions.Clean(); - - // - conditions.symbol = mSymbol; - conditions.period = mPeriod; - conditions.time = TimeCurrent(); - - // - int zIndex = barIndex; - int cIndex = zIndex + 1; - int pIndex = cIndex + 1; - int ppIndex = pIndex + 1; - - // - XOHCL zBar; - result = zBar.Init( - mSymbol, - mPeriod, - zIndex // - ); - if (!result) - { - return result; - } - - // - XOHCL cBar; - result = cBar.Init( - mSymbol, - mPeriod, - cIndex // - ); - if (!result) - { - return result; - } - - // - XOHCL pBar; - result = pBar.Init( - mSymbol, - mPeriod, - pIndex // - ); - if (!result) - { - return result; - } - - // - // XPV ... - X121XPVConditions xpvConditions; - result = GetPVConditions( - xpvConditions, - barIndex, - loopback // - ); - if (!result) - { - // - xpvConditions.Clean(); - - // - return result; - } - - // - // XHK ... - X121XHKConditions xhkConditions; - result = GetHKConditions( - xhkConditions, - barIndex, - loopback // - ); - if (!result) - { - // - xpvConditions.Clean(); - xhkConditions.Clean(); - - // - return result; - } - - // - // XICH ... - X121XICHConditions xichConditions; - result = GetICHConditions( - xichConditions, - barIndex, - loopback // - ); - if (!result) - { - // - xpvConditions.Clean(); - xhkConditions.Clean(); - xichConditions.Clean(); - - // - return result; - } - - // - // XMAS ... - X121XMASConditions xmasConditions; - result = GetMASConditions( - xmasConditions, - barIndex, - loopback // - ); - if (!result) - { - // - xpvConditions.Clean(); - xhkConditions.Clean(); - xichConditions.Clean(); - xmasConditions.Clean(); - - // - return result; - } - - // - // XATR ... - X121XATRConditions xatrConditions; - result = GetATRConditions( - xatrConditions, - barIndex, - loopback // - ); - if (!result) - { - // - xpvConditions.Clean(); - xhkConditions.Clean(); - xichConditions.Clean(); - xmasConditions.Clean(); - xatrConditions.Clean(); - - // - return result; - } - - // - // XSTR ... - X121XSTRConditions xstrConditions; - result = GetSTRConditions( - xstrConditions, - barIndex, - loopback // - ); - if (!result) - { - // - xpvConditions.Clean(); - xhkConditions.Clean(); - xichConditions.Clean(); - xmasConditions.Clean(); - xatrConditions.Clean(); - xstrConditions.Clean(); - - // - return result; - } - - // - // XCHE ... - X121XCHEConditions xcheConditions; - result = GetCHEConditions( - xcheConditions, - barIndex, - loopback // - ); - if (!result) - { - // - xpvConditions.Clean(); - xhkConditions.Clean(); - xichConditions.Clean(); - xmasConditions.Clean(); - xatrConditions.Clean(); - xstrConditions.Clean(); - xcheConditions.Clean(); - - // - return result; - } - - // - // XDON ... - X121XDONConditions xdonConditions; - result = GetDONConditions( - xdonConditions, - barIndex, - loopback // - ); - if (!result) - { - // - xpvConditions.Clean(); - xhkConditions.Clean(); - xichConditions.Clean(); - xmasConditions.Clean(); - xatrConditions.Clean(); - xstrConditions.Clean(); - xcheConditions.Clean(); - xdonConditions.Clean(); - - // - return result; - } - - // - // X3MA ... - X121X3MAConditions x3maConditions; - result = Get3MAConditions( - x3maConditions, - barIndex, - loopback // - ); - if (!result) - { - // - xpvConditions.Clean(); - xhkConditions.Clean(); - xichConditions.Clean(); - xmasConditions.Clean(); - xatrConditions.Clean(); - xstrConditions.Clean(); - xcheConditions.Clean(); - xdonConditions.Clean(); - x3maConditions.Clean(); - - // - return result; - } - - // - // XVWAP ... - X121XVWAPConditions xvwapConditions; - result = GetVWAPConditions( - xvwapConditions, - barIndex, - loopback // - ); - if (!result) - { - // - xpvConditions.Clean(); - xhkConditions.Clean(); - xichConditions.Clean(); - xmasConditions.Clean(); - xatrConditions.Clean(); - xstrConditions.Clean(); - xcheConditions.Clean(); - xdonConditions.Clean(); - x3maConditions.Clean(); - xvwapConditions.Clean(); - - // - return result; - } - - // - // XDELTA ... - X121XDELTAConditions xdeltaConditions; - result = GetDELTAConditions( - xdeltaConditions, - barIndex, - loopback // - ); - if (!result) - { - // - xpvConditions.Clean(); - xhkConditions.Clean(); - xichConditions.Clean(); - xmasConditions.Clean(); - xatrConditions.Clean(); - xstrConditions.Clean(); - xcheConditions.Clean(); - xdonConditions.Clean(); - x3maConditions.Clean(); - xvwapConditions.Clean(); - xdeltaConditions.Clean(); - - // - return result; - } - - // - // XVOLUME ... - X121XVOLUMEConditions xvolumeConditions; - result = GetVOLUMEConditions( - xvolumeConditions, - barIndex, - loopback // - ); - if (!result) - { - // - xpvConditions.Clean(); - xhkConditions.Clean(); - xichConditions.Clean(); - xmasConditions.Clean(); - xatrConditions.Clean(); - xstrConditions.Clean(); - xcheConditions.Clean(); - xdonConditions.Clean(); - x3maConditions.Clean(); - xvwapConditions.Clean(); - xdeltaConditions.Clean(); - xvolumeConditions.Clean(); - - // - return result; - } - - // - // Fill Volume Buffer ... - for (int i = barIndex; i < barIndex + loopback; i++) - { - // - // Reading Bar Valuem ... - long iVol = iVolume( - mSymbol, - mPeriod, - i // - ); - - // - Add( - iVol, - conditions.volumeBuffer // - ); - } - - // - // Fill X121 Conditions Reference by Using - // Retrieved Conditions ... - - // - int cIDX = 1; - int pIDX = cIDX + 1; - - // - // XPV ... - - // - // Buffers ... - - // - Copy( - xpvConditions.peaksBuffer, - conditions.peaksBuffer // - ); - - // - Copy( - xpvConditions.valesBuffer, - conditions.valesBuffer // - ); - - // - Copy( - xpvConditions.supportsBuffer, - conditions.supportsBuffer // - ); - - // - Copy( - xpvConditions.resistancesBuffer, - conditions.resistancesBuffer // - ); - - // - Copy( - xpvConditions.peaksGoldenBuffer, - conditions.peaksGoldenBuffer // - ); - - // - Copy( - xpvConditions.valesGoldenBuffer, - conditions.valesGoldenBuffer // - ); - - // - Copy( - xpvConditions.sarBuffer, - conditions.sarBuffer // - ); - - // - Copy( - xpvConditions.cHHBuffer, - conditions.cHHBuffer // - ); - - // - Copy( - xpvConditions.cLLBuffer, - conditions.cLLBuffer // - ); - - // - Copy( - xpvConditions.sHHBuffer, - conditions.sHHBuffer // - ); - - // - Copy( - xpvConditions.sLLBuffer, - conditions.sLLBuffer // - ); - - // - Copy( - xpvConditions.mHHBuffer, - conditions.mHHBuffer // - ); - - // - Copy( - xpvConditions.mLLBuffer, - conditions.mLLBuffer // - ); - - // - Copy( - xpvConditions.lHHBuffer, - conditions.lHHBuffer // - ); - - // - Copy( - xpvConditions.lLLBuffer, - conditions.lLLBuffer // - ); - - // - Copy( - xpvConditions.hHHBuffer, - conditions.hHHBuffer // - ); - - // - Copy( - xpvConditions.hLLBuffer, - conditions.hLLBuffer // - ); - - // - Copy( - xpvConditions.fractalsUpperBuffer, - conditions.fractalsUpperBuffer // - ); - - // - Copy( - xpvConditions.fractalsLowerBuffer, - conditions.fractalsLowerBuffer // - ); - - // - // Conditions ... - - // - conditions.isNewPeak = xpvConditions.isNewPeak; - conditions.isNewVale = xpvConditions.isNewVale; - conditions.isSarBullish = xpvConditions.isSarBullish; - conditions.isSarBearish = xpvConditions.isSarBearish; - conditions.isNewPeakOverLast = xpvConditions.isNewPeakOverLast; - conditions.isNewValeOverLast = xpvConditions.isNewValeOverLast; - conditions.isNewPeakUnderLast = xpvConditions.isNewPeakUnderLast; - conditions.isNewValeUnderLast = xpvConditions.isNewValeUnderLast; - conditions.isSarSwitchedToBullish = xpvConditions.isSarSwitchedToBullish; - conditions.isSarSwitchedToBearish = xpvConditions.isSarSwitchedToBearish; - - // - // XHK ... - - // - // Buffers ... - - // - Copy( - xhkConditions.xhkRawOpenBuffer, - conditions.xhkRawOpenBuffer // - ); - - // - Copy( - xhkConditions.xhkRawHighBuffer, - conditions.xhkRawHighBuffer // - ); - - // - Copy( - xhkConditions.xhkRawLowBuffer, - conditions.xhkRawLowBuffer // - ); - - // - Copy( - xhkConditions.xhkRawCloseBuffer, - conditions.xhkRawCloseBuffer // - ); - - // - Copy( - xhkConditions.xhkSMOpenBuffer, - conditions.xhkSMOpenBuffer // - ); - - // - Copy( - xhkConditions.xhkSMHighBuffer, - conditions.xhkSMHighBuffer // - ); - - // - Copy( - xhkConditions.xhkSMLowBuffer, - conditions.xhkSMLowBuffer // - ); - - // - Copy( - xhkConditions.xhkSMCloseBuffer, - conditions.xhkSMCloseBuffer // - ); - - // - // Conditions ... - conditions.isSMHKBullish = xhkConditions.isSMHKBullish; - conditions.isRawHKBullish = xhkConditions.isRawHKBullish; - conditions.isSMHKBearish = xhkConditions.isSMHKBearish; - conditions.isRawHKBearish = xhkConditions.isRawHKBearish; - conditions.isClosedOverSMHK = xhkConditions.isClosedOverSMHK; - conditions.isClosedUnderSMHK = xhkConditions.isClosedUnderSMHK; - conditions.isClosedOverRawHK = xhkConditions.isClosedOverRawHK; - conditions.isClosedUnderRawHK = xhkConditions.isClosedUnderRawHK; - conditions.isRawHKClosedOverSMHK = xhkConditions.isRawHKClosedOverSMHK; - conditions.isSMHKSwitchedToBearish = xhkConditions.isSMHKSwitchedToBearish; - conditions.isRawHKSwitchedToBearish = xhkConditions.isRawHKSwitchedToBearish; - conditions.isRawHKClosedUnderSMHK = xhkConditions.isRawHKClosedUnderSMHK; - conditions.isSMHKSwitchedToBullish = xhkConditions.isSMHKSwitchedToBullish; - conditions.isRawHKSwitchedToBullish = xhkConditions.isRawHKSwitchedToBullish; - - // - // XMAS ... - - // - // Buffers ... - - // - Copy( - xmasConditions.upperBuffer, - conditions.masUpperBuffer // - ); - - // - Copy( - xmasConditions.midBuffer, - conditions.masMidBuffer // - ); - - // - Copy( - xmasConditions.lowerBuffer, - conditions.masLowerBuffer // - ); - - // - // XATR ... - - // - // Buffers ... - - // - Copy( - xatrConditions.atrUpperBuffer, - conditions.atrUpperBuffer // - ); - - // - Copy( - xatrConditions.atrLowerBuffer, - conditions.atrLowerBuffer // - ); - - // - Copy( - xatrConditions.atrUpperRawBuffer, - conditions.atrUpperRawBuffer // - ); - - // - Copy( - xatrConditions.atrLowerRawBuffer, - conditions.atrLowerRawBuffer // - ); - - // - Copy( - xatrConditions.atrBuffer, - conditions.atrBuffer // - ); - - // - Copy( - xatrConditions.rsiBuffer, - conditions.rsiBuffer // - ); - - // - // Conditions ... - - // - conditions.isRsiOverSold = xatrConditions.isRsiOverSold; - conditions.isRsiOverBought = xatrConditions.isRsiOverBought; - conditions.isClosedOverAtrUpper = xatrConditions.isClosedOverAtrUpper; - conditions.isClosedOverAtrLower = xatrConditions.isClosedOverAtrLower; - conditions.isClosedUnderAtrUpper = xatrConditions.isClosedUnderAtrUpper; - conditions.isClosedUnderAtrLower = xatrConditions.isClosedUnderAtrLower; - conditions.isRsiCrossedOverOverSold = xatrConditions.isRsiCrossedOverOverSold; - conditions.isRsiCrossedUnderOverSold = xatrConditions.isRsiCrossedUnderOverSold; - conditions.isRsiCrossedOverOverBought = xatrConditions.isRsiCrossedOverOverBought; - conditions.isRsiCrossedUnderOverBought = xatrConditions.isRsiCrossedUnderOverBought; - - // - // XSTR ... - - // - // Buffers ... - - // - Copy( - xstrConditions.strBuffer, - conditions.strBuffer // - ); - - // - Copy( - xstrConditions.strPriceBuffer, - conditions.strPriceBuffer // - ); - - // - Copy( - xstrConditions.strUpBuffer, - conditions.strUpBuffer // - ); - - // - Copy( - xstrConditions.strDownBuffer, - conditions.strDownBuffer // - ); - - // - Copy( - xstrConditions.strStateBuffer, - conditions.strStateBuffer // - ); - - // - // Conditions ... - - // - conditions.isStrBullish = xstrConditions.isStrBullish; - conditions.isStrBearish = xstrConditions.isStrBearish; - conditions.isStrSwitchedToBullish = xstrConditions.isStrSwitchedToBullish; - conditions.isStrSwitchedToBearish = xstrConditions.isStrSwitchedToBearish; - - // - // XCHE ... - - // - // Buffers ... - - // - Copy( - xcheConditions.le1Buffer, - conditions.le1Buffer // - ); - - // - Copy( - xcheConditions.se1Buffer, - conditions.se1Buffer // - ); - - // - Copy( - xcheConditions.le2Buffer, - conditions.le2Buffer // - ); - - // - Copy( - xcheConditions.se2Buffer, - conditions.se2Buffer // - ); - - // - Copy( - xcheConditions.le1StartBuffer, - conditions.le1StartBuffer // - ); - - // - Copy( - xcheConditions.se1StartBuffer, - conditions.se1StartBuffer // - ); - - // - Copy( - xcheConditions.le2StartBuffer, - conditions.le2StartBuffer // - ); - - // - Copy( - xcheConditions.se2StartBuffer, - conditions.se2StartBuffer // - ); - - // - // Conditions ... - - conditions.isCheBullish = xcheConditions.isCheBullish; - conditions.isCheBearish = xcheConditions.isCheBearish; - conditions.isChe1Bullish = xcheConditions.isChe1Bullish; - conditions.isChe1Bearish = xcheConditions.isChe1Bearish; - conditions.isChe2Bullish = xcheConditions.isChe2Bullish; - conditions.isChe2Bearish = xcheConditions.isChe2Bearish; - conditions.isClosedOverCheMin = xcheConditions.isClosedOverCheMin; - conditions.isClosedOverCheMax = xcheConditions.isClosedOverCheMax; - conditions.isClosedUnderCheMin = xcheConditions.isClosedUnderCheMin; - conditions.isClosedUnderCheMax = xcheConditions.isClosedUnderCheMax; - conditions.isCheSwitchedToBullish = xcheConditions.isCheSwitchedToBullish; - conditions.isCheSwitchedToBearish = xcheConditions.isCheSwitchedToBearish; - conditions.isChe1SwitchedToBullish = xcheConditions.isChe1SwitchedToBullish; - conditions.isChe1SwitchedToBearish = xcheConditions.isChe1SwitchedToBearish; - conditions.isChe2SwitchedToBullish = xcheConditions.isChe2SwitchedToBullish; - conditions.isChe2SwitchedToBearish = xcheConditions.isChe2SwitchedToBearish; - - // - // XDON ... - - // - // Buffers ... - - // - Copy( - xdonConditions.donOpenUpperBuffer, - conditions.donOpenUpperBuffer // - ); - - // - Copy( - xdonConditions.donOpenLowerBuffer, - conditions.donOpenLowerBuffer // - ); - - // - Copy( - xdonConditions.donHighUpperBuffer, - conditions.donHighUpperBuffer // - ); - - // - Copy( - xdonConditions.donHighLowerBuffer, - conditions.donHighLowerBuffer // - ); - - // - Copy( - xdonConditions.donLowUpperBuffer, - conditions.donLowUpperBuffer // - ); - - // - Copy( - xdonConditions.donLowLowerBuffer, - conditions.donLowLowerBuffer // - ); - - // - Copy( - xdonConditions.donCloseUpperBuffer, - conditions.donCloseUpperBuffer // - ); - - // - Copy( - xdonConditions.donCloseLowerBuffer, - conditions.donCloseLowerBuffer // - ); - - // - // Conditions ... - - // - // X3MA ... - - // - // Buffers ... - - // - Copy( - x3maConditions.x3maFastBuffer, - conditions.x3maFastBuffer // - ); - - // - Copy( - x3maConditions.x3maMidBuffer, - conditions.x3maMidBuffer // - ); - - // - Copy( - x3maConditions.x3maSlowBuffer, - conditions.x3maSlowBuffer // - ); - - // - Copy( - x3maConditions.x3maFastStateBuffer, - conditions.x3maFastStateBuffer // - ); - - // - Copy( - x3maConditions.x3maMidStateBuffer, - conditions.x3maMidStateBuffer // - ); - - // - Copy( - x3maConditions.x3maSlowStateBuffer, - conditions.x3maSlowStateBuffer // - ); - - // - // Conditions ... - - // - conditions.isX3MaMidBullish = x3maConditions.isX3MaMidBullish; - conditions.isX3MaMidBearish = x3maConditions.isX3MaMidBearish; - conditions.isX3MaFastBullish = x3maConditions.isX3MaFastBullish; - conditions.isX3MaFastBearish = x3maConditions.isX3MaFastBearish; - conditions.isX3MaMidNeutural = x3maConditions.isX3MaMidNeutural; - conditions.isX3MaSlowBullish = x3maConditions.isX3MaSlowBullish; - conditions.isX3MaSlowBearish = x3maConditions.isX3MaSlowBearish; - conditions.isX3MaFastOverMid = x3maConditions.isX3MaFastOverMid; - conditions.isX3MaMidOverSlow = x3maConditions.isX3MaMidOverSlow; - conditions.isX3MaFastNeutural = x3maConditions.isX3MaFastNeutural; - conditions.isX3MaSlowNeutural = x3maConditions.isX3MaSlowNeutural; - conditions.isX3MaFastUnderMid = x3maConditions.isX3MaFastUnderMid; - conditions.isX3MaMidUnderSlow = x3maConditions.isX3MaMidUnderSlow; - conditions.isX3MaBullishState = x3maConditions.isX3MaBullishState; - conditions.isX3MaBearishState = x3maConditions.isX3MaBearishState; - conditions.isX3MaNeuturalState = x3maConditions.isX3MaNeuturalState; - conditions.isX3MaBullishOrdered = x3maConditions.isX3MaBullishOrdered; - conditions.isX3MaBearishOrdered = x3maConditions.isX3MaBearishOrdered; - conditions.isX3MaSwitchedToBullishState = x3maConditions.isX3MaSwitchedToBullishState; - conditions.isX3MaSwitchedToBearishState = x3maConditions.isX3MaSwitchedToBearishState; - conditions.isX3MaSwitchedToNeuturalState = x3maConditions.isX3MaSwitchedToNeuturalState; - conditions.isX3MaSwitchedToBullishOrdered = x3maConditions.isX3MaSwitchedToBullishOrdered; - conditions.isX3MaSwitchedToBearishOrdered = x3maConditions.isX3MaSwitchedToBearishOrdered; - - // - // XVWAP ... - - // - // Buffers ... - - // - Copy( - xvwapConditions.vwapFastBuffer, - conditions.vwapFastBuffer // - ); - - // - Copy( - xvwapConditions.vwapMidBuffer, - conditions.vwapMidBuffer // - ); - - // - Copy( - xvwapConditions.vwapSlowBuffer, - conditions.vwapSlowBuffer // - ); - - // - Copy( - xvwapConditions.vwapVolumeBuffer, - conditions.vwapVolumeBuffer // - ); - - // - Copy( - xvwapConditions.vwapPriceBuffer, - conditions.vwapPriceBuffer // - ); - - // - Copy( - xvwapConditions.vwapFastStateBuffer, - conditions.vwapFastStateBuffer // - ); - - // - Copy( - xvwapConditions.vwapMidStateBuffer, - conditions.vwapMidStateBuffer // - ); - - // - Copy( - xvwapConditions.vwapSlowStateBuffer, - conditions.vwapSlowStateBuffer // - ); - - // - // Conditions ... - - // - conditions.isVWapMidBullish = xvwapConditions.isVWapMidBullish; - conditions.isVWapMidBearish = xvwapConditions.isVWapMidBearish; - conditions.isVWapFastBullish = xvwapConditions.isVWapFastBullish; - conditions.isVWapFastBearish = xvwapConditions.isVWapFastBearish; - conditions.isVWapMidNeutural = xvwapConditions.isVWapMidNeutural; - conditions.isVWapSlowBullish = xvwapConditions.isVWapSlowBullish; - conditions.isVWapSlowBearish = xvwapConditions.isVWapSlowBearish; - conditions.isVWapFastOverMid = xvwapConditions.isVWapFastOverMid; - conditions.isVWapMidOverSlow = xvwapConditions.isVWapMidOverSlow; - conditions.isVWapFastNeutural = xvwapConditions.isVWapFastNeutural; - conditions.isVWapSlowNeutural = xvwapConditions.isVWapSlowNeutural; - conditions.isVWapFastUnderMid = xvwapConditions.isVWapFastUnderMid; - conditions.isVWapMidUnderSlow = xvwapConditions.isVWapMidUnderSlow; - conditions.isVWapBullishState = xvwapConditions.isVWapBullishState; - conditions.isVWapBearishState = xvwapConditions.isVWapBearishState; - conditions.isVWapNeuturalState = xvwapConditions.isVWapNeuturalState; - conditions.isVWapBullishOrdered = xvwapConditions.isVWapBullishOrdered; - conditions.isVWapBearishOrdered = xvwapConditions.isVWapBearishOrdered; - conditions.isVWapSwitchedToBullishState = xvwapConditions.isVWapSwitchedToBullishState; - conditions.isVWapSwitchedToBearishState = xvwapConditions.isVWapSwitchedToBearishState; - conditions.isVWapSwitchedToNeuturalState = xvwapConditions.isVWapSwitchedToNeuturalState; - conditions.isVWapSwitchedToBullishOrdered = xvwapConditions.isVWapSwitchedToBullishOrdered; - conditions.isVWapSwitchedToBearishOrdered = xvwapConditions.isVWapSwitchedToBearishOrdered; - - // - // XICH ... - - // - // Buffers ... - - // - Copy( - xichConditions.kijunSenBuffer, - conditions.kijunSenBuffer // - ); - - // - Copy( - xichConditions.tenkanSenBuffer, - conditions.tenkanSenBuffer // - ); - - // - Copy( - xichConditions.chikouSpanBuffer, - conditions.chikouSpanBuffer // - ); - - // - Copy( - xichConditions.senkouSpanABuffer, - conditions.senkouSpanABuffer // - ); - - // - Copy( - xichConditions.senkouSpanBBuffer, - conditions.senkouSpanBBuffer // - ); - - // - // Conditions ... - - // - conditions.isTenkanSenOverKijunSen = xichConditions.isTenkanSenOverKijunSen; - conditions.isTenkanSenUnderKijunSen = xichConditions.isTenkanSenUnderKijunSen; - - // - conditions.isTenkanSenCrossedOverKijunSen = xichConditions.isTenkanSenCrossedOverKijunSen; - conditions.isTenkanSenCrossedUnderKijunSen = xichConditions.isTenkanSenCrossedUnderKijunSen; - - // - conditions.isSenkouSpanAOverB = xichConditions.isSenkouSpanAOverB; - conditions.isSenkouSpanAUnderB = xichConditions.isSenkouSpanAUnderB; - - // - conditions.isSenkouSpanACrossedOverB = xichConditions.isSenkouSpanACrossedOverB; - conditions.isSenkouSpanACrossedUnderB = xichConditions.isSenkouSpanACrossedUnderB; - - // - conditions.tenKijMax = MathMax(xichConditions.tenkanSenBuffer[cIDX], xichConditions.kijunSenBuffer[cIDX]); - conditions.tenKijMin = MathMin(xichConditions.tenkanSenBuffer[cIDX], xichConditions.kijunSenBuffer[cIDX]); - conditions.senkouMax = MathMax(xichConditions.senkouSpanABuffer[cIDX], xichConditions.senkouSpanBBuffer[cIDX]); - conditions.senkouMin = MathMin(xichConditions.senkouSpanABuffer[cIDX], xichConditions.senkouSpanBBuffer[cIDX]); - - // - // XDELTA ... - - // - // Buffers ... - - // - Copy( - xdeltaConditions.deltaBuffer, - conditions.deltaBuffer // - ); - - // - Copy( - xdeltaConditions.deltaMaBuffer, - conditions.deltaMaBuffer // - ); - - // - Copy( - xdeltaConditions.deltaStateBuffer, - conditions.deltaStateBuffer // - ); - - // - // Conditions ... - - // - conditions.isDeltaBullish = xdeltaConditions.isDeltaBullish; - conditions.isDeltaBearish = xdeltaConditions.isDeltaBearish; - conditions.isDeltaSwitchedToBullish = xdeltaConditions.isDeltaSwitchedToBullish; - conditions.isDeltaSwitchedToBearish = xdeltaConditions.isDeltaSwitchedToBearish; - - // - conditions.isDeltaOverMa = xdeltaConditions.isDeltaOverMa; - conditions.isDeltaUnderMa = xdeltaConditions.isDeltaUnderMa; - conditions.isDeltaCrossedOverMa = xdeltaConditions.isDeltaCrossedOverMa; - conditions.isDeltaCrossedUnderMa = xdeltaConditions.isDeltaCrossedUnderMa; - - // - // XVOLUME ... - - // - // Buffers ... - - // - Copy( - xvolumeConditions.bullishVolumeBuffer, - conditions.bullishVolumeBuffer // - ); - - // - Copy( - xvolumeConditions.bullishVolumeMaBuffer, - conditions.bullishVolumeMaBuffer // - ); - - // - Copy( - xvolumeConditions.bearishVolumeBuffer, - conditions.bearishVolumeBuffer // - ); - - // - Copy( - xvolumeConditions.bearishVolumeMaBuffer, - conditions.bearishVolumeMaBuffer // - ); - - // - // Conditions ... - - // - conditions.isBullishVolumeOverMa = xvolumeConditions.isBullishVolumeOverMa; - conditions.isBullishVolumeCrossedOverMa = xvolumeConditions.isBullishVolumeCrossedOverMa; - - // - conditions.isBullishVolumeUnderMa = xvolumeConditions.isBullishVolumeUnderMa; - conditions.isBullishVolumeCrossedUnderMa = xvolumeConditions.isBullishVolumeCrossedUnderMa; - - // - conditions.isBullishVolumeIncreased = xvolumeConditions.isBullishVolumeIncreased; - conditions.isBullishVolumeSwitchedToIncreased = xvolumeConditions.isBullishVolumeSwitchedToIncreased; - - // - conditions.isBullishVolumeDecreased = xvolumeConditions.isBullishVolumeDecreased; - conditions.isBullishVolumeSwitchedToDecreased = xvolumeConditions.isBullishVolumeSwitchedToDecreased; - - // - conditions.isBearishVolumeOverMa = xvolumeConditions.isBearishVolumeOverMa; - conditions.isBearishVolumeCrossedOverMa = xvolumeConditions.isBearishVolumeCrossedOverMa; - - // - conditions.isBearishVolumeUnderMa = xvolumeConditions.isBearishVolumeUnderMa; - conditions.isBearishVolumeCrossedUnderMa = xvolumeConditions.isBearishVolumeCrossedUnderMa; - - // - conditions.isBearishVolumeIncreased = xvolumeConditions.isBearishVolumeIncreased; - conditions.isBearishVolumeSwitchedToIncreased = xvolumeConditions.isBearishVolumeSwitchedToIncreased; - - // - conditions.isBearishVolumeDecreased = xvolumeConditions.isBearishVolumeDecreased; - conditions.isBearishVolumeSwitchedToDecreased = xvolumeConditions.isBearishVolumeSwitchedToDecreased; - - // - conditions.isVolumeSwitchedToBullish = xvolumeConditions.isVolumeSwitchedToBullish; - conditions.isVolumeSwitchedToBearish = xvolumeConditions.isVolumeSwitchedToBearish; - - // - conditions.isBullishVolumeMaOverBearishVolumeMa = xvolumeConditions.isBullishVolumeMaOverBearishVolumeMa; - conditions.isBullishVolumeMaUnderBearishVolumeMa = xvolumeConditions.isBullishVolumeMaUnderBearishVolumeMa; - - // - // Slopes ... - - // - double rsiSlope = GetSlope(conditions.rsiBuffer, pIDX, cIDX); - double strSlope = GetSlope(conditions.strBuffer, pIDX, cIDX); - double atrUpperSlope = GetSlope(conditions.atrUpperBuffer, pIDX, cIDX); - double atrLowerSlope = GetSlope(conditions.atrLowerBuffer, pIDX, cIDX); - double vwapFastSlope = GetSlope(conditions.vwapFastBuffer, pIDX, cIDX); - double vwapMidSlope = GetSlope(conditions.vwapMidBuffer, pIDX, cIDX); - double vwapSlowSlope = GetSlope(conditions.vwapSlowBuffer, pIDX, cIDX); - - // - bool isRsiSlopeBullish = rsiSlope > 0; - bool isStrSlopeBullish = strSlope > 0; - bool isAtrUpperSlopeBullish = atrUpperSlope > 0; - bool isAtrLowerSlopeBullish = atrLowerSlope > 0; - bool isVwapFastSlopeBullish = vwapFastSlope > 0; - bool isVwapMidSlopeBullish = vwapMidSlope > 0; - bool isVwapSlowSlopeBullish = vwapSlowSlope > 0; - - // - bool isRsiSlopeBearish = rsiSlope < 0; - bool isStrSlopeBearish = strSlope < 0; - bool isAtrUpperSlopeBearish = atrUpperSlope < 0; - bool isAtrLowerSlopeBearish = atrLowerSlope < 0; - bool isVwapFastSlopeBearish = vwapFastSlope < 0; - bool isVwapMidSlopeBearish = vwapMidSlope < 0; - bool isVwapSlowSlopeBearish = vwapSlowSlope < 0; - - // - conditions.rsiSlope = rsiSlope; - conditions.strSlope = strSlope; - conditions.vwapMidSlope = vwapMidSlope; - conditions.vwapSlowSlope = vwapSlowSlope; - conditions.atrUpperSlope = atrUpperSlope; - conditions.atrLowerSlope = atrLowerSlope; - conditions.vwapFastSlope = vwapFastSlope; - conditions.isRsiSlopeBearish = isRsiSlopeBearish; - conditions.isStrSlopeBearish = isStrSlopeBearish; - conditions.isRsiSlopeBullish = isRsiSlopeBullish; - conditions.isStrSlopeBullish = isStrSlopeBullish; - conditions.isVwapMidSlopeBearish = isVwapMidSlopeBearish; - conditions.isVwapMidSlopeBullish = isVwapMidSlopeBullish; - conditions.isAtrUpperSlopeBearish = isAtrUpperSlopeBearish; - conditions.isAtrLowerSlopeBearish = isAtrLowerSlopeBearish; - conditions.isVwapFastSlopeBearish = isVwapFastSlopeBearish; - conditions.isVwapSlowSlopeBearish = isVwapSlowSlopeBearish; - conditions.isAtrUpperSlopeBullish = isAtrUpperSlopeBullish; - conditions.isAtrLowerSlopeBullish = isAtrLowerSlopeBullish; - conditions.isVwapFastSlopeBullish = isVwapFastSlopeBullish; - conditions.isVwapSlowSlopeBullish = isVwapSlowSlopeBullish; - - // - // Complex Conditions ... - - // - double x3maFast = conditions.x3maFastBuffer[cIDX]; - double x3maMid = conditions.x3maMidBuffer[cIDX]; - double x3maSlow = conditions.x3maSlowBuffer[cIDX]; - - // - double x3mas[3] = { - x3maFast, - x3maMid, - x3maSlow // - }; - - // - double x3maMin = GetMin(x3mas); - double x3maMax = GetMax(x3mas); - - // - bool isX3MaFatsOverMid = conditions.x3maFastBuffer[cIDX] > conditions.x3maMidBuffer[cIDX]; - bool isX3MaFatsOverMidPrev = conditions.x3maFastBuffer[pIDX] > conditions.x3maMidBuffer[pIDX]; - - // - bool isX3MaFatsUnderMid = conditions.x3maFastBuffer[cIDX] < conditions.x3maMidBuffer[cIDX]; - bool isX3MaFatsUnderMidPrev = conditions.x3maFastBuffer[pIDX] < conditions.x3maMidBuffer[pIDX]; - - // - bool isX3MaFatsOverSlow = conditions.x3maFastBuffer[cIDX] > conditions.x3maSlowBuffer[cIDX]; - bool isX3MaFatsOverSlowPrev = conditions.x3maFastBuffer[pIDX] > conditions.x3maSlowBuffer[pIDX]; - - // - bool isX3MaFatsUnderSlow = conditions.x3maFastBuffer[cIDX] < conditions.x3maSlowBuffer[cIDX]; - bool isX3MaFatsUnderSlowPrev = conditions.x3maFastBuffer[pIDX] < conditions.x3maSlowBuffer[pIDX]; - - // - bool isX3MaFastCrossedOverMid = isX3MaFatsOverMid && - !isX3MaFatsOverMidPrev; - bool isX3MaFastCrossedUnderMid = isX3MaFatsUnderMid && - !isX3MaFatsUnderMidPrev; - - // - bool isX3MaFastCrossedOverSlow = isX3MaFatsOverSlow && - !isX3MaFatsOverSlowPrev; - bool isX3MaFastCrossedUnderSlow = isX3MaFatsUnderSlow && - !isX3MaFatsUnderSlowPrev; - - // - bool isClosedOverX3MaMin = cBar.close > x3maMin; - bool isClosedUnderX3MaMin = cBar.close < x3maMin; - - // - bool isClosedOverX3MaMax = cBar.close > x3maMax; - bool isClosedUnderX3MaMax = cBar.close < x3maMax; - - // - // - // - - // - double vwapFast = conditions.vwapFastBuffer[cIDX]; - double vwapMid = conditions.vwapMidBuffer[cIDX]; - double vwapSlow = conditions.vwapSlowBuffer[cIDX]; - - // - double vwaps[3] = { - vwapFast, - vwapMid, - vwapSlow // - }; - - // - double vwapMin = GetMin(vwaps); - double vwapMax = GetMax(vwaps); - - // - bool isVWapFatsOverMid = conditions.vwapFastBuffer[cIDX] > conditions.vwapMidBuffer[cIDX]; - bool isVWapFatsOverMidPrev = conditions.vwapFastBuffer[pIDX] > conditions.vwapMidBuffer[pIDX]; - - // - bool isVWapFatsUnderMid = conditions.vwapFastBuffer[cIDX] < conditions.vwapMidBuffer[cIDX]; - bool isVWapFatsUnderMidPrev = conditions.vwapFastBuffer[pIDX] < conditions.vwapMidBuffer[pIDX]; - - // - bool isVWapFatsOverSlow = conditions.vwapFastBuffer[cIDX] > conditions.vwapSlowBuffer[cIDX]; - bool isVWapFatsOverSlowPrev = conditions.vwapFastBuffer[pIDX] > conditions.vwapSlowBuffer[pIDX]; - - // - bool isVWapFatsUnderSlow = conditions.vwapFastBuffer[cIDX] < conditions.vwapSlowBuffer[cIDX]; - bool isVWapFatsUnderSlowPrev = conditions.vwapFastBuffer[pIDX] < conditions.vwapSlowBuffer[pIDX]; - - // - bool isVWapFastCrossedOverMid = isVWapFatsOverMid && - !isVWapFatsOverMidPrev; - bool isVWapFastCrossedUnderMid = isVWapFatsUnderMid && - !isVWapFatsUnderMidPrev; - - // - bool isVWapFastCrossedOverSlow = isVWapFatsOverSlow && - !isVWapFatsOverSlowPrev; - bool isVWapFastCrossedUnderSlow = isVWapFatsUnderSlow && - !isVWapFatsUnderSlowPrev; - - // - bool isClosedOverVWapMin = cBar.close > vwapMin; - bool isClosedUnderVWapMin = cBar.close < vwapMin; - - // - bool isClosedOverVWapMax = cBar.close > vwapMax; - bool isClosedUnderVWapMax = cBar.close < vwapMax; - - // - bool isSarEqualsToPeak = - conditions.sarBuffer[cIDX] == conditions.peaksBuffer[cIDX]; - bool isSarEqualsToVale = - conditions.sarBuffer[cIDX] == conditions.valesBuffer[cIDX]; - - // - bool isSarIncreased = conditions.sarBuffer[cIDX] > conditions.sarBuffer[pIDX]; - bool isSarDecreased = conditions.sarBuffer[cIDX] < conditions.sarBuffer[pIDX]; - - // - double prevSar = conditions.sarBuffer[pIDX]; - double prevStr = conditions.strBuffer[pIDX]; - double prevCheLE1 = conditions.le1Buffer[pIDX]; - double prevCheLE2 = conditions.le2Buffer[pIDX]; - double prevCheSE1 = conditions.se1Buffer[pIDX]; - double prevCheSE2 = conditions.se2Buffer[pIDX]; - double prevAtrUpper = conditions.atrUpperBuffer[pIDX]; - double prevAtrLower = conditions.atrLowerBuffer[pIDX]; - - // - double ches[]; - if (prevCheLE1 != EMPTY_VALUE) - { - // - Add( - prevCheLE1, - ches // - ); - } - if (prevCheLE2 != EMPTY_VALUE) - { - // - Add( - prevCheLE2, - ches // - ); - } - if (prevCheSE1 != EMPTY_VALUE) - { - // - Add( - prevCheSE1, - ches // - ); - } - if (prevCheSE2 != EMPTY_VALUE) - { - // - Add( - prevCheSE2, - ches // - ); - } - - // - double cheMin = GetMin(ches); - double cheMax = GetMax(ches); - - // - bool isSarCrossedUnderPeak = - conditions.sarBuffer[cIDX] < conditions.peaksBuffer[cIDX] && - !(conditions.sarBuffer[pIDX] < conditions.peaksBuffer[pIDX]); - bool isSarCrossedOverVale = - conditions.sarBuffer[cIDX] > conditions.valesBuffer[cIDX] && - !(conditions.sarBuffer[pIDX] > conditions.valesBuffer[pIDX]); - - // - bool isStrEqualsToPeak = - conditions.strBuffer[cIDX] == conditions.peaksBuffer[cIDX]; - bool isStrEqualsToVale = - conditions.strBuffer[cIDX] == conditions.valesBuffer[cIDX]; - - // - bool isStrCrossedUnderPeak = - conditions.strBuffer[cIDX] < conditions.peaksBuffer[cIDX] && - !(conditions.strBuffer[pIDX] < conditions.peaksBuffer[pIDX]); - bool isStrCrossedOverVale = - conditions.strBuffer[cIDX] > conditions.valesBuffer[cIDX] && - !(conditions.strBuffer[pIDX] > conditions.valesBuffer[pIDX]); - - // - bool isPeakOverAtrUpper = - conditions.peaksBuffer[cIDX] > conditions.atrUpperBuffer[cIDX]; - bool isValeUnderAtrLower = - conditions.valesBuffer[cIDX] > conditions.atrLowerBuffer[cIDX]; - - // - bool isNewPeakOverAtrUpper = - isPeakOverAtrUpper && - conditions.isNewPeak; - bool isNewValeUnderAtrLower = - isValeUnderAtrLower && - conditions.isNewVale; - - // - bool isStrUpperOverPeak = - conditions.strBuffer[cIDX] > conditions.peaksBuffer[cIDX]; - bool isStrUpperOverPeakPrev = - conditions.strBuffer[pIDX] > conditions.peaksBuffer[pIDX]; - - // - bool isStrUpperUnderPeak = - conditions.strBuffer[cIDX] < conditions.peaksBuffer[cIDX]; - bool isStrUpperUnderPeakPrev = - conditions.strBuffer[pIDX] < conditions.peaksBuffer[pIDX]; - - // - bool isStrUpperCrossedOverPeak = isStrUpperOverPeak && - !isStrUpperOverPeakPrev; - bool isStrUpperCrossedUnderPeak = isStrUpperUnderPeak && - !isStrUpperUnderPeakPrev; - - // - bool isStrLowerOverVale = - conditions.strBuffer[cIDX] > conditions.valesBuffer[cIDX]; - bool isStrLowerOverValePrev = - conditions.strBuffer[pIDX] > conditions.valesBuffer[pIDX]; - - // - bool isStrLowerUnderVale = - conditions.strBuffer[cIDX] < conditions.valesBuffer[cIDX]; - bool isStrLowerUnderValePrev = - conditions.strBuffer[pIDX] < conditions.valesBuffer[pIDX]; - - // - bool isStrLowerCrossedOverVale = isStrLowerOverVale && - !isStrLowerOverValePrev; - bool isStrLowerCrossedUnderVale = isStrLowerUnderVale && - !isStrLowerUnderValePrev; - - // - bool isDonHighUpperEqualsToPeak = - conditions.donHighUpperBuffer[cIDX] == conditions.peaksBuffer[cIDX]; - bool isDonLowLowerEqualsToVale = - conditions.donLowLowerBuffer[cIDX] == conditions.valesBuffer[cIDX]; - - // - bool isStrUpperOverAtrUpper = - conditions.strUpBuffer[cIDX] > conditions.atrUpperBuffer[cIDX]; - bool isStrUpperOverAtrUpperPrev = - conditions.strUpBuffer[pIDX] > conditions.atrUpperBuffer[pIDX]; - bool isStrUpperCrossedOverAtrUpper = isStrUpperOverAtrUpper && - !isStrUpperOverAtrUpperPrev; - - // - bool isStrUpperUnderAtrUpper = - conditions.strUpBuffer[cIDX] < conditions.atrUpperBuffer[cIDX]; - bool isStrUpperUnderAtrUpperPrev = - conditions.strUpBuffer[pIDX] < conditions.atrUpperBuffer[pIDX]; - bool isStrUpperCrossedUnderAtrUpper = isStrUpperUnderAtrUpper && - !isStrUpperUnderAtrUpperPrev; - - // - bool isStrLowerOverAtrLower = - conditions.strDownBuffer[cIDX] > conditions.atrLowerBuffer[cIDX]; - bool isStrLowerOverAtrLowerPrev = - conditions.strDownBuffer[pIDX] > conditions.atrLowerBuffer[pIDX]; - bool isStrLowerCrossedOverAtrLower = isStrLowerOverAtrLower && - !isStrLowerOverAtrLowerPrev; - - // - bool isStrLowerUnderAtrLower = - conditions.strDownBuffer[cIDX] < conditions.atrLowerBuffer[cIDX]; - bool isStrLowerUnderAtrLowerPrev = - conditions.strDownBuffer[pIDX] < conditions.atrLowerBuffer[pIDX]; - bool isStrLowerCrossedUnderAtrLower = isStrLowerUnderAtrLower && - !isStrLowerUnderAtrLowerPrev; - - // - bool isStrUpperOverDonHighUpper = - conditions.strUpBuffer[cIDX] > conditions.donHighUpperBuffer[cIDX]; - bool isStrUpperOverDonHighUpperPrev = - conditions.strUpBuffer[pIDX] > conditions.donHighUpperBuffer[pIDX]; - bool isStrUpperCrossedOverDonHighUpper = isStrUpperOverDonHighUpper && - !isStrUpperOverDonHighUpperPrev; - - // - bool isStrUpperUnderDonHighUpper = - conditions.strUpBuffer[cIDX] < conditions.donHighUpperBuffer[cIDX]; - bool isStrUpperUnderDonHighUpperPrev = - conditions.strUpBuffer[pIDX] < conditions.donHighUpperBuffer[pIDX]; - bool isStrUpperCrossedUnderDonHighUpper = isStrUpperUnderDonHighUpper && - !isStrUpperUnderDonHighUpperPrev; - - // - bool isStrLowerOverDonLowLower = - conditions.strDownBuffer[cIDX] > conditions.donLowLowerBuffer[cIDX]; - bool isStrLowerOverDonLowLowerPrev = - conditions.strDownBuffer[pIDX] > conditions.donLowLowerBuffer[pIDX]; - bool isStrLowerCrossedOverDonLowLower = isStrLowerOverDonLowLower && - !isStrLowerOverDonLowLowerPrev; - - // - bool isStrLowerUnderDonLowLower = - conditions.strDownBuffer[cIDX] < conditions.donLowLowerBuffer[cIDX]; - bool isStrLowerUnderDonLowLowerPrev = - conditions.strDownBuffer[pIDX] < conditions.donLowLowerBuffer[pIDX]; - bool isStrLowerCrossedUnderDonLowLower = isStrLowerUnderDonLowLower && - !isStrLowerUnderDonLowLowerPrev; - - // - bool isAtrUpperOverPeak = conditions.atrUpperBuffer[cIDX] > conditions.peaksBuffer[cIDX]; - bool isAtrUpperEqualsToPeak = conditions.atrUpperBuffer[cIDX] == conditions.peaksBuffer[cIDX]; - - // - bool isAtrUpperCrossedUpPeak = conditions.atrUpperBuffer[cIDX] > conditions.peaksBuffer[cIDX] && - !(conditions.atrUpperBuffer[cIDX] > conditions.peaksBuffer[cIDX]); - bool isAtrUpperCrossedDownPeak = conditions.atrUpperBuffer[cIDX] < conditions.peaksBuffer[cIDX] && - !(conditions.atrUpperBuffer[cIDX] < conditions.peaksBuffer[cIDX]); - - // - bool isAtrLowerUnderVale = conditions.atrUpperBuffer[cIDX] < conditions.valesBuffer[cIDX]; - bool isAtrLowerEqualsToVale = conditions.atrUpperBuffer[cIDX] == conditions.valesBuffer[cIDX]; - - // - bool isAtrLowerCrossedUpVale = conditions.atrUpperBuffer[cIDX] > conditions.valesBuffer[cIDX] && - !(conditions.atrUpperBuffer[cIDX] > conditions.valesBuffer[cIDX]); - bool isAtrLowerCrossedDownVale = conditions.atrUpperBuffer[cIDX] < conditions.valesBuffer[cIDX] && - !(conditions.atrUpperBuffer[cIDX] < conditions.valesBuffer[cIDX]); - - // - conditions.cheMin = cheMin; - conditions.cheMax = cheMax; - conditions.x3maMin = x3maMin; - conditions.x3maMax = x3maMax; - conditions.vwapMin = vwapMin; - conditions.vwapMax = vwapMax; - - // - conditions.isSarIncreased = isSarIncreased; - conditions.isSarDecreased = isSarDecreased; - conditions.isSarEqualsToPeak = isSarEqualsToPeak; - conditions.isSarEqualsToVale = isSarEqualsToVale; - conditions.isStrEqualsToPeak = isStrEqualsToPeak; - conditions.isStrEqualsToVale = isStrEqualsToVale; - conditions.isX3MaFatsOverMid = isX3MaFatsOverMid; - conditions.isX3MaFatsUnderMid = isX3MaFatsUnderMid; - conditions.isX3MaFatsOverSlow = isX3MaFatsOverSlow; - conditions.isStrUpperOverPeak = isStrUpperOverPeak; - conditions.isPeakOverAtrUpper = isPeakOverAtrUpper; - conditions.isStrLowerOverVale = isStrLowerOverVale; - conditions.isAtrUpperOverPeak = isAtrUpperOverPeak; - conditions.isClosedOverX3MaMin = isClosedOverX3MaMin; - conditions.isClosedOverX3MaMax = isClosedOverX3MaMax; - conditions.isX3MaFatsUnderSlow = isX3MaFatsUnderSlow; - conditions.isAtrLowerUnderVale = isAtrLowerUnderVale; - conditions.isStrLowerUnderVale = isStrLowerUnderVale; - conditions.isStrUpperUnderPeak = isStrUpperUnderPeak; - conditions.isValeUnderAtrLower = isValeUnderAtrLower; - conditions.isClosedOverVWapMin = isClosedOverVWapMin; - conditions.isClosedOverVWapMax = isClosedOverVWapMax; - conditions.isClosedUnderX3MaMin = isClosedUnderX3MaMin; - conditions.isClosedUnderX3MaMax = isClosedUnderX3MaMax; - conditions.isClosedUnderVWapMin = isClosedUnderVWapMin; - conditions.isClosedUnderVWapMax = isClosedUnderVWapMax; - conditions.isSarCrossedOverVale = isSarCrossedOverVale; - conditions.isStrCrossedOverVale = isStrCrossedOverVale; - conditions.isX3MaFatsOverMidPrev = isX3MaFatsOverMidPrev; - conditions.isSarCrossedUnderPeak = isSarCrossedUnderPeak; - conditions.isStrCrossedUnderPeak = isStrCrossedUnderPeak; - conditions.isNewPeakOverAtrUpper = isNewPeakOverAtrUpper; - conditions.isX3MaFatsUnderMidPrev = isX3MaFatsUnderMidPrev; - conditions.isX3MaFatsOverSlowPrev = isX3MaFatsOverSlowPrev; - conditions.isAtrUpperEqualsToPeak = isAtrUpperEqualsToPeak; - conditions.isAtrLowerEqualsToVale = isAtrLowerEqualsToVale; - conditions.isNewValeUnderAtrLower = isNewValeUnderAtrLower; - conditions.isStrUpperOverAtrUpper = isStrUpperOverAtrUpper; - conditions.isStrLowerOverAtrLower = isStrLowerOverAtrLower; - conditions.isX3MaFatsUnderSlowPrev = isX3MaFatsUnderSlowPrev; - conditions.isStrUpperUnderAtrUpper = isStrUpperUnderAtrUpper; - conditions.isStrLowerUnderAtrLower = isStrLowerUnderAtrLower; - conditions.isAtrUpperCrossedUpPeak = isAtrUpperCrossedUpPeak; - conditions.isAtrLowerCrossedUpVale = isAtrLowerCrossedUpVale; - conditions.isX3MaFastCrossedOverMid = isX3MaFastCrossedOverMid; - conditions.isVWapFastCrossedOverMid = isVWapFastCrossedOverMid; - conditions.isX3MaFastCrossedUnderMid = isX3MaFastCrossedUnderMid; - conditions.isX3MaFastCrossedOverSlow = isX3MaFastCrossedOverSlow; - conditions.isAtrUpperCrossedDownPeak = isAtrUpperCrossedDownPeak; - conditions.isAtrLowerCrossedDownVale = isAtrLowerCrossedDownVale; - conditions.isVWapFastCrossedUnderMid = isVWapFastCrossedUnderMid; - conditions.isDonLowLowerEqualsToVale = isDonLowLowerEqualsToVale; - conditions.isStrUpperCrossedOverPeak = isStrUpperCrossedOverPeak; - conditions.isStrLowerCrossedOverVale = isStrLowerCrossedOverVale; - conditions.isStrLowerOverDonLowLower = isStrLowerOverDonLowLower; - conditions.isVWapFastCrossedOverSlow = isVWapFastCrossedOverSlow; - conditions.isX3MaFastCrossedUnderSlow = isX3MaFastCrossedUnderSlow; - conditions.isVWapFastCrossedUnderSlow = isVWapFastCrossedUnderSlow; - conditions.isStrUpperOverDonHighUpper = isStrUpperOverDonHighUpper; - conditions.isStrLowerUnderDonLowLower = isStrLowerUnderDonLowLower; - conditions.isDonHighUpperEqualsToPeak = isDonHighUpperEqualsToPeak; - conditions.isStrUpperCrossedUnderPeak = isStrUpperCrossedUnderPeak; - conditions.isStrLowerCrossedUnderVale = isStrLowerCrossedUnderVale; - conditions.isStrUpperUnderDonHighUpper = isStrUpperUnderDonHighUpper; - conditions.isStrLowerCrossedOverAtrLower = isStrLowerCrossedOverAtrLower; - conditions.isStrUpperCrossedOverAtrUpper = isStrUpperCrossedOverAtrUpper; - conditions.isStrUpperCrossedUnderAtrUpper = isStrUpperCrossedUnderAtrUpper; - conditions.isStrLowerCrossedUnderAtrLower = isStrLowerCrossedUnderAtrLower; - conditions.isStrLowerCrossedOverDonLowLower = isStrLowerCrossedOverDonLowLower; - conditions.isStrUpperCrossedOverDonHighUpper = isStrUpperCrossedOverDonHighUpper; - conditions.isStrLowerCrossedUnderDonLowLower = isStrLowerCrossedUnderDonLowLower; - conditions.isStrUpperCrossedUnderDonHighUpper = isStrUpperCrossedUnderDonHighUpper; - - // - // - xpvConditions.Clean(); - xhkConditions.Clean(); - xichConditions.Clean(); - xmasConditions.Clean(); - xatrConditions.Clean(); - xstrConditions.Clean(); - xcheConditions.Clean(); - xdonConditions.Clean(); - x3maConditions.Clean(); - xvwapConditions.Clean(); - - // - Free(); - - // - return result; - } - - // - protected: - // - - // - private: - // - - // - string mSymbol; // Trading Symbol - ENUM_TIMEFRAMES mPeriod; // Trading Period - - // - // Inputs ... - X121Inputs mInputs; - X121XCCInputs xccInputs; - X121XPVInputs xpvInputs; - X121XHKInputs xhkInputs; - X121XICHInputs xichInputs; - X121XMASInputs xmasInputs; - X121XATRInputs xatrInputs; - X121XDONInputs xdonInputs; - X121XSTRInputs xstrInputs; - X121XCHEInputs xcheInputs; - X121X3MAInputs x3maInputs; - X121XVWAPInputs xvwapInputs; - X121XDELTAInputs xdeltaInputs; - X121XVOLUMEInputs xvolumeInputs; - - // - int mRSIHandler; -}; - -// \ No newline at end of file diff --git a/Documents/BKP/x-saherelm.x121.xcdv.mq5 b/Documents/BKP/x-saherelm.x121.xcdv.mq5 deleted file mode 100644 index ce81dda4..00000000 --- a/Documents/BKP/x-saherelm.x121.xcdv.mq5 +++ /dev/null @@ -1,573 +0,0 @@ -/////////////////////////////////////////////////////// -// -// SaherElm IT Center MQL5 Ocillator -// ------------------------------------------------- -// Name: X121 XCDV -// Description: Detect Comulative Delta Volume ... -// -// -// 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 XCDV Ocillator" -#property strict - -// -// Definitions ... - -// -#define ShortName "X121_XCDV" - -// -// Imports ... -#include "../Libraries/x-saherelm.common.lib.mq5" - -// -// Inputs ... - -// -// Makret ... -input group "Market"; -input int maLength = 14; // Moving Averge Length -input ENUM_X_PRICE maAppliedTo = X_PRICE_CLOSE; // Moving Averge Applied To -input ENUM_X_MA_METHOD maMethod = X_MA_MODE_EMA; // Moving Averge Method - -// -// Presentation ... -input group "Presentation"; -input int startCalculationForLastBars = 1000; // Calculate Last n Bars -input bool showCDV = true; // Show Delta Line -input bool showMA = true; // Show Delta Histogram - -// -// Buffers Props ... - -// -#property indicator_separate_window - -// -#property indicator_buffers 10 -#property indicator_plots 2 - -// -#define hideColorIDX 0 -#define bullishColorIDX 1 -#define bearishColorIDX 2 - -// -// Buffers ... - -// -#define openBufferIndex 0 -double openBuffer[]; - -// -#define highBufferIndex 1 -double highBuffer[]; - -// -#define lowBufferIndex 2 -double lowBuffer[]; - -// -#define closeBufferIndex 3 -double closeBuffer[]; - -// -#define colorBufferIndex 4 -double colorBuffer[]; - -// -#define barBufferIndex 0 -#property indicator_label1 "X121 XCDV Open;X121 XCDV High;X121 XCDV Low;X121 XCDV Close" -#property indicator_type1 DRAW_COLOR_CANDLES -#property indicator_color1 CLR_NONE, clrLime, clrRed - -// -#define maBufferIndex 5 -double maBuffer[]; - -#property indicator_label2 "MA" -#property indicator_type2 DRAW_LINE -#property indicator_color2 clrYellow -#property indicator_style2 STYLE_SOLID -#property indicator_width2 1 - -// -// Data Buffers ... - -#define mLastBufferIndex 5 - -#define priceBufferIndex mLastBufferIndex + 1 -double priceBuffer[]; - -#define deltaBufferIndex mLastBufferIndex + 2 -double deltaBuffer[]; - -#define cumulativeDeltaBufferIndex mLastBufferIndex + 3 -double cumulativeDeltaBuffer[]; - -// -// Variables, Properties and etc ... - -// -// this counts Available Bars ... -int limit; - -// -int maxLength; - -// -double lastCDV = 0.0; - -// -// Event Handlers ... - -/** - * Initialize Indicator ... - * - * @return ( int ) - */ -int OnInit() -{ - // - // Validate Inputs ... - if (!ValidateInputs()) - { - return INIT_PARAMETERS_INCORRECT; - } - - // - // Initialize Indicator Handlers ... - - // - // 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(); - IndicatorSetInteger(INDICATOR_DIGITS, 2); - - // - // Init Succeed ... - return INIT_SUCCEEDED; -} - -/** - * De Initialize Indicator ... - * - * @param reason: Integer, De Initialization Reason ... - */ -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 -} - -/** - * Calculate Bars ... - * - * @param rates_total: Integer, Total Bars on Chart ... - * @param prev_calculated: Integer, Total Calculated Bars on Charts ... - * @param time: DateTime Array, History of Open Time ... - * @param open: Double Array, History of Open Prices ... - * @param high: Double Array, History of High Prices ... - * @param low: Double Array, History of Low Prices ... - * @param close: Double Array, History of Close Prices ... - * @param tick_volume: Long, History of Tick Volumes on Bar ... - * @param volume: Long, History of Trade Volumes ... - * @param spread: Double, History of Spread Price ... - * - * @return ( int ) - */ -int OnCalculate( - const int rates_total, - const int prev_calculated, - const datetime &time[], - const double &open[], - const double &high[], - const double &low[], - const double &close[], - const long &tick_volume[], - const long &volume[], - const int &spread[] // -) -{ - // - // 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); - - // - limit = (prev_calculated > rates_total || prev_calculated <= 0) - ? rates_total - : (rates_total - prev_calculated) + 1; - - // - // Main Loop ... - for (int i = limit - 1; i >= 0 && !IsStopped(); i--) - { - // - CalculateBuffers( - // - i, - prev_calculated, - rates_total, - // - open, - high, - close, - low, - tick_volume // - ); - } - - // - return rates_total; -} - -// -// Functions ... - -/** - * Validate Input Args for Initialization ... - * - * @return ( bool ) - */ -bool ValidateInputs() -{ - // - bool result = false; - - // - result = maLength > 0 && - IsValid(maMethod) && - IsValid(maAppliedTo); - - // - return result; -} - -/** - * Extract Max Length of Inputs ... - * - * @return ( int ) - */ -int ExtractMaxLengthOfInputs() -{ - // - int result = 0; - - // - result = MathMax(0, maLength); - - // - return result; -} - -/** - * Set Indicator Short Name and also we can define Buffers Labels ... - */ -void SetIndicatorName() -{ - IndicatorSetString(INDICATOR_SHORTNAME, ShortName); -} - -/** - * Define Required Buffers ... - */ -void DefineBuffers() -{ - // - // Plot Buffers ... - - // - // CDV ... - - // - // Raw Candles Color ... - ArraySetAsSeries(colorBuffer, true); - SetIndexBuffer(colorBufferIndex, colorBuffer, INDICATOR_COLOR_INDEX); - - // - ENUM_DRAW_TYPE barDrawType = showCDV ? DRAW_COLOR_CANDLES : DRAW_NONE; - - // - // Set EMPTY_VALUE on Candles Buffer ... - PlotIndexSetDouble(barBufferIndex, PLOT_EMPTY_VALUE, 0.0); - PlotIndexSetInteger(barBufferIndex, PLOT_SHOW_DATA, showCDV); - PlotIndexSetInteger(barBufferIndex, PLOT_DRAW_TYPE, barDrawType); - - // - // Open ... - ArraySetAsSeries(openBuffer, true); - SetIndexBuffer(openBufferIndex, openBuffer, INDICATOR_DATA); - - // - // High ... - ArraySetAsSeries(highBuffer, true); - SetIndexBuffer(highBufferIndex, highBuffer, INDICATOR_DATA); - - // - // Close ... - ArraySetAsSeries(closeBuffer, true); - SetIndexBuffer(closeBufferIndex, closeBuffer, INDICATOR_DATA); - - // - // Low ... - ArraySetAsSeries(lowBuffer, true); - SetIndexBuffer(lowBufferIndex, lowBuffer, INDICATOR_DATA); - - // - // Ma ... - ENUM_DRAW_TYPE maDrawType = showMA ? DRAW_LINE : DRAW_NONE; - - // - ArraySetAsSeries(maBuffer, true); - SetIndexBuffer(maBufferIndex, maBuffer, INDICATOR_DATA); - PlotIndexSetDouble(maBufferIndex, PLOT_EMPTY_VALUE, 0); - PlotIndexSetInteger(maBufferIndex, PLOT_SHOW_DATA, showMA); - PlotIndexSetInteger(maBufferIndex, PLOT_DRAW_TYPE, maDrawType); - - // - // Data Buffers ... - - // - ArraySetAsSeries(priceBuffer, true); - SetIndexBuffer(priceBufferIndex, priceBuffer, INDICATOR_CALCULATIONS); - - // - ArraySetAsSeries(deltaBuffer, true); - SetIndexBuffer(deltaBufferIndex, deltaBuffer, INDICATOR_CALCULATIONS); - - // - ArraySetAsSeries(cumulativeDeltaBuffer, true); - SetIndexBuffer(cumulativeDeltaBufferIndex, cumulativeDeltaBuffer, INDICATOR_CALCULATIONS); -} - -/** - * Calculate Custom Buffers ... - * - * @param bar_index: Integer, Represent Current Bar ... - * @param prevCalculated: Integer, Represent Previous Calculated Bars ... - * @param ratesTotal: Integer, Represents All Available Bars ... - * @param open: Double Array, History of Open Prices ... - * @param high: Double Array, History of High Prices ... - * @param close: Double Array, History of Close Prices ... - * @param low: Double Array, History of Low Prices ... - * @param tickVolume: Long, History of Tick Volumes on Bar ... - */ -void CalculateBuffers( - int bar_index, // Selected Bar Index - const int prevCalculated, - const int ratesTotal, - const double &open[], - const double &high[], - const double &close[], - const double &low[], - const long &tickVolume[] // -) -{ - // - int barsLimit = startCalculationForLastBars > 0 - ? startCalculationForLastBars - : 0; - // - // bool canCalculate = true; - bool canCalculate = - barsLimit == 0 || - bar_index <= barsLimit; - if (canCalculate) - { - // - CalculateValues( - bar_index, - prevCalculated, - ratesTotal, - open, - high, - close, - low, - tickVolume // - ); - } - else - { - FillBuffersZero(bar_index); - } -} - -/** - * Fill All Bufers to Zero Vlue for Specified Bar Index ... - * - * @param barIndex: Integer ... - */ -void FillBuffersZero(int barIndex) -{ - // - openBuffer[barIndex] = 0.0; - highBuffer[barIndex] = 0.0; - closeBuffer[barIndex] = 0.0; - lowBuffer[barIndex] = 0.0; - colorBuffer[barIndex] = hideColorIDX; -} - -/** - * Calculate Vales ... - * - * @param bar_index: Integer, Represent Current Bar ... - * @param prevCalculated: Integer, Represent Previous Calculated Bars ... - * @param ratesTotal: Integer, Represents All Available Bars ... - * @param open: Double Array, History of Open Prices ... - * @param high: Double Array, History of High Prices ... - * @param close: Double Array, History of Close Prices ... - * @param low: Double Array, History of Low Prices ... - * @param tickVolume: Long, History of Tick Volumes on Bar ... - */ -void CalculateValues( - int bar_index, // Selected Bar Index - const int prevCalculated, - const int ratesTotal, - const double &open[], - const double &high[], - const double &close[], - const double &low[], - const long &tickVolume[] // -) -{ - // - XOHCL bar; - bool has = bar.Init( - _Symbol, - _Period, - bar_index // - ); - if (!has) - { - return; - } - - // - double lowShadow = bar.GetLowShadow(); - double highShadow = bar.GetHighShadow(); - double body = bar.GetBody(); - bool isBullish = bar.IsBullish(); - bool hasDir = HasDirection(bar.GetDirection()); - - // - double iRate = 0.5 * (highShadow + lowShadow + (hasDir ? 2 * body : 0)) / (highShadow + lowShadow + body); - iRate = iRate <= 0 - ? 0.5 - : iRate; - - // - double iVRate = tickVolume[bar_index] * iRate; - double iDelta = isBullish - ? iVRate - : -1 * iVRate; - deltaBuffer[bar_index] = iDelta; - - // - double iCumulate = lastCDV + iDelta; - cumulativeDeltaBuffer[bar_index] = iCumulate; - lastCDV = iCumulate; - - // - bool isFirstBar = - startCalculationForLastBars > 0 - ? bar_index == startCalculationForLastBars - : bar_index == ratesTotal; - - // - double iO = 0; - double iH = 0; - double iL = 0; - double iC = 0; - if (!isFirstBar) - { - // - iO = cumulativeDeltaBuffer[bar_index + 1]; - iH = MathMax(cumulativeDeltaBuffer[bar_index], cumulativeDeltaBuffer[bar_index + 1]); - iL = MathMin(cumulativeDeltaBuffer[bar_index], cumulativeDeltaBuffer[bar_index + 1]); - iC = iCumulate; - } - - // - double iClose = (iO + iH + iL + iC) / 4; - double iOpen = isFirstBar - ? (iO + iC) / 2 - : (openBuffer[bar_index + 1] + closeBuffer[bar_index + 1]) / 2; - double iLow = MathMin(iL, MathMin(iOpen, iClose)); - double iHigh = MathMax(iH, MathMax(iOpen, iClose)); - - // - lowBuffer[bar_index] = iLow; - openBuffer[bar_index] = iOpen; - highBuffer[bar_index] = iHigh; - closeBuffer[bar_index] = iClose; - - // - bool isCBullish = iOpen <= iClose; - double iColor = isCBullish - ? bullishColorIDX - : bearishColorIDX; - colorBuffer[bar_index] = iColor; - - // - double iPrice = GetAppliedPrice( - maAppliedTo, - openBuffer, - highBuffer, - lowBuffer, - closeBuffer, - bar_index // - ); - priceBuffer[bar_index] = iPrice; - - // - // Calculate Moving Averages ... - int deltaMAsCount = iMAOnBuffer( - ratesTotal, - prevCalculated, - bar_index, - maLength, - priceBuffer, - maBuffer, - maMethod // - ); - - // - bar.Clean(); -} - -// diff --git a/Documents/BKP/x-saherelm.x121.xich.mq5 b/Documents/BKP/x-saherelm.x121.xich.mq5 deleted file mode 100644 index 02df92f6..00000000 --- a/Documents/BKP/x-saherelm.x121.xich.mq5 +++ /dev/null @@ -1,846 +0,0 @@ -/////////////////////////////////////////////////////// -// -// SaherElm IT Center MQL5 Indicator -// ------------------------------------------------- -// Name: XICH -// Description: Ichimoku Kinko Hyo ... -// -// -// 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 XICH Indicator" -#property strict - -// -// START Constants ... -// - -// -// Indicator Short Name ... -#define ShortName "X121 XICH" - -// -// Ichimoku Golden Numbers ... -enum ENUM_X_ICHIMOKU_GOLDEN_NUMBERS -{ - X_ICH_BASE = 9, - X_ICH_GOLDEN = 17, - X_ICH_CYCLE = 26, - X_ICH_PERIOD = 35, - X_ICH_STAR = 45, - X_ICH_MED = 52, - X_ICH_LONG = 63, - X_ICH_FULL = 72 -}; - -// -// Ichimoku Lines Calculator Mode ... -enum ENUM_X_ICHIMOKU_CALCULATION_MODE -{ - // - X_XICH_HH_LL_MODE = 1, // Highest High and Lowest Low - X_XICH_HO_LC_MODE = 2, // Highest Open and Lowest Close -}; - -// -// END Constants ... -// - -// -// START Inputs ... -// - -// -// ICHIMOKU Kinko Hyo ... - -// -// TENKANSEN ... -input group "Tenkan Sen"; -input int tenkanSenLength = 9; // Length -input ENUM_X_ICHIMOKU_CALCULATION_MODE tenkanSenMode = X_XICH_HH_LL_MODE; // Calculation Mode - -// -// KIJUNSEN ... -input group "Kijun Sen"; -input int kijunSenLength = 26; // Length -input ENUM_X_ICHIMOKU_CALCULATION_MODE kijunSenMode = X_XICH_HH_LL_MODE; // Calculation Mode - -// -// SENKOUSPANB ... -input group "Senkou Span B"; -input int senkouSpanBLength = 52; // Length -input ENUM_X_ICHIMOKU_CALCULATION_MODE senkouSpanBMode = X_XICH_HH_LL_MODE; // Calculation Mode - -// -// CHIKOUSPAN ... -input group "Chikou Span"; -input ENUM_APPLIED_PRICE chikuoSpanAppliedTo = PRICE_CLOSE; // Price Type - -// -input group "Presentation"; -input bool showTenkanSen = true; // Show Tenkan Sen -input bool showKijunSen = true; // Show Kijun Sen -input bool showKijunSenPlus = false; // Show Kijun Sen + -input bool showKijunSenNegative = false; // Show Kijun Sen - -input bool showChikouSpan = true; // Show Chikou Span -input bool showSenkouSpanA = true; // Show Senkou Span A -input bool showSenkouSpanB = true; // Show Senkou Span B -input bool showKumo = true; // Show Kumo -input bool shiftKumo = true; // Shift Kumo to Future - -// -// END Inputs ... -// - -// -// START Includes and Imports ... -// - -// -// Includes Common Library ... -#include "../Libraries/x-saherelm.common.lib.mq5" - -// -// END Includes and Imports ... -// - -// -// START Buffers ... -// -#property indicator_chart_window - -// -#property indicator_buffers 15 -#property indicator_plots 8 - -// -// PLOTTED Buffers ... - -// -// ICHIMOKU ... - -// -// TENKANSEN ... - -// -#define tenkanSenBufferIndex 0 -double tenkanSenBuffer[]; - -// -#property indicator_label1 "XICH TK" -#property indicator_type1 DRAW_LINE -#property indicator_color1 clrBrown -#property indicator_style1 STYLE_SOLID -#property indicator_width1 1 - -// -// KIJUNSEN ... - -// -#define kijunSenBufferIndex 1 -double kijunSenBuffer[]; - -// -#property indicator_label2 "XICH KJ" -#property indicator_type2 DRAW_LINE -#property indicator_color2 clrDodgerBlue -#property indicator_style2 STYLE_SOLID -#property indicator_width2 1 - -// -#define kijunSenPlusBufferIndex 2 -double kijunSenPlusBuffer[]; - -// -#property indicator_label3 "XICH KJ+" -#property indicator_type3 DRAW_LINE -#property indicator_color3 clrMediumTurquoise -#property indicator_style3 STYLE_DOT -#property indicator_width3 1 - -// -#define kijunSenNegativeBufferIndex 3 -double kijunSenNegativeBuffer[]; - -// -#property indicator_label4 "XICH KJ-" -#property indicator_type4 DRAW_LINE -#property indicator_color4 clrDarkSeaGreen -#property indicator_style4 STYLE_DOT -#property indicator_width4 1 - -// -// CHIKOUSPAN ... - -// -#define chikouSpanBufferIndex 4 -double chikouSpanBuffer[]; - -// -#property indicator_label5 "XICH CS" -#property indicator_type5 DRAW_LINE -#property indicator_color5 clrDarkGreen -#property indicator_style5 STYLE_SOLID -#property indicator_width5 1 - -// -#define senkouABufferIndex 5 -double senkouABuffer[]; - -// -#property indicator_label6 "XICH SSA" -#property indicator_type6 DRAW_LINE -#property indicator_color6 clrLightGray -#property indicator_style6 STYLE_DASHDOTDOT -#property indicator_width6 1 - -// -#define senkouBBufferIndex 6 -double senkouBBuffer[]; - -// -#property indicator_label7 "XICH SSB" -#property indicator_type7 DRAW_LINE -#property indicator_color7 clrLightGray -#property indicator_style7 STYLE_DASHDOTDOT -#property indicator_width7 1 - -// -// KUMO ... - -// -// SENKOUSPANA ... - -// -#define senkouSpanABufferIndex 7 -double senkouSpanABuffer[]; - -// -// SENKOUSPANB ... - -// -#define senkouSpanBBufferIndex 8 -double senkouSpanBBuffer[]; - -// -// KUMOCLOUD ... - -// -#define kumoBufferIndex 7 - -// -#property indicator_label8 "XICH Kumo" -#property indicator_type8 DRAW_FILLING -#property indicator_color8 clrAqua, clrMagenta -#property indicator_style8 STYLE_SOLID -#property indicator_width8 1 - -// -// DATA Buffers ... - -// -#define dTenkanBufferIndex 9 -double dTenkanBuffer[]; - -// -#define dKijunBufferIndex 10 -double dKijunBuffer[]; - -// -#define dChikouBufferIndex 11 -double dChikouBuffer[]; - -// -#define dSSABufferIndex 12 -double dSSABuffer[]; - -// -#define dSSBBufferIndex 13 -double dSSBBuffer[]; - -// -// END Buffers ... -// - -// -// START Global Definitions: Variables, Properties and etc ... -// - -// -int maxLength; -int mHandler; - -// -ENUM_SERIESMODE mTenkanSenTopMode = NULL; -ENUM_SERIESMODE mTenkanSenBottomMode = NULL; - -// -ENUM_SERIESMODE mKijunSenTopMode = NULL; -ENUM_SERIESMODE mKijunSenBottomMode = NULL; - -// -ENUM_SERIESMODE mSenkouSpanBTopMode = NULL; -ENUM_SERIESMODE mSenkouSpanBBottomMode = NULL; - -// -// 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(); - - // - // Init Handler ... - mHandler = iIchimoku( - _Symbol, - _Period, - tenkanSenLength, - kijunSenLength, - senkouSpanBLength); - if (mHandler == INVALID_HANDLE) - { - return INIT_FAILED; - } - - // - // 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 - - // - IndicatorRelease(mHandler); -} - -// -// 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[]) -{ - // - // 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); - - // - // this counts Available Bars ... - int limit; - - // - // Check Calculated Bars ... - int ichCalculatedBars = BarsCalculated(mHandler); - if (ichCalculatedBars < maxLength) - { - return prev_calculated; - } - - // - limit = (prev_calculated > 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; - } - } - - // - XOHCL bar; - bar.Init( - _Symbol, - _Period, - bar_index - // - ); - - // - // Calculate Top ... - topValue = bar - .FindHighest( - tenkanSenLength, - mTenkanSenTopMode - // - ); - - // - // Calculate Bottom ... - bottomValue = bar - .FindLowest( - tenkanSenLength, - mTenkanSenBottomMode - // - ); - - // - 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 = bar - .FindHighest( - kijunSenLength, - mKijunSenTopMode - // - ); - - // - // Calculate Bottom ... - bottomValue = bar - .FindLowest( - kijunSenLength, - mKijunSenBottomMode - // - ); - - // - double kijunSenValue = (topValue + bottomValue) / 2; - kijunSenBuffer[bar_index] = kijunSenValue; - - // - kijunSenPlusBuffer[bar_index] = kijunSenValue; - kijunSenNegativeBuffer[bar_index] = kijunSenValue; - - // - // CHIKOUSPAN ... - double chikouSpanValue = bar - .GetPrice(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 = bar - .FindHighest( - senkouSpanBLength, - mSenkouSpanBTopMode - // - ); - - // - // Calculate Bottom ... - bottomValue = bar - .FindLowest( - senkouSpanBLength, - mSenkouSpanBBottomMode - // - ); - - // - double senkouSpanBValue = (topValue + bottomValue) / 2; - senkouBBuffer[bar_index] = senkouSpanBValue; - senkouSpanBBuffer[bar_index] = senkouSpanBValue; -} - -// -// END Functions ... -// diff --git a/Documents/BKP/x121.helper.bkp.mq5 b/Documents/BKP/x121.helper.bkp.mq5 deleted file mode 100644 index 1487eca5..00000000 --- a/Documents/BKP/x121.helper.bkp.mq5 +++ /dev/null @@ -1,393 +0,0 @@ - - // // - // // XICH ... - // X121XICHConditions xichConditions; - // result = GetICHConditions( - // xichConditions, - // barIndex, - // loopback // - // ); - // if (!result) - // { - // // - // xpvConditions.Clean(); - // xhkConditions.Clean(); - // xichConditions.Clean(); - - // // - // return result; - // } - - // // - // // XDON ... - // X121XDONConditions xdonConditions; - // result = GetDONConditions( - // xdonConditions, - // barIndex, - // loopback // - // ); - // if (!result) - // { - // // - // xpvConditions.Clean(); - // xhkConditions.Clean(); - // xichConditions.Clean(); - // xmasConditions.Clean(); - // xatrConditions.Clean(); - // xstrConditions.Clean(); - // xcheConditions.Clean(); - // xdonConditions.Clean(); - - // // - // return result; - // } - - // // - // // XDELTA ... - // X121XDELTAConditions xdeltaConditions; - // result = GetDELTAConditions( - // xdeltaConditions, - // barIndex, - // loopback // - // ); - // if (!result) - // { - // // - // xpvConditions.Clean(); - // xhkConditions.Clean(); - // xichConditions.Clean(); - // xmasConditions.Clean(); - // xatrConditions.Clean(); - // xstrConditions.Clean(); - // xcheConditions.Clean(); - // xdonConditions.Clean(); - // x3maConditions.Clean(); - // xvwapConditions.Clean(); - // xdeltaConditions.Clean(); - - // // - // return result; - // } - - // // - // // XVOLUME ... - // X121XVOLUMEConditions xvolumeConditions; - // result = GetVOLUMEConditions( - // xvolumeConditions, - // barIndex, - // loopback // - // ); - // if (!result) - // { - // // - // xpvConditions.Clean(); - // xhkConditions.Clean(); - // xichConditions.Clean(); - // xmasConditions.Clean(); - // xatrConditions.Clean(); - // xstrConditions.Clean(); - // xcheConditions.Clean(); - // xdonConditions.Clean(); - // x3maConditions.Clean(); - // xvwapConditions.Clean(); - // xdeltaConditions.Clean(); - // xvolumeConditions.Clean(); - - // // - // return result; - // } - - // - // xichConditions.Clean(); - // xdonConditions.Clean(); - // xdeltaConditions.Clean(); - // xvolumeConditions.Clean(); - - - // // - // // XICH ... - // bool GetICHConditions( - // X121XICHConditions &conditions, // - // int barIndex = 0, // - // int loopback = 5 // - // ) - // { - // // - // bool result = false; - - // // - // result = xichHelper.GetConditions( - // conditions, - // barIndex, - // loopback // - // ); - - // // - // return result; - // } - - // // - // // XDON ... - // bool GetDONConditions( - // X121XDONConditions &conditions, // - // int barIndex = 0, // - // int loopback = 5 // - // ) - // { - // // - // bool result = false; - - // // - // result = xdonHelper.GetConditions( - // conditions, - // barIndex, - // loopback // - // ); - - // // - // return result; - // } - - // // - // // XDELTA ... - // bool GetDELTAConditions( - // X121XDELTAConditions &conditions, // - // int barIndex = 0, // - // int loopback = 5 // - // ) - // { - // // - // bool result = false; - - // // - // result = xdeltaHelper.GetConditions( - // conditions, - // barIndex, - // loopback // - // ); - - // // - // return result; - // } - - // // - // // XVOLUME ... - // bool GetVOLUMEConditions( - // X121XVOLUMEConditions &conditions, // - // int barIndex = 0, // - // int loopback = 5 // - // ) - // { - // // - // bool result = false; - - // // - // result = xvolumeHelper.GetConditions( - // conditions, - // barIndex, - // loopback // - // ); - - // // - // return result; - // } - - - // - // xichInputs = inputs.xichInputs; - // xdonInputs = inputs.xdonInputs; - // xdeltaInputs = inputs.xdeltaInputs; - // xvolumeInputs = inputs.xvolumeInputs; - - - - // // - // // XICH ... - // xichHelper = new XCX121XICHHelper(); - // result = xichHelper.Init( - // symbol, - // period, - // xichInputs // - // ); - // if (!result) - // { - // // - // ZeroMemory(xccHelper); - // ZeroMemory(xpvHelper); - // ZeroMemory(xhkHelper); - // ZeroMemory(xmasHelper); - // ZeroMemory(xatrHelper); - // ZeroMemory(xstrHelper); - // ZeroMemory(xcheHelper); - // ZeroMemory(x3maHelper); - // ZeroMemory(xvwapHelper); - - // // - // // ZeroMemory(xichHelper); - // // ZeroMemory(xdonHelper); - // // ZeroMemory(xdeltaHelper); - // // ZeroMemory(xvolumeHelper); - - // // - // return result; - // } - - // // - // // XDON ... - // xdonHelper = new XCX121XDONHelper(); - // result = xdonHelper.Init( - // symbol, - // period, - // xdonInputs // - // ); - // if (!result) - // { - // // - // ZeroMemory(xccHelper); - // ZeroMemory(xpvHelper); - // ZeroMemory(xhkHelper); - // ZeroMemory(xmasHelper); - // ZeroMemory(xatrHelper); - // ZeroMemory(xstrHelper); - // ZeroMemory(xcheHelper); - // ZeroMemory(x3maHelper); - // ZeroMemory(xvwapHelper); - - // // - // // ZeroMemory(xichHelper); - // // ZeroMemory(xdonHelper); - // // ZeroMemory(xdeltaHelper); - // // ZeroMemory(xvolumeHelper); - - // // - // return result; - // } - - // // - // // XDELTA ... - // xdeltaHelper = new XCX121XDELTAHelper(); - // result = xdeltaHelper.Init( - // symbol, - // period, - // xdeltaInputs // - // ); - // if (!result) - // { - // // - // ZeroMemory(xccHelper); - // ZeroMemory(xpvHelper); - // ZeroMemory(xhkHelper); - // ZeroMemory(xmasHelper); - // ZeroMemory(xatrHelper); - // ZeroMemory(xstrHelper); - // ZeroMemory(xcheHelper); - // ZeroMemory(x3maHelper); - // ZeroMemory(xvwapHelper); - - // // - // // ZeroMemory(xichHelper); - // // ZeroMemory(xdonHelper); - // // ZeroMemory(xdeltaHelper); - // // ZeroMemory(xvolumeHelper); - - // // - // return result; - // } - - // // - // // XVOLUME ... - // xvolumeHelper = new XCX121XVOLUMEHelper(); - // result = xvolumeHelper.Init( - // symbol, - // period, - // xvolumeInputs // - // ); - // if (!result) - // { - // // - // ZeroMemory(xccHelper); - // ZeroMemory(xpvHelper); - // ZeroMemory(xhkHelper); - // ZeroMemory(xmasHelper); - // ZeroMemory(xatrHelper); - // ZeroMemory(xstrHelper); - // ZeroMemory(xcheHelper); - // ZeroMemory(x3maHelper); - // ZeroMemory(xvwapHelper); - - // // - // // ZeroMemory(xichHelper); - // // ZeroMemory(xdonHelper); - // // ZeroMemory(xdeltaHelper); - // // ZeroMemory(xvolumeHelper); - - // // - // return result; - // } - - - // - // ZeroMemory(xichHelper); - // ZeroMemory(xdonHelper); - // ZeroMemory(xdeltaHelper); - // ZeroMemory(xvolumeHelper); - - - // - // XCX121XICHHelper *xichHelper; - // XCX121XDONHelper *xdonHelper; - // XCX121XDELTAHelper *xdeltaHelper; - // XCX121XVOLUMEHelper *xvolumeHelper; - - - // - // int xdonMax = xdonInputs.Max(); - // int xichMax = xichInputs.Max(); - // int xdeltaMax = xdeltaInputs.Max(); - // int xvolumeMax = xvolumeInputs.Max(); - - - // - // result = MathMax(result, xdonMax); - // result = MathMax(result, xichMax); - // result = MathMax(result, xdeltaMax); - // result = MathMax(result, xvolumeMax); - - // && - // xichInputs.IsValid() && - // xdonInputs.IsValid() && - // xdeltaInputs.IsValid() && - // xvolumeInputs.IsValid() - // - - - // - // xichInputs.Default(); - // xdonInputs.Default(); - // xdeltaInputs.Default(); - // xvolumeInputs.Default(); - - - // - // xichInputs.Clean(); - // xdonInputs.Clean(); - // xdeltaInputs.Clean(); - // xvolumeInputs.Clean(); - - // - // xichInputs.Clean(); - // xdonInputs.Clean(); - // xdeltaInputs.Clean(); - // xvolumeInputs.Clean(); - - // - // delete xichHelper; - // delete xdonHelper; - // delete xdeltaHelper; - // delete xvolumeHelper; - - // - // ZeroMemory(xichHelper); - // ZeroMemory(xdonHelper); - // ZeroMemory(xdeltaHelper); - // ZeroMemory(xvolumeHelper); diff --git a/Documents/BKP/xaea.tmp.signaller.bkp.mq5 b/Documents/BKP/xaea.tmp.signaller.bkp.mq5 deleted file mode 100644 index daf60bf0..00000000 --- a/Documents/BKP/xaea.tmp.signaller.bkp.mq5 +++ /dev/null @@ -1,431 +0,0 @@ - // - bool isPeakPivot = conditions.isPeakIsPivot; - bool isValePivot = conditions.isValeIsPivot; - - // - bool isPivotBullish = isValePivot && - isCBarValidForBullish; - - // - bool isPivotBearish = isPeakPivot && - isCBarValidForBearish; - - // - bool isPivotBullishReversal = - // - isPivotBullish && - conditions.isKIBearish && - conditions.isSarBearish && - conditions.isTrendBearish && - conditions.isLastSupportRejected - // - ; - - // - bool isPivotBearishReversal = - // - isPivotBearish && - conditions.isKIBullish && - conditions.isSarBullish && - conditions.isTrendBullish && - conditions.isLastResistanceRejected - // - ; - - // - bool isPivot = isPivotBullishReversal || - isPivotBearishReversal; - - if (isPivot) - { - Print("Pivot: "); - - // - if (isPivotBullish) - { - Print("Bullish: ", isPivotBullish); - } - - // - if (isPivotBearish) - { - Print("Bearish: ", isPivotBearish); - } - - // - Print("Bullish Score: ", bullishScore); - Print("Bearish Score: ", bearishScore); - } - - // - bool isOverFib2 = pBar.low > conditions.fiboLevel2Buffer[cIDX]; - bool isUnderFib2 = pBar.high < conditions.fiboLevel2Buffer[cIDX]; - - // - bool isTrendBasedBullish = - isUnderFib2 && - isCBarValidForBullish && - conditions.isTrendRejectUp; - - // - bool isTrendBasedBearish = - isOverFib2 && - isCBarValidForBearish && - conditions.isTrendRejectDown; - - // - bool isTrend = - isTrendBasedBullish || - isTrendBasedBearish; - - // - if (isTrend) - { - Print("Trend Based ..."); - } - - // - bool isBarBreakedKITrendBullish = - cBar.IsBullish() && - isCBarBullishMomentum && - cBar.open < conditions.kiBuffer[cIDX] && - cBar.close > conditions.kiBuffer[cIDX] && - cBar.open < conditions.trendBuffer[cIDX] && - cBar.close > conditions.trendBuffer[cIDX]; - - // - bool isBarBreakedKITrendBearish = - cBar.IsBearish() && - isCBarBearishMomentum && - cBar.open > conditions.kiBuffer[cIDX] && - cBar.close < conditions.kiBuffer[cIDX] && - cBar.open > conditions.trendBuffer[cIDX] && - cBar.close > conditions.trendBuffer[cIDX]; - - // - bool isKITrendBreaked = - isBarBreakedKITrendBullish || - isBarBreakedKITrendBearish; - - // - if (isKITrendBreaked) - { - Print("KI Trend Breaked ..."); - } - - - ///////////////////////////////////////////////////////////// - - - // while (index <= end) - // { - // // - // XCAEAConditions iConditions; - // bool has = helper.GetConditions( - // iConditions, - // index, - // 5 // - // ); - // if (!has) - // { - // // - // iConditions.Clean(); - // continue; - // } - - // // - // zIDX = 0; - // cIDX = zIDX + 1; - // pIDX = cIDX + 1; - // p2IDX = pIDX + 1; - - // // - // XOHCL cBar; - // has = cBar.Init( - // iConditions.symbol, - // iConditions.period, - // index + 1 // - // ); - // if (!has) - // { - // // - // cBar.Clean(); - // iConditions.Clean(); - // continue; - // } - - // // - // // Read Reuired Data ... - - // // - // // KI ... - - // // - // double cKI = iConditions.kiBuffer[cIDX]; - // double pKI = iConditions.kiBuffer[pIDX]; - // double p2KI = iConditions.kiBuffer[p2IDX]; - - // // - // double cKIState = iConditions.kiStateBuffer[cIDX]; - // double pKIState = iConditions.kiStateBuffer[pIDX]; - // double p2KIState = iConditions.kiStateBuffer[p2IDX]; - - // // - // // TKI ... - - // // - // double cTKI = iConditions.tkiBuffer[cIDX]; - // double pTKI = iConditions.tkiBuffer[pIDX]; - // double p2TKI = iConditions.tkiBuffer[p2IDX]; - - // // - // double cTKIState = iConditions.tkiStateBuffer[cIDX]; - // double pTKIState = iConditions.tkiStateBuffer[pIDX]; - // double p2TKIState = iConditions.tkiStateBuffer[p2IDX]; - - // // - // // TREND ... - - // // - // double cTrend = iConditions.trendBuffer[cIDX]; - // double pTrend = iConditions.trendBuffer[pIDX]; - // double p2Trend = iConditions.trendBuffer[p2IDX]; - - // // - // double ctrendState = iConditions.trendStateBuffer[cIDX]; - // double ptrendState = iConditions.trendStateBuffer[pIDX]; - // double p2trendState = iConditions.trendStateBuffer[p2IDX]; - - // // - // // SWING Low ... - - // // - // double cSWL = iConditions.swingLowBuffer[cIDX]; - // double pSWL = iConditions.swingLowBuffer[pIDX]; - // double p2SWL = iConditions.swingLowBuffer[p2IDX]; - - // // - // // SWING High ... - - // // - // double cSWH = iConditions.swingHighBuffer[cIDX]; - // double pSWH = iConditions.swingHighBuffer[pIDX]; - // double p2SWH = iConditions.swingHighBuffer[p2IDX]; - - // // - // // PEAK ... - - // // - // double cPeak = iConditions.peakBuffer[cIDX]; - // double pPeak = iConditions.peakBuffer[pIDX]; - // double p2Peak = iConditions.peakBuffer[p2IDX]; - - // // - // // VALE ... - - // // - // double cVale = iConditions.valeBuffer[cIDX]; - // double pVale = iConditions.valeBuffer[pIDX]; - // double p2Vale = iConditions.valeBuffer[p2IDX]; - - // // - // // Required Condirions ... - - // // - // bool isTKITRNDBullish = - // iConditions.isKIBullish && - // iConditions.isTKIBullish && - // iConditions.isTrendBullish; - - // // - // bool isTKITRNDBearish = - // iConditions.isKIBearish && - // iConditions.isTKIBearish && - // iConditions.isTrendBearish; - - // // - // XBoxZone iBox; - - // // - // // Check FVG ... - // bool isFVG = barAnalyser.IsFVG( - // cBar, - // iBox, - // false // Force Same Bars ... - // ); - // if (isFVG) - // { - // // - // // Validate FVG ... - // bool isFVGBullish = iBox.IsBullish(); - - // // // - // // isFVG = - // // isFVGBullish - // // ? isTKITRNDBullish - // // : isTKITRNDBearish; - - // // - // if (isFVG) - // { - // // - // XCBoxObject *iObj; - // has = drawer.DrawBox( - // iBox, - // iObj // - // ); - // if (has) - // { - // iObj.BoxWidth(2); - // } - // } - // } - - // // - // index++; - // cBar.Clean(); - // iConditions.Clean(); - // } - - //////////////////////////////////////////////////////////////////// - - // - XBoxZone tmpFVGBoxes[]; - - // - int index = barIndex; - int end = index + loopback; - while (index <= end) - { - // - XOHCL cBar; - bool has = cBar.Init( - helper.GetSymbol(), - helper.GetPeriod(), - index + 1 // - ); - if (!has) - { - // - cBar.Clean(); - continue; - } - - // - // Check FVG ... - XBoxZone iBox; - bool isFVG = barAnalyser.IsFVG( - cBar, - iBox, - false // Force Same Bars ... - ); - if (isFVG) - { - // - AddBox( - iBox, - tmpFVGBoxes // - ); - } - - // - index++; - cBar.Clean(); - } - - // - int idx = -1; - bool has = false; - if (HasChild(tmpFVGBoxes)) - { - // - while (HasChild(tmpFVGBoxes)) - { - // - idx = GetYoungest(tmpFVGBoxes); - has = IsValidIndex(idx); - if (!has) - { - break; - } - - // - XBoxZone iBox = tmpFVGBoxes[idx]; - ArrayRemove( - tmpFVGBoxes, - idx, - 1 // - ); - - // - // Here We Have to Validate FVG ... - - // - XCBoxObject *iObj; - has = drawer.DrawBox( - iBox, - iObj // - ); - - // - } - } - - -////////////////////////////////////////////////////////////////////////////////// - -has = HasPeakPivots(); -if (has) -{ - // - count = CountPeakPivots(); - for (int i = 0; i < count; i++) - { - // - XCAPivot iPivot = peakPivots[i]; - - // - int toIDX = iPivot.ToIndex(); - int fromIDX = iPivot.FromIndex(); - has = IsValidIndex(toIDX) && - IsValidIndex(fromIDX); - if (!has) - { - // - iPivot.Clean(); - continue; - } - - // - for (int j = toIDX; j <= fromIDX; j++) { - // - XCAEAConditions jConditions; - has = helper.GetConditions( - jConditions, - j, - 5 // - ); - if (!has) { - // - jConditions.Clean(); - continue; - } - - // - datetime jTime = GetBarTime( - jConditions.symbol, - jConditions.period, - j // - ); - - // - - } - - // - iPivot.Clean(); - } -} - -////////////////////////////////////////////////////////////////////////////////////////// - diff --git a/Documents/BKP/xcaea.pivots.tmp.mq5 b/Documents/BKP/xcaea.pivots.tmp.mq5 deleted file mode 100644 index 15e291f9..00000000 --- a/Documents/BKP/xcaea.pivots.tmp.mq5 +++ /dev/null @@ -1,45 +0,0 @@ - - // - // PEAKS ... - - // - // VALES ... - - // - // PEAK SWH RES ... - - // - // VALE SWL SUP ... - - // - // SWING HIGH ... - - // - // SWING LOW ... - - // - // KI ... - - // - // TKI ... - - // - // FVG ... - - // - // TREND ... - - // - // TKITRND ... - - // - // SAME CYCLES HH / LL ... - - // - // OSCS ... - - // - // RSI ... - - // - // CCI ... diff --git a/Documents/BKP/xcaea.tmp.signal.lib.mq5 b/Documents/BKP/xcaea.tmp.signal.lib.mq5 deleted file mode 100644 index c48ebf92..00000000 --- a/Documents/BKP/xcaea.tmp.signal.lib.mq5 +++ /dev/null @@ -1,816 +0,0 @@ -///////////////////////////////////////////////////////////////////////////////// - -// -bool DetectXCAEAConditions( - XBoxZone &boxes[], - XCAEAConditions &conditions, - XBoxZone &pivotBox, - XBoxZone &box, - ENUM_X_DIRECTION &dir, - XCXCAEAHelper *helper, - int barIndex = 0, - int loopback = 10 // -) -{ - // - bool result = false; - - // - int idx = -1; - int count = 0; - bool has = false; - - // - box.Clean(); - conditions.Clean(); - dir = X_DIRECTION_NONE; - - // - if (barIndex < 0) - { - barIndex = 0; - } - loopback = NormalizeInt(loopback, 5); - - // - string symbol = helper.GetSymbol(); - ENUM_TIMEFRAMES period = helper.GetPeriod(); - - // - result = helper.GetConditions( - conditions, - barIndex, - loopback // - ); - if (!result) - { - // - conditions.Clean(); - return result; - } - - // - int zIDX = barIndex; - int cIDX = zIDX + 1; - int pIDX = cIDX + 1; - int p2IDX = pIDX + 1; - int p3IDX = p2IDX + 1; - int p4IDX = p3IDX + 1; - - // - // Reading Parameters ... - - // - // KI ... - - // - double cKI = conditions.kiBuffer[cIDX]; - double pKI = conditions.kiBuffer[pIDX]; - double p2KI = conditions.kiBuffer[p2IDX]; - - // - double cKIState = conditions.kiStateBuffer[cIDX]; - double pKIState = conditions.kiStateBuffer[pIDX]; - double p2KIState = conditions.kiStateBuffer[p2IDX]; - - // - // TKI ... - - // - double cTKI = conditions.tkiBuffer[cIDX]; - double pTKI = conditions.tkiBuffer[pIDX]; - double p2TKI = conditions.tkiBuffer[p2IDX]; - - // - double cTKIState = conditions.tkiStateBuffer[cIDX]; - double pTKIState = conditions.tkiStateBuffer[pIDX]; - double p2TKIState = conditions.tkiStateBuffer[p2IDX]; - - // - // TREND ... - - // - double cTrend = conditions.trendBuffer[cIDX]; - double pTrend = conditions.trendBuffer[pIDX]; - double p2Trend = conditions.trendBuffer[p2IDX]; - - // - double ctrendState = conditions.trendStateBuffer[cIDX]; - double ptrendState = conditions.trendStateBuffer[pIDX]; - double p2trendState = conditions.trendStateBuffer[p2IDX]; - - // - // SWING Low ... - double cSWL = conditions.swingLowBuffer[cIDX]; - double pSWL = conditions.swingLowBuffer[pIDX]; - double p2SWL = conditions.swingLowBuffer[p2IDX]; - - // - // SWING High ... - double cSWH = conditions.swingHighBuffer[cIDX]; - double pSWH = conditions.swingHighBuffer[pIDX]; - double p2SWH = conditions.swingHighBuffer[p2IDX]; - - // - // PEAK ... - double zPeak = conditions.peakBuffer[zIDX]; - double cPeak = conditions.peakBuffer[cIDX]; - double pPeak = conditions.peakBuffer[pIDX]; - double p2Peak = conditions.peakBuffer[p2IDX]; - double p3Peak = conditions.peakBuffer[p3IDX]; - - // - // VALE ... - double zVale = conditions.valeBuffer[zIDX]; - double cVale = conditions.valeBuffer[cIDX]; - double pVale = conditions.valeBuffer[pIDX]; - double p2Vale = conditions.valeBuffer[p2IDX]; - double p3Vale = conditions.valeBuffer[p3IDX]; - - // - // RSI ... - double zRSI = conditions.rsiBuffer[zIDX]; - double cRSI = conditions.rsiBuffer[cIDX]; - double pRSI = conditions.rsiBuffer[pIDX]; - double p2RSI = conditions.rsiBuffer[p2IDX]; - double p3RSI = conditions.rsiBuffer[p3IDX]; - - // - // CCI ... - double zCCI = conditions.cciBuffer[zIDX]; - double cCCI = conditions.cciBuffer[cIDX]; - double pCCI = conditions.cciBuffer[pIDX]; - double p2CCI = conditions.cciBuffer[p2IDX]; - double p3CCI = conditions.cciBuffer[p3IDX]; - - // - // RVI ... - - // - double zRVI = conditions.rviBuffer[zIDX]; - double cRVI = conditions.rviBuffer[cIDX]; - double pRVI = conditions.rviBuffer[pIDX]; - double p2RVI = conditions.rviBuffer[p2IDX]; - double p3RVI = conditions.rviBuffer[p3IDX]; - - // - double zRVISignal = conditions.rviSignalBuffer[zIDX]; - double cRVISignal = conditions.rviSignalBuffer[cIDX]; - double pRVISignal = conditions.rviSignalBuffer[pIDX]; - double p2RVISignal = conditions.rviSignalBuffer[p2IDX]; - double p3RVISignal = conditions.rviSignalBuffer[p3IDX]; - - // - // Reading Bars ... - - // - XOHCL zBar; - XOHCL cBar; - XOHCL pBar; - XOHCL p2Bar; - XOHCL p3Bar; - XOHCL p4Bar; - result = zBar.Init( - symbol, - period, - zIDX // - ); - result = - result && - zBar.GetPreviousBar(cBar); - result = - result && - cBar.GetPreviousBar(pBar); - result = - result && - pBar.GetPreviousBar(p2Bar); - result = - result && - p2Bar.GetPreviousBar(p3Bar); - result = - result && - p3Bar.GetPreviousBar(p4Bar); - if (!result) - { - // - zBar.Clean(); - cBar.Clean(); - pBar.Clean(); - p2Bar.Clean(); - p3Bar.Clean(); - p4Bar.Clean(); - - // - box.Clean(); - conditions.Clean(); - - // - return result; - } - - // - // Bars Conditions ... - - // - ENUM_X_DIRECTION cBarDir; - - // - // Hammer ... - bool isCBarHammer = helper - .barAnalyser - .IsHammer( - cBar, - cBarDir // - ); - bool isCBarBullishHammer = - isCBarHammer && - IsBullish(cBarDir); - bool isCBarBearishHammer = - isCBarHammer && - IsBearish(cBarDir); - - // - // Rejected ... - bool isCBarRejected = helper - .barAnalyser - .IsRejected( - cBar, - cBarDir, - false, // Force Type ... - true // Force Fibo Pressure ... - ); - bool isCBarBullishRejected = - isCBarRejected && - IsBullish(cBarDir); - bool isCBarBearishRejected = - isCBarRejected && - IsBearish(cBarDir); - - // - // Engulfed ... - bool isCBarEngulfed = helper - .barAnalyser - .IsEngulfed( - cBar, - cBarDir // - ); - bool isCBarBullishEngulfed = - isCBarEngulfed && - IsBullish(cBarDir); - bool isCBarBearishEngulfed = - isCBarEngulfed && - IsBearish(cBarDir); - - // - // Momentum ... - bool isCBarMomentum = helper - .barAnalyser - .IsMomentum( - cBar, - cBarDir, - 1 // - ); - bool isCBarBullishMomentum = - isCBarMomentum && - IsBullish(cBarDir); - bool isCBarBearishMomentum = - isCBarMomentum && - IsBearish(cBarDir); - - // - // Bar Sumarise ... - - // - bool isCBarValidForBullish = - (isCBarBullishHammer || - isCBarBullishRejected || - isCBarBullishMomentum || - isCBarBullishEngulfed); - - // - bool isCBarValidForBearish = - (isCBarBearishHammer || - isCBarBearishRejected || - isCBarBearishMomentum || - isCBarBearishEngulfed); - - // - double pBarLowShadow = pBar.GetLowShadow(); - double pBarHighShadow = pBar.GetHighShadow(); - - // - bool isPBarSwingLow = - pBarLowShadow > 0 && - pBar.low < p2Bar.low && - pBar.low < cBar.low && - p2Bar.GetUp() >= pBar.low && - p2Bar.GetDown() <= pBar.high && - cBar.GetUp() >= pBar.low && - cBar.GetDown() <= pBar.high; - - // - bool isPBarSwingHigh = - pBarHighShadow > 0 && - pBar.high > p2Bar.high && - pBar.high > cBar.high && - p2Bar.GetUp() >= pBar.low && - p2Bar.GetDown() <= pBar.high && - cBar.GetUp() >= pBar.low && - cBar.GetDown() <= pBar.high; - - // - // Score ... - - // - double bullishScore = 0; - double bearishScore = 0; - conditions.GenerateScore( - bullishScore, - bearishScore // - ); - - // - bool isScoreBullish = - bullishScore > bearishScore; - - // - bool isScoreBearish = - bearishScore > bullishScore; - - // - string summary = - conditions - .GenerateSummary(); - - // - // Detect Selected Box ... - double providedSL = 0; - bool isBoxRejected = false; - bool isBoxActivated = false; - bool hasBoxes = HasChild(boxes); - if (hasBoxes) - { - // - // Detect Selected Boxes ... - XBoxZone tmp[]; - Copy( - boxes, - tmp // - ); - while (HasChild(tmp)) - { - // - idx = GetYoungest(tmp); - has = IsValidIndex(idx); - if (!has) - { - break; - } - - // - XBoxZone iBox; - iBox = tmp[idx]; - ArrayRemove( - tmp, - idx, - 1 // - ); - - // - // Check Selected Box not RSI or CCI ... - has = iBox.type == ToString(XCA_PEAKSWHRES) || - iBox.type == ToString(XCA_VALESWLSUP); - if (!has) - { - continue; - } - - // - bool isBullish = iBox.IsBullish(); - bool isBearish = iBox.IsBearish(); - - // - double rejectedCheckPrice = - isBullish - ? iBox.upper - : iBox.lower; - - // - // Check Box Selecting Senarios ... - - // - // Selecting Rejected Boxes ... - isBoxRejected = cBar.IsRejected( - rejectedCheckPrice, - iBox.dir, - false, - false // - ); - - // - // Selecting Activation Boxes ... - - // - bool isBullishActivated = - isBullish && - isPBarSwingLow && - cBar.IsBullish() && - cBar.GetUp() > rejectedCheckPrice && - cBar.GetDown() < rejectedCheckPrice; - - // - bool isBearishActivated = - isBearish && - isPBarSwingHigh && - cBar.IsBearish() && - cBar.GetUp() > rejectedCheckPrice && - cBar.GetDown() < rejectedCheckPrice; - - // - isBoxActivated = isBullishActivated || - isBearishActivated; - - // - // Detect Box is Selected or not ... - has = - isBoxRejected || - isBoxActivated; - if (has) - { - // - pivotBox = iBox; - - // - iBox.Clean(); - break; - } - - // - iBox.Clean(); - } - - // - Clean(tmp); - } - - // - // Force Conditions to Have Selected Box ... - result = hasBoxes && - pivotBox.IsValid(); - if (!result) - { - // - zBar.Clean(); - cBar.Clean(); - pBar.Clean(); - p2Bar.Clean(); - p3Bar.Clean(); - p4Bar.Clean(); - - // - box.Clean(); - pivotBox.Clean(); - conditions.Clean(); - - // - return result; - } - - // - // Conditions ... - - // - bool isRSIBullish = - zRSI >= cRSI && - cRSI > pRSI; - bool isRSIBearish = - zRSI <= cRSI && - cRSI < pRSI; - - // - bool isCCIBullish = - zCCI >= cCCI && - cCCI > pCCI && - (zCCI > conditions.cciOSLevel || - cCCI > conditions.cciOSLevel); - bool isCCIBearish = - zCCI >= cCCI && - cCCI > pCCI && - (zCCI < conditions.cciOBLevel || - cCCI < conditions.cciOBLevel); - - // - // Signaller Summarization ... - - // - // Cond1 Act Using Box Activation ... - - // - bool isCond1Bullish = - // - false && - isCCIBullish && - isBoxActivated && - pivotBox.IsValid() && - pivotBox.IsBullish() - // - ; - - // - bool isCond1Bearish = - // - false && - isCCIBearish && - isBoxActivated && - pivotBox.IsValid() && - pivotBox.IsBearish() - // - ; - - // - bool isCond1 = isCond1Bullish || - isCond1Bearish; - if (isCond1) - { - // - providedSL = - isCond1Bullish - ? MathMin(pBar.low, pivotBox.lower) - : MathMax(pBar.high, pivotBox.upper); - - // - Print("Cond1"); - } - - // - // Cond2 Act Using Box Rejection ... - - // - bool isCond2Bullish = - // - false && - isBoxRejected && - pivotBox.IsValid() && - pivotBox.IsBullish() - // - ; - - // - bool isCond2Bearish = - // - false && - isBoxRejected && - pivotBox.IsValid() && - pivotBox.IsBearish() - // - ; - - // - bool isCond2 = isCond2Bullish || - isCond2Bearish; - if (isCond2) - { - // - providedSL = - isCond1Bullish - ? MathMin(pBar.low, pivotBox.lower) - : MathMax(pBar.high, pivotBox.upper); - - // - Print("Cond2"); - } - - // - // Cond3 Act Using CCi Peaks and Vales ... - - // - bool isCond3Bullish = false; - - // - bool isCond3Bearish = false; - - // - bool isCond3 = isCond3Bullish || - isCond3Bearish; - if (isCond3) - { - // - - // - Print("Cond3"); - } - - // - // Summarise Conditions ... - - // - bool isBullish = - // - isCond1Bullish || - isCond2Bullish; - // - ; - - // - bool isBearish = - // - isCond1Bearish || - isCond2Bearish - // - ; - - // - result = isBullish || - isBearish; - if (result) - { - // - dir = - isBullish - ? X_DIRECTION_BULLISH - : X_DIRECTION_BEARISH; - - // - double entry = GetEntry( - conditions.symbol, - dir // - ); - - // - double sl = - providedSL > 0 - ? providedSL - : isBullish - ? pivotBox.lower - : pivotBox.upper; - - // - box.dir = dir; - box.symbol = conditions.symbol; - box.period = conditions.period; - - // - box.upper = - isBullish - ? entry - : sl; - - // - box.lower = - isBullish - ? sl - : entry; - - // - box.to = zBar.time; - box.from = p4Bar.time; - - // - box.type = "XCASignal"; - } - - // - result = box.IsValid() && - HasDirection(dir); - - // - // Cleanup Resources ... - - // - if (!result) - { - // - box.Clean(); - pivotBox.Clean(); - conditions.Clean(); - } - - // - zBar.Clean(); - cBar.Clean(); - pBar.Clean(); - p2Bar.Clean(); - p3Bar.Clean(); - p4Bar.Clean(); - - // - return result; -} - -/////////////////////////////////////////////////////////////////////////////////// - // - // Detect Trend Lines ... - - // - // RSI ... - bool canLookupValeTrendLine = - detector.HasRSIValePivots() && - detector.CountRSIValePivots() >= 2; - if (canLookupValeTrendLine) - { - // - XBoxZone rsiVale; - XBoxZone rsiValePrev; - count = detector.CountRSIValePivots(); - has = detector.rsiValePivots[count - 1].AsBox(rsiValePrev); - has = has && - detector.rsiValePivots[count - 2].AsBox(rsiVale); - bool hasTrend = has && - rsiVale.lower > rsiValePrev.lower; - - // - if (hasTrend) - { - // - string valeTrendLineName = "RSIValeTrendLine"; - CChartObjectTrend *iVTLine; - iVTLine = new CChartObjectTrend(); - has = iVTLine.Create( - 0, - valeTrendLineName, - 0, - rsiValePrev.from, - rsiValePrev.lower, - rsiVale.to, - rsiVale.lower // - ); - if (has) - { - // - iVTLine.RayRight(true); - iVTLine.Width(2); - iVTLine.Color(clrAqua); - iVTLine.Style(STYLE_SOLID); - - // - mObjects.Add(iVTLine); - } - } - - // - rsiVale.Clean(); - rsiValePrev.Clean(); - } - - // - // CCI ... - // canLookupValeTrendLine = - // detector.HasCCIValePivots() && - // detector.CountCCIValePivots() >= 2; - // if (canLookupValeTrendLine) - // { - // // - // XBoxZone cciVale; - // XBoxZone cciValePrev; - // count = detector.CountCCIValePivots(); - // has = detector.cciValePivots[count - 1].AsBox(cciValePrev); - // has = has && - // detector.cciValePivots[count - 2].AsBox(cciVale); - // bool hasTrend = has && - // cciVale.lower > cciValePrev.lower; - - // // - // if (hasTrend) - // { - // // - // string valeTrendLineName = "CCIValeTrendLine"; - // CChartObjectTrend *iVTLine; - // iVTLine = new CChartObjectTrend(); - // has = iVTLine.Create( - // 0, - // valeTrendLineName, - // 0, - // cciValePrev.from, - // cciValePrev.lower, - // cciVale.to, - // cciVale.lower // - // ); - // if (has) - // { - // // - // iVTLine.RayRight(true); - // iVTLine.Width(2); - // iVTLine.Color(clrAqua); - // iVTLine.Style(STYLE_SOLID); - - // // - // mObjects.Add(iVTLine); - // } - // } - - // // - // cciVale.Clean(); - // cciValePrev.Clean(); - // } - -/////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////// diff --git a/Documents/BKP/xcaea.x-poi.detector.class.mq5 b/Documents/BKP/xcaea.x-poi.detector.class.mq5 deleted file mode 100644 index 73fab8fc..00000000 --- a/Documents/BKP/xcaea.x-poi.detector.class.mq5 +++ /dev/null @@ -1,481 +0,0 @@ -/////////////////////////////////////////////////////// -// -// SaherElm IT Center MQL5 Indicator -// ------------------------------------------------- -// Name: XCXCAEAPOIDetector ... -// Description: Class for XCAEA POI Detector ... -// -// -// 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 Class for XCAEA POI Detector" -#property strict - -// -// Imports ... -#include "../../Classes/x-saherelm.x-bar.analyser.class.mq5" -#include "../Helpers/xcaea.helper.mq5" - -// -// Definitions ... - -// enum ENUM_X_PIVOT_KINDS -// { -// X_PIVOT_SWL, // SWL -// X_PIVOT_SWH, // SWH -// }; - -// string ToString(ENUM_X_PIVOT_KINDS value) -// { -// // -// string result = NULL; - -// // -// result = EnumToString(value); - -// // -// return result; -// } - -// struct XSamePivot -// { -// // -// // Props ... -// datetime to; -// string type; -// double value; -// datetime from; -// string symbol; -// ENUM_X_DIRECTION dir; -// ENUM_TIMEFRAMES period; - -// // -// // Constructor ... -// XSamePivot() -// { -// Clean(); -// } - -// // -// // Tools ... - -// /** -// * Cleanup Model ... -// */ -// void Clean() -// { -// // -// to = NULL; -// value = 0; -// from = NULL; -// type = NULL; -// symbol = NULL; -// period = NULL; -// dir = X_DIRECTION_NONE; -// } - -// /** -// * Validate Model ... -// * -// * @return ( bool ) -// */ -// bool IsValid() -// { -// // -// bool result = false; - -// // -// result = -// // -// from < to && -// value != 0 && -// IsValid(to) && -// IsValid(from) && -// IsValid(symbol) && -// IsValid(period) && -// HasDirection(dir) -// // -// ; - -// // -// return result; -// } - -// /** -// * Check a Model is Same As Other ... -// * -// * @return ( bool ) -// */ -// bool IsSameAs(XSamePivot &item) -// { -// // -// bool result = false; - -// // -// result = IsValid() && -// item.IsValid(); -// if (!result) -// { -// return result; -// } - -// // -// result = -// // -// to == item.to && -// dir == item.dir && -// from == item.from && -// type == item.type && -// value == item.value && -// symbol == item.symbol && -// period == item.period -// // -// ; - -// // -// return result; -// } - -// // -// }; - -// -// Implementations ... -class XCXCAEAPOIDetector : public XCBase -{ - // - // Public ... - public: - // - // Props ... - - // - // Constructors ... - XCXCAEAPOIDetector( - XCXCAEAHelper *_helper // - ) - { - // - helper = _helper; - barAnalyser = new XCBarAnalyser(); - - // - Default(); - } - - // - // De Constructors ... - ~XCXCAEAPOIDetector() - { - // - Clean(tkitrndPivots); - - // - ZeroMemory(helper); - ZeroMemory(barAnalyser); - } - - // - // Properties ... - - int TITrndPivotVerification() - { - return tkitrndPivotVerification; - } - - void TKITrndPivotVerification(int value) - { - // - value = NormalizeInt(value, 0); - - // - tkitrndPivotVerification = value; - } - - // - // Tools ... - - virtual void Default() - { - // - TKITrndPivotVerification(10); - } - - // - void Update( - int barIndex = 0, - int loopback = 100 // - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - loopback = NormalizeInt(loopback, 100); - - // - int index = barIndex; - int end = index + loopback; - while (index <= end) - { - // - XCAEAConditions iConditions; - bool has = helper.GetConditions( - iConditions, - index, - loopback // - ); - - // - // Detecting Same Pivots ... - // HandleTKITRNDPivotDetection(iConditions, index); - - // - index++; - iConditions.Clean(); - } - - // - } - - // - // POI Handlers ... - - // bool HasTKITRNDPivots() - // { - // return HasChild(tkitrndPivots); - // } - - // int CountTKITRNDPivots() - // { - // return ArraySize(tkitrndPivots); - // } - - // int FillTKITRNDPivots(XSamePivot &pivots[]) - // { - // // - // int result = 0; - - // // - // if (!HasTKITRNDPivots()) - // { - // return result; - // } - - // // - // Copy( - // tkitrndPivots, - // pivots // - // ); - - // // - // result = ArraySize(pivots); - - // // - // return result; - // } - - // bool IsTKITRNDPivotExists( - // int &index, - // XSamePivot &pivot // - // ) - // { - // // - // bool result = false; - - // // - // index = -1; - - // // - // result = pivot.IsValid() && - // HasTKITRNDPivots(); - // if (!result) - // { - // return result; - // } - - // // - // int count = CountTKITRNDPivots(); - // for (int i = 0; i < count; i++) - // { - // // - // XSamePivot iPivot = tkitrndPivots[i]; - - // // - // bool isSame = - // pivot.IsSameAs(iPivot); - // if (isSame) - // { - // // - // index = i; - // iPivot.Clean(); - - // // - // break; - // } - - // // - // iPivot.Clean(); - // } - - // // - // result = IsValidIndex(index); - - // // - // return result; - // } - - // - // Protected ... - protected: - // - // Props ... - - // // - // void HandleTKITRNDPivotDetection( - // XCAEAConditions &conditions, - // int barIndex = 0 // - // ) - // { - // // - // if (barIndex < 0) - // { - // barIndex = 0; - // } - - // // - // if (tkitrndPivotVerification <= 0) - // { - // return; - // } - - // // - // datetime barTime = GetBarTime( - // conditions.symbol, - // conditions.period, - // barIndex + 1 // - // ); - - // // - // int index = 2; - // datetime cTime = barTime; - // int end = ArraySize(conditions.swingLowBuffer); - - // // - // int swingLowVerified = 0; - // datetime swingLowFinishAt = NULL; - // datetime swingLowStartAt = barTime; - // double swingLow = conditions.swingLowBuffer[1]; - // bool canLookupSwingLow = true; - - // // - // bool isVerified = false; - // bool canContinue = true; - // while (index < end && canContinue) - // { - // // - // cTime += PeriodSeconds(conditions.period); - - // // - // // Swing Low ... - // double iSWL = conditions.swingLowBuffer[index]; - // if (iSWL == swingLow) - // { - // swingLowVerified++; - // } - // else if (iSWL != swingLow) - // { - // // - // isVerified = swingLowVerified >= tkitrndPivotVerification; - // if (isVerified) - // { - // // - // swingLowFinishAt = cTime; - - // // - // XSamePivot iPivot; - - // // - // iPivot.value = swingLow; - // iPivot.to = swingLowFinishAt; - // iPivot.from = swingLowStartAt; - // iPivot.dir = X_DIRECTION_BULLISH; - // iPivot.symbol = conditions.symbol; - // iPivot.period = conditions.period; - // iPivot.type = ToString(X_PIVOT_SWL); - - // // - // if (iPivot.IsValid()) - // { - // AddOrUpdateTKITRNDPivot(iPivot); - // } - // } - - // // - // // Reset ... - // swingLow = iSWL; - // swingLowVerified = 0; - // swingLowFinishAt = NULL; - // swingLowStartAt = cTime; - // canLookupSwingLow = true; - // } - - // // - // index++; - - // // - // canContinue = canLookupSwingLow; - // } - // } - - // // - // void AddOrUpdateTKITRNDPivot(XSamePivot &pivot) - // { - // // - // int idx = -1; - // bool isExists = IsTKITRNDPivotExists( - // idx, - // pivot // - // ); - // if (isExists) - // { - // return; - // } - - // // - // AddRef( - // pivot, - // tkitrndPivots // - // ); - // } - - // - // Prrivate ... - private: - // - // Props ... - int tkitrndPivotVerification; // KI/TKI/Trend Verification ... - - // - XCXCAEAHelper *helper; - XCBarAnalyser *barAnalyser; - - // - // Same Pivots ... - // XSamePivot tkitrndPivots[]; // TKITrend is Bullish/Bearish and Swing Low/High Under / Over Min / Max ... - - // -}; - -// \ No newline at end of file diff --git a/Helpers/x-saherelm.x121.helper.mq5 b/Helpers/x-saherelm.x121.helper.mq5 deleted file mode 100644 index a8b644de..00000000 --- a/Helpers/x-saherelm.x121.helper.mq5 +++ /dev/null @@ -1,3123 +0,0 @@ -/////////////////////////////////////////////////////// -// -// SaherElm IT Center MQL5 Helper Class Library -// ---------------------------------------------- -// Name: XCX121Helper -// Description: provides all Indicator -// Helper requirements ... -// -// -// Maintainer: -// ------------ -// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) -// -////////////////////////////////////////////////////// -// -// Global Properties ... -#property library -#property copyright "Copyright 2023, SaherElm IT Center" -#property link "https://www.saherelm.ir" -#property version "1.00" -#property strict - -// -// Imports ... -#include "../Helpers/x-saherelm.x121.x3ma.helper.mq5" -#include "../Helpers/x-saherelm.x121.xatr.helper.mq5" -#include "../Helpers/x-saherelm.x121.xcc.helper.mq5" -#include "../Helpers/x-saherelm.x121.xche.helper.mq5" -#include "../Helpers/x-saherelm.x121.xhk.helper.mq5" -#include "../Helpers/x-saherelm.x121.xmas.helper.mq5" -#include "../Helpers/x-saherelm.x121.xpv.helper.mq5" -#include "../Helpers/x-saherelm.x121.xstr.helper.mq5" -#include "../Helpers/x-saherelm.x121.xvwap.helper.mq5" - -// -// Inputs ... -struct X121Inputs -{ - // - // Props ... - bool showRSI; - X121XCCInputs xccInputs; - X121XPVInputs xpvInputs; - X121XHKInputs xhkInputs; - X121XMASInputs xmasInputs; - X121XATRInputs xatrInputs; - X121XSTRInputs xstrInputs; - X121XCHEInputs xcheInputs; - X121X3MAInputs x3maInputs; - X121XVWAPInputs xvwapInputs; - - // - // X121XICHInputs xichInputs; - // X121XDONInputs xdonInputs; - // X121XDELTAInputs xdeltaInputs; - // X121XVOLUMEInputs xvolumeInputs; - - // - // Constructor ... - X121Inputs() - { - Clean(); - } - - // - // Tools ... - - /** - * Cleaning Up ... - */ - void Clean() - { - // - xccInputs.Clean(); - xpvInputs.Clean(); - xhkInputs.Clean(); - xmasInputs.Clean(); - xatrInputs.Clean(); - xstrInputs.Clean(); - xcheInputs.Clean(); - x3maInputs.Clean(); - xvwapInputs.Clean(); - - // - ZeroMemory(this); - } - - /** - * Set Default Values ... - */ - void Default() - { - // - xccInputs.Default(); - xpvInputs.Default(); - xhkInputs.Default(); - xmasInputs.Default(); - xatrInputs.Default(); - xstrInputs.Default(); - xcheInputs.Default(); - x3maInputs.Default(); - xvwapInputs.Default(); - } - - /** - * Validate ... - * - * @return ( bool ) - */ - bool IsValid() - { - // - bool result = false; - - // - result = - // - xccInputs.IsValid() && - xpvInputs.IsValid() && - xhkInputs.IsValid() && - xmasInputs.IsValid() && - xatrInputs.IsValid() && - xstrInputs.IsValid() && - xcheInputs.IsValid() && - x3maInputs.IsValid() && - xvwapInputs.IsValid(); - - // - return result; - } - - /** - * Extract Max Input Length ... - * - * @return ( int ) - */ - int Max() - { - // - int result = 0; - - // - int xpvMax = xpvInputs.Max(); - int xhkMax = xhkInputs.Max(); - int xmasMax = xmasInputs.Max(); - int xatrMax = xatrInputs.Max(); - int xstrMax = xstrInputs.Max(); - int xcheMax = xcheInputs.Max(); - int x3maMax = x3maInputs.Max(); - int xvwapMax = xvwapInputs.Max(); - - // - result = MathMax(xpvMax, xhkMax); - result = MathMax(result, xmasMax); - result = MathMax(result, xatrMax); - result = MathMax(result, xstrMax); - result = MathMax(result, xcheMax); - result = MathMax(result, x3maMax); - result = MathMax(result, xvwapMax); - - // - return result; - } -}; - -// -// Conditions ... -struct X121Conditions -{ - // - // Common ... - string symbol; - ENUM_TIMEFRAMES period; - datetime time; - - // - // XCC ... - - // - // Buffers ... - - // - // Conditions ... - - // - // XPV ... - - // - // Buffers ... - - // - double sarBuffer[]; - double cHHBuffer[]; - double cLLBuffer[]; - double sHHBuffer[]; - double sLLBuffer[]; - double mHHBuffer[]; - double mLLBuffer[]; - double lHHBuffer[]; - double lLLBuffer[]; - double hHHBuffer[]; - double hLLBuffer[]; - double peaksBuffer[]; - double valesBuffer[]; - double supportsBuffer[]; - double peaksGoldenBuffer[]; - double valesGoldenBuffer[]; - double resistancesBuffer[]; - double fractalsUpperBuffer[]; - double fractalsLowerBuffer[]; - - // - // Conditions ... - - // - bool isSarBullish; - bool isSarBearish; - - // - bool isSarSwitchedToBullish; - bool isSarSwitchedToBearish; - - // - bool isNewPeak; - bool isNewPeakOverLast; - bool isNewPeakUnderLast; - - // - bool isNewVale; - bool isNewValeOverLast; - bool isNewValeUnderLast; - - // - // XHK ... - - // - // Buffers ... - - // - double xhkSMLowBuffer[]; - double xhkRawLowBuffer[]; - double xhkSMOpenBuffer[]; - double xhkSMHighBuffer[]; - double xhkRawOpenBuffer[]; - double xhkRawHighBuffer[]; - double xhkSMCloseBuffer[]; - double xhkRawCloseBuffer[]; - - // - // Conditions ... - - // - bool isSMHKBullish; - bool isRawHKBullish; - bool isSMHKSwitchedToBullish; - bool isRawHKSwitchedToBullish; - - // - bool isSMHKBearish; - bool isRawHKBearish; - bool isSMHKSwitchedToBearish; - bool isRawHKSwitchedToBearish; - - // - bool isClosedOverSMHK; - bool isClosedUnderSMHK; - bool isClosedOverRawHK; - bool isClosedUnderRawHK; - - // - bool isRawHKClosedOverSMHK; - bool isRawHKClosedUnderSMHK; - - // - // XMAS ... - - // - // Buffers ... - - // - double midBuffer[]; - double upperBuffer[]; - double lowerBuffer[]; - - // - // Conditions ... - - // - // XATR ... - - // - // Buffers ... - - // - double rsiBuffer[]; - double atrBuffer[]; - double atrUpperBuffer[]; - double atrLowerBuffer[]; - double atrUpperSMBuffer[]; - double atrLowerSMBuffer[]; - double rsiChangeBuffer[]; - double rsiChangeSMBuffer[]; - double priceChangeBuffer[]; - double priceChangeSMBuffer[]; - - // - // Conditions ... - - // - bool isRsiInRange; - bool isRsiOverSold; - bool isRsiOverBought; - bool isRsiCrossedOverOverSold; - bool isRsiCrossedUnderOverSold; - bool isRsiCrossedOverOverBought; - bool isRsiCrossedUnderOverBought; - - // - bool isRsiSMOverPriceChange; - bool isRsiSMUnderPriceChange; - - // - bool isRsiSMCrossedOverPriceChange; - bool isRsiSMCrossedUnderPriceChange; - - // - bool isPriceChangeSMOverRsi; - bool isPriceChangeSMUnderRsi; - - // - bool isPriceChangeSMCrossedOverRsi; - bool isPriceChangeSMCrossedUnderRsi; - - // - bool isRsiOverRsiSM; - bool isRsiUnderRsiSM; - - // - bool isRsiCrossedOverRsiSM; - bool isRsiCrossedUnderRsiSM; - - // - bool isPriceChangeOverPriceChangeSM; - bool isPriceChangeUnderPriceChangeSM; - - // - bool isPriceChangeCrossedOverPriceChangeSM; - bool isPriceChangeCrossedUnderPriceChangeSM; - - // - // XSTR ... - - // - // Buffers ... - - // - double strBuffer[]; - double vidyaBuffer[]; - double strUpBuffer[]; - double strMidBuffer[]; - double strDownBuffer[]; - double strPriceBuffer[]; - double strStateBuffer[]; - double strSMLowBuffer[]; - double strSMHighBuffer[]; - double strMidStateBuffer[]; - - // - // Conditions ... - - // - bool isStrBullish; - bool isStrBearish; - - // - bool isStrSwitchedToBullish; - bool isStrSwitchedToBearish; - - // - // XCHE ... - - // - // Buffers ... - - // - double le1Buffer[]; - double se1Buffer[]; - double le2Buffer[]; - double se2Buffer[]; - double le1StartBuffer[]; - double se1StartBuffer[]; - double le2StartBuffer[]; - double se2StartBuffer[]; - - // - // Conditions ... - - // - bool isChe1Bullish; - bool isChe1Bearish; - - // - bool isChe1SwitchedToBullish; - bool isChe1SwitchedToBearish; - - // - bool isChe2Bullish; - bool isChe2Bearish; - - // - bool isChe2SwitchedToBullish; - bool isChe2SwitchedToBearish; - - // - bool isCheBullish; - bool isCheBearish; - - // - bool isCheSwitchedToBullish; - bool isCheSwitchedToBearish; - - // - // X3MA ... - - // - // Buffers ... - - // - double x3maMidBuffer[]; - double x3maFastBuffer[]; - double x3maSlowBuffer[]; - double x3maMidStateBuffer[]; - double x3maFastStateBuffer[]; - double x3maSlowStateBuffer[]; - - // - // Conditions ... - - // - bool isX3MaFastBullish; - bool isX3MaFastBearish; - bool isX3MaFastNeutural; - - // - bool isX3MaMidBullish; - bool isX3MaMidBearish; - bool isX3MaMidNeutural; - - // - bool isX3MaSlowBullish; - bool isX3MaSlowBearish; - bool isX3MaSlowNeutural; - - // - bool isX3MaFastOverMid; - bool isX3MaMidOverSlow; - - // - bool isX3MaFastUnderMid; - bool isX3MaMidUnderSlow; - - // - bool isX3MaBullishState; - bool isX3MaBearishState; - bool isX3MaNeuturalState; - - // - bool isX3MaBullishOrdered; - bool isX3MaBearishOrdered; - - // - bool isX3MaSwitchedToBullishOrdered; - bool isX3MaSwitchedToBearishOrdered; - - // - bool isX3MaSwitchedToBullishState; - bool isX3MaSwitchedToBearishState; - bool isX3MaSwitchedToNeuturalState; - - // - // XVWAP ... - - // - // Buffers ... - - // - double vwapMidBuffer[]; - double vwapFastBuffer[]; - double vwapSlowBuffer[]; - double vwapPriceBuffer[]; - double vwapVolumeBuffer[]; - double vwapMidStateBuffer[]; - double vwapFastStateBuffer[]; - double vwapSlowStateBuffer[]; - - // - // Conditions ... - - // - bool isVWapFastBullish; - bool isVWapFastBearish; - bool isVWapFastNeutural; - - // - bool isVWapMidBullish; - bool isVWapMidBearish; - bool isVWapMidNeutural; - - // - bool isVWapSlowBullish; - bool isVWapSlowBearish; - bool isVWapSlowNeutural; - - // - bool isVWapFastOverMid; - bool isVWapMidOverSlow; - - // - bool isVWapFastUnderMid; - bool isVWapMidUnderSlow; - - // - bool isVWapBullishState; - bool isVWapBearishState; - bool isVWapNeuturalState; - - // - bool isVWapBullishOrdered; - bool isVWapBearishOrdered; - - // - bool isVWapSwitchedToBullishOrdered; - bool isVWapSwitchedToBearishOrdered; - - // - bool isVWapSwitchedToBullishState; - bool isVWapSwitchedToBearishState; - bool isVWapSwitchedToNeuturalState; - - // - // Constructor ... - X121Conditions() - { - Clean(); - } - - // - // Tools ... - - /** - * Cleaning Up ... - */ - void Clean() - { - // - // Commons ... - symbol = NULL; - period = NULL; - time = NULL; - - // - // XPV ... - - // - // Buffers ... - - // - // Clean ... - - // - Clean(sarBuffer); - Clean(cHHBuffer); - Clean(cLLBuffer); - Clean(sHHBuffer); - Clean(sLLBuffer); - Clean(mHHBuffer); - Clean(mLLBuffer); - Clean(lHHBuffer); - Clean(lLLBuffer); - Clean(hHHBuffer); - Clean(hLLBuffer); - Clean(peaksBuffer); - Clean(valesBuffer); - Clean(supportsBuffer); - Clean(peaksGoldenBuffer); - Clean(valesGoldenBuffer); - Clean(resistancesBuffer); - Clean(fractalsUpperBuffer); - Clean(fractalsLowerBuffer); - - // - // Set As Series ... - - // - ArraySetAsSeries(sarBuffer, true); - ArraySetAsSeries(cHHBuffer, true); - ArraySetAsSeries(cLLBuffer, true); - ArraySetAsSeries(sHHBuffer, true); - ArraySetAsSeries(sLLBuffer, true); - ArraySetAsSeries(mHHBuffer, true); - ArraySetAsSeries(mLLBuffer, true); - ArraySetAsSeries(lHHBuffer, true); - ArraySetAsSeries(lLLBuffer, true); - ArraySetAsSeries(hHHBuffer, true); - ArraySetAsSeries(hLLBuffer, true); - ArraySetAsSeries(peaksBuffer, true); - ArraySetAsSeries(valesBuffer, true); - ArraySetAsSeries(supportsBuffer, true); - ArraySetAsSeries(peaksGoldenBuffer, true); - ArraySetAsSeries(valesGoldenBuffer, true); - ArraySetAsSeries(resistancesBuffer, true); - ArraySetAsSeries(fractalsUpperBuffer, true); - ArraySetAsSeries(fractalsLowerBuffer, true); - - // - // Conditions ... - - // - isNewPeak = false; - isNewVale = false; - isSarBullish = false; - isSarBearish = false; - isNewPeakOverLast = false; - isNewValeOverLast = false; - isNewPeakUnderLast = false; - isNewValeUnderLast = false; - isSarSwitchedToBullish = false; - isSarSwitchedToBearish = false; - - // - // XHK ... - - // - // Buffers ... - - // - // Clean ... - - // - Clean(xhkSMLowBuffer); - Clean(xhkRawLowBuffer); - Clean(xhkSMOpenBuffer); - Clean(xhkSMHighBuffer); - Clean(xhkRawOpenBuffer); - Clean(xhkRawHighBuffer); - Clean(xhkSMCloseBuffer); - Clean(xhkRawCloseBuffer); - - // - // Set As Series ... - - // - ArraySetAsSeries(xhkSMLowBuffer, true); - ArraySetAsSeries(xhkRawLowBuffer, true); - ArraySetAsSeries(xhkSMOpenBuffer, true); - ArraySetAsSeries(xhkSMHighBuffer, true); - ArraySetAsSeries(xhkRawOpenBuffer, true); - ArraySetAsSeries(xhkRawHighBuffer, true); - ArraySetAsSeries(xhkSMCloseBuffer, true); - ArraySetAsSeries(xhkRawCloseBuffer, true); - - // - // Conditions ... - - // - isSMHKBullish = false; - isSMHKBearish = false; - isRawHKBullish = false; - isRawHKBearish = false; - isClosedOverSMHK = false; - isClosedUnderSMHK = false; - isClosedOverRawHK = false; - isClosedUnderRawHK = false; - isRawHKClosedOverSMHK = false; - isRawHKClosedUnderSMHK = false; - isSMHKSwitchedToBearish = false; - isSMHKSwitchedToBullish = false; - isRawHKSwitchedToBullish = false; - isRawHKSwitchedToBearish = false; - - // - // XMAS ... - - // - // Buffers ... - - // - // Clean ... - - // - Clean(midBuffer); - Clean(upperBuffer); - Clean(lowerBuffer); - - // - // Set As Series ... - - // - ArraySetAsSeries(midBuffer, true); - ArraySetAsSeries(upperBuffer, true); - ArraySetAsSeries(lowerBuffer, true); - - // - // Conditions ... - - // - // XATR ... - - // - // Buffers ... - - // - // Clean ... - - // - Clean(rsiBuffer); - Clean(atrBuffer); - Clean(atrUpperBuffer); - Clean(atrLowerBuffer); - Clean(rsiChangeBuffer); - Clean(atrUpperSMBuffer); - Clean(atrLowerSMBuffer); - Clean(rsiChangeSMBuffer); - Clean(priceChangeBuffer); - Clean(priceChangeSMBuffer); - - // - // Set As Series ... - - // - ArraySetAsSeries(rsiBuffer, true); - ArraySetAsSeries(atrBuffer, true); - ArraySetAsSeries(atrUpperBuffer, true); - ArraySetAsSeries(atrLowerBuffer, true); - ArraySetAsSeries(rsiChangeBuffer, true); - ArraySetAsSeries(atrUpperSMBuffer, true); - ArraySetAsSeries(atrLowerSMBuffer, true); - ArraySetAsSeries(rsiChangeSMBuffer, true); - ArraySetAsSeries(priceChangeBuffer, true); - ArraySetAsSeries(priceChangeSMBuffer, true); - - // - // Conditions ... - - // - isRsiInRange = false; - isRsiOverSold = false; - isRsiOverRsiSM = false; - isRsiUnderRsiSM = false; - isRsiOverBought = false; - isRsiCrossedOverRsiSM = false; - isRsiCrossedUnderRsiSM = false; - isPriceChangeSMOverRsi = false; - isRsiSMOverPriceChange = false; - isRsiSMUnderPriceChange = false; - isPriceChangeSMUnderRsi = false; - isRsiCrossedOverOverSold = false; - isRsiCrossedUnderOverSold = false; - isRsiCrossedOverOverBought = false; - isRsiCrossedUnderOverBought = false; - isRsiSMCrossedOverPriceChange = false; - isPriceChangeSMCrossedOverRsi = false; - isRsiSMCrossedUnderPriceChange = false; - isPriceChangeSMCrossedUnderRsi = false; - isPriceChangeOverPriceChangeSM = false; - isPriceChangeUnderPriceChangeSM = false; - isPriceChangeCrossedOverPriceChangeSM = false; - isPriceChangeCrossedUnderPriceChangeSM = false; - - // - // XSTR ... - - // - // Buffers ... - - // - // Clean ... - - // - Clean(strBuffer); - Clean(vidyaBuffer); - Clean(strUpBuffer); - Clean(strMidBuffer); - Clean(strDownBuffer); - Clean(strPriceBuffer); - Clean(strStateBuffer); - Clean(strSMLowBuffer); - Clean(strSMHighBuffer); - Clean(strMidStateBuffer); - - // - // Set As Series ... - - // - ArraySetAsSeries(strBuffer, true); - ArraySetAsSeries(vidyaBuffer, true); - ArraySetAsSeries(strUpBuffer, true); - ArraySetAsSeries(strMidBuffer, true); - ArraySetAsSeries(strDownBuffer, true); - ArraySetAsSeries(strPriceBuffer, true); - ArraySetAsSeries(strStateBuffer, true); - ArraySetAsSeries(strSMLowBuffer, true); - ArraySetAsSeries(strSMHighBuffer, true); - ArraySetAsSeries(strMidStateBuffer, true); - - // - // Conditions ... - - // - isStrBullish = false; - isStrBearish = false; - isStrSwitchedToBullish = false; - isStrSwitchedToBearish = false; - - // - // XCHE ... - - // - // Buffers ... - - // - // Clean ... - - // - Clean(le1Buffer); - Clean(se1Buffer); - Clean(le2Buffer); - Clean(se2Buffer); - Clean(le1StartBuffer); - Clean(se1StartBuffer); - Clean(le2StartBuffer); - Clean(se2StartBuffer); - - // - // Set As Series ... - - // - ArraySetAsSeries(le1Buffer, true); - ArraySetAsSeries(se1Buffer, true); - ArraySetAsSeries(le2Buffer, true); - ArraySetAsSeries(se2Buffer, true); - ArraySetAsSeries(le1StartBuffer, true); - ArraySetAsSeries(se1StartBuffer, true); - ArraySetAsSeries(le2StartBuffer, true); - ArraySetAsSeries(se2StartBuffer, true); - - // - // Conditions ... - - // - isCheBullish = false; - isCheBearish = false; - isChe1Bullish = false; - isChe1Bearish = false; - isChe2Bullish = false; - isChe2Bearish = false; - isCheSwitchedToBullish = false; - isCheSwitchedToBearish = false; - isChe1SwitchedToBullish = false; - isChe1SwitchedToBearish = false; - isChe2SwitchedToBullish = false; - isChe2SwitchedToBearish = false; - - // - // X3MA ... - - // - // Buffers ... - - // - // Clean ... - - // - Clean(x3maMidBuffer); - Clean(x3maFastBuffer); - Clean(x3maSlowBuffer); - Clean(x3maMidStateBuffer); - Clean(x3maFastStateBuffer); - Clean(x3maSlowStateBuffer); - - // - // Set As Series ... - - // - ArraySetAsSeries(x3maMidBuffer, true); - ArraySetAsSeries(x3maFastBuffer, true); - ArraySetAsSeries(x3maSlowBuffer, true); - ArraySetAsSeries(x3maMidStateBuffer, true); - ArraySetAsSeries(x3maFastStateBuffer, true); - ArraySetAsSeries(x3maSlowStateBuffer, true); - - // - // Conditions ... - - // - isX3MaMidBullish = false; - isX3MaMidBearish = false; - isX3MaFastBullish = false; - isX3MaFastBearish = false; - isX3MaMidNeutural = false; - isX3MaSlowBullish = false; - isX3MaSlowBearish = false; - isX3MaFastOverMid = false; - isX3MaMidOverSlow = false; - isX3MaFastNeutural = false; - isX3MaSlowNeutural = false; - isX3MaFastUnderMid = false; - isX3MaMidUnderSlow = false; - isX3MaBullishState = false; - isX3MaBearishState = false; - isX3MaNeuturalState = false; - isX3MaBullishOrdered = false; - isX3MaBearishOrdered = false; - isX3MaSwitchedToBullishState = false; - isX3MaSwitchedToBearishState = false; - isX3MaSwitchedToNeuturalState = false; - isX3MaSwitchedToBullishOrdered = false; - isX3MaSwitchedToBearishOrdered = false; - - // - // XVWAP ... - - // - // Buffers ... - - // - // Clean ... - - // - Clean(vwapMidBuffer); - Clean(vwapFastBuffer); - Clean(vwapSlowBuffer); - Clean(vwapPriceBuffer); - Clean(vwapVolumeBuffer); - Clean(vwapMidStateBuffer); - Clean(vwapFastStateBuffer); - Clean(vwapSlowStateBuffer); - - // - // Set As Series ... - - // - ArraySetAsSeries(vwapMidBuffer, true); - ArraySetAsSeries(vwapFastBuffer, true); - ArraySetAsSeries(vwapSlowBuffer, true); - ArraySetAsSeries(vwapPriceBuffer, true); - ArraySetAsSeries(vwapVolumeBuffer, true); - ArraySetAsSeries(vwapMidStateBuffer, true); - ArraySetAsSeries(vwapFastStateBuffer, true); - ArraySetAsSeries(vwapSlowStateBuffer, true); - - // - // Conditions ... - - // - isVWapMidBullish = false; - isVWapMidBearish = false; - isVWapMidNeutural = false; - isVWapFastBullish = false; - isVWapFastBearish = false; - isVWapSlowBullish = false; - isVWapSlowBearish = false; - isVWapFastOverMid = false; - isVWapMidOverSlow = false; - isVWapFastNeutural = false; - isVWapSlowNeutural = false; - isVWapFastUnderMid = false; - isVWapMidUnderSlow = false; - isVWapBullishState = false; - isVWapBearishState = false; - isVWapNeuturalState = false; - isVWapBullishOrdered = false; - isVWapBearishOrdered = false; - isVWapSwitchedToBullishState = false; - isVWapSwitchedToBearishState = false; - isVWapSwitchedToNeuturalState = false; - isVWapSwitchedToBullishOrdered = false; - isVWapSwitchedToBearishOrdered = false; - - // - ZeroMemory(this); - } - - /** - * Generate Conditions Scores ... - * - * @param bullishScore: Double, Directional Scores Reference ... - * @param bearishScore: Double, Directional Scores Reference ... - */ - void GenerateScore( - double &bullishScore, - double &bearishScore // - ) - { - // - bullishScore = 0; - bearishScore = 0; - - // - double score = 1; - double minScore = 0.5; - double highScore = 1.5; - - // - // XCC ... - - // - // XPV ... - - // - if (isSarBullish) - { - bullishScore += minScore; - } - if (isSarSwitchedToBullish) - { - bullishScore += score; - } - - // - if (isSarBearish) - { - bearishScore += minScore; - } - if (isSarSwitchedToBearish) - { - bearishScore += score; - } - - // - // XHK ... - - // - if (isSMHKBullish) - { - bullishScore += minScore; - } - if (isRawHKBullish) - { - bullishScore += minScore; - } - if (isClosedOverSMHK) - { - bullishScore += minScore; - } - if (isClosedOverRawHK) - { - bullishScore += minScore; - } - if (isRawHKClosedOverSMHK) - { - bullishScore += minScore; - } - if (isSMHKSwitchedToBullish) - { - bullishScore += highScore; - } - if (isRawHKSwitchedToBullish) - { - bullishScore += highScore; - } - - // - if (isSMHKBearish) - { - bearishScore += minScore; - } - if (isRawHKBearish) - { - bearishScore += minScore; - } - if (isClosedUnderSMHK) - { - bearishScore += minScore; - } - if (isClosedUnderRawHK) - { - bearishScore += minScore; - } - if (isRawHKClosedUnderSMHK) - { - bearishScore += minScore; - } - if (isSMHKSwitchedToBearish) - { - bearishScore += highScore; - } - if (isRawHKSwitchedToBullish) - { - bearishScore += highScore; - } - - // - // XMAS ... - - // - // XATR ... - - // - if (isRsiOverSold) - { - bullishScore += minScore; - } - if (isRsiOverRsiSM) - { - bullishScore += minScore; - } - if (isRsiSMOverPriceChange) - { - bullishScore += minScore; - } - if (isPriceChangeSMOverRsi) - { - bullishScore += minScore; - } - if (isPriceChangeOverPriceChangeSM) - { - bullishScore += minScore; - } - - // - if (isRsiCrossedOverRsiSM) - { - bullishScore += score; - } - if (isRsiCrossedOverOverSold) - { - bullishScore += score; - } - if (isRsiCrossedUnderOverBought) - { - bullishScore += score; - } - if (isRsiSMCrossedOverPriceChange) - { - bullishScore += score; - } - if (isPriceChangeSMCrossedOverRsi) - { - bullishScore += score; - } - if (isPriceChangeCrossedOverPriceChangeSM) - { - bullishScore += score; - } - - // - if (isRsiOverBought) - { - bearishScore += minScore; - } - if (isRsiUnderRsiSM) - { - bearishScore += minScore; - } - if (isRsiSMUnderPriceChange) - { - bearishScore += minScore; - } - if (isPriceChangeSMUnderRsi) - { - bearishScore += minScore; - } - if (isPriceChangeUnderPriceChangeSM) - { - bearishScore += minScore; - } - - // - if (isRsiCrossedUnderRsiSM) - { - bearishScore += score; - } - if (isRsiCrossedUnderOverSold) - { - bearishScore += score; - } - if (isRsiCrossedOverOverBought) - { - bearishScore += score; - } - if (isRsiSMCrossedUnderPriceChange) - { - bearishScore += score; - } - if (isPriceChangeSMCrossedUnderRsi) - { - bearishScore += score; - } - if (isPriceChangeCrossedUnderPriceChangeSM) - { - bearishScore += score; - } - - // - // XSTR ... - - // - if (isStrBullish) - { - bullishScore += minScore; - } - if (isStrSwitchedToBullish) - { - bullishScore += score; - } - - // - if (isStrBearish) - { - bearishScore += minScore; - } - if (isStrSwitchedToBearish) - { - bearishScore += score; - } - - // - // XCHE ... - - // - if (isCheBullish) - { - bullishScore += score; - } - if (isCheSwitchedToBullish) - { - bullishScore += highScore; - } - if (isChe1Bullish && - !isCheBullish && - !isCheSwitchedToBullish) - { - bullishScore += minScore; - } - if (isChe1SwitchedToBullish && - !isCheBullish && - !isCheSwitchedToBullish) - { - bullishScore += minScore; - } - - // - if (isCheBearish) - { - bearishScore += score; - } - if (isCheSwitchedToBearish) - { - bearishScore += highScore; - } - if (isChe1Bearish && - !isCheBearish && - !isCheSwitchedToBearish) - { - bearishScore += minScore; - } - if (isChe1SwitchedToBearish && - !isCheBearish && - !isCheSwitchedToBearish) - { - bearishScore += minScore; - } - - // - // X3MA ... - - // - if (isX3MaBullishState) - { - bullishScore += score; - } - if (isX3MaBullishOrdered) - { - bullishScore += score; - } - if (isX3MaSwitchedToBullishState) - { - bullishScore += highScore; - } - if (isX3MaSwitchedToBullishOrdered) - { - bullishScore += highScore; - } - if (!isX3MaBullishState && - !isX3MaSwitchedToBullishState) - { - // - if (isX3MaFastBullish) - { - bullishScore += minScore; - } - if (isX3MaSlowBullish) - { - bullishScore += minScore; - } - } - if (!isX3MaBullishOrdered && - !isX3MaSwitchedToBullishOrdered) - { - // - if (isX3MaFastOverMid) - { - bullishScore += minScore; - } - if (isX3MaMidOverSlow) - { - bullishScore += minScore; - } - } - - // - if (isX3MaBearishState) - { - bearishScore += score; - } - if (isX3MaBearishOrdered) - { - bearishScore += score; - } - if (isX3MaSwitchedToBearishState) - { - bearishScore += highScore; - } - if (isX3MaSwitchedToBearishOrdered) - { - bearishScore += highScore; - } - if (!isX3MaBearishState && - !isX3MaSwitchedToBearishState) - { - // - if (isX3MaFastBearish) - { - bearishScore += minScore; - } - if (isX3MaSlowBearish) - { - bearishScore += minScore; - } - } - if (!isX3MaBearishOrdered && - !isX3MaSwitchedToBearishOrdered) - { - // - if (isX3MaFastUnderMid) - { - bearishScore += minScore; - } - if (isX3MaMidUnderSlow) - { - bearishScore += minScore; - } - } - - // - // XVWAP ... - - // - if (isVWapBullishState) - { - bullishScore += score; - } - if (isVWapBullishOrdered) - { - bullishScore += score; - } - if (isVWapSwitchedToBullishState) - { - bullishScore += highScore; - } - if (isVWapSwitchedToBullishOrdered) - { - bullishScore += highScore; - } - if (!isVWapBullishState && - !isVWapSwitchedToBullishState) - { - // - if (isVWapFastBullish) - { - bullishScore += minScore; - } - if (isVWapSlowBullish) - { - bullishScore += minScore; - } - } - if (!isVWapBullishOrdered && - !isVWapSwitchedToBullishOrdered) - { - // - if (isVWapFastOverMid) - { - bullishScore += minScore; - } - if (isVWapMidOverSlow) - { - bullishScore += minScore; - } - } - - // - if (isVWapBearishState) - { - bearishScore += score; - } - if (isVWapBearishOrdered) - { - bearishScore += score; - } - if (isVWapSwitchedToBearishState) - { - bearishScore += highScore; - } - if (isVWapSwitchedToBearishOrdered) - { - bearishScore += highScore; - } - if (!isVWapBearishState && - !isVWapSwitchedToBearishState) - { - // - if (isVWapFastBearish) - { - bearishScore += minScore; - } - if (isVWapSlowBearish) - { - bearishScore += minScore; - } - } - if (!isVWapBearishOrdered && - !isVWapSwitchedToBearishOrdered) - { - // - if (isVWapFastUnderMid) - { - bearishScore += minScore; - } - if (isVWapMidUnderSlow) - { - bearishScore += minScore; - } - } - } - - /** - * Generate Summary String for Represent Conditions State ... - * - * @param onlyCommons: Boolean, Just Generate Only Commons Conditions ... - * @param onlyConditions: Boolean, Just Generate Only Conditions ... - * @param includeScores: Boolean, Attach Scores Representations on Result ... - * @param ignoreFalseConditions: Boolean, Ignore False Conditions on Result ... - * @param separator: String, Separate Lines ... - * - * @return ( string ) - */ - string GenerateSummary( - bool onlyCommons = false, - bool onlyConditions = false, - bool includeScores = true, - bool ignoreFalseConditions = true, - string separator = "\n" // - ) - { - // - string result = NULL; - - // - double bullishScore = 0; - double bearishScore = 0; - GenerateScore( - bullishScore, - bearishScore // - ); - - // - string scoresStr = - // - "Scores: " + separator + - "---------------" + separator + - "Bullish: " + ToString(bullishScore) + separator + - "Bearish: " + ToString(bearishScore) + separator + - "" - // - ; - - // - string commonStr = GenerateSpecifiedCommonSummary( - this, - separator, - includeScores // - ); - - // - // XCC ... - - // - // XPV ... - - // - string pvConditionsStr = - // - "-----------------------" + separator + - "XPV: " + separator + - "-----------------------" + separator + - ToString("isSarBullish", isSarBullish, ignoreFalseConditions, separator) + - ToString("isSarBearish", isSarBearish, ignoreFalseConditions, separator) + - ToString("isSarSwitchedToBullish", isSarSwitchedToBullish, ignoreFalseConditions, separator) + - ToString("isSarSwitchedToBearish", isSarSwitchedToBearish, ignoreFalseConditions, separator) + - ToString("isNewPeak", isNewPeak, ignoreFalseConditions, separator) + - ToString("isNewPeakOverLast", isNewPeakOverLast, ignoreFalseConditions, separator) + - ToString("isNewPeakUnderLast", isNewPeakUnderLast, ignoreFalseConditions, separator) + - ToString("isNewVale", isNewVale, ignoreFalseConditions, separator) + - ToString("isNewValeOverLast", isNewValeOverLast, ignoreFalseConditions, separator) + - ToString("isNewValeUnderLast", isNewValeUnderLast, ignoreFalseConditions, separator) + - // - "" - // - ; - - // - // XHK ... - - // - string hkConditionsStr = - // - "-----------------------" + separator + - "XHK: " + separator + - "-----------------------" + separator + - ToString("isSMHKBullish", isSMHKBullish, ignoreFalseConditions, separator) + - ToString("isRawHKBullish", isRawHKBullish, ignoreFalseConditions, separator) + - ToString("isSMHKSwitchedToBullish", isSMHKSwitchedToBullish, ignoreFalseConditions, separator) + - ToString("isRawHKSwitchedToBullish", isRawHKSwitchedToBullish, ignoreFalseConditions, separator) + - ToString("isSMHKBearish", isSMHKBearish, ignoreFalseConditions, separator) + - ToString("isRawHKBearish", isRawHKBearish, ignoreFalseConditions, separator) + - ToString("isSMHKSwitchedToBearish", isSMHKSwitchedToBearish, ignoreFalseConditions, separator) + - ToString("isRawHKSwitchedToBearish", isRawHKSwitchedToBearish, ignoreFalseConditions, separator) + - ToString("isClosedOverSMHK", isClosedOverSMHK, ignoreFalseConditions, separator) + - ToString("isClosedUnderSMHK", isClosedUnderSMHK, ignoreFalseConditions, separator) + - ToString("isClosedOverRawHK", isClosedOverRawHK, ignoreFalseConditions, separator) + - ToString("isClosedUnderRawHK", isClosedUnderRawHK, ignoreFalseConditions, separator) + - ToString("isRawHKClosedOverSMHK", isRawHKClosedOverSMHK, ignoreFalseConditions, separator) + - ToString("isRawHKClosedUnderSMHK", isRawHKClosedUnderSMHK, ignoreFalseConditions, separator) + - // - "" - // - ; - - // - // XMAS ... - - // - // XATR ... - - // - string atrConditionsStr = - // - "-----------------------" + separator + - "XATR: " + separator + - "-----------------------" + separator + - ToString("isRsiInRange", isRsiInRange, ignoreFalseConditions, separator) + - ToString("isRsiOverSold", isRsiOverSold, ignoreFalseConditions, separator) + - ToString("isRsiOverBought", isRsiOverBought, ignoreFalseConditions, separator) + - ToString("isRsiCrossedOverOverSold", isRsiCrossedOverOverSold, ignoreFalseConditions, separator) + - ToString("isRsiCrossedUnderOverSold", isRsiCrossedUnderOverSold, ignoreFalseConditions, separator) + - ToString("isRsiCrossedOverOverBought", isRsiCrossedOverOverBought, ignoreFalseConditions, separator) + - ToString("isRsiCrossedUnderOverBought", isRsiCrossedUnderOverBought, ignoreFalseConditions, separator) + - // - ToString("isRsiSMOverPriceChange", isRsiSMOverPriceChange, ignoreFalseConditions, separator) + - ToString("isRsiSMUnderPriceChange", isRsiSMUnderPriceChange, ignoreFalseConditions, separator) + - ToString("isRsiSMCrossedOverPriceChange", isRsiSMCrossedOverPriceChange, ignoreFalseConditions, separator) + - ToString("isRsiSMCrossedUnderPriceChange", isRsiSMCrossedUnderPriceChange, ignoreFalseConditions, separator) + - ToString("isPriceChangeSMOverRsi", isPriceChangeSMOverRsi, ignoreFalseConditions, separator) + - ToString("isPriceChangeSMUnderRsi", isPriceChangeSMUnderRsi, ignoreFalseConditions, separator) + - ToString("isPriceChangeSMCrossedOverRsi", isPriceChangeSMCrossedOverRsi, ignoreFalseConditions, separator) + - ToString("isPriceChangeSMCrossedUnderRsi", isPriceChangeSMCrossedUnderRsi, ignoreFalseConditions, separator) + - ToString("isRsiOverRsiSM", isRsiOverRsiSM, ignoreFalseConditions, separator) + - ToString("isRsiUnderRsiSM", isRsiUnderRsiSM, ignoreFalseConditions, separator) + - ToString("isRsiCrossedOverRsiSM", isRsiCrossedOverRsiSM, ignoreFalseConditions, separator) + - ToString("isRsiCrossedUnderRsiSM", isRsiCrossedUnderRsiSM, ignoreFalseConditions, separator) + - ToString("isPriceChangeOverPriceChangeSM", isPriceChangeOverPriceChangeSM, ignoreFalseConditions, separator) + - ToString("isPriceChangeUnderPriceChangeSM", isPriceChangeUnderPriceChangeSM, ignoreFalseConditions, separator) + - ToString("isPriceChangeCrossedOverPriceChangeSM", isPriceChangeCrossedOverPriceChangeSM, ignoreFalseConditions, separator) + - ToString("isPriceChangeCrossedUnderPriceChangeSM", isPriceChangeCrossedUnderPriceChangeSM, ignoreFalseConditions, separator) + - // - "" - // - ; - - // - // XSTR ... - - // - string strConditionsStr = - // - "-----------------------" + separator + - "XSTR: " + separator + - "-----------------------" + separator + - ToString("isStrBullish", isStrBullish, ignoreFalseConditions, separator) + - ToString("isStrBearish", isStrBearish, ignoreFalseConditions, separator) + - ToString("isStrSwitchedToBullish", isStrSwitchedToBullish, ignoreFalseConditions, separator) + - ToString("isStrSwitchedToBearish", isStrSwitchedToBearish, ignoreFalseConditions, separator) + - // - "" - // - ; - - // - // XCHE ... - - // - string cheConditionsStr = - // - "-----------------------" + separator + - "XCHE: " + separator + - "-----------------------" + separator + - ToString("isChe1Bullish", isChe1Bullish, ignoreFalseConditions, separator) + - ToString("isChe1Bearish", isChe1Bearish, ignoreFalseConditions, separator) + - ToString("isChe1SwitchedToBullish", isChe1SwitchedToBullish, ignoreFalseConditions, separator) + - ToString("isChe1SwitchedToBearish", isChe1SwitchedToBearish, ignoreFalseConditions, separator) + - ToString("isChe2Bullish", isChe2Bullish, ignoreFalseConditions, separator) + - ToString("isChe2Bearish", isChe2Bearish, ignoreFalseConditions, separator) + - ToString("isChe2SwitchedToBullish", isChe2SwitchedToBullish, ignoreFalseConditions, separator) + - ToString("isChe2SwitchedToBearish", isChe2SwitchedToBearish, ignoreFalseConditions, separator) + - ToString("isCheBullish", isCheBullish, ignoreFalseConditions, separator) + - ToString("isCheBearish", isCheBearish, ignoreFalseConditions, separator) + - ToString("isCheSwitchedToBullish", isCheSwitchedToBullish, ignoreFalseConditions, separator) + - ToString("isCheSwitchedToBearish", isCheSwitchedToBearish, ignoreFalseConditions, separator) + - // - "" - // - ; - - // - // X3MA ... - - // - string x3maonditionsStr = - // - "-----------------------" + separator + - "X3MA: " + separator + - "-----------------------" + separator + - ToString("isX3MaFastBullish", isX3MaFastBullish, ignoreFalseConditions, separator) + - ToString("isX3MaFastBearish", isX3MaFastBearish, ignoreFalseConditions, separator) + - ToString("isX3MaFastNeutural", isX3MaFastNeutural, ignoreFalseConditions, separator) + - ToString("isX3MaMidBullish", isX3MaMidBullish, ignoreFalseConditions, separator) + - ToString("isX3MaMidBearish", isX3MaMidBearish, ignoreFalseConditions, separator) + - ToString("isX3MaMidNeutural", isX3MaMidNeutural, ignoreFalseConditions, separator) + - ToString("isX3MaSlowBullish", isX3MaSlowBullish, ignoreFalseConditions, separator) + - ToString("isX3MaSlowBearish", isX3MaSlowBearish, ignoreFalseConditions, separator) + - ToString("isX3MaSlowNeutural", isX3MaSlowNeutural, ignoreFalseConditions, separator) + - ToString("isX3MaFastOverMid", isX3MaFastOverMid, ignoreFalseConditions, separator) + - ToString("isX3MaMidOverSlow", isX3MaMidOverSlow, ignoreFalseConditions, separator) + - ToString("isX3MaFastUnderMid", isX3MaFastUnderMid, ignoreFalseConditions, separator) + - ToString("isX3MaMidUnderSlow", isX3MaMidUnderSlow, ignoreFalseConditions, separator) + - ToString("isX3MaBullishState", isX3MaBullishState, ignoreFalseConditions, separator) + - ToString("isX3MaBearishState", isX3MaBearishState, ignoreFalseConditions, separator) + - ToString("isX3MaNeuturalState", isX3MaNeuturalState, ignoreFalseConditions, separator) + - ToString("isX3MaBullishOrdered", isX3MaBullishOrdered, ignoreFalseConditions, separator) + - ToString("isX3MaBearishOrdered", isX3MaBearishOrdered, ignoreFalseConditions, separator) + - ToString("isX3MaSwitchedToBullishOrdered", isX3MaSwitchedToBullishOrdered, ignoreFalseConditions, separator) + - ToString("isX3MaSwitchedToBearishOrdered", isX3MaSwitchedToBearishOrdered, ignoreFalseConditions, separator) + - ToString("isX3MaSwitchedToBullishState", isX3MaSwitchedToBullishState, ignoreFalseConditions, separator) + - ToString("isX3MaSwitchedToBearishState", isX3MaSwitchedToBearishState, ignoreFalseConditions, separator) + - ToString("isX3MaSwitchedToNeuturalState", isX3MaSwitchedToNeuturalState, ignoreFalseConditions, separator) + - // - "" - // - ; - - // - // XVWAP ... - - // - string vwapConditionsStr = - // - "-----------------------" + separator + - "XVWAP: " + separator + - "-----------------------" + separator + - ToString("isVWapFastBullish", isVWapFastBullish, ignoreFalseConditions, separator) + - ToString("isVWapFastBearish", isVWapFastBearish, ignoreFalseConditions, separator) + - ToString("isVWapFastNeutural", isVWapFastNeutural, ignoreFalseConditions, separator) + - ToString("isVWapMidBullish", isVWapMidBullish, ignoreFalseConditions, separator) + - ToString("isVWapMidBearish", isVWapMidBearish, ignoreFalseConditions, separator) + - ToString("isVWapMidNeutural", isVWapMidNeutural, ignoreFalseConditions, separator) + - ToString("isVWapSlowBullish", isVWapSlowBullish, ignoreFalseConditions, separator) + - ToString("isVWapSlowBearish", isVWapSlowBearish, ignoreFalseConditions, separator) + - ToString("isVWapSlowNeutural", isVWapSlowNeutural, ignoreFalseConditions, separator) + - ToString("isVWapFastOverMid", isVWapFastOverMid, ignoreFalseConditions, separator) + - ToString("isVWapMidOverSlow", isVWapMidOverSlow, ignoreFalseConditions, separator) + - ToString("isVWapFastUnderMid", isVWapFastUnderMid, ignoreFalseConditions, separator) + - ToString("isVWapMidUnderSlow", isVWapMidUnderSlow, ignoreFalseConditions, separator) + - ToString("isVWapBullishState", isVWapBullishState, ignoreFalseConditions, separator) + - ToString("isVWapBearishState", isVWapBearishState, ignoreFalseConditions, separator) + - ToString("isVWapNeuturalState", isVWapNeuturalState, ignoreFalseConditions, separator) + - ToString("isVWapBullishOrdered", isVWapBullishOrdered, ignoreFalseConditions, separator) + - ToString("isVWapBearishOrdered", isVWapBearishOrdered, ignoreFalseConditions, separator) + - ToString("isVWapSwitchedToBullishOrdered", isVWapSwitchedToBullishOrdered, ignoreFalseConditions, separator) + - ToString("isVWapSwitchedToBearishOrdered", isVWapSwitchedToBearishOrdered, ignoreFalseConditions, separator) + - ToString("isVWapSwitchedToBullishState", isVWapSwitchedToBullishState, ignoreFalseConditions, separator) + - ToString("isVWapSwitchedToBearishState", isVWapSwitchedToBearishState, ignoreFalseConditions, separator) + - ToString("isVWapSwitchedToNeuturalState", isVWapSwitchedToNeuturalState, ignoreFalseConditions, separator) + - // - "" - // - ; - - // - string conditionsStr = - // - pvConditionsStr + separator + - hkConditionsStr + separator + - atrConditionsStr + separator + - strConditionsStr + separator + - cheConditionsStr + separator + - x3maonditionsStr + separator + - vwapConditionsStr + separator + - "" - // - ; - - // - result = - // - "[" + GetTag() + "]" + separator + - (onlyConditions - ? "" - : commonStr) + - (!includeScores - ? "" - : scoresStr) + - " " + separator + - (onlyCommons - ? "" - : conditionsStr) + - "" - // - ; - - // - return result; - } - - /** - * Retrieve nique Tag Identifier ... - * - * @return ( string ) - */ - string GetTag() - { - return GetTypeName(this); - } - - // -}; - -// -// Implementation ... -class XCX121Helper : public XCBase -{ - // - public: - // - - // - // Helpers ... - XCX121XCCHelper *xccHelper; - XCX121XPVHelper *xpvHelper; - XCX121XHKHelper *xhkHelper; - XCX121XMASHelper *xmasHelper; - XCX121XATRHelper *xatrHelper; - XCX121XSTRHelper *xstrHelper; - XCX121XCHEHelper *xcheHelper; - XCX121X3MAHelper *x3maHelper; - XCX121XVWAPHelper *xvwapHelper; - - // - // Constructors ... - XCX121Helper() - { - } - - // - // Deconstructor ... - ~XCX121Helper() - { - // - mInputs.Clean(); - xccInputs.Clean(); - xpvInputs.Clean(); - xhkInputs.Clean(); - xmasInputs.Clean(); - xatrInputs.Clean(); - xstrInputs.Clean(); - xcheInputs.Clean(); - x3maInputs.Clean(); - xvwapInputs.Clean(); - - // - delete xccHelper; - delete xpvHelper; - delete xhkHelper; - delete xmasHelper; - delete xatrHelper; - delete xstrHelper; - delete xcheHelper; - delete x3maHelper; - delete xvwapHelper; - - // - ZeroMemory(xccHelper); - ZeroMemory(xpvHelper); - ZeroMemory(xhkHelper); - ZeroMemory(xmasHelper); - ZeroMemory(xatrHelper); - ZeroMemory(xstrHelper); - ZeroMemory(xcheHelper); - ZeroMemory(x3maHelper); - ZeroMemory(xvwapHelper); - } - - // - string GetSymbol() - { - return mSymbol; - } - - // - ENUM_TIMEFRAMES GetPeriod() - { - return mPeriod; - } - - // - // Tools ... - - /** - * Initialize Indicator Helper ... - * - * @param symbol: String, Symbol ... - * @param period: ENUM_TIMEFRAMES member, Period ... - * @param inputs: X121Inputs instance, Indicator Inputs ... - * - * @return ( bool ) - */ - bool Init( - string symbol, // Trading Symbol - ENUM_TIMEFRAMES period, // Trading Period - X121Inputs &inputs // Inputs - ) - { - // - bool result = false; - - // - result = - IsValid(symbol) && - IsValid(period) && - inputs.IsValid(); - if (!result) - { - return result; - } - - // - mSymbol = symbol; - mPeriod = period; - - // - // Setting Inputs ... - - // - mInputs = inputs; - xccInputs = inputs.xccInputs; - xpvInputs = inputs.xpvInputs; - xhkInputs = inputs.xhkInputs; - xmasInputs = inputs.xmasInputs; - xatrInputs = inputs.xatrInputs; - xstrInputs = inputs.xstrInputs; - xcheInputs = inputs.xcheInputs; - x3maInputs = inputs.x3maInputs; - xvwapInputs = inputs.xvwapInputs; - - // - // Initial Helpers ... - - // - // XCC ... - xccHelper = new XCX121XCCHelper(); - result = - result && - xccHelper.Init( - symbol, - period, - xccInputs // - ); - - // - // XPV ... - xpvHelper = new XCX121XPVHelper(); - result = - result && - xpvHelper.Init( - symbol, - period, - xpvInputs // - ); - - // - // XHK ... - xhkHelper = new XCX121XHKHelper(); - result = - result && - xhkHelper.Init( - symbol, - period, - xhkInputs // - ); - if (!result) - { - // - ZeroMemory(xccHelper); - ZeroMemory(xpvHelper); - ZeroMemory(xhkHelper); - ZeroMemory(xmasHelper); - ZeroMemory(xatrHelper); - ZeroMemory(xstrHelper); - ZeroMemory(xcheHelper); - ZeroMemory(x3maHelper); - ZeroMemory(xvwapHelper); - - // - // ZeroMemory(xichHelper); - // ZeroMemory(xdonHelper); - // ZeroMemory(xdeltaHelper); - // ZeroMemory(xvolumeHelper); - - // - return result; - } - - // - // XMAS ... - xmasHelper = new XCX121XMASHelper(); - result = - result && - xmasHelper.Init( - symbol, - period, - xmasInputs // - ); - - // - // XATR ... - xatrHelper = new XCX121XATRHelper(); - result = - result && - xatrHelper.Init( - symbol, - period, - xatrInputs // - ); - - // - // XSTR ... - xstrHelper = new XCX121XSTRHelper(); - result = - result && - xstrHelper.Init( - symbol, - period, - xstrInputs // - ); - - // - // XCHE ... - xcheHelper = new XCX121XCHEHelper(); - result = - result && - xcheHelper.Init( - symbol, - period, - xcheInputs // - ); - - // - // X3MA ... - x3maHelper = new XCX121X3MAHelper(); - result = - result && - x3maHelper.Init( - symbol, - period, - x3maInputs // - ); - - // - // XVWAP ... - xvwapHelper = new XCX121XVWAPHelper(); - result = - result && - xvwapHelper.Init( - symbol, - period, - xvwapInputs // - ); - - // - // Show RSI ... - if (inputs.showRSI) - { - // - ENUM_APPLIED_PRICE rsiAppliedTo = ToAppliedPrice(xatrInputs.rsiPriceType); - mRSIHandler = iRSI( - symbol, - period, - xatrInputs.rsiLength, - rsiAppliedTo // - ); - - // - result = - result && - mRSIHandler != INVALID_HANDLE; - } - - // - // If Result is False, Cleanup Resources ... - if (!result) - { - // - mInputs.Clean(); - - // - xccInputs.Clean(); - xpvInputs.Clean(); - xhkInputs.Clean(); - xmasInputs.Clean(); - xatrInputs.Clean(); - xstrInputs.Clean(); - xcheInputs.Clean(); - x3maInputs.Clean(); - xvwapInputs.Clean(); - - // - ZeroMemory(xccHelper); - ZeroMemory(xpvHelper); - ZeroMemory(xhkHelper); - ZeroMemory(xmasHelper); - ZeroMemory(xatrHelper); - ZeroMemory(xstrHelper); - ZeroMemory(xcheHelper); - ZeroMemory(x3maHelper); - ZeroMemory(xvwapHelper); - - // - return result; - } - - // - return result; - } - - // - // Conditions Readers ... - - // - // XPV ... - bool GetPVConditions( - X121XPVConditions &conditions, // - int barIndex = 0, // - int loopback = 5 // - ) - { - // - bool result = false; - - // - result = xpvHelper.GetConditions( - conditions, - barIndex, - loopback // - ); - - // - return result; - } - - // - // XHK ... - bool GetHKConditions( - X121XHKConditions &conditions, // - int barIndex = 0, // - int loopback = 5 // - ) - { - // - bool result = false; - - // - result = xhkHelper.GetConditions( - conditions, - barIndex, - loopback // - ); - - // - return result; - } - - // - // XMAS ... - bool GetMASConditions( - X121XMASConditions &conditions, // - int barIndex = 0, // - int loopback = 5 // - ) - { - // - bool result = false; - - // - result = xmasHelper.GetConditions( - conditions, - barIndex, - loopback // - ); - - // - return result; - } - - // - // XATR ... - bool GetATRConditions( - X121XATRConditions &conditions, // - int barIndex = 0, // - int loopback = 5 // - ) - { - // - bool result = false; - - // - result = xatrHelper.GetConditions( - conditions, - barIndex, - loopback // - ); - - // - return result; - } - - // - // XSTR ... - bool GetSTRConditions( - X121XSTRConditions &conditions, // - int barIndex = 0, // - int loopback = 5 // - ) - { - // - bool result = false; - - // - result = xstrHelper.GetConditions( - conditions, - barIndex, - loopback // - ); - - // - return result; - } - - // - // XCHE ... - bool GetCHEConditions( - X121XCHEConditions &conditions, // - int barIndex = 0, // - int loopback = 5 // - ) - { - // - bool result = false; - - // - result = xcheHelper.GetConditions( - conditions, - barIndex, - loopback // - ); - - // - return result; - } - - // - // X3MA ... - bool Get3MAConditions( - X121X3MAConditions &conditions, // - int barIndex = 0, // - int loopback = 5 // - ) - { - // - bool result = false; - - // - result = x3maHelper.GetConditions( - conditions, - barIndex, - loopback // - ); - - // - return result; - } - - // - // XVWAP ... - bool GetVWAPConditions( - X121XVWAPConditions &conditions, // - int barIndex = 0, // - int loopback = 5 // - ) - { - // - bool result = false; - - // - result = xvwapHelper.GetConditions( - conditions, - barIndex, - loopback // - ); - - // - return result; - } - - // - void Free() - { - // - xpvHelper.Free(); - xhkHelper.Free(); - xmasHelper.Free(); - xatrHelper.Free(); - xstrHelper.Free(); - xcheHelper.Free(); - xvwapHelper.Free(); - - // - // xichHelper.Free(); - // xdonHelper.Free(); - // xdeltaHelper.Free(); - // xvolumeHelper.Free(); - } - - // - bool GetConditions( - X121Conditions &conditions, // - int barIndex = 0, // - int loopback = 5 // - ) - { - // - bool result = true; - - // - if (loopback < 5) - { - loopback = 5; - } - - // - conditions.Clean(); - - // - conditions.symbol = mSymbol; - conditions.period = mPeriod; - conditions.time = TimeCurrent(); - - // - int zIndex = barIndex; - int cIndex = zIndex + 1; - int pIndex = cIndex + 1; - int ppIndex = pIndex + 1; - - // - XOHCL zBar; - XOHCL cBar; - XOHCL pBar; - - // - X121XPVConditions xpvConditions; - X121XHKConditions xhkConditions; - X121XMASConditions xmasConditions; - X121XATRConditions xatrConditions; - X121XSTRConditions xstrConditions; - X121XCHEConditions xcheConditions; - X121X3MAConditions x3maConditions; - X121XVWAPConditions xvwapConditions; - - // - result = zBar.Init( - mSymbol, - mPeriod, - zIndex // - ); - result = - result && - zBar.GetPreviousBar(cBar); - result = - result && - cBar.GetPreviousBar(pBar); - - // - // Conditions Retriever ... - - // - // XPV ... - result = - result && - GetPVConditions( - xpvConditions, - barIndex, - loopback // - ); - - // - // XHK ... - result = - result && - GetHKConditions( - xhkConditions, - barIndex, - loopback // - ); - - // - // XMAS ... - result = - result && - GetMASConditions( - xmasConditions, - barIndex, - loopback // - ); - - // - // XATR ... - result = - result && - GetATRConditions( - xatrConditions, - barIndex, - loopback // - ); - - // - // XSTR ... - result = - result && - GetSTRConditions( - xstrConditions, - barIndex, - loopback // - ); - - // - // XCHE ... - result = - result && - GetCHEConditions( - xcheConditions, - barIndex, - loopback // - ); - - // - // X3MA ... - result = - result && - Get3MAConditions( - x3maConditions, - barIndex, - loopback // - ); - - // - // XVWAP ... - result = - result && - GetVWAPConditions( - xvwapConditions, - barIndex, - loopback // - ); - - // - // Check Result ... - if (!result) - { - // - zBar.Clean(); - cBar.Clean(); - pBar.Clean(); - - // - xpvConditions.Clean(); - xhkConditions.Clean(); - xmasConditions.Clean(); - xatrConditions.Clean(); - xstrConditions.Clean(); - xcheConditions.Clean(); - x3maConditions.Clean(); - xvwapConditions.Clean(); - - // - return result; - } - - // - // Fill X121 Conditions Reference by Using - // Retrieved Conditions ... - - // - int cIDX = 1; - int pIDX = cIDX + 1; - - // - // Conditions ... - - // - // XCC ... - - // - // Buffers ... - - // - // Conditions ... - - // - // XPV ... - - // - // Buffers ... - - // - Copy( - xpvConditions.sarBuffer, - conditions.sarBuffer // - ); - - // - Copy( - xpvConditions.cHHBuffer, - conditions.cHHBuffer // - ); - - // - Copy( - xpvConditions.cLLBuffer, - conditions.cLLBuffer // - ); - - // - Copy( - xpvConditions.sHHBuffer, - conditions.sHHBuffer // - ); - - // - Copy( - xpvConditions.sLLBuffer, - conditions.sLLBuffer // - ); - - // - Copy( - xpvConditions.mHHBuffer, - conditions.mHHBuffer // - ); - - // - Copy( - xpvConditions.mLLBuffer, - conditions.mLLBuffer // - ); - - // - Copy( - xpvConditions.lHHBuffer, - conditions.lHHBuffer // - ); - - // - Copy( - xpvConditions.lLLBuffer, - conditions.lLLBuffer // - ); - - // - Copy( - xpvConditions.hHHBuffer, - conditions.hHHBuffer // - ); - - // - Copy( - xpvConditions.hLLBuffer, - conditions.hLLBuffer // - ); - - // - Copy( - xpvConditions.peaksBuffer, - conditions.peaksBuffer // - ); - - // - Copy( - xpvConditions.valesBuffer, - conditions.valesBuffer // - ); - - // - Copy( - xpvConditions.supportsBuffer, - conditions.supportsBuffer // - ); - - // - Copy( - xpvConditions.peaksGoldenBuffer, - conditions.peaksGoldenBuffer // - ); - - // - Copy( - xpvConditions.valesGoldenBuffer, - conditions.valesGoldenBuffer // - ); - - // - Copy( - xpvConditions.resistancesBuffer, - conditions.resistancesBuffer // - ); - - // - Copy( - xpvConditions.fractalsUpperBuffer, - conditions.fractalsUpperBuffer // - ); - - // - Copy( - xpvConditions.fractalsLowerBuffer, - conditions.fractalsLowerBuffer // - ); - - // - // Conditions ... - - // - conditions.isNewPeak = xpvConditions.isNewPeak; - conditions.isNewVale = xpvConditions.isNewVale; - conditions.isSarBullish = xpvConditions.isSarBullish; - conditions.isSarBearish = xpvConditions.isSarBearish; - conditions.isNewPeakOverLast = xpvConditions.isNewPeakOverLast; - conditions.isNewValeOverLast = xpvConditions.isNewValeOverLast; - conditions.isNewPeakUnderLast = xpvConditions.isNewPeakUnderLast; - conditions.isNewValeUnderLast = xpvConditions.isNewValeUnderLast; - conditions.isSarSwitchedToBullish = xpvConditions.isSarSwitchedToBullish; - conditions.isSarSwitchedToBearish = xpvConditions.isSarSwitchedToBearish; - - // - // XHK ... - - // - // Buffers ... - - // - Copy( - xhkConditions.xhkSMLowBuffer, - conditions.xhkSMLowBuffer // - ); - - // - Copy( - xhkConditions.xhkRawLowBuffer, - conditions.xhkRawLowBuffer // - ); - - // - Copy( - xhkConditions.xhkSMOpenBuffer, - conditions.xhkSMOpenBuffer // - ); - - // - Copy( - xhkConditions.xhkSMHighBuffer, - conditions.xhkSMHighBuffer // - ); - - // - Copy( - xhkConditions.xhkRawOpenBuffer, - conditions.xhkRawOpenBuffer // - ); - - // - Copy( - xhkConditions.xhkRawHighBuffer, - conditions.xhkRawHighBuffer // - ); - - // - Copy( - xhkConditions.xhkSMCloseBuffer, - conditions.xhkSMCloseBuffer // - ); - - // - Copy( - xhkConditions.xhkRawCloseBuffer, - conditions.xhkRawCloseBuffer // - ); - - // - // Conditions ... - - // - conditions.isSMHKBullish = xhkConditions.isSMHKBullish; - conditions.isSMHKBearish = xhkConditions.isSMHKBearish; - conditions.isRawHKBullish = xhkConditions.isRawHKBullish; - conditions.isRawHKBearish = xhkConditions.isRawHKBearish; - conditions.isClosedOverSMHK = xhkConditions.isClosedOverSMHK; - conditions.isClosedUnderSMHK = xhkConditions.isClosedUnderSMHK; - conditions.isClosedOverRawHK = xhkConditions.isClosedOverRawHK; - conditions.isClosedUnderRawHK = xhkConditions.isClosedUnderRawHK; - conditions.isRawHKClosedOverSMHK = xhkConditions.isRawHKClosedOverSMHK; - conditions.isRawHKClosedUnderSMHK = xhkConditions.isRawHKClosedUnderSMHK; - conditions.isSMHKSwitchedToBearish = xhkConditions.isSMHKSwitchedToBearish; - conditions.isSMHKSwitchedToBullish = xhkConditions.isSMHKSwitchedToBullish; - conditions.isRawHKSwitchedToBullish = xhkConditions.isRawHKSwitchedToBullish; - conditions.isRawHKSwitchedToBearish = xhkConditions.isRawHKSwitchedToBearish; - - // - // XMAS ... - - // - // Buffers ... - - // - Copy( - xmasConditions.midBuffer, - conditions.midBuffer // - ); - - // - Copy( - xmasConditions.upperBuffer, - conditions.upperBuffer // - ); - - // - Copy( - xmasConditions.lowerBuffer, - conditions.lowerBuffer // - ); - - // - // Conditions ... - - // - // XATR ... - - // - // Buffers ... - - // - Copy( - xatrConditions.rsiBuffer, - conditions.rsiBuffer // - ); - - // - Copy( - xatrConditions.atrBuffer, - conditions.atrBuffer // - ); - - // - Copy( - xatrConditions.atrUpperBuffer, - conditions.atrUpperBuffer // - ); - - // - Copy( - xatrConditions.atrLowerBuffer, - conditions.atrLowerBuffer // - ); - - // - Copy( - xatrConditions.rsiChangeBuffer, - conditions.rsiChangeBuffer // - ); - - // - Copy( - xatrConditions.atrUpperSMBuffer, - conditions.atrUpperSMBuffer // - ); - - // - Copy( - xatrConditions.atrLowerSMBuffer, - conditions.atrLowerSMBuffer // - ); - - // - Copy( - xatrConditions.rsiChangeSMBuffer, - conditions.rsiChangeSMBuffer // - ); - - // - Copy( - xatrConditions.priceChangeBuffer, - conditions.priceChangeBuffer // - ); - - // - Copy( - xatrConditions.priceChangeSMBuffer, - conditions.priceChangeSMBuffer // - ); - - // - // Conditions ... - - // - conditions.isRsiInRange = xatrConditions.isRsiInRange; - conditions.isRsiOverSold = xatrConditions.isRsiOverSold; - conditions.isRsiOverRsiSM = xatrConditions.isRsiOverRsiSM; - conditions.isRsiUnderRsiSM = xatrConditions.isRsiUnderRsiSM; - conditions.isRsiOverBought = xatrConditions.isRsiOverBought; - conditions.isRsiCrossedOverRsiSM = xatrConditions.isRsiCrossedOverRsiSM; - conditions.isRsiCrossedUnderRsiSM = xatrConditions.isRsiCrossedUnderRsiSM; - conditions.isPriceChangeSMOverRsi = xatrConditions.isPriceChangeSMOverRsi; - conditions.isRsiSMOverPriceChange = xatrConditions.isRsiSMOverPriceChange; - conditions.isRsiSMUnderPriceChange = xatrConditions.isRsiSMUnderPriceChange; - conditions.isPriceChangeSMUnderRsi = xatrConditions.isPriceChangeSMUnderRsi; - conditions.isRsiCrossedOverOverSold = xatrConditions.isRsiCrossedOverOverSold; - conditions.isRsiCrossedUnderOverSold = xatrConditions.isRsiCrossedUnderOverSold; - conditions.isRsiCrossedOverOverBought = xatrConditions.isRsiCrossedOverOverBought; - conditions.isRsiCrossedUnderOverBought = xatrConditions.isRsiCrossedUnderOverBought; - conditions.isRsiSMCrossedOverPriceChange = xatrConditions.isRsiSMCrossedOverPriceChange; - conditions.isPriceChangeSMCrossedOverRsi = xatrConditions.isPriceChangeSMCrossedOverRsi; - conditions.isRsiSMCrossedUnderPriceChange = xatrConditions.isRsiSMCrossedUnderPriceChange; - conditions.isPriceChangeSMCrossedUnderRsi = xatrConditions.isPriceChangeSMCrossedUnderRsi; - conditions.isPriceChangeOverPriceChangeSM = xatrConditions.isPriceChangeOverPriceChangeSM; - conditions.isPriceChangeUnderPriceChangeSM = xatrConditions.isPriceChangeUnderPriceChangeSM; - conditions.isPriceChangeCrossedOverPriceChangeSM = xatrConditions.isPriceChangeCrossedOverPriceChangeSM; - conditions.isPriceChangeCrossedUnderPriceChangeSM = xatrConditions.isPriceChangeCrossedUnderPriceChangeSM; - - // - // XSTR ... - - // - // Buffers ... - - // - Copy( - xstrConditions.vidyaBuffer, - conditions.vidyaBuffer // - ); - - // - Copy( - xstrConditions.strBuffer, - conditions.strBuffer // - ); - - // - Copy( - xstrConditions.strUpBuffer, - conditions.strUpBuffer // - ); - - // - Copy( - xstrConditions.strDownBuffer, - conditions.strDownBuffer // - ); - - // - Copy( - xstrConditions.strPriceBuffer, - conditions.strPriceBuffer // - ); - - // - Copy( - xstrConditions.strStateBuffer, - conditions.strStateBuffer // - ); - - // - Copy( - xstrConditions.strSMLowBuffer, - conditions.strSMLowBuffer // - ); - - // - Copy( - xstrConditions.strSMHighBuffer, - conditions.strSMHighBuffer // - ); - - // - // Conditions ... - - // - conditions.isStrBullish = xstrConditions.isStrBullish; - conditions.isStrBearish = xstrConditions.isStrBearish; - conditions.isStrSwitchedToBullish = xstrConditions.isStrSwitchedToBullish; - conditions.isStrSwitchedToBearish = xstrConditions.isStrSwitchedToBearish; - - // - // XCHE ... - - // - // Buffers ... - - // - Copy( - xcheConditions.le1Buffer, - conditions.le1Buffer // - ); - - // - Copy( - xcheConditions.se1Buffer, - conditions.se1Buffer // - ); - - // - Copy( - xcheConditions.le2Buffer, - conditions.le2Buffer // - ); - - // - Copy( - xcheConditions.se2Buffer, - conditions.se2Buffer // - ); - - // - Copy( - xcheConditions.le1StartBuffer, - conditions.le1StartBuffer // - ); - - // - Copy( - xcheConditions.se1StartBuffer, - conditions.se1StartBuffer // - ); - - // - Copy( - xcheConditions.le2StartBuffer, - conditions.le2StartBuffer // - ); - - // - Copy( - xcheConditions.se2StartBuffer, - conditions.se2StartBuffer // - ); - - // - // Conditions ... - - // - conditions.isCheBullish = xcheConditions.isCheBullish; - conditions.isCheBearish = xcheConditions.isCheBearish; - conditions.isChe1Bullish = xcheConditions.isChe1Bullish; - conditions.isChe1Bearish = xcheConditions.isChe1Bearish; - conditions.isChe2Bullish = xcheConditions.isChe2Bullish; - conditions.isChe2Bearish = xcheConditions.isChe2Bearish; - conditions.isCheSwitchedToBullish = xcheConditions.isCheSwitchedToBullish; - conditions.isCheSwitchedToBearish = xcheConditions.isCheSwitchedToBearish; - conditions.isChe1SwitchedToBullish = xcheConditions.isChe1SwitchedToBullish; - conditions.isChe1SwitchedToBearish = xcheConditions.isChe1SwitchedToBearish; - conditions.isChe2SwitchedToBullish = xcheConditions.isChe2SwitchedToBullish; - conditions.isChe2SwitchedToBearish = xcheConditions.isChe2SwitchedToBearish; - - // - // X3MA ... - - // - // Buffers ... - - // - Copy( - x3maConditions.x3maMidBuffer, - conditions.x3maMidBuffer // - ); - - // - Copy( - x3maConditions.x3maFastBuffer, - conditions.x3maFastBuffer // - ); - - // - Copy( - x3maConditions.x3maSlowBuffer, - conditions.x3maSlowBuffer // - ); - - // - Copy( - x3maConditions.x3maMidStateBuffer, - conditions.x3maMidStateBuffer // - ); - - // - Copy( - x3maConditions.x3maFastStateBuffer, - conditions.x3maFastStateBuffer // - ); - - // - Copy( - x3maConditions.x3maSlowStateBuffer, - conditions.x3maSlowStateBuffer // - ); - - // - // Conditions ... - - // - conditions.isX3MaMidBullish = x3maConditions.isX3MaMidBullish; - conditions.isX3MaMidBearish = x3maConditions.isX3MaMidBearish; - conditions.isX3MaFastBullish = x3maConditions.isX3MaFastBullish; - conditions.isX3MaFastBearish = x3maConditions.isX3MaFastBearish; - conditions.isX3MaMidNeutural = x3maConditions.isX3MaMidNeutural; - conditions.isX3MaSlowBullish = x3maConditions.isX3MaSlowBullish; - conditions.isX3MaSlowBearish = x3maConditions.isX3MaSlowBearish; - conditions.isX3MaFastOverMid = x3maConditions.isX3MaFastOverMid; - conditions.isX3MaMidOverSlow = x3maConditions.isX3MaMidOverSlow; - conditions.isX3MaFastNeutural = x3maConditions.isX3MaFastNeutural; - conditions.isX3MaSlowNeutural = x3maConditions.isX3MaSlowNeutural; - conditions.isX3MaFastUnderMid = x3maConditions.isX3MaFastUnderMid; - conditions.isX3MaMidUnderSlow = x3maConditions.isX3MaMidUnderSlow; - conditions.isX3MaBullishState = x3maConditions.isX3MaBullishState; - conditions.isX3MaBearishState = x3maConditions.isX3MaBearishState; - conditions.isX3MaNeuturalState = x3maConditions.isX3MaNeuturalState; - conditions.isX3MaBullishOrdered = x3maConditions.isX3MaBullishOrdered; - conditions.isX3MaBearishOrdered = x3maConditions.isX3MaBearishOrdered; - conditions.isX3MaSwitchedToBullishState = x3maConditions.isX3MaSwitchedToBullishState; - conditions.isX3MaSwitchedToBearishState = x3maConditions.isX3MaSwitchedToBearishState; - conditions.isX3MaSwitchedToNeuturalState = x3maConditions.isX3MaSwitchedToNeuturalState; - conditions.isX3MaSwitchedToBullishOrdered = x3maConditions.isX3MaSwitchedToBullishOrdered; - conditions.isX3MaSwitchedToBearishOrdered = x3maConditions.isX3MaSwitchedToBearishOrdered; - - // - // XVWAP ... - - // - // Buffers ... - - // - Copy( - xvwapConditions.vwapMidBuffer, - conditions.vwapMidBuffer // - ); - - // - Copy( - xvwapConditions.vwapFastBuffer, - conditions.vwapFastBuffer // - ); - - // - Copy( - xvwapConditions.vwapSlowBuffer, - conditions.vwapSlowBuffer // - ); - - // - Copy( - xvwapConditions.vwapPriceBuffer, - conditions.vwapPriceBuffer // - ); - - // - Copy( - xvwapConditions.vwapVolumeBuffer, - conditions.vwapVolumeBuffer // - ); - - // - Copy( - xvwapConditions.vwapMidStateBuffer, - conditions.vwapMidStateBuffer // - ); - - // - Copy( - xvwapConditions.vwapFastStateBuffer, - conditions.vwapFastStateBuffer // - ); - - // - Copy( - xvwapConditions.vwapSlowStateBuffer, - conditions.vwapSlowStateBuffer // - ); - - // - // Conditions ... - - // - conditions.isVWapMidBullish = xvwapConditions.isVWapMidBullish; - conditions.isVWapMidBearish = xvwapConditions.isVWapMidBearish; - conditions.isVWapMidNeutural = xvwapConditions.isVWapMidNeutural; - conditions.isVWapFastBullish = xvwapConditions.isVWapFastBullish; - conditions.isVWapFastBearish = xvwapConditions.isVWapFastBearish; - conditions.isVWapSlowBullish = xvwapConditions.isVWapSlowBullish; - conditions.isVWapSlowBearish = xvwapConditions.isVWapSlowBearish; - conditions.isVWapFastOverMid = xvwapConditions.isVWapFastOverMid; - conditions.isVWapMidOverSlow = xvwapConditions.isVWapMidOverSlow; - conditions.isVWapFastNeutural = xvwapConditions.isVWapFastNeutural; - conditions.isVWapSlowNeutural = xvwapConditions.isVWapSlowNeutural; - conditions.isVWapFastUnderMid = xvwapConditions.isVWapFastUnderMid; - conditions.isVWapMidUnderSlow = xvwapConditions.isVWapMidUnderSlow; - conditions.isVWapBullishState = xvwapConditions.isVWapBullishState; - conditions.isVWapBearishState = xvwapConditions.isVWapBearishState; - conditions.isVWapNeuturalState = xvwapConditions.isVWapNeuturalState; - conditions.isVWapBullishOrdered = xvwapConditions.isVWapBullishOrdered; - conditions.isVWapBearishOrdered = xvwapConditions.isVWapBearishOrdered; - conditions.isVWapSwitchedToBullishState = xvwapConditions.isVWapSwitchedToBullishState; - conditions.isVWapSwitchedToBearishState = xvwapConditions.isVWapSwitchedToBearishState; - conditions.isVWapSwitchedToNeuturalState = xvwapConditions.isVWapSwitchedToNeuturalState; - conditions.isVWapSwitchedToBullishOrdered = xvwapConditions.isVWapSwitchedToBullishOrdered; - conditions.isVWapSwitchedToBearishOrdered = xvwapConditions.isVWapSwitchedToBearishOrdered; - - // - // Cleanup Resource ... - - // - zBar.Clean(); - cBar.Clean(); - pBar.Clean(); - - // - xpvConditions.Clean(); - xhkConditions.Clean(); - xmasConditions.Clean(); - xatrConditions.Clean(); - xstrConditions.Clean(); - xcheConditions.Clean(); - x3maConditions.Clean(); - xvwapConditions.Clean(); - - // - Free(); - - // - return result; - } - - // - protected: - // - - // - private: - // - - // - string mSymbol; // Trading Symbol - ENUM_TIMEFRAMES mPeriod; // Trading Period - - // - // Inputs ... - X121Inputs mInputs; - X121XCCInputs xccInputs; - X121XPVInputs xpvInputs; - X121XHKInputs xhkInputs; - X121XMASInputs xmasInputs; - X121XATRInputs xatrInputs; - X121XSTRInputs xstrInputs; - X121XCHEInputs xcheInputs; - X121X3MAInputs x3maInputs; - X121XVWAPInputs xvwapInputs; - - // - // X121XICHInputs xichInputs; - // X121XDONInputs xdonInputs; - // X121XDELTAInputs xdeltaInputs; - // X121XVOLUMEInputs xvolumeInputs; - - // - int mRSIHandler; -}; - -// diff --git a/Helpers/x-saherelm.x121.x3ma.helper.mq5 b/Helpers/x-saherelm.x121.x3ma.helper.mq5 deleted file mode 100644 index 2c5a2693..00000000 --- a/Helpers/x-saherelm.x121.x3ma.helper.mq5 +++ /dev/null @@ -1,1439 +0,0 @@ -/////////////////////////////////////////////////////// -// -// SaherElm IT Center MQL5 Helper Class Library -// ---------------------------------------------- -// Name: XCX121X3MAHelper -// Description: provides all Indicator -// Helper requirements ... -// -// -// Maintainer: -// ------------ -// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) -// -////////////////////////////////////////////////////// -// -// Global Properties ... -#property library -#property copyright "Copyright 2023, SaherElm IT Center" -#property link "https://www.saherelm.ir" -#property version "1.00" -#property strict - -// -// Imports ... -#include "../Classes/x-saherelm.x-helper.class.mq5" - -// -// Definitions ... - -// -// Definitions ... -enum ENUM_X121_X3MA_BUFFERS -{ - // - X121_X3MA_FAST_LINE = 0, - X121_X3MA_FAST_STATE_LINE = 6, - X121_X3MA_MID_LINE = 2, - X121_X3MA_MID_STATE_LINE = 7, - X121_X3MA_SLOW_LINE = 4, - X121_X3MA_SLOW_STATE_LINE = 8, -}; - -// -enum ENUM_X3MA_STATES -{ - X3MA_STATE_BULLISH = 1, - X3MA_STATE_BEARISH = 2, - X3MA_STATE_NEUTURAL = 3, -}; - -// -// Input Models ... -struct X121X3MAInputs -{ - // - // Props ... - int x3maFastMALength; // Fast MA Length - int x3maMidMALength; // Mid MA Length - int x3maSlowMALength; // Slow MA Length - ENUM_MA_METHOD x3maMaMethod; // MA Method - ENUM_APPLIED_PRICE x3maMaAppliedTo; // Applied To - - // - int startCalculationForLastBars; // Calculate Last n Bars - - // - bool showX3MaFast; // Show X3Ma Fast - bool showX3MaMid; // Show X3Ma Medium - bool showX3MaSlow; // Show X3Ma Slow - - // - // Constructor(s) ... - X121X3MAInputs() - { - Clean(); - } - - // - // Tools ... - - // - // Clean ... - void Clean() - { - // - x3maFastMALength = 0; - x3maMidMALength = 0; - x3maSlowMALength = 0; - x3maMaMethod = MODE_EMA; - x3maMaAppliedTo = PRICE_CLOSE; - startCalculationForLastBars = 0; - showX3MaFast = false; - showX3MaMid = false; - showX3MaSlow = false; - - // - ZeroMemory(this); - } - - // - // Default ... - void Default() - { - // - x3maFastMALength = 20; - x3maMidMALength = 50; - x3maSlowMALength = 200; - x3maMaMethod = MODE_EMA; - x3maMaAppliedTo = PRICE_CLOSE; - startCalculationForLastBars = 1000; - showX3MaFast = true; - showX3MaMid = true; - showX3MaSlow = true; - } - - // - // Validate ... - bool IsValid() - { - // - bool result = false; - - // - result = - // - x3maFastMALength > 2 && - x3maMidMALength > x3maFastMALength && - x3maSlowMALength > x3maMidMALength - // - ; - - // - return result; - } - - // - // Retrieve MAx Length ... - int Max() - { - // - int result = 0; - - // - result = MathMax(x3maFastMALength, x3maMidMALength); - result = MathMax(result, x3maSlowMALength); - - // - return result; - } -}; - -// -// Conditions ... -struct X121X3MAConditions -{ - // - // Common ... - string symbol; - ENUM_TIMEFRAMES period; - datetime time; - - // - // Buffers ... - double x3maFastBuffer[]; - double x3maMidBuffer[]; - double x3maSlowBuffer[]; - double x3maFastStateBuffer[]; - double x3maMidStateBuffer[]; - double x3maSlowStateBuffer[]; - - // - // Conditions ... - - // - bool isX3MaFastBullish; - bool isX3MaFastBearish; - bool isX3MaFastNeutural; - - // - bool isX3MaMidBullish; - bool isX3MaMidBearish; - bool isX3MaMidNeutural; - - // - bool isX3MaSlowBullish; - bool isX3MaSlowBearish; - bool isX3MaSlowNeutural; - - // - bool isX3MaFastOverMid; - bool isX3MaMidOverSlow; - - // - bool isX3MaFastUnderMid; - bool isX3MaMidUnderSlow; - - // - bool isX3MaBullishState; - bool isX3MaBearishState; - bool isX3MaNeuturalState; - - // - bool isX3MaBullishOrdered; - bool isX3MaBearishOrdered; - - // - bool isX3MaSwitchedToBullishOrdered; - bool isX3MaSwitchedToBearishOrdered; - - // - bool isX3MaSwitchedToBullishState; - bool isX3MaSwitchedToBearishState; - bool isX3MaSwitchedToNeuturalState; - - // - // Constructor ... - X121X3MAConditions() - { - Clean(); - } - - // - // Tools ... - - /** - * Cleaning Up ... - */ - void Clean() - { - // - // Commons ... - symbol = NULL; - period = NULL; - time = NULL; - - // - // Buffers ... - - // - Clean(x3maFastBuffer); - Clean(x3maMidBuffer); - Clean(x3maSlowBuffer); - Clean(x3maFastStateBuffer); - Clean(x3maMidStateBuffer); - Clean(x3maSlowStateBuffer); - - // - ArraySetAsSeries(x3maFastBuffer, true); - ArraySetAsSeries(x3maMidBuffer, true); - ArraySetAsSeries(x3maSlowBuffer, true); - ArraySetAsSeries(x3maFastStateBuffer, true); - ArraySetAsSeries(x3maMidStateBuffer, true); - ArraySetAsSeries(x3maSlowStateBuffer, true); - - // - // Conditions ... - - // - isX3MaFastBullish = false; - isX3MaFastBearish = false; - isX3MaFastNeutural = false; - - // - isX3MaMidBullish = false; - isX3MaMidBearish = false; - isX3MaMidNeutural = false; - - // - isX3MaSlowBullish = false; - isX3MaSlowBearish = false; - isX3MaSlowNeutural = false; - - // - isX3MaFastOverMid = false; - isX3MaMidOverSlow = false; - - // - isX3MaFastUnderMid = false; - isX3MaMidUnderSlow = false; - - // - isX3MaBullishState = false; - isX3MaBearishState = false; - isX3MaNeuturalState = false; - - // - isX3MaBullishOrdered = false; - isX3MaBearishOrdered = false; - - // - isX3MaSwitchedToBullishOrdered = false; - isX3MaSwitchedToBearishOrdered = false; - - // - isX3MaSwitchedToBullishState = false; - isX3MaSwitchedToBearishState = false; - isX3MaSwitchedToNeuturalState = false; - - // - ZeroMemory(this); - } - - /** - * Generate Conditions Scores ... - * - * @param bullishScore: Double, Directional Scores Reference ... - * @param bearishScore: Double, Directional Scores Reference ... - */ - void GenerateScore( - double &bullishScore, - double &bearishScore // - ) - { - // - bullishScore = 0; - bearishScore = 0; - - // - double score = 1; - double minScore = 0.5; - double highScore = 1.5; - - // - // X3MA ... - - // - if (isX3MaBullishState) - { - bullishScore += score; - } - if (isX3MaBullishOrdered) - { - bullishScore += score; - } - if (isX3MaSwitchedToBullishState) - { - bullishScore += highScore; - } - if (isX3MaSwitchedToBullishOrdered) - { - bullishScore += highScore; - } - if (!isX3MaBullishState && - !isX3MaSwitchedToBullishState) - { - // - if (isX3MaFastBullish) - { - bullishScore += minScore; - } - if (isX3MaSlowBullish) - { - bullishScore += minScore; - } - } - if (!isX3MaBullishOrdered && - !isX3MaSwitchedToBullishOrdered) - { - // - if (isX3MaFastOverMid) - { - bullishScore += minScore; - } - if (isX3MaMidOverSlow) - { - bullishScore += minScore; - } - } - - // - if (isX3MaBearishState) - { - bearishScore += score; - } - if (isX3MaBearishOrdered) - { - bearishScore += score; - } - if (isX3MaSwitchedToBearishState) - { - bearishScore += highScore; - } - if (isX3MaSwitchedToBearishOrdered) - { - bearishScore += highScore; - } - if (!isX3MaBearishState && - !isX3MaSwitchedToBearishState) - { - // - if (isX3MaFastBearish) - { - bearishScore += minScore; - } - if (isX3MaSlowBearish) - { - bearishScore += minScore; - } - } - if (!isX3MaBearishOrdered && - !isX3MaSwitchedToBearishOrdered) - { - // - if (isX3MaFastUnderMid) - { - bearishScore += minScore; - } - if (isX3MaMidUnderSlow) - { - bearishScore += minScore; - } - } - } - - /** - * Generate Summary String for Represent Conditions State ... - * - * @param onlyCommons: Boolean, Just Generate Only Commons Conditions ... - * @param onlyConditions: Boolean, Just Generate Only Conditions ... - * @param includeScores: Boolean, Attach Scores Representations on Result ... - * @param ignoreFalseConditions: Boolean, Ignore False Conditions on Result ... - * @param separator: String, Separate Lines ... - * - * @return ( string ) - */ - string GenerateSummary( - bool onlyCommons = false, - bool onlyConditions = false, - bool includeScores = true, - bool ignoreFalseConditions = true, - string separator = "\n" // - ) - { - // - string result = NULL; - - // - double bullishScore = 0; - double bearishScore = 0; - GenerateScore( - bullishScore, - bearishScore // - ); - - // - string scoresStr = - // - "Scores: " + separator + - "---------------" + separator + - "Bullish: " + ToString(bullishScore) + separator + - "Bearish: " + ToString(bearishScore) + separator + - "" - // - ; - - // - string commonStr = GenerateSpecifiedCommonSummary( - this, - separator, - includeScores // - ); - - // - string conditionsStr = - // - "-----------------------" + separator + - "X3MA: " + separator + - "-----------------------" + separator + - ToString("isX3MaFastBullish", isX3MaFastBullish, ignoreFalseConditions, separator) + - ToString("isX3MaFastBearish", isX3MaFastBearish, ignoreFalseConditions, separator) + - ToString("isX3MaFastNeutural", isX3MaFastNeutural, ignoreFalseConditions, separator) + - ToString("isX3MaMidBullish", isX3MaMidBullish, ignoreFalseConditions, separator) + - ToString("isX3MaMidBearish", isX3MaMidBearish, ignoreFalseConditions, separator) + - ToString("isX3MaMidNeutural", isX3MaMidNeutural, ignoreFalseConditions, separator) + - ToString("isX3MaSlowBullish", isX3MaSlowBullish, ignoreFalseConditions, separator) + - ToString("isX3MaSlowBearish", isX3MaSlowBearish, ignoreFalseConditions, separator) + - ToString("isX3MaSlowNeutural", isX3MaSlowNeutural, ignoreFalseConditions, separator) + - ToString("isX3MaFastOverMid", isX3MaFastOverMid, ignoreFalseConditions, separator) + - ToString("isX3MaMidOverSlow", isX3MaMidOverSlow, ignoreFalseConditions, separator) + - ToString("isX3MaFastUnderMid", isX3MaFastUnderMid, ignoreFalseConditions, separator) + - ToString("isX3MaMidUnderSlow", isX3MaMidUnderSlow, ignoreFalseConditions, separator) + - ToString("isX3MaBullishState", isX3MaBullishState, ignoreFalseConditions, separator) + - ToString("isX3MaBearishState", isX3MaBearishState, ignoreFalseConditions, separator) + - ToString("isX3MaNeuturalState", isX3MaNeuturalState, ignoreFalseConditions, separator) + - ToString("isX3MaBullishOrdered", isX3MaBullishOrdered, ignoreFalseConditions, separator) + - ToString("isX3MaBearishOrdered", isX3MaBearishOrdered, ignoreFalseConditions, separator) + - ToString("isX3MaSwitchedToBullishOrdered", isX3MaSwitchedToBullishOrdered, ignoreFalseConditions, separator) + - ToString("isX3MaSwitchedToBearishOrdered", isX3MaSwitchedToBearishOrdered, ignoreFalseConditions, separator) + - ToString("isX3MaSwitchedToBullishState", isX3MaSwitchedToBullishState, ignoreFalseConditions, separator) + - ToString("isX3MaSwitchedToBearishState", isX3MaSwitchedToBearishState, ignoreFalseConditions, separator) + - ToString("isX3MaSwitchedToNeuturalState", isX3MaSwitchedToNeuturalState, ignoreFalseConditions, separator) + - // - "" - // - ; - - // - result = - // - "[" + GetTag() + "]" + separator + - (onlyConditions - ? "" - : commonStr) + - (!includeScores - ? "" - : scoresStr) + - " " + separator + - (onlyCommons - ? "" - : conditionsStr) + - "" - // - ; - - // - return result; - } - - /** - * Retrieve nique Tag Identifier ... - * - * @return ( string ) - */ - string GetTag() - { - return GetTypeName(this); - } - - // -}; - -// -// Class ... -class XCX121X3MAHelper : public XCBaseHelper -{ - // - // Public ... - public: - // - // Props ... - - // - // Constructors ... - XCX121X3MAHelper() - : XCBaseHelper(_Symbol, _Period) - { - } - - // - // Deconstructor ... - ~XCX121X3MAHelper() - { - // - mInputs.Clean(); - - // - Clean(x3maFastBuffer); - Clean(x3maMidBuffer); - Clean(x3maSlowBuffer); - Clean(x3maFastStateBuffer); - Clean(x3maMidStateBuffer); - Clean(x3maSlowStateBuffer); - } - - // - // Tools ... - bool Init( - string symbol, // Trading Symbol - ENUM_TIMEFRAMES period, // Trading Period - X121X3MAInputs &inputs // Inputs - ) - { - // - bool result = false; - - // - mSymbol = symbol; - mPeriod = period; - - // - result = inputs.IsValid(); - if (!result) - { - return result; - } - - // - ArraySetAsSeries(x3maFastBuffer, true); - ArraySetAsSeries(x3maMidBuffer, true); - ArraySetAsSeries(x3maSlowBuffer, true); - ArraySetAsSeries(x3maFastStateBuffer, true); - ArraySetAsSeries(x3maMidStateBuffer, true); - ArraySetAsSeries(x3maSlowStateBuffer, true); - - // - mInputs = inputs; - - // - mHandler = iCustom( - mSymbol, - mPeriod, - "x-saherelm.x121.x3ma", - // - // Inputs ... - // - // Market ... - "", - mInputs.x3maFastMALength, - mInputs.x3maMidMALength, - mInputs.x3maSlowMALength, - mInputs.x3maMaMethod, - mInputs.x3maMaAppliedTo, - // - // Presentation ... - "", - // - mInputs.startCalculationForLastBars, - // - mInputs.showX3MaFast, - mInputs.showX3MaMid, - mInputs.showX3MaSlow - // - ); - result = mHandler != INVALID_HANDLE; - if (!result) - { - return result; - } - - // - return result; - } - - // - // Inputs ... - - // - X121X3MAInputs GetInputs() - { - return mInputs; - } - - // - bool SetInputs( - X121X3MAInputs &inputs // Configs - ) - { - // - return Init( - mSymbol, - mPeriod, - inputs - // - ); - } - - // - // Readers ... - - // - // FAST ... - - // - double GetX3MaFast( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(x3maFastBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return x3maFastBuffer[barIndex]; - } - - // - int CopyX3MaFast( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - x3maFastBuffer, - buffer, - forceClean - // - ); - } - - // - // STATE FAST ... - - // - double GetX3MaFastState( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(x3maFastStateBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return x3maFastStateBuffer[barIndex]; - } - - // - int CopyX3MaFastState( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - x3maFastStateBuffer, - buffer, - forceClean - // - ); - } - - // - // MID ... - - // - double GetX3MaMid( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(x3maMidBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return x3maMidBuffer[barIndex]; - } - - // - int CopyX3MaMid( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - x3maMidBuffer, - buffer, - forceClean - // - ); - } - - // - // STATE MID ... - - // - double GetX3MaMidState( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(x3maMidStateBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return x3maMidStateBuffer[barIndex]; - } - - // - int CopyX3MaMidState( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - x3maMidStateBuffer, - buffer, - forceClean - // - ); - } - - // - // SLOW ... - - // - double GetX3MaSlowBuffer( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(x3maSlowBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return x3maSlowBuffer[barIndex]; - } - - // - int CopyX3MaSlow( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - x3maSlowBuffer, - buffer, - forceClean - // - ); - } - - // - // STATE SLOW ... - - // - double GetX3MaSlowState( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(x3maSlowStateBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return x3maSlowStateBuffer[barIndex]; - } - - // - int CopyX3MaSlowState( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - x3maSlowStateBuffer, - buffer, - forceClean - // - ); - } - - // - // Converts to State ... - ENUM_X3MA_STATES ToX3MAState(double value) - { - // - ENUM_X3MA_STATES result = - value == 1 - ? X3MA_STATE_BULLISH - : value == 2 - ? X3MA_STATE_BEARISH - : X3MA_STATE_NEUTURAL; - - // - return result; - } - - // - bool IsX3MABullish(double value) - { - // - bool result = false; - - // - result = ToX3MAState(value) == X3MA_STATE_BULLISH; - - // - return result; - } - - // - bool IsX3MABearish(double value) - { - // - bool result = false; - - // - result = ToX3MAState(value) == X3MA_STATE_BEARISH; - - // - return result; - } - - // - bool IsX3MANeutural(double value) - { - // - bool result = false; - - // - result = ToX3MAState(value) == X3MA_STATE_NEUTURAL; - - // - return result; - } - - // - void Free() override - { - Cleanup(10); - } - - // - bool GetConditions( - X121X3MAConditions &conditions, // - int barIndex = 0, // - int loopback = 5 // - ) - { - // - bool result = true; - - // - if (loopback < 5) - { - loopback = 5; - } - - // - conditions.Clean(); - - // - conditions.symbol = mSymbol; - conditions.period = mPeriod; - conditions.time = TimeCurrent(); - - // - int zIndex = barIndex; - int cIndex = zIndex + 1; - int pIndex = cIndex + 1; - int ppIndex = pIndex + 1; - - // - XOHCL zBar; - result = zBar.Init( - mSymbol, - mPeriod, - zIndex // - ); - if (!result) - { - return result; - } - - // - XOHCL cBar; - result = cBar.Init( - mSymbol, - mPeriod, - cIndex // - ); - if (!result) - { - return result; - } - - // - XOHCL pBar; - result = pBar.Init( - mSymbol, - mPeriod, - pIndex // - ); - if (!result) - { - return result; - } - - // - // Buffers ... - - // - CopyX3MaFast( - zIndex, - loopback, - conditions.x3maFastBuffer // - ); - - // - CopyX3MaFastState( - zIndex, - loopback, - conditions.x3maFastStateBuffer // - ); - - // - CopyX3MaMid( - zIndex, - loopback, - conditions.x3maMidBuffer // - ); - - // - CopyX3MaMidState( - zIndex, - loopback, - conditions.x3maMidStateBuffer // - ); - - // - CopyX3MaSlow( - zIndex, - loopback, - conditions.x3maSlowBuffer // - ); - - // - CopyX3MaSlowState( - zIndex, - loopback, - conditions.x3maSlowStateBuffer // - ); - - // - // Conditions ... - - // - int cIDX = 1; - int pIDX = cIDX + 1; - - // - // SAR ... - - // - bool isX3MaFastBullish = IsX3MABullish(conditions.x3maFastStateBuffer[cIDX]); - bool isX3MaFastBullishPrev = IsX3MABullish(conditions.x3maFastStateBuffer[pIDX]); - - // - bool isX3MaFastBearish = IsX3MABearish(conditions.x3maFastStateBuffer[cIDX]); - bool isX3MaFastBearishPrev = IsX3MABearish(conditions.x3maFastStateBuffer[pIDX]); - - // - bool isX3MaFastNeutural = IsX3MANeutural(conditions.x3maFastStateBuffer[cIDX]); - bool isX3MaFastNeuturalPrev = IsX3MANeutural(conditions.x3maFastStateBuffer[pIDX]); - - // - bool isX3MaMidBullish = IsX3MABullish(conditions.x3maMidStateBuffer[cIDX]); - bool isX3MaMidBullishPrev = IsX3MABullish(conditions.x3maMidStateBuffer[pIDX]); - - // - bool isX3MaMidBearish = IsX3MABearish(conditions.x3maMidStateBuffer[cIDX]); - bool isX3MaMidBearishPrev = IsX3MABearish(conditions.x3maMidStateBuffer[pIDX]); - - // - bool isX3MaMidNeutural = IsX3MANeutural(conditions.x3maMidStateBuffer[cIDX]); - bool isX3MaMidNeuturalPrev = IsX3MANeutural(conditions.x3maMidStateBuffer[pIDX]); - - // - bool isX3MaSlowBullish = IsX3MABullish(conditions.x3maSlowStateBuffer[cIDX]); - bool isX3MaSlowBullishPrev = IsX3MABullish(conditions.x3maSlowStateBuffer[pIDX]); - - // - bool isX3MaSlowBearish = IsX3MABearish(conditions.x3maSlowStateBuffer[cIDX]); - bool isX3MaSlowBearishPrev = IsX3MABearish(conditions.x3maSlowStateBuffer[pIDX]); - - // - bool isX3MaSlowNeutural = IsX3MANeutural(conditions.x3maSlowStateBuffer[cIDX]); - bool isX3MaSlowNeuturalPrev = IsX3MANeutural(conditions.x3maSlowStateBuffer[pIDX]); - - // - bool isX3MaFastOverMid = conditions.x3maFastBuffer[cIDX] > conditions.x3maMidBuffer[cIDX]; - bool isX3MaFastOverMidPrev = conditions.x3maFastBuffer[pIDX] > conditions.x3maMidBuffer[pIDX]; - - // - bool isX3MaMidOverSlow = conditions.x3maMidBuffer[cIDX] > conditions.x3maSlowBuffer[cIDX]; - bool isX3MaMidOverSlowPrev = conditions.x3maMidBuffer[pIDX] > conditions.x3maSlowBuffer[pIDX]; - - // - bool isX3MaFastUnderMid = conditions.x3maFastBuffer[cIDX] < conditions.x3maMidBuffer[cIDX]; - bool isX3MaFastUnderMidPrev = conditions.x3maFastBuffer[pIDX] < conditions.x3maMidBuffer[pIDX]; - - // - bool isX3MaMidUnderSlow = conditions.x3maMidBuffer[cIDX] < conditions.x3maSlowBuffer[cIDX]; - bool isX3MaMidUnderSlowPrev = conditions.x3maMidBuffer[pIDX] < conditions.x3maSlowBuffer[pIDX]; - - // - bool isX3MaBullishState = isX3MaFastBullish && - isX3MaMidBullish && - isX3MaSlowBullish; - bool isX3MaBullishStatePrev = isX3MaFastBullishPrev && - isX3MaMidBullishPrev && - isX3MaSlowBullishPrev; - - // - bool isX3MaBearishState = isX3MaFastBearish && - isX3MaMidBearish && - isX3MaSlowBearish; - bool isX3MaBearishStatePrev = isX3MaFastBearishPrev && - isX3MaMidBearishPrev && - isX3MaSlowBearishPrev; - - // - bool isX3MaNeuturalState = isX3MaFastNeutural && - isX3MaMidNeutural && - isX3MaSlowNeutural; - bool isX3MaNeuturalStatePrev = isX3MaFastNeuturalPrev && - isX3MaMidNeuturalPrev && - isX3MaSlowNeuturalPrev; - - // - bool isX3MaBullishOrdered = isX3MaFastOverMid && - isX3MaMidOverSlow; - bool isX3MaBullishOrderedPrev = isX3MaFastOverMidPrev && - isX3MaMidOverSlowPrev; - - // - bool isX3MaBearishOrdered = isX3MaFastUnderMid && - isX3MaMidUnderSlow; - bool isX3MaBearishOrderedPrev = isX3MaFastUnderMidPrev && - isX3MaMidUnderSlowPrev; - - // - bool isX3MaSwitchedToBullishOrdered = isX3MaBullishOrdered && - !isX3MaBullishOrderedPrev; - bool isX3MaSwitchedToBearishOrdered = isX3MaBearishOrdered && - !isX3MaBearishOrderedPrev; - - // - bool isX3MaSwitchedToBullishState = isX3MaBullishState && - !isX3MaBullishStatePrev; - bool isX3MaSwitchedToBearishState = isX3MaBearishState && - !isX3MaBearishStatePrev; - bool isX3MaSwitchedToNeuturalState = isX3MaNeuturalState && - !isX3MaNeuturalStatePrev; - - // - conditions.isX3MaFastBullish = isX3MaFastBullish; - conditions.isX3MaFastBearish = isX3MaFastBearish; - conditions.isX3MaFastNeutural = isX3MaFastNeutural; - conditions.isX3MaMidBullish = isX3MaMidBullish; - conditions.isX3MaMidBearish = isX3MaMidBearish; - conditions.isX3MaMidNeutural = isX3MaMidNeutural; - conditions.isX3MaSlowBullish = isX3MaSlowBullish; - conditions.isX3MaSlowBearish = isX3MaSlowBearish; - conditions.isX3MaSlowNeutural = isX3MaSlowNeutural; - conditions.isX3MaFastOverMid = isX3MaFastOverMid; - conditions.isX3MaMidOverSlow = isX3MaMidOverSlow; - conditions.isX3MaFastUnderMid = isX3MaFastUnderMid; - conditions.isX3MaMidUnderSlow = isX3MaMidUnderSlow; - conditions.isX3MaBullishState = isX3MaBullishState; - conditions.isX3MaBearishState = isX3MaBearishState; - conditions.isX3MaNeuturalState = isX3MaNeuturalState; - conditions.isX3MaBullishOrdered = isX3MaBullishOrdered; - conditions.isX3MaBearishOrdered = isX3MaBearishOrdered; - conditions.isX3MaSwitchedToBullishOrdered = isX3MaSwitchedToBullishOrdered; - conditions.isX3MaSwitchedToBearishOrdered = isX3MaSwitchedToBearishOrdered; - conditions.isX3MaSwitchedToBullishState = isX3MaSwitchedToBullishState; - conditions.isX3MaSwitchedToBearishState = isX3MaSwitchedToBearishState; - conditions.isX3MaSwitchedToNeuturalState = isX3MaSwitchedToNeuturalState; - - // - Cleanup(); - - // - zBar.Clean(); - cBar.Clean(); - pBar.Clean(); - - // - return result; - } - - // - // Protected ... - protected: - // - // Private ... - private: - // - // Props ... - X121X3MAInputs mInputs; // Inputs ... - - // - // Buffers ... - double x3maFastBuffer[]; - double x3maMidBuffer[]; - double x3maSlowBuffer[]; - double x3maFastStateBuffer[]; - double x3maMidStateBuffer[]; - double x3maSlowStateBuffer[]; - - // - void Calculate( - int barIndex = 0, - int maxRequiredBars = 100 // - ) - { - // - // Buffers ... - if (barIndex < 0) { - barIndex = 0; - } - - // - // FAST ... - CopyBuffer( - mHandler, - X121_X3MA_FAST_LINE, - barIndex, - maxRequiredBars, - x3maFastBuffer - // - ); - - // - // FAST STATE ... - CopyBuffer( - mHandler, - X121_X3MA_FAST_STATE_LINE, - barIndex, - maxRequiredBars, - x3maFastStateBuffer - // - ); - - // - // MID ... - CopyBuffer( - mHandler, - X121_X3MA_MID_LINE, - barIndex, - maxRequiredBars, - x3maMidBuffer - // - ); - - // - // MID STATE ... - CopyBuffer( - mHandler, - X121_X3MA_MID_STATE_LINE, - barIndex, - maxRequiredBars, - x3maMidStateBuffer - // - ); - - // - // SLOW ... - CopyBuffer( - mHandler, - X121_X3MA_SLOW_LINE, - barIndex, - maxRequiredBars, - x3maSlowBuffer - // - ); - - // - // SLOW STATE ... - CopyBuffer( - mHandler, - X121_X3MA_SLOW_STATE_LINE, - barIndex, - maxRequiredBars, - x3maSlowStateBuffer - // - ); - } - - // - void Cleanup( - int maxAllowed = 100 // - ) - { - // - CleanupArray( - x3maFastBuffer, - maxAllowed // - ); - - // - CleanupArray( - x3maMidBuffer, - maxAllowed // - ); - - // - CleanupArray( - x3maSlowBuffer, - maxAllowed // - ); - - // - CleanupArray( - x3maFastStateBuffer, - maxAllowed // - ); - - // - CleanupArray( - x3maMidStateBuffer, - maxAllowed // - ); - - // - CleanupArray( - x3maSlowStateBuffer, - maxAllowed // - ); - - // - } - - // -}; - -// -// Tools ... \ No newline at end of file diff --git a/Helpers/x-saherelm.x121.xatr.helper.mq5 b/Helpers/x-saherelm.x121.xatr.helper.mq5 deleted file mode 100644 index 4a2365f7..00000000 --- a/Helpers/x-saherelm.x121.xatr.helper.mq5 +++ /dev/null @@ -1,1824 +0,0 @@ -/////////////////////////////////////////////////////// -// -// SaherElm IT Center MQL5 Helper Class Library -// ---------------------------------------------- -// Name: XCX121XATRHelper -// Description: provides all Indicator -// Helper requirements ... -// -// -// Maintainer: -// ------------ -// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) -// -////////////////////////////////////////////////////// -// -// Global Properties ... -#property library -#property copyright "Copyright 2023, SaherElm IT Center" -#property link "https://www.saherelm.ir" -#property version "1.00" -#property strict - -// -// Imports ... -#include "../Classes/x-saherelm.x-helper.class.mq5" - -// -// Definitions ... - -// -// Definitions ... -enum ENUM_X121_XATR_BUFFERS -{ - // - X121_ATR_UPPER_LINE = 0, - X121_ATR_LOWER_LINE = 1, - X121_ATR_SM_UPPER_LINE = 2, - X121_ATR_SM_LOWER_LINE = 3, - X121_PRICE_CHANGE_LINE = 4, - X121_PRICE_CHANGE_SM_LINE = 5, - X121_RSI_CHANGE_LINE = 6, - X121_RSI_CHANGE_SM_LINE = 7, - X121_ATR_LINE = 8, - X121_RSI_LINE = 9, -}; - -// -// Input Models ... -struct X121XATRInputs -{ - // - // Props ... - - // - // RSI Detection ... - int rsiLength; // Length - ENUM_X_PRICE rsiPriceType; // Applied To - ENUM_X_MA_METHOD rsiSmoothingMethod; // Smoothing Method; - - // - // ATR Detection ... - int atrLength; // Length - double atrMultiplier; // Multiplier - ENUM_X_PRICE atrUpperPriceType; // Upper Zone Applied To - ENUM_X_PRICE atrLowerPriceType; // Lower Zone Applied To - ENUM_X_MA_METHOD atrSmoothingMethod; // Smoothing Method - - // - // Price Change ... - int priceChangeSmoothingLength; // Length - ENUM_X_PRICE priceChangeType; // Price Type - ENUM_X_MA_METHOD priceChangeSmoothingMethod; // Moving Average Moethod - - // - // Presentation ... - int startCalculationForLastBars; // Calculate Last n Bars - bool showAtrUpper; // Show Upper Zone - bool showAtrLower; // Show Lower Zone - bool showSmoothedAtrUpper; // Show Smoothed Upper Zone - bool showSmoothedAtrLower; // Show Smoothed Lower Zone - bool showRSIChange; // Show RSI Change - bool showSmoothedRSIChange; // ShowSmoothed RSI Change - bool showPriceChange; // Show Price Change - bool showSmoothedPriceChange; // ShowSmoothed Price Change - - // - // Custom Props ... - int rsiOverSoldLevel; // RSI Over Sold Level ... - int rsiOverBoughtLevel; // RSI Over Bought Level ... - - // - // Constructor(s) ... - X121XATRInputs() - { - // - Clean(); - } - - // - // Tools ... - - // - // Clean ... - void Clean() - { - // - // RSI Detection ... - rsiLength = 0; // Length - rsiPriceType = X_PRICE_NONE; // Applied To - rsiSmoothingMethod = X_MA_MODE_NONE; // Smoothing Method; - - // - // ATR Detection ... - atrLength = 0; // Length - atrMultiplier = 0; // Multiplier - atrUpperPriceType = X_PRICE_NONE; // Upper Zone Applied To - atrLowerPriceType = X_PRICE_NONE; // Lower Zone Applied To - atrSmoothingMethod = X_MA_MODE_NONE; // Smoothing Method - - // - // Price Change ... - priceChangeSmoothingLength = 0; // Length - priceChangeType = X_PRICE_NONE; // Price Type - priceChangeSmoothingMethod = X_MA_MODE_NONE; // Moving Average Moethod - - // - // Presentation ... - startCalculationForLastBars = 0; // Calculate Last n Bars - showAtrUpper = false; // Show Upper Zone - showAtrLower = false; // Show Lower Zone - showSmoothedAtrUpper = false; // Show Smoothed Upper Zone - showSmoothedAtrLower = false; // Show Smoothed Lower Zone - showRSIChange = false; // Show RSI Change - showSmoothedRSIChange = false; // ShowSmoothed RSI Change - showPriceChange = false; // Show Price Change - showSmoothedPriceChange = false; // ShowSmoothed Price Change - - // - rsiOverSoldLevel = 0; - rsiOverBoughtLevel = 0; - - // - ZeroMemory(this); - } - - // - // Default ... - void Default() - { - // - // RSI Detection ... - rsiLength = 14; // Length - rsiPriceType = X_PRICE_CLOSE; // Applied To - rsiSmoothingMethod = X_MA_MODE_SMA; // Smoothing Method; - - // - // ATR Detection ... - atrLength = 14; // Length - atrMultiplier = 1; // Multiplier - atrUpperPriceType = X_PRICE_HIGH; // Upper Zone Applied To - atrLowerPriceType = X_PRICE_LOW; // Lower Zone Applied To - atrSmoothingMethod = X_MA_MODE_SMA; // Smoothing Method - - // - // Price Change ... - priceChangeSmoothingLength = 14; // Length - priceChangeType = X_PRICE_CLOSE; // Price Type - priceChangeSmoothingMethod = X_MA_MODE_SMA; // Moving Average Moethod - - // - // Presentation ... - startCalculationForLastBars = 1000; // Calculate Last n Bars - showAtrUpper = true; // Show Upper Zone - showAtrLower = true; // Show Lower Zone - showSmoothedAtrUpper = true; // Show Smoothed Upper Zone - showSmoothedAtrLower = true; // Show Smoothed Lower Zone - showRSIChange = true; // Show RSI Change - showSmoothedRSIChange = true; // ShowSmoothed RSI Change - showPriceChange = true; // Show Price Change - showSmoothedPriceChange = true; // ShowSmoothed Price Change - - // - rsiOverSoldLevel = 30; - rsiOverBoughtLevel = 70; - } - - // - // Validate ... - bool IsValid() - { - // - bool result = false; - - // - result = - // - // RSI ... - rsiLength > 0 && - // - // ATR ... - atrLength > 0 && - atrMultiplier > 0 && - // - // RSI Levels ... - rsiOverSoldLevel > 0 && - rsiOverSoldLevel < 100 && - rsiOverBoughtLevel > 0 && - rsiOverBoughtLevel < 100 && - rsiOverSoldLevel < rsiOverBoughtLevel && - // - priceChangeSmoothingLength > 0 && - // - IsValid(rsiPriceType) && - IsValid(priceChangeType) && - IsValid(atrUpperPriceType) && - IsValid(atrLowerPriceType) - // - ; - - // - return result; - } - - // - // Retrieve MAx Length ... - int Max() - { - // - int result = 0; - - // - result = MathMax(rsiLength, atrLength); - result = MathMax(result, priceChangeSmoothingLength); - - // - return result; - } -}; - -// -// Conditions ... -struct X121XATRConditions -{ - // - // Common ... - string symbol; - ENUM_TIMEFRAMES period; - datetime time; - - // - // Buffers ... - double rsiBuffer[]; - double atrBuffer[]; - double atrUpperBuffer[]; - double atrLowerBuffer[]; - double atrUpperSMBuffer[]; - double atrLowerSMBuffer[]; - double rsiChangeBuffer[]; - double rsiChangeSMBuffer[]; - double priceChangeBuffer[]; - double priceChangeSMBuffer[]; - - // - // Conditions ... - - // - // RSI ... - bool isRsiInRange; - bool isRsiOverSold; - bool isRsiOverBought; - bool isRsiCrossedOverOverSold; - bool isRsiCrossedUnderOverSold; - bool isRsiCrossedOverOverBought; - bool isRsiCrossedUnderOverBought; - - // - // Other ... - - // - bool isRsiSMOverPriceChange; - bool isRsiSMUnderPriceChange; - - // - bool isRsiSMCrossedOverPriceChange; - bool isRsiSMCrossedUnderPriceChange; - - // - bool isPriceChangeSMOverRsi; - bool isPriceChangeSMUnderRsi; - - // - bool isPriceChangeSMCrossedOverRsi; - bool isPriceChangeSMCrossedUnderRsi; - - // - bool isRsiOverRsiSM; - bool isRsiUnderRsiSM; - - // - bool isRsiCrossedOverRsiSM; - bool isRsiCrossedUnderRsiSM; - - // - bool isPriceChangeOverPriceChangeSM; - bool isPriceChangeUnderPriceChangeSM; - - // - bool isPriceChangeCrossedOverPriceChangeSM; - bool isPriceChangeCrossedUnderPriceChangeSM; - - // - // bool isCloseLower - - // - // Constructor ... - X121XATRConditions() - { - Clean(); - } - - // - // Tools ... - - /** - * Cleaning Up ... - */ - void Clean() - { - // - // Commons ... - symbol = NULL; - period = NULL; - time = NULL; - - // - // Buffers ... - - // - Clean(rsiBuffer); - Clean(atrBuffer); - Clean(atrUpperBuffer); - Clean(atrLowerBuffer); - Clean(atrUpperSMBuffer); - Clean(atrLowerSMBuffer); - Clean(rsiChangeBuffer); - Clean(rsiChangeSMBuffer); - Clean(priceChangeBuffer); - Clean(priceChangeSMBuffer); - - // - ArraySetAsSeries(rsiBuffer, true); - ArraySetAsSeries(atrBuffer, true); - ArraySetAsSeries(atrUpperBuffer, true); - ArraySetAsSeries(atrLowerBuffer, true); - ArraySetAsSeries(atrUpperSMBuffer, true); - ArraySetAsSeries(atrLowerSMBuffer, true); - ArraySetAsSeries(rsiChangeBuffer, true); - ArraySetAsSeries(rsiChangeSMBuffer, true); - ArraySetAsSeries(priceChangeBuffer, true); - ArraySetAsSeries(priceChangeSMBuffer, true); - - // - // Conditions ... - - // - // RSI ... - isRsiInRange = false; - isRsiOverSold = false; - isRsiOverBought = false; - isRsiCrossedOverOverSold = false; - isRsiCrossedUnderOverSold = false; - isRsiCrossedOverOverBought = false; - isRsiCrossedUnderOverBought = false; - - // - // Other ... - - // - isRsiSMOverPriceChange = false; - isRsiSMUnderPriceChange = false; - - // - isRsiSMCrossedOverPriceChange = false; - isRsiSMCrossedUnderPriceChange = false; - - // - isPriceChangeSMOverRsi = false; - isPriceChangeSMUnderRsi = false; - - // - isPriceChangeSMCrossedOverRsi = false; - isPriceChangeSMCrossedUnderRsi = false; - - // - isRsiOverRsiSM = false; - isRsiUnderRsiSM = false; - - // - isRsiCrossedOverRsiSM = false; - isRsiCrossedUnderRsiSM = false; - - // - isPriceChangeOverPriceChangeSM = false; - isPriceChangeUnderPriceChangeSM = false; - - // - isPriceChangeCrossedOverPriceChangeSM = false; - isPriceChangeCrossedUnderPriceChangeSM = false; - - // - ZeroMemory(this); - } - - /** - * Generate Conditions Scores ... - * - * @param bullishScore: Double, Directional Scores Reference ... - * @param bearishScore: Double, Directional Scores Reference ... - */ - void GenerateScore( - double &bullishScore, - double &bearishScore // - ) - { - // - bullishScore = 0; - bearishScore = 0; - - // - double score = 1; - double minScore = 0.5; - double highScore = 1.5; - - // - if (isRsiOverSold) - { - bullishScore += minScore; - } - if (isRsiOverRsiSM) - { - bullishScore += minScore; - } - if (isRsiSMOverPriceChange) - { - bullishScore += minScore; - } - if (isPriceChangeSMOverRsi) - { - bullishScore += minScore; - } - if (isPriceChangeOverPriceChangeSM) - { - bullishScore += minScore; - } - - // - if (isRsiCrossedOverRsiSM) - { - bullishScore += score; - } - if (isRsiCrossedOverOverSold) - { - bullishScore += score; - } - if (isRsiCrossedUnderOverBought) - { - bullishScore += score; - } - if (isRsiSMCrossedOverPriceChange) - { - bullishScore += score; - } - if (isPriceChangeSMCrossedOverRsi) - { - bullishScore += score; - } - if (isPriceChangeCrossedOverPriceChangeSM) - { - bullishScore += score; - } - - // - if (isRsiOverBought) - { - bearishScore += minScore; - } - if (isRsiUnderRsiSM) - { - bearishScore += minScore; - } - if (isRsiSMUnderPriceChange) - { - bearishScore += minScore; - } - if (isPriceChangeSMUnderRsi) - { - bearishScore += minScore; - } - if (isPriceChangeUnderPriceChangeSM) - { - bearishScore += minScore; - } - - // - if (isRsiCrossedUnderRsiSM) - { - bearishScore += score; - } - if (isRsiCrossedUnderOverSold) - { - bearishScore += score; - } - if (isRsiCrossedOverOverBought) - { - bearishScore += score; - } - if (isRsiSMCrossedUnderPriceChange) - { - bearishScore += score; - } - if (isPriceChangeSMCrossedUnderRsi) - { - bearishScore += score; - } - if (isPriceChangeCrossedUnderPriceChangeSM) - { - bearishScore += score; - } - } - - /** - * Generate Summary String for Represent Conditions State ... - * - * @param onlyCommons: Boolean, Just Generate Only Commons Conditions ... - * @param onlyConditions: Boolean, Just Generate Only Conditions ... - * @param includeScores: Boolean, Attach Scores Representations on Result ... - * @param ignoreFalseConditions: Boolean, Ignore False Conditions on Result ... - * @param separator: String, Separate Lines ... - * - * @return ( string ) - */ - string GenerateSummary( - bool onlyCommons = false, - bool onlyConditions = false, - bool includeScores = true, - bool ignoreFalseConditions = true, - string separator = "\n" // - ) - { - // - string result = NULL; - - // - double bullishScore = 0; - double bearishScore = 0; - GenerateScore( - bullishScore, - bearishScore // - ); - - // - string scoresStr = - // - "Scores: " + separator + - "---------------" + separator + - "Bullish: " + ToString(bullishScore) + separator + - "Bearish: " + ToString(bearishScore) + separator + - "" - // - ; - - // - string commonStr = GenerateSpecifiedCommonSummary( - this, - separator, - includeScores // - ); - - // - string conditionsStr = - // - "-----------------------" + separator + - "XATR: " + separator + - "-----------------------" + separator + - ToString("isRsiInRange", isRsiInRange, ignoreFalseConditions, separator) + - ToString("isRsiOverSold", isRsiOverSold, ignoreFalseConditions, separator) + - ToString("isRsiOverBought", isRsiOverBought, ignoreFalseConditions, separator) + - ToString("isRsiCrossedOverOverSold", isRsiCrossedOverOverSold, ignoreFalseConditions, separator) + - ToString("isRsiCrossedUnderOverSold", isRsiCrossedUnderOverSold, ignoreFalseConditions, separator) + - ToString("isRsiCrossedOverOverBought", isRsiCrossedOverOverBought, ignoreFalseConditions, separator) + - ToString("isRsiCrossedUnderOverBought", isRsiCrossedUnderOverBought, ignoreFalseConditions, separator) + - // - ToString("isRsiSMOverPriceChange", isRsiSMOverPriceChange, ignoreFalseConditions, separator) + - ToString("isRsiSMUnderPriceChange", isRsiSMUnderPriceChange, ignoreFalseConditions, separator) + - ToString("isRsiSMCrossedOverPriceChange", isRsiSMCrossedOverPriceChange, ignoreFalseConditions, separator) + - ToString("isRsiSMCrossedUnderPriceChange", isRsiSMCrossedUnderPriceChange, ignoreFalseConditions, separator) + - ToString("isPriceChangeSMOverRsi", isPriceChangeSMOverRsi, ignoreFalseConditions, separator) + - ToString("isPriceChangeSMUnderRsi", isPriceChangeSMUnderRsi, ignoreFalseConditions, separator) + - ToString("isPriceChangeSMCrossedOverRsi", isPriceChangeSMCrossedOverRsi, ignoreFalseConditions, separator) + - ToString("isPriceChangeSMCrossedUnderRsi", isPriceChangeSMCrossedUnderRsi, ignoreFalseConditions, separator) + - ToString("isRsiOverRsiSM", isRsiOverRsiSM, ignoreFalseConditions, separator) + - ToString("isRsiUnderRsiSM", isRsiUnderRsiSM, ignoreFalseConditions, separator) + - ToString("isRsiCrossedOverRsiSM", isRsiCrossedOverRsiSM, ignoreFalseConditions, separator) + - ToString("isRsiCrossedUnderRsiSM", isRsiCrossedUnderRsiSM, ignoreFalseConditions, separator) + - ToString("isPriceChangeOverPriceChangeSM", isPriceChangeOverPriceChangeSM, ignoreFalseConditions, separator) + - ToString("isPriceChangeUnderPriceChangeSM", isPriceChangeUnderPriceChangeSM, ignoreFalseConditions, separator) + - ToString("isPriceChangeCrossedOverPriceChangeSM", isPriceChangeCrossedOverPriceChangeSM, ignoreFalseConditions, separator) + - ToString("isPriceChangeCrossedUnderPriceChangeSM", isPriceChangeCrossedUnderPriceChangeSM, ignoreFalseConditions, separator) + - // - "" - // - ; - - // - result = - // - "[" + GetTag() + "]" + separator + - (onlyConditions - ? "" - : commonStr) + - (!includeScores - ? "" - : scoresStr) + - " " + separator + - (onlyCommons - ? "" - : conditionsStr) + - "" - // - ; - - // - return result; - } - - /** - * Retrieve nique Tag Identifier ... - * - * @return ( string ) - */ - string GetTag() - { - return GetTypeName(this); - } - - // -}; - -// -// Class ... -class XCX121XATRHelper : public XCBaseHelper -{ - // - // Public ... - public: - // - // Props ... - - // - // Constructors ... - XCX121XATRHelper() - : XCBaseHelper(_Symbol, _Period) - { - } - - // - // Deconstructor ... - ~XCX121XATRHelper() - { - // - Clean(rsiBuffer); - Clean(atrBuffer); - Clean(atrUpperBuffer); - Clean(atrLowerBuffer); - Clean(atrUpperSMBuffer); - Clean(atrLowerSMBuffer); - Clean(rsiChangeBuffer); - Clean(rsiChangeSMBuffer); - Clean(priceChangeBuffer); - Clean(priceChangeSMBuffer); - - // - mInputs.Clean(); - } - - // - // Tools ... - bool Init( - string symbol, // Trading Symbol - ENUM_TIMEFRAMES period, // Trading Period - X121XATRInputs &inputs // Inputs - ) - { - // - bool result = false; - - // - mSymbol = symbol; - mPeriod = period; - - // - result = inputs.IsValid(); - if (!result) - { - return result; - } - - // - ArraySetAsSeries(rsiBuffer, true); - ArraySetAsSeries(atrBuffer, true); - ArraySetAsSeries(atrUpperBuffer, true); - ArraySetAsSeries(atrLowerBuffer, true); - ArraySetAsSeries(atrUpperSMBuffer, true); - ArraySetAsSeries(atrLowerSMBuffer, true); - ArraySetAsSeries(rsiChangeBuffer, true); - ArraySetAsSeries(rsiChangeSMBuffer, true); - ArraySetAsSeries(priceChangeBuffer, true); - ArraySetAsSeries(priceChangeSMBuffer, true); - - // - mInputs = inputs; - - // - mHandler = iCustom( - mSymbol, - mPeriod, - "x-saherelm.x121.xatr", - // - // Inputs ... - // - // Market ... - "", - // - // RSI Detection ... - "", - mInputs.rsiLength, // Length - mInputs.rsiPriceType, // Applied To - mInputs.rsiSmoothingMethod, // Smoothing Method; - // - // ATR Detection ... - "", - mInputs.atrLength, // Length - mInputs.atrMultiplier, // Multiplier - mInputs.atrUpperPriceType, // Upper Zone Applied To - mInputs.atrLowerPriceType, // Lower Zone Applied To - mInputs.atrSmoothingMethod, // Smoothing Method - // - // Price Change ... - "", - mInputs.priceChangeSmoothingLength, // Length - mInputs.priceChangeType, // Price Type - mInputs.priceChangeSmoothingMethod, // Moving Average Moethod - // - // Presentation ... - "", - mInputs.startCalculationForLastBars, // Calculate Last n Bars - mInputs.showAtrUpper, // Show Upper Zone - mInputs.showAtrLower, // Show Lower Zone - mInputs.showSmoothedAtrUpper, // Show Smoothed Upper Zone - mInputs.showSmoothedAtrLower, // Show Smoothed Lower Zone - mInputs.showRSIChange, // Show RSI Change - mInputs.showSmoothedRSIChange, // ShowSmoothed RSI Change - mInputs.showPriceChange, // Show Price Change - mInputs.showSmoothedPriceChange // ShowSmoothed Price Change - // - ); - result = mHandler != INVALID_HANDLE; - if (!result) - { - return result; - } - - // - return result; - } - - // - // Inputs ... - - // - X121XATRInputs GetInputs() - { - return mInputs; - } - - // - bool SetInputs( - X121XATRInputs &inputs // Configs - ) - { - // - return Init( - mSymbol, - mPeriod, - inputs - // - ); - } - - // - // Readers ... - - // - // RSI ... - - // - double GetRSI( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(rsiBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return rsiBuffer[barIndex]; - } - - // - int CopyRSI( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - rsiBuffer, - buffer, - forceClean - // - ); - } - - // - // ATR ... - - // - double GetATR( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(atrBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return atrBuffer[barIndex]; - } - - // - int CopyATR( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - atrBuffer, - buffer, - forceClean - // - ); - } - - // - double GetATRUpper( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(atrUpperBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return atrUpperBuffer[barIndex]; - } - - // - int CopyATRUpper( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - atrUpperBuffer, - buffer, - forceClean - // - ); - } - - // - double GetATRLower( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(atrLowerBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return atrLowerBuffer[barIndex]; - } - - // - int CopyATRLower( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - atrLowerBuffer, - buffer, - forceClean - // - ); - } - - // - double GetSMATRUpper( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(atrUpperSMBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return atrUpperSMBuffer[barIndex]; - } - - // - int CopySMATRUpper( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - atrUpperSMBuffer, - buffer, - forceClean - // - ); - } - - // - double GetSMATRLower( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(atrLowerSMBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return atrLowerSMBuffer[barIndex]; - } - - // - int CopySMATRLower( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - atrLowerSMBuffer, - buffer, - forceClean - // - ); - } - - // - // PRICE Change ... - - // - double GetPriceChange( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(priceChangeBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return priceChangeBuffer[barIndex]; - } - - // - int CopyPriceChange( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - priceChangeBuffer, - buffer, - forceClean - // - ); - } - - // - double GetSMPriceChange( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(priceChangeSMBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return priceChangeSMBuffer[barIndex]; - } - - // - int CopySMPriceChange( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - priceChangeSMBuffer, - buffer, - forceClean - // - ); - } - - // - // RSI Change ... - - // - double GetRsiChange( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(rsiChangeBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return rsiChangeBuffer[barIndex]; - } - - // - int CopyRsiChange( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - rsiChangeBuffer, - buffer, - forceClean - // - ); - } - - // - double GetSMRsiChange( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(rsiChangeSMBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return rsiChangeSMBuffer[barIndex]; - } - - // - int CopySMRsiChange( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - rsiChangeSMBuffer, - buffer, - forceClean - // - ); - } - - // - void Free() override - { - Cleanup(10); - } - - // - bool GetConditions( - X121XATRConditions &conditions, // - int barIndex = 0, // - int loopback = 5 // - ) - { - // - bool result = true; - - // - if (loopback < 5) - { - loopback = 5; - } - - // - conditions.Clean(); - - // - conditions.symbol = mSymbol; - conditions.period = mPeriod; - conditions.time = TimeCurrent(); - - // - int zIndex = barIndex; - int cIndex = zIndex + 1; - int pIndex = cIndex + 1; - int ppIndex = pIndex + 1; - - // - XOHCL zBar; - result = zBar.Init( - mSymbol, - mPeriod, - zIndex // - ); - if (!result) - { - return result; - } - - // - XOHCL cBar; - result = cBar.Init( - mSymbol, - mPeriod, - cIndex // - ); - if (!result) - { - return result; - } - - // - XOHCL pBar; - result = pBar.Init( - mSymbol, - mPeriod, - pIndex // - ); - if (!result) - { - return result; - } - - // - // Buffers ... - - // - CopyRSI( - zIndex, - loopback, - conditions.rsiBuffer // - ); - - // - CopyATR( - zIndex, - loopback, - conditions.atrBuffer // - ); - - // - CopyATRUpper( - zIndex, - loopback, - conditions.atrUpperBuffer // - ); - - // - CopyATRLower( - zIndex, - loopback, - conditions.atrLowerBuffer // - ); - - // - CopySMATRUpper( - zIndex, - loopback, - conditions.atrUpperSMBuffer // - ); - - // - CopySMATRLower( - zIndex, - loopback, - conditions.atrLowerSMBuffer // - ); - - // - CopyPriceChange( - zIndex, - loopback, - conditions.priceChangeBuffer // - ); - - // - CopySMPriceChange( - zIndex, - loopback, - conditions.priceChangeSMBuffer // - ); - - // - CopyRsiChange( - zIndex, - loopback, - conditions.rsiChangeBuffer // - ); - - // - CopySMRsiChange( - zIndex, - loopback, - conditions.rsiChangeSMBuffer // - ); - - // - // Conditions ... - - // - int zIDX = 0; - int cIDX = zIDX + 1; - int pIDX = cIDX + 1; - int pPIDX = pIDX + 1; - - // - double cRSI = conditions.rsiBuffer[cIDX]; - double pRSI = conditions.rsiBuffer[pIDX]; - double pPRSI = conditions.rsiBuffer[pPIDX]; - - // - // RSI ... - - // - bool isRsiInRange = - cRSI > mInputs.rsiOverSoldLevel && - cRSI < mInputs.rsiOverBoughtLevel; - bool isRsiInRangeP = - pRSI > mInputs.rsiOverSoldLevel && - pRSI < mInputs.rsiOverBoughtLevel; - - // - bool isRsiOverSold = - cRSI < mInputs.rsiOverSoldLevel; - bool isRsiOverSoldP = - pRSI < mInputs.rsiOverSoldLevel; - bool isRsiCrossedOverOverSold = isRsiOverSold && - !isRsiOverSoldP; - bool isRsiCrossedUnderOverSold = isRsiOverSoldP && - !isRsiOverSold; - - // - bool isRsiOverBought = - cRSI > mInputs.rsiOverBoughtLevel; - bool isRsiOverBoughtP = - pRSI > mInputs.rsiOverBoughtLevel; - bool isRsiCrossedOverOverBought = isRsiOverBought && - !isRsiOverBoughtP; - bool isRsiCrossedUnderOverBought = isRsiOverBoughtP && - !isRsiOverBought; - - // - // Other ... - - // - double rsiChange = conditions.rsiChangeBuffer[cIDX]; - double rsiChangeP = conditions.rsiChangeBuffer[pIDX]; - - // - double rsiChangeSM = conditions.rsiChangeSMBuffer[cIDX]; - double rsiChangeSMP = conditions.rsiChangeSMBuffer[pIDX]; - - // - double priceChange = conditions.priceChangeBuffer[cIDX]; - double priceChangeP = conditions.priceChangeBuffer[pIDX]; - - // - double priceChangeSM = conditions.priceChangeSMBuffer[cIDX]; - double priceChangeSMP = conditions.priceChangeSMBuffer[pIDX]; - - // - // - // - - // - bool isRsiSMOverPriceChange = rsiChangeSM > priceChangeSM; - bool isRsiSMOverPriceChangeP = rsiChangeSMP > priceChangeSMP; - bool isRsiSMCrossedOverPriceChange = isRsiSMOverPriceChange && - !isRsiSMOverPriceChangeP; - - // - bool isRsiSMUnderPriceChange = rsiChangeSM < priceChangeSM; - bool isRsiSMUnderPriceChangeP = rsiChangeSMP < priceChangeSMP; - bool isRsiSMCrossedUnderPriceChange = isRsiSMUnderPriceChange && - !isRsiSMUnderPriceChangeP; - - // - bool isPriceChangeSMOverRsi = priceChangeSM > rsiChangeSM; - bool isPriceChangeSMOverRsiP = priceChangeSMP > rsiChangeSMP; - bool isPriceChangeSMCrossedOverRsi = isPriceChangeSMOverRsi && - !isPriceChangeSMOverRsiP; - - // - bool isPriceChangeSMUnderRsi = priceChangeSM < rsiChangeSM; - bool isPriceChangeSMUnderRsiP = priceChangeSMP < rsiChangeSMP; - bool isPriceChangeSMCrossedUnderRsi = isPriceChangeSMUnderRsi && - !isPriceChangeSMUnderRsiP; - - // - bool isRsiOverRsiSM = rsiChange > rsiChangeSM; - bool isRsiOverRsiSMP = rsiChangeP > rsiChangeSMP; - bool isRsiCrossedOverRsiSM = isRsiOverRsiSM && - !isRsiOverRsiSMP; - - // - bool isRsiUnderRsiSM = rsiChange < rsiChangeSM; - bool isRsiUnderRsiSMP = rsiChangeP < rsiChangeSMP; - bool isRsiCrossedUnderRsiSM = isRsiUnderRsiSM && - !isRsiUnderRsiSMP; - - // - bool isPriceChangeOverPriceChangeSM = priceChange > priceChangeSM; - bool isPriceChangeOverPriceChangeSMP = priceChangeP > priceChangeSMP; - bool isPriceChangeCrossedOverPriceChangeSM = isPriceChangeOverPriceChangeSM && - !isPriceChangeOverPriceChangeSMP; - - // - bool isPriceChangeUnderPriceChangeSM = priceChange < priceChangeSM; - bool isPriceChangeUnderPriceChangeSMP = priceChangeP < priceChangeSMP; - bool isPriceChangeCrossedUnderPriceChangeSM = isPriceChangeUnderPriceChangeSM && - !isPriceChangeUnderPriceChangeSMP; - - // - // - // - - // - conditions.isRsiInRange = isRsiInRange; - conditions.isRsiOverSold = isRsiOverSold; - conditions.isRsiOverRsiSM = isRsiOverRsiSM; - conditions.isRsiOverBought = isRsiOverBought; - conditions.isRsiUnderRsiSM = isRsiUnderRsiSM; - conditions.isRsiCrossedOverRsiSM = isRsiCrossedOverRsiSM; - conditions.isRsiCrossedUnderRsiSM = isRsiCrossedUnderRsiSM; - conditions.isPriceChangeSMOverRsi = isPriceChangeSMOverRsi; - conditions.isRsiSMOverPriceChange = isRsiSMOverPriceChange; - conditions.isPriceChangeSMUnderRsi = isPriceChangeSMUnderRsi; - conditions.isRsiSMUnderPriceChange = isRsiSMUnderPriceChange; - conditions.isRsiCrossedOverOverSold = isRsiCrossedOverOverSold; - conditions.isRsiCrossedUnderOverSold = isRsiCrossedUnderOverSold; - conditions.isRsiCrossedOverOverBought = isRsiCrossedOverOverBought; - conditions.isRsiCrossedUnderOverBought = isRsiCrossedUnderOverBought; - conditions.isPriceChangeSMCrossedOverRsi = isPriceChangeSMCrossedOverRsi; - conditions.isRsiSMCrossedOverPriceChange = isRsiSMCrossedOverPriceChange; - conditions.isRsiSMCrossedUnderPriceChange = isRsiSMCrossedUnderPriceChange; - conditions.isPriceChangeSMCrossedUnderRsi = isPriceChangeSMCrossedUnderRsi; - conditions.isPriceChangeOverPriceChangeSM = isPriceChangeOverPriceChangeSM; - conditions.isPriceChangeUnderPriceChangeSM = isPriceChangeUnderPriceChangeSM; - conditions.isPriceChangeCrossedOverPriceChangeSM = isPriceChangeCrossedOverPriceChangeSM; - conditions.isPriceChangeCrossedUnderPriceChangeSM = isPriceChangeCrossedUnderPriceChangeSM; - - // - Cleanup(); - - // - zBar.Clean(); - cBar.Clean(); - pBar.Clean(); - - // - return result; - } - - // - // Protected ... - protected: - // - // Private ... - private: - // - // Props ... - X121XATRInputs mInputs; // Inputs ... - - // - // Buffers ... - double rsiBuffer[]; - double atrBuffer[]; - double atrUpperBuffer[]; - double atrLowerBuffer[]; - double atrUpperSMBuffer[]; - double atrLowerSMBuffer[]; - double rsiChangeBuffer[]; - double rsiChangeSMBuffer[]; - double priceChangeBuffer[]; - double priceChangeSMBuffer[]; - - // - void Calculate( - int barIndex = 0, - int maxRequiredBars = 100 // - ) - { - // - // Buffers ... - if (barIndex < 0) - { - barIndex = 0; - } - - // - // RSI ... - CopyBuffer( - mHandler, - X121_RSI_LINE, - barIndex, - maxRequiredBars, - rsiBuffer - // - ); - - // - // ATR ... - CopyBuffer( - mHandler, - X121_ATR_LINE, - barIndex, - maxRequiredBars, - atrBuffer // - ); - - // - // ATR Band ... - - // - // Upper ... - CopyBuffer( - mHandler, - X121_ATR_UPPER_LINE, - barIndex, - maxRequiredBars, - atrUpperBuffer // - ); - - // - // Lower ... - CopyBuffer( - mHandler, - X121_ATR_LOWER_LINE, - barIndex, - maxRequiredBars, - atrLowerBuffer // - ); - - // - // SM Upper ... - CopyBuffer( - mHandler, - X121_ATR_SM_UPPER_LINE, - barIndex, - maxRequiredBars, - atrUpperSMBuffer // - ); - - // - // Lower ... - CopyBuffer( - mHandler, - X121_ATR_SM_LOWER_LINE, - barIndex, - maxRequiredBars, - atrLowerSMBuffer // - ); - - // - // PRICE Change ... - - // - CopyBuffer( - mHandler, - X121_PRICE_CHANGE_LINE, - barIndex, - maxRequiredBars, - priceChangeBuffer // - ); - - // - CopyBuffer( - mHandler, - X121_PRICE_CHANGE_SM_LINE, - barIndex, - maxRequiredBars, - priceChangeSMBuffer // - ); - - // - // RSI Change ... - - // - CopyBuffer( - mHandler, - X121_RSI_CHANGE_LINE, - barIndex, - maxRequiredBars, - rsiChangeBuffer // - ); - - // - CopyBuffer( - mHandler, - X121_RSI_CHANGE_SM_LINE, - barIndex, - maxRequiredBars, - rsiChangeSMBuffer // - ); - - // - } - - // - void Cleanup( - int maxAllowed = 100 // - ) - { - // - CleanupArray( - rsiBuffer, - maxAllowed // - ); - - // - CleanupArray( - atrBuffer, - maxAllowed // - ); - - // - CleanupArray( - atrUpperBuffer, - maxAllowed // - ); - - // - CleanupArray( - atrLowerBuffer, - maxAllowed // - ); - - // - CleanupArray( - atrUpperSMBuffer, - maxAllowed // - ); - - // - CleanupArray( - atrLowerSMBuffer, - maxAllowed // - ); - - // - CleanupArray( - rsiChangeBuffer, - maxAllowed // - ); - - // - CleanupArray( - rsiChangeSMBuffer, - maxAllowed // - ); - - // - CleanupArray( - priceChangeBuffer, - maxAllowed // - ); - - // - CleanupArray( - priceChangeSMBuffer, - maxAllowed // - ); - - // - } - - // -}; - -// -// Tools ... \ No newline at end of file diff --git a/Helpers/x-saherelm.x121.xche.helper.mq5 b/Helpers/x-saherelm.x121.xche.helper.mq5 deleted file mode 100644 index c1d01331..00000000 --- a/Helpers/x-saherelm.x121.xche.helper.mq5 +++ /dev/null @@ -1,1373 +0,0 @@ -/////////////////////////////////////////////////////// -// -// SaherElm IT Center MQL5 Helper Class Library -// ---------------------------------------------- -// Name: XCX121XCHEHelper -// Description: provides all Indicator -// Helper requirements ... -// -// -// Maintainer: -// ------------ -// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) -// -////////////////////////////////////////////////////// -// -// Global Properties ... -#property library -#property copyright "Copyright 2023, SaherElm IT Center" -#property link "https://www.saherelm.ir" -#property version "1.00" -#property strict - -// -// Imports ... -#include "../Classes/x-saherelm.x-helper.class.mq5" - -// -// Definitions ... - -// -// Definitions ... -enum ENUM_X121_XCHE_BUFFERS -{ - // - X121_XCHE_LE_1_LINE = 0, - X121_XCHE_SE_1_LINE = 1, - X121_XCHE_LE_2_LINE = 2, - X121_XCHE_SE_2_LINE = 3, - X121_XCHE_LE_1_S_LINE = 4, - X121_XCHE_SE_1_S_LINE = 5, - X121_XCHE_LE_2_S_LINE = 6, - X121_XCHE_SE_2_S_LINE = 7, -}; - -// -// Input Models ... -struct X121XCHEInputs -{ - // - // Props ... - - int cheLength; // Length - int cheLoopback; // Loopback - double cheMultiplier1; // 1st Multiplier - double cheMultiplier2; // 2nd Multiplier - ENUM_APPLIED_PRICE cheUpperAppliedTo; // Upper Zone Applied to - ENUM_APPLIED_PRICE cheLowerAppliedTo; // Lower Zone Applied to - - // - int cheArrowCode; // CHE Arrow Code - - // - bool showLE1; // Show 1st Long Exit - bool showSE1; // Show 1st Short Exit - bool showLE2; // Show 2st Long Exit - bool showSE2; // Show 2st Short Exit - - // - // Constructor(s) ... - X121XCHEInputs() - { - // - Clean(); - } - - // - // Tools ... - - // - // Clean ... - void Clean() - { - // - cheLength = 0; - cheLoopback = 0; - cheMultiplier1 = 0; - cheMultiplier2 = 0; - cheUpperAppliedTo = PRICE_HIGH; - cheLowerAppliedTo = PRICE_LOW; - - // - cheArrowCode = 0; - - // - showLE1 = false; - showSE1 = false; - showLE2 = false; - showSE2 = false; - - // - ZeroMemory(this); - } - - // - // Default ... - void Default() - { - // - cheLength = 35; - cheLoopback = 26; - cheMultiplier1 = 3.0; - cheMultiplier2 = 3.5; - cheUpperAppliedTo = PRICE_HIGH; - cheLowerAppliedTo = PRICE_LOW; - - // - cheArrowCode = 159; - - // - showLE1 = true; - showSE1 = true; - showLE2 = true; - showSE2 = true; - } - - // - // Validate ... - bool IsValid() - { - // - bool result = true; - - // - result = - cheLength >= 9 && - cheLoopback >= 0; - - // - return result; - } - - // - // Retrieve MAx Length ... - int Max() - { - // - int result = 0; - - // - result = MathMax(cheLength, cheLoopback); - - // - return result; - } -}; - -// -// Conditions ... -struct X121XCHEConditions -{ - // - // Common ... - string symbol; - ENUM_TIMEFRAMES period; - datetime time; - - // - // Buffers ... - double le1Buffer[]; - double se1Buffer[]; - double le2Buffer[]; - double se2Buffer[]; - double le1StartBuffer[]; - double se1StartBuffer[]; - double le2StartBuffer[]; - double se2StartBuffer[]; - - // - // Conditions ... - - // - bool isChe1Bullish; - bool isChe1Bearish; - - // - bool isChe1SwitchedToBullish; - bool isChe1SwitchedToBearish; - - // - bool isChe2Bullish; - bool isChe2Bearish; - - // - bool isChe2SwitchedToBullish; - bool isChe2SwitchedToBearish; - - // - bool isCheBullish; - bool isCheBearish; - - // - bool isCheSwitchedToBullish; - bool isCheSwitchedToBearish; - - // - // Constructor ... - X121XCHEConditions() - { - Clean(); - } - - // - // Tools ... - - /** - * Cleaning Up ... - */ - void Clean() - { - // - // Commons ... - symbol = NULL; - period = NULL; - time = NULL; - - // - // Buffers ... - - // - Clean(le1Buffer); - Clean(se1Buffer); - Clean(le2Buffer); - Clean(se2Buffer); - Clean(le1StartBuffer); - Clean(se1StartBuffer); - Clean(le2StartBuffer); - Clean(se2StartBuffer); - - // - ArraySetAsSeries(le1Buffer, true); - ArraySetAsSeries(se1Buffer, true); - ArraySetAsSeries(le2Buffer, true); - ArraySetAsSeries(se2Buffer, true); - ArraySetAsSeries(le1StartBuffer, true); - ArraySetAsSeries(se1StartBuffer, true); - ArraySetAsSeries(le2StartBuffer, true); - ArraySetAsSeries(se2StartBuffer, true); - - // - // Conditions ... - - // - isChe1Bullish = false; - isChe1Bearish = false; - - // - isChe1SwitchedToBullish = false; - isChe1SwitchedToBearish = false; - - // - isChe2Bullish = false; - isChe2Bearish = false; - - // - isChe2SwitchedToBullish = false; - isChe2SwitchedToBearish = false; - - // - isCheBullish = false; - isCheBearish = false; - - // - isCheSwitchedToBullish = false; - isCheSwitchedToBearish = false; - - // - ZeroMemory(this); - } - - /** - * Generate Conditions Scores ... - * - * @param bullishScore: Double, Directional Scores Reference ... - * @param bearishScore: Double, Directional Scores Reference ... - */ - void GenerateScore( - double &bullishScore, - double &bearishScore // - ) - { - // - bullishScore = 0; - bearishScore = 0; - - // - double score = 1; - double minScore = 0.5; - double highScore = 1.5; - - // - // XCHE ... - - // - if (isCheBullish) - { - bullishScore += score; - } - if (isCheSwitchedToBullish) - { - bullishScore += highScore; - } - if (isChe1Bullish && - !isCheBullish && - !isCheSwitchedToBullish) - { - bullishScore += minScore; - } - if (isChe1SwitchedToBullish && - !isCheBullish && - !isCheSwitchedToBullish) - { - bullishScore += minScore; - } - - // - if (isCheBearish) - { - bearishScore += score; - } - if (isCheSwitchedToBearish) - { - bearishScore += highScore; - } - if (isChe1Bearish && - !isCheBearish && - !isCheSwitchedToBearish) - { - bearishScore += minScore; - } - if (isChe1SwitchedToBearish && - !isCheBearish && - !isCheSwitchedToBearish) - { - bearishScore += minScore; - } - } - - /** - * Generate Summary String for Represent Conditions State ... - * - * @param onlyCommons: Boolean, Just Generate Only Commons Conditions ... - * @param onlyConditions: Boolean, Just Generate Only Conditions ... - * @param includeScores: Boolean, Attach Scores Representations on Result ... - * @param ignoreFalseConditions: Boolean, Ignore False Conditions on Result ... - * @param separator: String, Separate Lines ... - * - * @return ( string ) - */ - string GenerateSummary( - bool onlyCommons = false, - bool onlyConditions = false, - bool includeScores = true, - bool ignoreFalseConditions = true, - string separator = "\n" // - ) - { - // - string result = NULL; - - // - double bullishScore = 0; - double bearishScore = 0; - GenerateScore( - bullishScore, - bearishScore // - ); - - // - string scoresStr = - // - "Scores: " + separator + - "---------------" + separator + - "Bullish: " + ToString(bullishScore) + separator + - "Bearish: " + ToString(bearishScore) + separator + - "" - // - ; - - // - string commonStr = GenerateSpecifiedCommonSummary( - this, - separator, - includeScores // - ); - - // - string conditionsStr = - // - "-----------------------" + separator + - "XCHE: " + separator + - "-----------------------" + separator + - ToString("isChe1Bullish", isChe1Bullish, ignoreFalseConditions, separator) + - ToString("isChe1Bearish", isChe1Bearish, ignoreFalseConditions, separator) + - ToString("isChe1SwitchedToBullish", isChe1SwitchedToBullish, ignoreFalseConditions, separator) + - ToString("isChe1SwitchedToBearish", isChe1SwitchedToBearish, ignoreFalseConditions, separator) + - ToString("isChe2Bullish", isChe2Bullish, ignoreFalseConditions, separator) + - ToString("isChe2Bearish", isChe2Bearish, ignoreFalseConditions, separator) + - ToString("isChe2SwitchedToBullish", isChe2SwitchedToBullish, ignoreFalseConditions, separator) + - ToString("isChe2SwitchedToBearish", isChe2SwitchedToBearish, ignoreFalseConditions, separator) + - ToString("isCheBullish", isCheBullish, ignoreFalseConditions, separator) + - ToString("isCheBearish", isCheBearish, ignoreFalseConditions, separator) + - ToString("isCheSwitchedToBullish", isCheSwitchedToBullish, ignoreFalseConditions, separator) + - ToString("isCheSwitchedToBearish", isCheSwitchedToBearish, ignoreFalseConditions, separator) + - // - "" - // - ; - - // - result = - // - "[" + GetTag() + "]" + separator + - (onlyConditions - ? "" - : commonStr) + - (!includeScores - ? "" - : scoresStr) + - " " + separator + - (onlyCommons - ? "" - : conditionsStr) + - "" - // - ; - - // - return result; - } - - /** - * Retrieve nique Tag Identifier ... - * - * @return ( string ) - */ - string GetTag() - { - return GetTypeName(this); - } - - // -}; - -// -// Class ... -class XCX121XCHEHelper : public XCBaseHelper -{ - // - // Public ... - public: - // - // Props ... - - // - // Constructors ... - XCX121XCHEHelper() - : XCBaseHelper(_Symbol, _Period) - { - } - - // - // Deconstructor ... - ~XCX121XCHEHelper() - { - // - mInputs.Clean(); - - // - Clean(le1Buffer); - Clean(se1Buffer); - Clean(le2Buffer); - Clean(se2Buffer); - Clean(le1StartBuffer); - Clean(se1StartBuffer); - Clean(le2StartBuffer); - Clean(se2StartBuffer); - } - - // - // Tools ... - bool Init( - string symbol, // Trading Symbol - ENUM_TIMEFRAMES period, // Trading Period - X121XCHEInputs &inputs // Inputs - ) - { - // - bool result = false; - - // - mSymbol = symbol; - mPeriod = period; - - // - result = inputs.IsValid(); - if (!result) - { - return result; - } - - // - ArraySetAsSeries(le1Buffer, true); - ArraySetAsSeries(se1Buffer, true); - ArraySetAsSeries(le2Buffer, true); - ArraySetAsSeries(se2Buffer, true); - ArraySetAsSeries(le1StartBuffer, true); - ArraySetAsSeries(se1StartBuffer, true); - ArraySetAsSeries(le2StartBuffer, true); - ArraySetAsSeries(se2StartBuffer, true); - - // - mInputs = inputs; - - // - mHandler = iCustom( - mSymbol, - mPeriod, - "x-saherelm.x121.xche", - // - // Inputs ... - // - // Market ... - "", - mInputs.cheLength, - mInputs.cheLoopback, - mInputs.cheMultiplier1, - mInputs.cheMultiplier2, - mInputs.cheUpperAppliedTo, - mInputs.cheLowerAppliedTo, - // - // Presentation ... - "", - mInputs.cheArrowCode, - mInputs.showLE1, - mInputs.showSE1, - mInputs.showLE2, - mInputs.showSE2 - // - ); - result = mHandler != INVALID_HANDLE; - if (!result) - { - return result; - } - - // - return result; - } - - // - // Inputs ... - - // - X121XCHEInputs GetInputs() - { - return mInputs; - } - - // - bool SetInputs( - X121XCHEInputs &inputs // Configs - ) - { - // - return Init( - mSymbol, - mPeriod, - inputs - // - ); - } - - // - // Readers ... - - // - double GetLE1( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(le1Buffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return le1Buffer[barIndex]; - } - - // - int CopyLE1( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - le1Buffer, - buffer, - forceClean - // - ); - } - - // - double GetLE1Start( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(le1StartBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return le1StartBuffer[barIndex]; - } - - // - int CopyLE1Start( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - le1StartBuffer, - buffer, - forceClean - // - ); - } - - // - double GetLE2( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(le2Buffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return le2Buffer[barIndex]; - } - - // - int CopyLE2( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - le2Buffer, - buffer, - forceClean - // - ); - } - - // - double GetLE2Start( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(le2StartBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return le2StartBuffer[barIndex]; - } - - // - int CopyLE2Start( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - le2StartBuffer, - buffer, - forceClean - // - ); - } - - // - double GetSE1( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(se1Buffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return se1Buffer[barIndex]; - } - - // - int CopySE1( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceCsean = true // Force To Csean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - se1Buffer, - buffer, - forceCsean - // - ); - } - - // - double GetSE1Start( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(se1StartBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return se1StartBuffer[barIndex]; - } - - // - int CopySE1Start( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceCsean = true // Force To Csean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - se1StartBuffer, - buffer, - forceCsean - // - ); - } - - // - double GetSE2( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(se2Buffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return se2Buffer[barIndex]; - } - - // - int CopySE2( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceCsean = true // Force To Csean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - se2Buffer, - buffer, - forceCsean - // - ); - } - - // - double GetSE2Start( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(se2StartBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return se2StartBuffer[barIndex]; - } - - // - int CopySE2Start( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceCsean = true // Force To Csean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - se2StartBuffer, - buffer, - forceCsean - // - ); - } - - // - void Free() override - { - Cleanup(10); - } - - // - bool GetConditions( - X121XCHEConditions &conditions, // - int barIndex = 0, // - int loopback = 5 // - ) - { - // - bool result = true; - - // - if (loopback < 5) - { - loopback = 5; - } - - // - conditions.Clean(); - - // - conditions.symbol = mSymbol; - conditions.period = mPeriod; - conditions.time = TimeCurrent(); - - // - int zIndex = barIndex; - int cIndex = zIndex + 1; - int pIndex = cIndex + 1; - int ppIndex = pIndex + 1; - - // - // Buffers ... - - // - CopyLE1( - zIndex, - loopback, - conditions.le1Buffer // - ); - - // - CopySE1( - zIndex, - loopback, - conditions.se1Buffer // - ); - - // - CopyLE2( - zIndex, - loopback, - conditions.le2Buffer // - ); - - // - CopySE2( - zIndex, - loopback, - conditions.se2Buffer // - ); - - // - CopyLE1Start( - zIndex, - loopback, - conditions.le1StartBuffer // - ); - - // - CopySE1Start( - zIndex, - loopback, - conditions.se1StartBuffer // - ); - - // - CopyLE2Start( - zIndex, - loopback, - conditions.le2StartBuffer // - ); - - // - CopySE2Start( - zIndex, - loopback, - conditions.se2StartBuffer // - ); - - // - // Conditions ... - - // - int cIDX = 1; - int pIDX = cIDX + 1; - - // - bool isChe1Bullish = le1Buffer[cIDX] != EMPTY_VALUE && - se1Buffer[cIDX] == EMPTY_VALUE; - bool isChe1BullishPrev = le1Buffer[cIDX] != EMPTY_VALUE && - se1Buffer[pIDX] == EMPTY_VALUE; - - // - bool isChe1Bearish = se1Buffer[cIDX] != EMPTY_VALUE && - le1Buffer[cIDX] == EMPTY_VALUE; - bool isChe1BearishPrev = se1Buffer[pIDX] != EMPTY_VALUE && - le1Buffer[pIDX] == EMPTY_VALUE; - - // - bool isChe1SwitchedToBullish = isChe1Bullish && - !isChe1BullishPrev; - bool isChe1SwitchedToBearish = isChe1Bearish && - !isChe1BearishPrev; - - // - bool isChe2Bullish = le2Buffer[cIDX] != EMPTY_VALUE && - se2Buffer[cIDX] == EMPTY_VALUE; - bool isChe2BullishPrev = le2Buffer[pIDX] != EMPTY_VALUE && - se2Buffer[pIDX] == EMPTY_VALUE; - - // - bool isChe2Bearish = se2Buffer[cIDX] != EMPTY_VALUE && - le2Buffer[cIDX] == EMPTY_VALUE; - bool isChe2BearishPrev = se2Buffer[pIDX] != EMPTY_VALUE && - le2Buffer[pIDX] == EMPTY_VALUE; - - // - bool isChe2SwitchedToBullish = isChe2Bullish && - !isChe2BullishPrev; - bool isChe2SwitchedToBearish = isChe2Bearish && - !isChe2BearishPrev; - - // - bool isCheBullish = isChe1Bullish && - isChe2Bullish; - bool isCheBullishPrev = isChe1BullishPrev && - isChe2BullishPrev; - - // - bool isCheBearish = isChe1Bearish && - isChe2Bearish; - bool isCheBearishPrev = isChe1BearishPrev && - isChe2BearishPrev; - - // - bool isCheSwitchedToBullish = isCheBullish && - !isCheBullishPrev; - bool isCheSwitchedToBearish = isCheBearish && - !isCheBearishPrev; - - // - double ches[]; - double prevCheLE1 = le1Buffer[pIDX]; - double prevCheLE2 = le2Buffer[pIDX]; - double prevCheSE1 = se1Buffer[pIDX]; - double prevCheSE2 = se2Buffer[pIDX]; - if (prevCheLE1 != EMPTY_VALUE) - { - // - Add( - prevCheLE1, - ches // - ); - } - if (prevCheLE2 != EMPTY_VALUE) - { - // - Add( - prevCheLE2, - ches // - ); - } - if (prevCheSE1 != EMPTY_VALUE) - { - // - Add( - prevCheSE1, - ches // - ); - } - if (prevCheSE2 != EMPTY_VALUE) - { - // - Add( - prevCheSE2, - ches // - ); - } - - // - double cheMin = GetMin(ches); - double cheMax = GetMax(ches); - - // - conditions.isChe1Bullish = isChe1Bullish; - conditions.isChe1Bearish = isChe1Bearish; - conditions.isChe1SwitchedToBullish = isChe1SwitchedToBullish; - conditions.isChe1SwitchedToBearish = isChe1SwitchedToBearish; - conditions.isChe2Bullish = isChe2Bullish; - conditions.isChe2Bearish = isChe2Bearish; - conditions.isChe2SwitchedToBullish = isChe2SwitchedToBullish; - conditions.isChe2SwitchedToBearish = isChe2SwitchedToBearish; - conditions.isCheBullish = isCheBullish; - conditions.isCheBearish = isCheBearish; - conditions.isCheSwitchedToBullish = isCheSwitchedToBullish; - conditions.isCheSwitchedToBearish = isCheSwitchedToBearish; - - // - Cleanup(); - - // - return result; - } - - // - // Protected ... - protected: - // - // Private ... - private: - // - // Props ... - X121XCHEInputs mInputs; // Inputs ... - - // - // Buffers ... - double le1Buffer[]; - double se1Buffer[]; - double le2Buffer[]; - double se2Buffer[]; - double le1StartBuffer[]; - double se1StartBuffer[]; - double le2StartBuffer[]; - double se2StartBuffer[]; - - // - void Calculate( - int barIndex = 0, - int maxRequiredBars = 100 // - ) - { - // - // Buffers ... - if (barIndex < 0) - { - barIndex = 0; - } - - // - // LE1 Start ... - CopyBuffer( - mHandler, - X121_XCHE_LE_1_S_LINE, - barIndex, - maxRequiredBars, - le1StartBuffer // - ); - - // - // LE1 ... - CopyBuffer( - mHandler, - X121_XCHE_LE_1_LINE, - barIndex, - maxRequiredBars, - le1Buffer // - ); - - // - // LE2 Start ... - CopyBuffer( - mHandler, - X121_XCHE_LE_2_S_LINE, - barIndex, - maxRequiredBars, - le2StartBuffer // - ); - - // - // LE2 ... - CopyBuffer( - mHandler, - X121_XCHE_LE_2_LINE, - barIndex, - maxRequiredBars, - le2Buffer // - ); - - // - // SE1 Start ... - CopyBuffer( - mHandler, - X121_XCHE_SE_1_S_LINE, - barIndex, - maxRequiredBars, - se1StartBuffer // - ); - - // - // SE1 ... - CopyBuffer( - mHandler, - X121_XCHE_SE_1_LINE, - barIndex, - maxRequiredBars, - se1Buffer // - ); - - // - // SE2 Start ... - CopyBuffer( - mHandler, - X121_XCHE_SE_2_S_LINE, - barIndex, - maxRequiredBars, - se2StartBuffer // - ); - - // - // SE2 ... - CopyBuffer( - mHandler, - X121_XCHE_SE_2_LINE, - barIndex, - maxRequiredBars, - se2Buffer // - ); - } - - // - void Cleanup( - int maxAllowed = 100 // - ) - { - // - CleanupArray( - le1Buffer, - maxAllowed // - ); - - // - CleanupArray( - se1Buffer, - maxAllowed // - ); - - // - CleanupArray( - le2Buffer, - maxAllowed // - ); - - // - CleanupArray( - se2Buffer, - maxAllowed // - ); - - // - CleanupArray( - le1StartBuffer, - maxAllowed // - ); - - // - CleanupArray( - se1StartBuffer, - maxAllowed // - ); - - // - CleanupArray( - le2StartBuffer, - maxAllowed // - ); - - // - CleanupArray( - se2StartBuffer, - maxAllowed // - ); - - // - } - - // -}; - -// -// Tools ... \ No newline at end of file diff --git a/Helpers/x-saherelm.x121.xdelta.helper.mq5 b/Helpers/x-saherelm.x121.xdelta.helper.mq5 deleted file mode 100644 index bdebbe99..00000000 --- a/Helpers/x-saherelm.x121.xdelta.helper.mq5 +++ /dev/null @@ -1,856 +0,0 @@ -/////////////////////////////////////////////////////// -// -// SaherElm IT Center MQL5 Helper Class Library -// ---------------------------------------------- -// Name: XCX121XDELTASHelper -// Description: provides all Indicator -// Helper requirements ... -// -// -// Maintainer: -// ------------ -// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) -// -////////////////////////////////////////////////////// -// -// Global Properties ... -#property library -#property copyright "Copyright 2023, SaherElm IT Center" -#property link "https://www.saherelm.ir" -#property version "1.00" -#property strict - -// -// Imports ... -#include "../Classes/x-saherelm.x-helper.class.mq5" - -// -// Definitions ... -enum ENUM_X121_XDELTA_BUFFERS -{ - // - X121_XDELTA_VOLUME_LINE = 0, - X121_XDELTA_HISTOGRAM_LINE = 1, - X121_XDELTA_MA_LINE = 3, - X121_XDELTA_STATE_LINE = 5, -}; - -// -// Input Models ... -struct X121XDELTAInputs -{ - // - // Props ... - - // - // Makret ... - int maLength; // Moving Averge Length - ENUM_X_MA_METHOD maMethod; // Moving Averge Method - - // - // Presentation ... - int startCalculationForLastBars; // Calculate Last n Bars - bool showDeltaLine; // Show Delta Line - bool showDeltaHistogram; // Show Delta Histogram - bool showDeltaMa; // Show Delta Moving Average - - // - // Constructor(s) ... - X121XDELTAInputs() - { - Clean(); - } - - // - // Tools ... - - /** - * Cleanup Model ... - */ - void Clean() - { - // - // Makret ... - maLength = 0; // Moving Averge Length - maMethod = X_MA_MODE_NONE; // Moving Averge Method - - // - // Presentation ... - startCalculationForLastBars = 0; // Calculate Last n Bars - showDeltaLine = false; // Show Delta Line - showDeltaHistogram = false; // Show Delta Histogram - showDeltaMa = false; // Show Delta Moving Average - - // - ZeroMemory(this); - } - - /** - * Default Inputs ... - */ - void Default() - { - // - // Makret ... - maLength = 14; // Moving Averge Length - maMethod = X_MA_MODE_EMA; // Moving Averge Method - - // - // Presentation ... - startCalculationForLastBars = 1000; // Calculate Last n Bars - showDeltaLine = true; // Show Delta Line - showDeltaHistogram = true; // Show Delta Histogram - showDeltaMa = true; // Show Delta Moving Average - } - - /** - * Validate Model ... - * - * @return ( bool ) - */ - bool IsValid() - { - // - bool result = false; - - // - result = - // - maLength > 0 && - IsValid(maMethod) - // - ; - - // - return result; - } - - /** - * Retrieve Max Input Length ... - * - * @return ( int ) - */ - int Max() - { - // - int result = 0; - - // - result = MathMax(result, maLength); - - // - return result; - } - - // -}; - -// -// Conditions ... -struct X121XDELTAConditions -{ - // - // Common ... - string symbol; - ENUM_TIMEFRAMES period; - datetime time; - - // - // Buffers ... - double deltaBuffer[]; - double deltaMaBuffer[]; - double deltaStateBuffer[]; - - // - // Conditions ... - - // - bool isDeltaBullish; - bool isDeltaBearish; - bool isDeltaSwitchedToBullish; - bool isDeltaSwitchedToBearish; - - // - bool isDeltaOverMa; - bool isDeltaUnderMa; - bool isDeltaCrossedOverMa; - bool isDeltaCrossedUnderMa; - - // - // Constructor ... - X121XDELTAConditions() - { - Clean(); - } - - // - // Tools ... - - /** - * Cleaning Up ... - */ - void Clean() - { - // - // Commons ... - time = NULL; - symbol = NULL; - period = NULL; - - // - // Buffers ... - - // - Clean(deltaBuffer); - Clean(deltaMaBuffer); - Clean(deltaStateBuffer); - - // - ArraySetAsSeries(deltaBuffer, true); - ArraySetAsSeries(deltaMaBuffer, true); - ArraySetAsSeries(deltaStateBuffer, true); - - // - // Conditions ... - - // - isDeltaBullish = false; - isDeltaBearish = false; - isDeltaSwitchedToBullish = false; - isDeltaSwitchedToBearish = false; - - // - isDeltaOverMa = false; - isDeltaUnderMa = false; - isDeltaCrossedOverMa = false; - isDeltaCrossedUnderMa = false; - - // - ZeroMemory(this); - } - - /** - * Generate Conditions Scores ... - * - * @param bullishScore: Double, Directional Scores Reference ... - * @param bearishScore: Double, Directional Scores Reference ... - */ - void GenerateScore( - double &bullishScore, - double &bearishScore // - ) - { - // - bullishScore = 0; - bearishScore = 0; - - // - double score = 1; - double minScore = 0.5; - double highScore = 1.5; - - // - if (isDeltaOverMa) - { - bullishScore += minScore; - } - if (isDeltaBullish) - { - bullishScore += minScore; - } - if (isDeltaCrossedOverMa) - { - bullishScore += score; - } - if (isDeltaSwitchedToBullish) - { - bullishScore += score; - } - - if (isDeltaBearish) - { - bearishScore += minScore; - } - if (isDeltaUnderMa) - { - bearishScore += minScore; - } - if (isDeltaCrossedUnderMa) - { - bearishScore += score; - } - if (isDeltaSwitchedToBearish) - { - bearishScore += score; - } - } - - /** - * Generate Summary String for Represent Conditions State ... - * - * @param onlyCommons: Boolean, Just Generate Only Commons Conditions ... - * @param onlyConditions: Boolean, Just Generate Only Conditions ... - * @param includeScores: Boolean, Attach Scores Representations on Result ... - * @param ignoreFalseConditions: Boolean, Ignore False Conditions on Result ... - * @param separator: String, Separate Lines ... - * - * @return ( string ) - */ - string GenerateSummary( - bool onlyCommons = false, - bool onlyConditions = false, - bool includeScores = true, - bool ignoreFalseConditions = true, - string separator = "\n" // - ) - { - // - string result = NULL; - - // - double bullishScore = 0; - double bearishScore = 0; - GenerateScore( - bullishScore, - bearishScore // - ); - - // - string scoresStr = - // - "Scores: " + separator + - "---------------" + separator + - "Bullish: " + ToString(bullishScore) + separator + - "Bearish: " + ToString(bearishScore) + separator + - "" - // - ; - - // - string commonStr = GenerateSpecifiedCommonSummary( - this, - separator, - includeScores // - ); - - // - string conditionsStr = - // - "-----------------------" + separator + - "XDELTA: " + separator + - "-----------------------" + separator + - ToString("isDeltaBullish", isDeltaBullish, ignoreFalseConditions, separator) + - ToString("isDeltaBearish", isDeltaBearish, ignoreFalseConditions, separator) + - ToString("isDeltaSwitchedToBullish", isDeltaSwitchedToBullish, ignoreFalseConditions, separator) + - ToString("isDeltaSwitchedToBearish", isDeltaSwitchedToBearish, ignoreFalseConditions, separator) + - ToString("isDeltaOverMa", isDeltaOverMa, ignoreFalseConditions, separator) + - ToString("isDeltaUnderMa", isDeltaUnderMa, ignoreFalseConditions, separator) + - ToString("isDeltaCrossedOverMa", isDeltaCrossedOverMa, ignoreFalseConditions, separator) + - ToString("isDeltaCrossedUnderMa", isDeltaCrossedUnderMa, ignoreFalseConditions, separator) + - // - "" - // - ; - - // - result = - // - "[" + GetTag() + "]" + separator + - (onlyConditions - ? "" - : commonStr) + - (!includeScores - ? "" - : scoresStr) + - " " + separator + - (onlyCommons - ? "" - : conditionsStr) + - "" - // - ; - - // - return result; - } - - /** - * Retrieve nique Tag Identifier ... - * - * @return ( string ) - */ - string GetTag() - { - return GetTypeName(this); - } - - // -}; - -// -// Class ... -class XCX121XDELTAHelper : public XCBaseHelper -{ - // - // Public ... - public: - // - // Props ... - - // - // Constructors ... - XCX121XDELTAHelper() - : XCBaseHelper(_Symbol, _Period) - { - } - - // - // Deconstructor ... - ~XCX121XDELTAHelper() - { - // - mInputs.Clean(); - - // - Clean(deltaBuffer); - Clean(deltaMaBuffer); - Clean(deltaStateBuffer); - } - - // - // Tools ... - bool Init( - string symbol, // Trading Symbol - ENUM_TIMEFRAMES period, // Trading Period - X121XDELTAInputs &inputs // Inputs - ) - { - // - bool result = false; - - // - mSymbol = symbol; - mPeriod = period; - - // - result = inputs.IsValid(); - if (!result) - { - return result; - } - - // - ArraySetAsSeries(deltaBuffer, true); - ArraySetAsSeries(deltaMaBuffer, true); - ArraySetAsSeries(deltaStateBuffer, true); - - // - mInputs = inputs; - - // - mHandler = iCustom( - mSymbol, - mPeriod, - "x-saherelm.x121.xdelta", - // - // Inputs ... - // - // Market ... - "", - mInputs.maLength, - mInputs.maMethod, - // - // Presentation ... - "", - // - mInputs.startCalculationForLastBars, - mInputs.showDeltaLine, - mInputs.showDeltaHistogram, - mInputs.showDeltaMa - // - ); - result = mHandler != INVALID_HANDLE; - if (!result) - { - return result; - } - - // - return result; - } - - // - // Inputs ... - - // - X121XDELTAInputs GetInputs() - { - return mInputs; - } - - // - bool SetInputs( - X121XDELTAInputs &inputs // Configs - ) - { - // - return Init( - mSymbol, - mPeriod, - inputs - // - ); - } - - // - // Readers ... - - // - // Bullish ... - - // - double GetDelta( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(deltaBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return deltaBuffer[barIndex]; - } - - // - int CopyDelta( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - deltaBuffer, - buffer, - forceClean - // - ); - } - - // - double GetDeltaState( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(deltaStateBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return deltaStateBuffer[barIndex]; - } - - // - int CopyDeltaState( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - deltaStateBuffer, - buffer, - forceClean - // - ); - } - - // - double GetDeltaMa( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(deltaMaBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return deltaMaBuffer[barIndex]; - } - - // - int CopyDeltaMa( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - deltaMaBuffer, - buffer, - forceClean - // - ); - } - - // - void Free() override - { - Cleanup(10); - } - - // - bool GetConditions( - X121XDELTAConditions &conditions, // - int barIndex = 0, // - int loopback = 5 // - ) - { - // - bool result = true; - - // - if (loopback < 5) - { - loopback = 5; - } - - // - conditions.Clean(); - - // - conditions.symbol = mSymbol; - conditions.period = mPeriod; - conditions.time = TimeCurrent(); - - // - int zIndex = barIndex; - int cIndex = zIndex + 1; - int pIndex = cIndex + 1; - int ppIndex = pIndex + 1; - - // - // Buffers ... - - // - CopyDelta( - zIndex, - loopback, - conditions.deltaBuffer // - ); - - // - CopyDeltaState( - zIndex, - loopback, - conditions.deltaStateBuffer // - ); - - // - CopyDeltaMa( - zIndex, - loopback, - conditions.deltaMaBuffer // - ); - - // - // Conditions ... - - // - int cIDX = 1; - int pIDX = cIDX + 1; - int pPIDX = pIDX + 1; - - // - bool isDeltaBullish = conditions.deltaBuffer[cIDX] > conditions.deltaBuffer[pIDX]; - bool isDeltaBullishP = conditions.deltaBuffer[pIDX] > conditions.deltaBuffer[pPIDX]; - bool isDeltaSwitchedToBullish = isDeltaBullish && - !isDeltaBullishP; - - // - bool isDeltaBearish = conditions.deltaBuffer[cIDX] < conditions.deltaBuffer[pIDX]; - bool isDeltaBearishP = conditions.deltaBuffer[pIDX] < conditions.deltaBuffer[pPIDX]; - bool isDeltaSwitchedToBearish = isDeltaBearish && - !isDeltaBearishP; - - // - bool isDeltaOverMa = conditions.deltaBuffer[cIDX] > conditions.deltaMaBuffer[cIDX]; - bool isDeltaOverMaP = conditions.deltaBuffer[pIDX] > conditions.deltaMaBuffer[pIDX]; - bool isDeltaCrossedOverMa = isDeltaOverMa && - !isDeltaOverMaP; - - // - bool isDeltaUnderMa = conditions.deltaBuffer[cIDX] < conditions.deltaMaBuffer[cIDX]; - bool isDeltaUnderMaP = conditions.deltaBuffer[pIDX] < conditions.deltaMaBuffer[pIDX]; - bool isDeltaCrossedUnderMa = isDeltaUnderMa && - !isDeltaUnderMaP; - - // - conditions.isDeltaBullish = isDeltaBullish; - conditions.isDeltaBearish = isDeltaBearish; - conditions.isDeltaSwitchedToBullish = isDeltaSwitchedToBullish; - conditions.isDeltaSwitchedToBearish = isDeltaSwitchedToBearish; - - // - conditions.isDeltaOverMa = isDeltaOverMa; - conditions.isDeltaUnderMa = isDeltaUnderMa; - conditions.isDeltaCrossedOverMa = isDeltaCrossedOverMa; - conditions.isDeltaCrossedUnderMa = isDeltaCrossedUnderMa; - - // - Cleanup(); - - // - return result; - } - - // - // Protected ... - protected: - // - // Private ... - private: - // - // Props ... - X121XDELTAInputs mInputs; // Inputs ... - - // - // Buffers ... - double deltaBuffer[]; - double deltaMaBuffer[]; - double deltaStateBuffer[]; - - // - void Calculate( - int barIndex = 0, - int maxRequiredBars = 100 // - ) - { - // - // Buffers ... - if (barIndex < 0) - { - barIndex = 0; - } - - // - CopyBuffer( - mHandler, - X121_XDELTA_VOLUME_LINE, - barIndex, - maxRequiredBars, - deltaBuffer - // - ); - - // - CopyBuffer( - mHandler, - X121_XDELTA_MA_LINE, - barIndex, - maxRequiredBars, - deltaMaBuffer - // - ); - - // - CopyBuffer( - mHandler, - X121_XDELTA_STATE_LINE, - barIndex, - maxRequiredBars, - deltaStateBuffer - // - ); - } - - // - void Cleanup( - int maxAllowed = 100 // - ) - { - // - CleanupArray( - deltaBuffer, - maxAllowed // - ); - - // - CleanupArray( - deltaMaBuffer, - maxAllowed // - ); - - // - CleanupArray( - deltaStateBuffer, - maxAllowed // - ); - } - - // -}; - -// diff --git a/Helpers/x-saherelm.x121.xdon.helper.mq5 b/Helpers/x-saherelm.x121.xdon.helper.mq5 deleted file mode 100644 index 9957b6f1..00000000 --- a/Helpers/x-saherelm.x121.xdon.helper.mq5 +++ /dev/null @@ -1,1202 +0,0 @@ -/////////////////////////////////////////////////////// -// -// SaherElm IT Center MQL5 Helper Class Library -// ---------------------------------------------- -// Name: XCX121XDONHelper -// Description: provides all Indicator -// Helper requirements ... -// -// -// Maintainer: -// ------------ -// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) -// -////////////////////////////////////////////////////// -// -// Global Properties ... -#property library -#property copyright "Copyright 2023, SaherElm IT Center" -#property link "https://www.saherelm.ir" -#property version "1.00" -#property strict - -// -// Imports ... -#include "../Classes/x-saherelm.x-helper.class.mq5" - -// -// Definitions ... - -// -// Definitions ... -enum ENUM_X121_XDON_BUFFERS -{ - // - X121_XDON_OPEN_UPPER_LINE = 0, - X121_XDON_OPEN_LOWER_LINE = 1, - X121_XDON_HIGH_UPPER_LINE = 2, - X121_XDON_HIGH_LOWER_LINE = 3, - X121_XDON_LOW_UPPER_LINE = 4, - X121_XDON_LOW_LOWER_LINE = 5, - X121_XDON_CLOSE_UPPER_LINE = 6, - X121_XDON_CLOSE_LOWER_LINE = 7, -}; - -// -// Input Models ... -struct X121XDONInputs -{ - // - // Props ... - - // - int donchainLength; // Donchain Length - - // - int startCalculationForLastBars; // Calculate Last n Bars - - // - bool showUpper; // Show Upper Band - bool showLower; // Show Lower Band - - // - bool showOpen; // Show Open - bool showHigh; // Show High - bool showClose; // Show Close - bool showLow; // Show Low - - // - // Constructor(s) ... - X121XDONInputs() - { - // - Clean(); - } - - // - // Tools ... - - // - // Clean ... - void Clean() - { - // - donchainLength = 0; - - // - startCalculationForLastBars = 0; - - // - showUpper = false; - showLower = false; - - // - showOpen = false; - showHigh = false; - showClose = false; - showLow = false; - - // - ZeroMemory(this); - } - - // - // Default ... - void Default() - { - // - donchainLength = 40; - - // - startCalculationForLastBars = 1000; - - // - showUpper = true; - showLower = true; - - // - showOpen = true; - showHigh = true; - showClose = true; - showLow = true; - } - - // - // Validate ... - bool IsValid() - { - // - bool result = false; - - // - result = - // - donchainLength > 0 - // - ; - - // - return result; - } - - // - // Retrieve MAx Length ... - int Max() - { - // - int result = 0; - - // - result = MathMax(1, donchainLength); - - // - return result; - } -}; - -// -// Conditions ... -struct X121XDONConditions -{ - // - // Common ... - string symbol; - ENUM_TIMEFRAMES period; - datetime time; - - // - // Buffers ... - double donOpenUpperBuffer[]; - double donOpenLowerBuffer[]; - double donHighUpperBuffer[]; - double donHighLowerBuffer[]; - double donLowUpperBuffer[]; - double donLowLowerBuffer[]; - double donCloseUpperBuffer[]; - double donCloseLowerBuffer[]; - - // - // Conditions ... - - // - // Constructor ... - X121XDONConditions() - { - Clean(); - } - - // - // Tools ... - - /** - * Cleaning Up ... - */ - void Clean() - { - // - // Commons ... - symbol = NULL; - period = NULL; - time = NULL; - - // - // Buffers ... - - // - Clean(donOpenUpperBuffer); - Clean(donOpenLowerBuffer); - Clean(donHighUpperBuffer); - Clean(donHighLowerBuffer); - Clean(donLowUpperBuffer); - Clean(donLowLowerBuffer); - Clean(donCloseUpperBuffer); - Clean(donCloseLowerBuffer); - - // - ArraySetAsSeries(donOpenUpperBuffer, true); - ArraySetAsSeries(donOpenLowerBuffer, true); - ArraySetAsSeries(donHighUpperBuffer, true); - ArraySetAsSeries(donHighLowerBuffer, true); - ArraySetAsSeries(donLowUpperBuffer, true); - ArraySetAsSeries(donLowLowerBuffer, true); - ArraySetAsSeries(donCloseUpperBuffer, true); - ArraySetAsSeries(donCloseLowerBuffer, true); - - // - // Conditions ... - - // - ZeroMemory(this); - } - - /** - * Generate Conditions Scores ... - * - * @param bullishScore: Double, Directional Scores Reference ... - * @param bearishScore: Double, Directional Scores Reference ... - */ - void GenerateScore( - double &bullishScore, - double &bearishScore // - ) - { - // - bullishScore = 0; - bearishScore = 0; - - // - // TODO: Implement if Required ... - } - - /** - * Generate Summary String for Represent Conditions State ... - * - * @param onlyCommons: Boolean, Just Generate Only Commons Conditions ... - * @param onlyConditions: Boolean, Just Generate Only Conditions ... - * @param includeScores: Boolean, Attach Scores Representations on Result ... - * @param ignoreFalseConditions: Boolean, Ignore False Conditions on Result ... - * @param separator: String, Separate Lines ... - * - * @return ( string ) - */ - string GenerateSummary( - bool onlyCommons = false, - bool onlyConditions = false, - bool includeScores = true, - bool ignoreFalseConditions = true, - string separator = "\n" // - ) - { - // - string result = NULL; - - // - double bullishScore = 0; - double bearishScore = 0; - GenerateScore( - bullishScore, - bearishScore // - ); - - // - string scoresStr = - // - "Scores: " + separator + - "---------------" + separator + - "Bullish: " + ToString(bullishScore) + separator + - "Bearish: " + ToString(bearishScore) + separator + - "" - // - ; - - // - string commonStr = GenerateSpecifiedCommonSummary( - this, - separator, - includeScores // - ); - - // - string conditionsStr = - // - // - "" - // - ; - - // - result = - // - "[" + GetTag() + "]" + separator + - (onlyConditions - ? "" - : commonStr) + - (!includeScores - ? "" - : scoresStr) + - " " + separator + - (onlyCommons - ? "" - : conditionsStr) + - "" - // - ; - - // - return result; - } - - /** - * Retrieve nique Tag Identifier ... - * - * @return ( string ) - */ - string GetTag() - { - return GetTypeName(this); - } - - // -}; - -// -// Class ... -class XCX121XDONHelper : public XCBaseHelper -{ - // - // Public ... - public: - // - // Props ... - - // - // Constructors ... - XCX121XDONHelper() - : XCBaseHelper(_Symbol, _Period) - { - } - - // - // Deconstructor ... - ~XCX121XDONHelper() - { - // - mInputs.Clean(); - - // - Clean(donOpenUpperBuffer); - Clean(donOpenLowerBuffer); - Clean(donHighUpperBuffer); - Clean(donHighLowerBuffer); - Clean(donLowUpperBuffer); - Clean(donLowLowerBuffer); - Clean(donCloseUpperBuffer); - Clean(donCloseLowerBuffer); - } - - // - // Tools ... - bool Init( - string symbol, // Trading Symbol - ENUM_TIMEFRAMES period, // Trading Period - X121XDONInputs &inputs // Inputs - ) - { - // - bool result = false; - - // - mSymbol = symbol; - mPeriod = period; - - // - result = inputs.IsValid(); - if (!result) - { - return result; - } - - // - ArraySetAsSeries(donOpenUpperBuffer, true); - ArraySetAsSeries(donOpenLowerBuffer, true); - ArraySetAsSeries(donHighUpperBuffer, true); - ArraySetAsSeries(donHighLowerBuffer, true); - ArraySetAsSeries(donLowUpperBuffer, true); - ArraySetAsSeries(donLowLowerBuffer, true); - ArraySetAsSeries(donCloseUpperBuffer, true); - ArraySetAsSeries(donCloseLowerBuffer, true); - - // - mInputs = inputs; - - // - mHandler = iCustom( - mSymbol, - mPeriod, - "x-saherelm.x121.xdon", - // - // Inputs ... - // - // Market ... - "", - mInputs.donchainLength, - // - // Presentation ... - "", - mInputs.startCalculationForLastBars, - // - mInputs.showUpper, - mInputs.showLower, - // - mInputs.showOpen, - mInputs.showHigh, - mInputs.showClose, - mInputs.showLow - // - ); - result = mHandler != INVALID_HANDLE; - if (!result) - { - return result; - } - - // - return result; - } - - // - // Inputs ... - - // - X121XDONInputs GetInputs() - { - return mInputs; - } - - // - bool SetInputs( - X121XDONInputs &inputs // Configs - ) - { - // - return Init( - mSymbol, - mPeriod, - inputs - // - ); - } - - // - // Readers ... - - // - // OPEN ... - - // - // UPPER ... - - // - double GetDonOpenUpper( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(donOpenUpperBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return donOpenUpperBuffer[barIndex]; - } - - // - int CopyDonOpenUpper( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - donOpenUpperBuffer, - buffer, - forceClean - // - ); - } - - // - // LOWER ... - - // - double GetDonOpenLower( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(donOpenLowerBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return donOpenLowerBuffer[barIndex]; - } - - // - int CopyDonOpenLower( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - donOpenLowerBuffer, - buffer, - forceClean - // - ); - } - - // - // CLOSE ... - - // - // UPPER ... - - // - double GetDonCloseUpper( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(donCloseUpperBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return donCloseUpperBuffer[barIndex]; - } - - // - int CopyDonCloseUpper( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - donCloseUpperBuffer, - buffer, - forceClean - // - ); - } - - // - // LOWER ... - - // - double GetDonCloseLower( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(donCloseLowerBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return donCloseLowerBuffer[barIndex]; - } - - // - int CopyDonCloseLower( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - donCloseLowerBuffer, - buffer, - forceClean - // - ); - } - - // - // HIGH ... - - // - // UPPER ... - - // - double GetDonHighUpper( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(donHighUpperBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return donHighUpperBuffer[barIndex]; - } - - // - int CopyDonHighUpper( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - donHighUpperBuffer, - buffer, - forceClean - // - ); - } - - // - // LOWER ... - - // - double GetDonHighLower( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(donHighLowerBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return donHighLowerBuffer[barIndex]; - } - - // - int CopyDonHighLower( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - donHighLowerBuffer, - buffer, - forceClean - // - ); - } - - // - // LOW ... - - // - // UPPER ... - - // - double GetDonLowUpper( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(donLowUpperBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return donLowUpperBuffer[barIndex]; - } - - // - int CopyDonLowUpper( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - donLowUpperBuffer, - buffer, - forceClean - // - ); - } - - // - // LOWER ... - - // - double GetDonLoweLower( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(donLowLowerBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return donLowLowerBuffer[barIndex]; - } - - // - int CopyDonLoweLower( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - donLowLowerBuffer, - buffer, - forceClean - // - ); - } - - // - void Free() override - { - Cleanup(10); - } - - // - bool GetConditions( - X121XDONConditions &conditions, // - int barIndex = 0, // - int loopback = 5 // - ) - { - // - bool result = true; - - // - if (loopback < 5) - { - loopback = 5; - } - - // - conditions.Clean(); - - // - conditions.symbol = mSymbol; - conditions.period = mPeriod; - conditions.time = TimeCurrent(); - - // - int zIndex = barIndex; - int cIndex = zIndex + 1; - int pIndex = cIndex + 1; - int ppIndex = pIndex + 1; - - // - // Buffers ... - - // - CopyDonOpenUpper( - zIndex, - loopback, - conditions.donOpenUpperBuffer // - ); - - // - CopyDonOpenLower( - zIndex, - loopback, - conditions.donOpenLowerBuffer // - ); - - // - CopyDonCloseUpper( - zIndex, - loopback, - conditions.donCloseUpperBuffer // - ); - - // - CopyDonCloseLower( - zIndex, - loopback, - conditions.donCloseLowerBuffer // - ); - - // - CopyDonHighUpper( - zIndex, - loopback, - conditions.donHighUpperBuffer // - ); - - // - CopyDonHighLower( - zIndex, - loopback, - conditions.donHighLowerBuffer // - ); - - // - CopyDonLowUpper( - zIndex, - loopback, - conditions.donLowUpperBuffer // - ); - - // - CopyDonLoweLower( - zIndex, - loopback, - conditions.donLowLowerBuffer // - ); - - // - // Conditions ... - - // - int cIDX = 1; - int pIDX = cIDX + 1; - - // - Cleanup(); - - // - return result; - } - - // - // Protected ... - protected: - // - // Private ... - private: - // - // Props ... - X121XDONInputs mInputs; // Inputs ... - - // - // Buffers ... - double donLowUpperBuffer[]; - double donLowLowerBuffer[]; - double donOpenUpperBuffer[]; - double donOpenLowerBuffer[]; - double donHighUpperBuffer[]; - double donHighLowerBuffer[]; - double donCloseUpperBuffer[]; - double donCloseLowerBuffer[]; - - // - void Calculate( - int barIndex = 0, - int maxRequiredBars = 100 // - ) - { - // - // Buffers ... - if (barIndex < 0) - { - barIndex = 0; - } - - // - // Upper ... - CopyBuffer( - mHandler, - X121_XDON_OPEN_UPPER_LINE, - barIndex, - maxRequiredBars, - donOpenUpperBuffer - // - ); - - // - // Lower ... - CopyBuffer( - mHandler, - X121_XDON_OPEN_LOWER_LINE, - barIndex, - maxRequiredBars, - donOpenLowerBuffer - // - ); - - // - // CLOSE ... - - // - // Upper ... - CopyBuffer( - mHandler, - X121_XDON_CLOSE_UPPER_LINE, - barIndex, - maxRequiredBars, - donCloseUpperBuffer - // - ); - - // - // Lower ... - CopyBuffer( - mHandler, - X121_XDON_CLOSE_LOWER_LINE, - barIndex, - maxRequiredBars, - donCloseLowerBuffer - // - ); - - // - // HIGH ... - - // - // Upper ... - CopyBuffer( - mHandler, - X121_XDON_HIGH_UPPER_LINE, - barIndex, - maxRequiredBars, - donHighUpperBuffer - // - ); - - // - // Lower ... - CopyBuffer( - mHandler, - X121_XDON_HIGH_LOWER_LINE, - barIndex, - maxRequiredBars, - donHighLowerBuffer - // - ); - - // - // LOW ... - - // - // Upper ... - CopyBuffer( - mHandler, - X121_XDON_LOW_UPPER_LINE, - barIndex, - maxRequiredBars, - donLowUpperBuffer - // - ); - - // - // Lower ... - CopyBuffer( - mHandler, - X121_XDON_LOW_LOWER_LINE, - barIndex, - maxRequiredBars, - donLowLowerBuffer - // - ); - } - - // - void Cleanup( - int maxAllowed = 100 // - ) - { - // - CleanupArray( - donOpenUpperBuffer, - maxAllowed // - ); - - // - CleanupArray( - donOpenLowerBuffer, - maxAllowed // - ); - - // - CleanupArray( - donHighUpperBuffer, - maxAllowed // - ); - - // - CleanupArray( - donHighLowerBuffer, - maxAllowed // - ); - - // - CleanupArray( - donLowUpperBuffer, - maxAllowed // - ); - - // - CleanupArray( - donLowLowerBuffer, - maxAllowed // - ); - - // - CleanupArray( - donCloseUpperBuffer, - maxAllowed // - ); - - // - CleanupArray( - donCloseLowerBuffer, - maxAllowed // - ); - - // - } - - // -}; - -// -// Tools ... \ No newline at end of file diff --git a/Helpers/x-saherelm.x121.xhk.helper.mq5 b/Helpers/x-saherelm.x121.xhk.helper.mq5 deleted file mode 100644 index 0f66528f..00000000 --- a/Helpers/x-saherelm.x121.xhk.helper.mq5 +++ /dev/null @@ -1,1490 +0,0 @@ -/////////////////////////////////////////////////////// -// -// SaherElm IT Center MQL5 Helper Class Library -// ---------------------------------------------- -// Name: XCX121XHKHelper -// Description: provides all Indicator -// Helper requirements ... -// -// -// Maintainer: -// ------------ -// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) -// -////////////////////////////////////////////////////// -// -// Global Properties ... -#property library -#property copyright "Copyright 2023, SaherElm IT Center" -#property link "https://www.saherelm.ir" -#property version "1.00" -#property strict - -// -// Imports ... -#include "../Classes/x-saherelm.x-helper.class.mq5" - -// -// Definitions ... - -// -// Definitions ... -enum ENUM_X121_XHK_BUFFERS -{ - // - X121_XHK_RAW_OPEN_LINE = 0, - X121_XHK_RAW_HIGH_LINE = 1, - X121_XHK_RAW_LOW_LINE = 2, - X121_XHK_RAW_CLOSE_LINE = 3, - // - X121_XHK_SM_OPEN_LINE = 5, - X121_XHK_SM_HIGH_LINE = 6, - X121_XHK_SM_LOW_LINE = 7, - X121_XHK_SM_CLOSE_LINE = 8, -}; - -// -// Input Models ... -struct X121XHKInputs -{ - // - // Props ... - int xhkSmoothingLength; // Length - ENUM_X_MA_METHOD xhkSmoothingMode; // Smoothing Method - bool xhkIgnoreSmoothingShadows; // Ignore Smoothed Bar Shadows - int startCalculationForLastBars; // Calculate Last n Bars - bool drawRawXHKCandles; // Draw Raw Candle - bool drawSmoothedXHKCandles; // Draw Smoothed Candle - - // - // Constructor(s) ... - X121XHKInputs() - { - // - Clean(); - } - - // - // Tools ... - - // - // Clean ... - void Clean() - { - // - xhkSmoothingLength = 0; - xhkSmoothingMode = X_MA_MODE_NONE; - xhkIgnoreSmoothingShadows = false; - startCalculationForLastBars = 1500; - drawRawXHKCandles = false; - drawSmoothedXHKCandles = false; - - // - ZeroMemory(this); - } - - // - // Default ... - void Default() - { - // - xhkSmoothingLength = 14; - xhkSmoothingMode = X_MA_MODE_EMA; - xhkIgnoreSmoothingShadows = false; - startCalculationForLastBars = 1500; - drawRawXHKCandles = true; - drawSmoothedXHKCandles = true; - } - - // - // Validate ... - bool IsValid() - { - // - bool result = false; - - // - result = - // - xhkSmoothingLength > 0 - // - ; - - // - return result; - } - - // - // Retrieve MAx Length ... - int Max() - { - // - int result = 0; - - // - result = MathMax(0, xhkSmoothingLength); - - // - return result; - } -}; - -// -// Conditions ... -struct X121XHKConditions -{ - // - // Common ... - string symbol; - ENUM_TIMEFRAMES period; - datetime time; - - // - // Buffers ... - - // - double xhkRawOpenBuffer[]; - double xhkRawHighBuffer[]; - double xhkRawLowBuffer[]; - double xhkRawCloseBuffer[]; - - // - double xhkSMOpenBuffer[]; - double xhkSMHighBuffer[]; - double xhkSMLowBuffer[]; - double xhkSMCloseBuffer[]; - - // - // Conditions ... - - // - bool isSMHKBullish; - bool isRawHKBullish; - bool isSMHKSwitchedToBullish; - bool isRawHKSwitchedToBullish; - - // - bool isSMHKBearish; - bool isRawHKBearish; - bool isSMHKSwitchedToBearish; - bool isRawHKSwitchedToBearish; - - // - bool isClosedOverSMHK; - bool isClosedUnderSMHK; - bool isClosedOverRawHK; - bool isClosedUnderRawHK; - - // - bool isRawHKClosedOverSMHK; - bool isRawHKClosedUnderSMHK; - - // - // Constructor ... - X121XHKConditions() - { - Clean(); - } - - // - // Tools ... - - /** - * Cleaning Up ... - */ - void Clean() - { - // - // Commons ... - symbol = NULL; - period = NULL; - time = NULL; - - // - // Buffers ... - - // - Clean(xhkRawOpenBuffer); - Clean(xhkRawHighBuffer); - Clean(xhkRawLowBuffer); - Clean(xhkRawCloseBuffer); - Clean(xhkSMOpenBuffer); - Clean(xhkSMHighBuffer); - Clean(xhkSMLowBuffer); - Clean(xhkSMCloseBuffer); - - // - ArraySetAsSeries(xhkRawOpenBuffer, true); - ArraySetAsSeries(xhkRawHighBuffer, true); - ArraySetAsSeries(xhkRawLowBuffer, true); - ArraySetAsSeries(xhkRawCloseBuffer, true); - ArraySetAsSeries(xhkSMOpenBuffer, true); - ArraySetAsSeries(xhkSMHighBuffer, true); - ArraySetAsSeries(xhkSMLowBuffer, true); - ArraySetAsSeries(xhkSMCloseBuffer, true); - - // - // Conditions ... - - // - isSMHKBullish = false; - isRawHKBullish = false; - isSMHKSwitchedToBullish = false; - isRawHKSwitchedToBullish = false; - - // - isSMHKBearish = false; - isRawHKBearish = false; - isSMHKSwitchedToBearish = false; - isRawHKSwitchedToBearish = false; - - // - isClosedOverSMHK = false; - isClosedUnderSMHK = false; - isClosedOverRawHK = false; - isClosedUnderRawHK = false; - - // - isRawHKClosedOverSMHK = false; - isRawHKClosedUnderSMHK = false; - - // - ZeroMemory(this); - } - - /** - * Generate Conditions Scores ... - * - * @param bullishScore: Double, Directional Scores Reference ... - * @param bearishScore: Double, Directional Scores Reference ... - */ - void GenerateScore( - double &bullishScore, - double &bearishScore // - ) - { - // - bullishScore = 0; - bearishScore = 0; - - // - double score = 1; - double minScore = 0.5; - double highScore = 1.5; - - // - if (isSMHKBullish) - { - bullishScore += minScore; - } - if (isRawHKBullish) - { - bullishScore += minScore; - } - if (isClosedOverSMHK) - { - bullishScore += minScore; - } - if (isClosedOverRawHK) - { - bullishScore += minScore; - } - if (isRawHKClosedOverSMHK) - { - bullishScore += minScore; - } - if (isSMHKSwitchedToBullish) - { - bullishScore += highScore; - } - if (isRawHKSwitchedToBullish) - { - bullishScore += highScore; - } - - // - if (isSMHKBearish) - { - bearishScore += minScore; - } - if (isRawHKBearish) - { - bearishScore += minScore; - } - if (isClosedUnderSMHK) - { - bearishScore += minScore; - } - if (isClosedUnderRawHK) - { - bearishScore += minScore; - } - if (isRawHKClosedUnderSMHK) - { - bearishScore += minScore; - } - if (isSMHKSwitchedToBearish) - { - bearishScore += highScore; - } - if (isRawHKSwitchedToBullish) - { - bearishScore += highScore; - } - } - - /** - * Generate Summary String for Represent Conditions State ... - * - * @param onlyCommons: Boolean, Just Generate Only Commons Conditions ... - * @param onlyConditions: Boolean, Just Generate Only Conditions ... - * @param includeScores: Boolean, Attach Scores Representations on Result ... - * @param ignoreFalseConditions: Boolean, Ignore False Conditions on Result ... - * @param separator: String, Separate Lines ... - * - * @return ( string ) - */ - string GenerateSummary( - bool onlyCommons = false, - bool onlyConditions = false, - bool includeScores = true, - bool ignoreFalseConditions = true, - string separator = "\n" // - ) - { - // - string result = NULL; - - // - double bullishScore = 0; - double bearishScore = 0; - GenerateScore( - bullishScore, - bearishScore // - ); - - // - string scoresStr = - // - "Scores: " + separator + - "---------------" + separator + - "Bullish: " + ToString(bullishScore) + separator + - "Bearish: " + ToString(bearishScore) + separator + - "" - // - ; - - // - string commonStr = GenerateSpecifiedCommonSummary( - this, - separator, - includeScores // - ); - - // - string conditionsStr = - // - "-----------------------" + separator + - "XHK: " + separator + - "-----------------------" + separator + - ToString("isSMHKBullish", isSMHKBullish, ignoreFalseConditions, separator) + - ToString("isRawHKBullish", isRawHKBullish, ignoreFalseConditions, separator) + - ToString("isSMHKSwitchedToBullish", isSMHKSwitchedToBullish, ignoreFalseConditions, separator) + - ToString("isRawHKSwitchedToBullish", isRawHKSwitchedToBullish, ignoreFalseConditions, separator) + - ToString("isSMHKBearish", isSMHKBearish, ignoreFalseConditions, separator) + - ToString("isRawHKBearish", isRawHKBearish, ignoreFalseConditions, separator) + - ToString("isSMHKSwitchedToBearish", isSMHKSwitchedToBearish, ignoreFalseConditions, separator) + - ToString("isRawHKSwitchedToBearish", isRawHKSwitchedToBearish, ignoreFalseConditions, separator) + - ToString("isClosedOverSMHK", isClosedOverSMHK, ignoreFalseConditions, separator) + - ToString("isClosedUnderSMHK", isClosedUnderSMHK, ignoreFalseConditions, separator) + - ToString("isClosedOverRawHK", isClosedOverRawHK, ignoreFalseConditions, separator) + - ToString("isClosedUnderRawHK", isClosedUnderRawHK, ignoreFalseConditions, separator) + - ToString("isRawHKClosedOverSMHK", isRawHKClosedOverSMHK, ignoreFalseConditions, separator) + - ToString("isRawHKClosedUnderSMHK", isRawHKClosedUnderSMHK, ignoreFalseConditions, separator) + - // - "" - // - ; - - // - result = - // - "[" + GetTag() + "]" + separator + - (onlyConditions - ? "" - : commonStr) + - (!includeScores - ? "" - : scoresStr) + - " " + separator + - (onlyCommons - ? "" - : conditionsStr) + - "" - // - ; - - // - return result; - } - - /** - * Retrieve nique Tag Identifier ... - * - * @return ( string ) - */ - string GetTag() - { - return GetTypeName(this); - } - - // -}; - -// -// Class ... -class XCX121XHKHelper : public XCBaseHelper -{ - // - // Public ... - public: - // - // Props ... - - // - // Constructors ... - XCX121XHKHelper() - : XCBaseHelper(_Symbol, _Period) - { - } - - // - // Deconstructor ... - ~XCX121XHKHelper() - { - // - Clean(xhkRawOpenBuffer); - Clean(xhkRawHighBuffer); - Clean(xhkRawLowBuffer); - Clean(xhkRawCloseBuffer); - Clean(xhkSMOpenBuffer); - Clean(xhkSMHighBuffer); - Clean(xhkSMLowBuffer); - Clean(xhkSMCloseBuffer); - - // - mInputs.Clean(); - } - - // - // Tools ... - bool Init( - string symbol, // Trading Symbol - ENUM_TIMEFRAMES period, // Trading Period - X121XHKInputs &inputs // Inputs - ) - { - // - bool result = false; - - // - mSymbol = symbol; - mPeriod = period; - - // - result = inputs.IsValid(); - if (!result) - { - return result; - } - - // - ArraySetAsSeries(xhkRawOpenBuffer, true); - ArraySetAsSeries(xhkRawHighBuffer, true); - ArraySetAsSeries(xhkRawLowBuffer, true); - ArraySetAsSeries(xhkRawCloseBuffer, true); - ArraySetAsSeries(xhkSMOpenBuffer, true); - ArraySetAsSeries(xhkSMHighBuffer, true); - ArraySetAsSeries(xhkSMLowBuffer, true); - ArraySetAsSeries(xhkSMCloseBuffer, true); - - // - mInputs = inputs; - - // - mHandler = iCustom( - mSymbol, - mPeriod, - "x-saherelm.x121.xhk", - // - // Inputs ... - // - // Market ... - "", - mInputs.xhkSmoothingLength, - mInputs.xhkSmoothingMode, - mInputs.xhkIgnoreSmoothingShadows, - // - // Presentation ... - "", - mInputs.startCalculationForLastBars, - mInputs.drawRawXHKCandles, - mInputs.drawSmoothedXHKCandles - // - ); - result = mHandler != INVALID_HANDLE; - if (!result) - { - return result; - } - - // - return result; - } - - // - // Inputs ... - - // - X121XHKInputs GetInputs() - { - return mInputs; - } - - // - bool SetInputs( - X121XHKInputs &inputs // Configs - ) - { - // - return Init( - mSymbol, - mPeriod, - inputs - // - ); - } - - // - // Readers ... - - // - double GetRawHKOpen( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(xhkRawOpenBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return xhkRawOpenBuffer[barIndex]; - } - - // - int CopyRawHKOpen( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - xhkRawOpenBuffer, - buffer, - forceClean - // - ); - } - - // - double GetRawHKHigh( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(xhkRawHighBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return xhkRawHighBuffer[barIndex]; - } - - // - int CopyRawHKHigh( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - xhkRawHighBuffer, - buffer, - forceClean - // - ); - } - - // - double GetRawHKLow( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(xhkRawLowBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return xhkRawLowBuffer[barIndex]; - } - - // - int CopyRawHKLow( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - xhkRawLowBuffer, - buffer, - forceClean - // - ); - } - - // - double GetRawHKClose( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(xhkRawCloseBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return xhkRawCloseBuffer[barIndex]; - } - - // - int CopyRawHKClose( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - xhkRawCloseBuffer, - buffer, - forceClean - // - ); - } - - // - double GetSMHKOpen( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(xhkSMOpenBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return xhkSMOpenBuffer[barIndex]; - } - - // - int CopySMHKOpen( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - xhkSMOpenBuffer, - buffer, - forceClean - // - ); - } - - // - double GetSMHKHigh( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(xhkSMHighBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return xhkSMHighBuffer[barIndex]; - } - - // - int CopySMHKHigh( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - xhkSMHighBuffer, - buffer, - forceClean - // - ); - } - - // - double GetSMHKLow( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(xhkSMLowBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return xhkSMLowBuffer[barIndex]; - } - - // - int CopySMHKLow( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - xhkSMLowBuffer, - buffer, - forceClean - // - ); - } - - // - double GetSMHKClose( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(xhkSMCloseBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return xhkSMCloseBuffer[barIndex]; - } - - // - int CopySMHKClose( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - xhkSMCloseBuffer, - buffer, - forceClean - // - ); - } - - // - bool GetRawHKAsXOHCL( - int barIndex, // Bar Index - XOHCL &bar // Bar Result - ) - { - // - bool result = false; - - // - bar.Clean(); - - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - result = bar.Init( - GetSymbol(), - GetPeriod(), - barIndex // - ); - if (!result) - { - return result; - } - - // - bar.open = xhkRawOpenBuffer[0]; - bar.high = xhkRawHighBuffer[0]; - bar.low = xhkRawLowBuffer[0]; - bar.close = xhkRawCloseBuffer[0]; - - // - return result; - } - - // - bool GetSMHKAsXOHCL( - int barIndex, // Bar Index - XOHCL &bar // Bar Result - ) - { - // - bool result = false; - - // - bar.Clean(); - - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - result = bar.Init( - GetSymbol(), - GetPeriod(), - barIndex // - ); - if (!result) - { - return result; - } - - // - bar.open = xhkSMOpenBuffer[0]; - bar.high = xhkSMHighBuffer[0]; - bar.low = xhkSMLowBuffer[0]; - bar.close = xhkSMCloseBuffer[0]; - - // - return result; - } - - // - void Free() override - { - Cleanup(10); - } - - // - bool GetConditions( - X121XHKConditions &conditions, // - int barIndex = 0, // - int loopback = 5 // - ) - { - // - bool result = true; - - // - if (loopback < 5) - { - loopback = 5; - } - - // - conditions.Clean(); - - // - conditions.symbol = mSymbol; - conditions.period = mPeriod; - conditions.time = TimeCurrent(); - - // - int zIndex = barIndex; - int cIndex = zIndex + 1; - int pIndex = cIndex + 1; - int ppIndex = pIndex + 1; - - // - XOHCL zBar; - result = zBar.Init( - mSymbol, - mPeriod, - zIndex // - ); - if (!result) - { - return result; - } - - // - XOHCL cBar; - result = cBar.Init( - mSymbol, - mPeriod, - cIndex // - ); - if (!result) - { - return result; - } - - // - XOHCL pBar; - result = pBar.Init( - mSymbol, - mPeriod, - pIndex // - ); - if (!result) - { - return result; - } - - // - // Buffers ... - - // - CopyRawHKOpen( - zIndex, - loopback, - conditions.xhkRawOpenBuffer // - ); - - // - CopyRawHKHigh( - zIndex, - loopback, - conditions.xhkRawHighBuffer // - ); - - // - CopyRawHKLow( - zIndex, - loopback, - conditions.xhkRawLowBuffer // - ); - - // - CopyRawHKClose( - zIndex, - loopback, - conditions.xhkRawCloseBuffer // - ); - - // - CopySMHKOpen( - zIndex, - loopback, - conditions.xhkSMOpenBuffer // - ); - - // - CopySMHKHigh( - zIndex, - loopback, - conditions.xhkSMHighBuffer // - ); - - // - CopySMHKLow( - zIndex, - loopback, - conditions.xhkSMLowBuffer // - ); - - // - CopySMHKClose( - zIndex, - loopback, - conditions.xhkSMCloseBuffer // - ); - - // - // Conditions ... - - // - int cIDX = 1; - int pIDX = cIDX + 1; - - // - double smHKLow = conditions.xhkSMLowBuffer[cIDX]; - double smHKHigh = conditions.xhkSMHighBuffer[cIDX]; - double smHKOpen = conditions.xhkSMOpenBuffer[cIDX]; - double smHKClose = conditions.xhkSMCloseBuffer[cIDX]; - - // - double smHKLowPrev = conditions.xhkSMLowBuffer[pIDX]; - double smHKHighPrev = conditions.xhkSMHighBuffer[pIDX]; - double smHKOpenPrev = conditions.xhkSMOpenBuffer[pIDX]; - double smHKClosePrev = conditions.xhkSMCloseBuffer[pIDX]; - - // - double rawHKLow = conditions.xhkRawLowBuffer[cIDX]; - double rawHKHigh = conditions.xhkRawHighBuffer[cIDX]; - double rawHKOpen = conditions.xhkRawOpenBuffer[cIDX]; - double rawHKClose = conditions.xhkRawCloseBuffer[cIDX]; - - // - double rawHKLowPrev = conditions.xhkRawLowBuffer[pIDX]; - double rawHKHighPrev = conditions.xhkRawHighBuffer[pIDX]; - double rawHKOpenPrev = conditions.xhkRawOpenBuffer[pIDX]; - double rawHKClosePrev = conditions.xhkRawCloseBuffer[pIDX]; - - // - double smHKUp = MathMax(smHKOpen, smHKClose); - double smHKUpPrev = MathMax(smHKOpenPrev, smHKClosePrev); - - // - double smHKDown = MathMin(smHKOpen, smHKClose); - double smHKDownPrev = MathMin(smHKOpenPrev, smHKClosePrev); - - // - double rawHKUp = MathMax(rawHKOpen, rawHKClose); - double rawHKUpPrev = MathMax(rawHKOpenPrev, rawHKClosePrev); - - // - double rawHKDown = MathMin(rawHKOpen, rawHKClose); - double rawHKDownPrev = MathMin(rawHKOpenPrev, rawHKClosePrev); - - // - XOHCL rawHKCBar; - bool hasRawHKBar = GetRawHKAsXOHCL( - cIndex, - rawHKCBar // - ); - - // - // - // - - // - bool isSMHKBullish = smHKOpen < smHKClose; - bool isSMHKBullishPrev = smHKOpenPrev < smHKClosePrev; - - // - bool isRawHKBullish = rawHKOpen < rawHKClose; - bool isRawHKBullishPrev = rawHKOpenPrev < rawHKClosePrev; - - // - bool isSMHKSwitchedToBullish = isSMHKBullish && - !isSMHKBullishPrev; - bool isRawHKSwitchedToBullish = isRawHKBullish && - !isRawHKBullishPrev; - - // - bool isSMHKBearish = smHKOpen > smHKClose; - bool isSMHKBearishPrev = smHKOpenPrev > smHKClosePrev; - - // - bool isRawHKBearish = rawHKOpen > rawHKClose; - bool isRawHKBearishPrev = rawHKOpenPrev > rawHKClosePrev; - - // - bool isSMHKSwitchedToBearish = isSMHKBearish && - !isSMHKBearishPrev; - bool isRawHKSwitchedToBearish = isRawHKBearish && - !isRawHKBearishPrev; - - // - bool isClosedOverSMHK = cBar.close > smHKUp; - bool isClosedUnderSMHK = cBar.close < smHKDown; - - // - bool isClosedOverRawHK = cBar.close > rawHKUp; - bool isClosedUnderRawHK = cBar.close < rawHKDown; - - // - bool isRawHKClosedOverSMHK = rawHKClose > smHKUp; - bool isRawHKClosedUnderSMHK = rawHKClose < smHKDown; - - // - conditions.isSMHKBullish = isSMHKBullish; - conditions.isRawHKBullish = isRawHKBullish; - conditions.isSMHKSwitchedToBullish = isSMHKSwitchedToBullish; - conditions.isRawHKSwitchedToBullish = isRawHKSwitchedToBullish; - conditions.isSMHKBearish = isSMHKBearish; - conditions.isRawHKBearish = isRawHKBearish; - conditions.isSMHKSwitchedToBearish = isSMHKSwitchedToBearish; - conditions.isRawHKSwitchedToBearish = isRawHKSwitchedToBearish; - conditions.isClosedOverSMHK = isClosedOverSMHK; - conditions.isClosedUnderSMHK = isClosedUnderSMHK; - conditions.isClosedOverRawHK = isClosedOverRawHK; - conditions.isClosedUnderRawHK = isClosedUnderRawHK; - conditions.isRawHKClosedOverSMHK = isRawHKClosedOverSMHK; - conditions.isRawHKClosedUnderSMHK = isRawHKClosedUnderSMHK; - - // - Cleanup(); - - // - zBar.Clean(); - cBar.Clean(); - pBar.Clean(); - - // - rawHKCBar.Clean(); - - // - return result; - } - - // - // Protected ... - protected: - // - // Private ... - private: - // - // Props ... - X121XHKInputs mInputs; // Inputs ... - - // - // Buffers ... - double xhkRawOpenBuffer[]; - double xhkRawHighBuffer[]; - double xhkRawLowBuffer[]; - double xhkRawCloseBuffer[]; - double xhkSMOpenBuffer[]; - double xhkSMHighBuffer[]; - double xhkSMLowBuffer[]; - double xhkSMCloseBuffer[]; - - // - void Calculate( - int barIndex = 0, - int maxRequiredBars = 100 // - ) - { - // - // Buffers ... - if (barIndex < 0) - { - barIndex = 0; - } - - // - // RAW Open ... - CopyBuffer( - mHandler, - X121_XHK_RAW_OPEN_LINE, - barIndex, - maxRequiredBars, - xhkRawOpenBuffer - // - ); - - // - // RAW High ... - CopyBuffer( - mHandler, - X121_XHK_RAW_HIGH_LINE, - barIndex, - maxRequiredBars, - xhkRawHighBuffer - // - ); - - // - // RAW Low ... - CopyBuffer( - mHandler, - X121_XHK_RAW_LOW_LINE, - barIndex, - maxRequiredBars, - xhkRawLowBuffer - // - ); - - // - // RAW Close ... - CopyBuffer( - mHandler, - X121_XHK_RAW_CLOSE_LINE, - barIndex, - maxRequiredBars, - xhkRawCloseBuffer - // - ); - - // - // SM Open ... - CopyBuffer( - mHandler, - X121_XHK_SM_OPEN_LINE, - barIndex, - maxRequiredBars, - xhkSMOpenBuffer - // - ); - - // - // SM High ... - CopyBuffer( - mHandler, - X121_XHK_SM_HIGH_LINE, - barIndex, - maxRequiredBars, - xhkSMHighBuffer - // - ); - - // - // SM Low ... - CopyBuffer( - mHandler, - X121_XHK_SM_LOW_LINE, - barIndex, - maxRequiredBars, - xhkSMLowBuffer - // - ); - - // - // SM Close ... - CopyBuffer( - mHandler, - X121_XHK_SM_CLOSE_LINE, - barIndex, - maxRequiredBars, - xhkSMCloseBuffer - // - ); - } - - // - void Cleanup( - int maxAllowed = 100 // - ) - { - // - CleanupArray( - xhkRawOpenBuffer, - maxAllowed // - ); - - // - CleanupArray( - xhkRawHighBuffer, - maxAllowed // - ); - - // - CleanupArray( - xhkRawLowBuffer, - maxAllowed // - ); - - // - CleanupArray( - xhkRawCloseBuffer, - maxAllowed // - ); - - // - CleanupArray( - xhkSMOpenBuffer, - maxAllowed // - ); - - // - CleanupArray( - xhkSMHighBuffer, - maxAllowed // - ); - - // - CleanupArray( - xhkSMLowBuffer, - maxAllowed // - ); - - // - CleanupArray( - xhkSMCloseBuffer, - maxAllowed // - ); - - // - } - - // -}; - -// -// Tools ... \ No newline at end of file diff --git a/Helpers/x-saherelm.x121.xich.helper.mq5 b/Helpers/x-saherelm.x121.xich.helper.mq5 deleted file mode 100644 index d57234ab..00000000 --- a/Helpers/x-saherelm.x121.xich.helper.mq5 +++ /dev/null @@ -1,1107 +0,0 @@ -/////////////////////////////////////////////////////// -// -// SaherElm IT Center MQL5 Helper Class Library -// ---------------------------------------------- -// Name: XCX121XICHHelper -// Description: provides all Indicator -// Helper requirements ... -// -// -// Maintainer: -// ------------ -// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) -// -////////////////////////////////////////////////////// -// -// Global Properties ... -#property library -#property copyright "Copyright 2023, SaherElm IT Center" -#property link "https://www.saherelm.ir" -#property version "1.00" -#property strict - -// -// Imports ... -#include "../Classes/x-saherelm.x-helper.class.mq5" - -// -// Definitions ... - -// -// Definitions ... -enum ENUM_X121_XICH_BUFFERS -{ - X121_XICH_TENKANSEN_LINE = 0, - X121_XICH_KIJUNSEN_LINE = 1, - X121_XICH_CHIKOUSPAN_LINE = 2, - X121_XICH_SENKOUSPANA_LINE = 3, - X121_XICH_SENKOUSPANB_LINE = 4, -}; - -// -// Input Models ... -struct X121XICHInputs -{ - // - // Props ... - - // - // Market ... - ENUM_X_PRICE chikouSpanMode; // ChikouSpan Mode - int tenkanSenLength; // TenkanSen Length - ENUM_X_BOUNDARY_PRICE tenkanSenMode; // TencanSen Mode - int kijunSenLength; // KijunSen Length - ENUM_X_BOUNDARY_PRICE kijunSenMode; // KijunSen Mode - int senkouSpanBLength; // SenkouSpan B Length - ENUM_X_BOUNDARY_PRICE senkouSpanBMode; // SenkouSpan B Mode - - // - // Presentation ... - int startCalculationForLastBars; // Calculate Last n Bars - bool shiftKumo; // Shift Kumo - bool showTenkanSen; // Show TenkanSen - bool showKijunSen; // Show KijunSen - bool showChikouSpan; // Show ChikouSpan - bool showSenkouSpanA; // Show Senkou Span A - bool showSenkouSpanB; // Show Senkou Span B - bool showKumo; // Show Kumo - - // - // Constructor(s) ... - X121XICHInputs() - { - Clean(); - } - - // - // Tools ... - - // - // Clean ... - void Clean() - { - // - // Market ... - chikouSpanMode = X_PRICE_NONE; // ChikouSpan Mode - tenkanSenLength = 0; // TenkanSen Length - tenkanSenMode = X_BOUNDARY_PRICE_NONE; // TencanSen Mode - kijunSenLength = 0; // KijunSen Length - kijunSenMode = X_BOUNDARY_PRICE_NONE; // KijunSen Mode - senkouSpanBLength = 0; // SenkouSpan B Length - senkouSpanBMode = X_BOUNDARY_PRICE_NONE; // SenkouSpan B Mode - - // - // Presentation ... - startCalculationForLastBars = 0; // Calculate Last n Bars - shiftKumo = false; // Shift Kumo - showTenkanSen = false; // Show TenkanSen - showKijunSen = false; // Show KijunSen - showChikouSpan = false; // Show ChikouSpan - showSenkouSpanA = false; // Show Senkou Span A - showSenkouSpanB = false; // Show Senkou Span B - showKumo = false; // Show Kumo - - // - ZeroMemory(this); - } - - // - // Default ... - void Default() - { - // - // Market ... - chikouSpanMode = X_PRICE_CLOSE; // ChikouSpan Mode - tenkanSenLength = 9; // TenkanSen Length - tenkanSenMode = X_BOUNDARY_PRICE_HIGH_LOW; // TencanSen Mode - kijunSenLength = 26; // KijunSen Length - kijunSenMode = X_BOUNDARY_PRICE_HIGH_LOW; // KijunSen Mode - senkouSpanBLength = 52; // SenkouSpan B Length - senkouSpanBMode = X_BOUNDARY_PRICE_HIGH_LOW; // SenkouSpan B Mode - - // - // Presentation ... - startCalculationForLastBars = 1000; // Calculate Last n Bars - shiftKumo = true; // Shift Kumo - showTenkanSen = true; // Show TenkanSen - showKijunSen = true; // Show KijunSen - showChikouSpan = true; // Show ChikouSpan - showSenkouSpanA = true; // Show Senkou Span A - showSenkouSpanB = true; // Show Senkou Span B - showKumo = true; // Show Kumo - } - - // - // Validate ... - bool IsValid() - { - // - bool result = false; - - // - result = - // - kijunSenLength > 0 && - tenkanSenLength > 0 && - senkouSpanBLength > 0 && - IsValid(kijunSenMode) && - IsValid(tenkanSenMode) && - IsValid(chikouSpanMode) && - IsValid(senkouSpanBMode) - // - ; - - // - return result; - } - - // - // Retrieve MAx Length ... - int Max() - { - // - int result = 0; - - // - result = MathMax(kijunSenLength, tenkanSenLength); - result = MathMax(result, senkouSpanBLength); - - // - return result; - } -}; - -// -// Conditions ... -struct X121XICHConditions -{ - // - // Common ... - string symbol; - ENUM_TIMEFRAMES period; - datetime time; - - // - // Buffers ... - - // - double kijunSenBuffer[]; - double tenkanSenBuffer[]; - double chikouSpanBuffer[]; - double senkouSpanABuffer[]; - double senkouSpanBBuffer[]; - - // - // Conditions ... - - // - bool isTenkanSenOverKijunSen; - bool isTenkanSenUnderKijunSen; - - // - bool isTenkanSenCrossedOverKijunSen; - bool isTenkanSenCrossedUnderKijunSen; - - // - bool isSenkouSpanAOverB; - bool isSenkouSpanAUnderB; - - // - bool isSenkouSpanACrossedOverB; - bool isSenkouSpanACrossedUnderB; - - // - // Constructor ... - X121XICHConditions() - { - Clean(); - } - - // - // Tools ... - - /** - * Cleaning Up ... - */ - void Clean() - { - // - // Commons ... - symbol = NULL; - period = NULL; - time = NULL; - - // - // Buffers ... - - // - Clean(kijunSenBuffer); - Clean(tenkanSenBuffer); - Clean(chikouSpanBuffer); - Clean(senkouSpanABuffer); - Clean(senkouSpanBBuffer); - - // - ArraySetAsSeries(kijunSenBuffer, true); - ArraySetAsSeries(tenkanSenBuffer, true); - ArraySetAsSeries(chikouSpanBuffer, true); - ArraySetAsSeries(senkouSpanABuffer, true); - ArraySetAsSeries(senkouSpanBBuffer, true); - - // - // Conditions ... - - // - isTenkanSenOverKijunSen = false; - isTenkanSenUnderKijunSen = false; - - // - isTenkanSenCrossedOverKijunSen = false; - isTenkanSenCrossedUnderKijunSen = false; - - // - isSenkouSpanAOverB = false; - isSenkouSpanAUnderB = false; - - // - isSenkouSpanACrossedOverB = false; - isSenkouSpanACrossedUnderB = false; - - // - ZeroMemory(this); - } - - /** - * Generate Conditions Scores ... - * - * @param bullishScore: Double, Directional Scores Reference ... - * @param bearishScore: Double, Directional Scores Reference ... - */ - void GenerateScore( - double &bullishScore, - double &bearishScore // - ) - { - // - bullishScore = 0; - bearishScore = 0; - - // - double score = 1; - double minScore = 0.5; - double highScore = 1.5; - - // - if (isSenkouSpanAOverB) - { - bullishScore += minScore; - } - if (isTenkanSenOverKijunSen) - { - bullishScore += minScore; - } - if (isSenkouSpanACrossedOverB) - { - bullishScore += highScore; - } - if (isTenkanSenCrossedOverKijunSen) - { - bullishScore += highScore; - } - - // - if (isSenkouSpanAUnderB) - { - bearishScore += minScore; - } - if (isTenkanSenUnderKijunSen) - { - bearishScore += minScore; - } - if (isSenkouSpanACrossedUnderB) - { - bearishScore += highScore; - } - if (isTenkanSenCrossedUnderKijunSen) - { - bearishScore += highScore; - } - } - - /** - * Generate Summary String for Represent Conditions State ... - * - * @param onlyCommons: Boolean, Just Generate Only Commons Conditions ... - * @param onlyConditions: Boolean, Just Generate Only Conditions ... - * @param includeScores: Boolean, Attach Scores Representations on Result ... - * @param ignoreFalseConditions: Boolean, Ignore False Conditions on Result ... - * @param separator: String, Separate Lines ... - * - * @return ( string ) - */ - string GenerateSummary( - bool onlyCommons = false, - bool onlyConditions = false, - bool includeScores = true, - bool ignoreFalseConditions = true, - string separator = "\n" // - ) - { - // - string result = NULL; - - // - double bullishScore = 0; - double bearishScore = 0; - GenerateScore( - bullishScore, - bearishScore // - ); - - // - string scoresStr = - // - "Scores: " + separator + - "---------------" + separator + - "Bullish: " + ToString(bullishScore) + separator + - "Bearish: " + ToString(bearishScore) + separator + - "" - // - ; - - // - string commonStr = GenerateSpecifiedCommonSummary( - this, - separator, - includeScores // - ); - - // - string conditionsStr = - // - "-----------------------" + separator + - "XICH: " + separator + - "-----------------------" + separator + - ToString("isTenkanSenOverKijunSen", isTenkanSenOverKijunSen, ignoreFalseConditions, separator) + - ToString("isTenkanSenUnderKijunSen", isTenkanSenUnderKijunSen, ignoreFalseConditions, separator) + - ToString("isTenkanSenCrossedOverKijunSen", isTenkanSenCrossedOverKijunSen, ignoreFalseConditions, separator) + - ToString("isTenkanSenCrossedUnderKijunSen", isTenkanSenCrossedUnderKijunSen, ignoreFalseConditions, separator) + - ToString("isSenkouSpanAOverB", isSenkouSpanAOverB, ignoreFalseConditions, separator) + - ToString("isSenkouSpanAUnderB", isSenkouSpanAUnderB, ignoreFalseConditions, separator) + - ToString("isSenkouSpanACrossedOverB", isSenkouSpanACrossedOverB, ignoreFalseConditions, separator) + - ToString("isSenkouSpanACrossedUnderB", isSenkouSpanACrossedUnderB, ignoreFalseConditions, separator) + - // - "" - // - ; - - // - result = - // - "[" + GetTag() + "]" + separator + - (onlyConditions - ? "" - : commonStr) + - (!includeScores - ? "" - : scoresStr) + - " " + separator + - (onlyCommons - ? "" - : conditionsStr) + - "" - // - ; - - // - return result; - } - - /** - * Retrieve nique Tag Identifier ... - * - * @return ( string ) - */ - string GetTag() - { - return GetTypeName(this); - } - - // -}; - -// -// Class ... -class XCX121XICHHelper : public XCBaseHelper -{ - // - // Public ... - public: - // - // Props ... - - // - // Constructors ... - XCX121XICHHelper() - : XCBaseHelper(_Symbol, _Period) - { - } - - // - // Deconstructor ... - ~XCX121XICHHelper() - { - // - Clean(kijunSenBuffer); - Clean(tenkanSenBuffer); - Clean(chikouSpanBuffer); - Clean(senkouSpanABuffer); - Clean(senkouSpanBBuffer); - - // - mInputs.Clean(); - } - - // - // Tools ... - bool Init( - string symbol, // Trading Symbol - ENUM_TIMEFRAMES period, // Trading Period - X121XICHInputs &inputs // Inputs - ) - { - // - bool result = false; - - // - mSymbol = symbol; - mPeriod = period; - - // - result = inputs.IsValid(); - if (!result) - { - return result; - } - - // - ArraySetAsSeries(kijunSenBuffer, true); - ArraySetAsSeries(tenkanSenBuffer, true); - ArraySetAsSeries(chikouSpanBuffer, true); - ArraySetAsSeries(senkouSpanABuffer, true); - ArraySetAsSeries(senkouSpanBBuffer, true); - - // - mInputs = inputs; - - // - mHandler = iCustom( - mSymbol, - mPeriod, - "x-saherelm.x121.xich", - // - // Inputs ... - // - // Market ... - "", - mInputs.chikouSpanMode, // ChikouSpan Mode - mInputs.tenkanSenLength, // TenkanSen Length - mInputs.tenkanSenMode, // TencanSen Mode - mInputs.kijunSenLength, // KijunSen Length - mInputs.kijunSenMode, // KijunSen Mode - mInputs.senkouSpanBLength, // SenkouSpan B Length - mInputs.senkouSpanBMode, // SenkouSpan B Mode - // - // Presentation ... - "", - mInputs.startCalculationForLastBars, // Calculate Last n Bars - mInputs.shiftKumo, // Shift Kumo - mInputs.showTenkanSen, // Show TenkanSen - mInputs.showKijunSen, // Show KijunSen - mInputs.showChikouSpan, // Show ChikouSpan - mInputs.showSenkouSpanA, // Show Senkou Span A - mInputs.showSenkouSpanB, // Show Senkou Span B - mInputs.showKumo // Show Kumo - // - ); - result = mHandler != INVALID_HANDLE; - if (!result) - { - return result; - } - - // - return result; - } - - // - // Inputs ... - - // - X121XICHInputs GetInputs() - { - return mInputs; - } - - // - bool SetInputs( - X121XICHInputs &inputs // Configs - ) - { - // - return Init( - mSymbol, - mPeriod, - inputs - // - ); - } - - // - // Readers ... - - // - double GetTenkanSen( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(tenkanSenBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return tenkanSenBuffer[barIndex]; - } - - // - int CopyTenkanSen( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - tenkanSenBuffer, - buffer, - forceClean - // - ); - } - - // - double GetKijunSen( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(kijunSenBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return kijunSenBuffer[barIndex]; - } - - // - int CopyKijunSen( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - kijunSenBuffer, - buffer, - forceClean - // - ); - } - - // - double GetChikouSpan( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(chikouSpanBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return chikouSpanBuffer[barIndex]; - } - - // - int CopyChikouSpan( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - chikouSpanBuffer, - buffer, - forceClean - // - ); - } - - // - double GetSenkouSpanA( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(senkouSpanABuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return senkouSpanABuffer[barIndex]; - } - - // - int CopySenkouSpanA( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - senkouSpanABuffer, - buffer, - forceClean - // - ); - } - - // - double GetSenkouSpanB( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(senkouSpanBBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return senkouSpanBBuffer[barIndex]; - } - - // - int CopySenkouSpanB( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - senkouSpanBBuffer, - buffer, - forceClean - // - ); - } - - // - void Free() override - { - Cleanup(10); - } - - // - bool GetConditions( - X121XICHConditions &conditions, // - int barIndex = 0, // - int loopback = 5 // - ) - { - // - bool result = true; - - // - if (loopback < 5) - { - loopback = 5; - } - - // - conditions.Clean(); - - // - conditions.symbol = mSymbol; - conditions.period = mPeriod; - conditions.time = TimeCurrent(); - - // - int zIndex = barIndex; - int cIndex = zIndex + 1; - int pIndex = cIndex + 1; - int ppIndex = pIndex + 1; - - // - XOHCL zBar; - result = zBar.Init( - mSymbol, - mPeriod, - zIndex // - ); - if (!result) - { - return result; - } - - // - XOHCL cBar; - result = cBar.Init( - mSymbol, - mPeriod, - cIndex // - ); - if (!result) - { - return result; - } - - // - XOHCL pBar; - result = pBar.Init( - mSymbol, - mPeriod, - pIndex // - ); - if (!result) - { - return result; - } - - // - // Buffers ... - - // - CopyTenkanSen( - zIndex, - loopback, - conditions.tenkanSenBuffer // - ); - - // - CopyKijunSen( - zIndex, - loopback, - conditions.kijunSenBuffer // - ); - - // - CopyChikouSpan( - zIndex, - loopback, - conditions.chikouSpanBuffer // - ); - - // - CopySenkouSpanA( - zIndex, - loopback, - conditions.senkouSpanABuffer // - ); - - // - CopySenkouSpanB( - zIndex, - loopback, - conditions.senkouSpanBBuffer // - ); - - // - // Conditions ... - - // - int cIDX = 1; - int pIDX = cIDX + 1; - - // - bool isTenkanSenOverKijunSen = - conditions.tenkanSenBuffer[cIDX] > conditions.kijunSenBuffer[cIDX]; - bool isTenkanSenOverKijunSenPrev = - conditions.tenkanSenBuffer[pIDX] > conditions.kijunSenBuffer[pIDX]; - - // - bool isTenkanSenUnderKijunSen = - conditions.tenkanSenBuffer[cIDX] < conditions.kijunSenBuffer[cIDX]; - bool isTenkanSenUnderKijunSenPrev = - conditions.tenkanSenBuffer[pIDX] < conditions.kijunSenBuffer[pIDX]; - - // - bool isTenkanSenCrossedOverKijunSen = isTenkanSenOverKijunSen && - !isTenkanSenOverKijunSenPrev; - bool isTenkanSenCrossedUnderKijunSen = isTenkanSenUnderKijunSen && - !isTenkanSenUnderKijunSenPrev; - - // - bool isSenkouSpanAOverB = - conditions.senkouSpanABuffer[cIDX] > conditions.senkouSpanBBuffer[cIDX]; - bool isSenkouSpanAOverBPrev = - conditions.senkouSpanABuffer[pIDX] > conditions.senkouSpanBBuffer[pIDX]; - - // - bool isSenkouSpanAUnderB = - conditions.senkouSpanABuffer[cIDX] < conditions.senkouSpanBBuffer[cIDX]; - bool isSenkouSpanAUnderBPrev = - conditions.senkouSpanABuffer[pIDX] < conditions.senkouSpanBBuffer[pIDX]; - - // - bool isSenkouSpanACrossedOverB = isSenkouSpanAOverB && - !isSenkouSpanAOverBPrev; - bool isSenkouSpanACrossedUnderB = isSenkouSpanAUnderB && - !isSenkouSpanAUnderBPrev; - - // - conditions.isSenkouSpanAOverB = isSenkouSpanAOverB; - conditions.isSenkouSpanAUnderB = isSenkouSpanAUnderB; - conditions.isTenkanSenOverKijunSen = isTenkanSenOverKijunSen; - conditions.isTenkanSenUnderKijunSen = isTenkanSenUnderKijunSen; - conditions.isSenkouSpanACrossedOverB = isSenkouSpanACrossedOverB; - conditions.isSenkouSpanACrossedUnderB = isSenkouSpanACrossedUnderB; - conditions.isTenkanSenCrossedOverKijunSen = isTenkanSenCrossedOverKijunSen; - conditions.isTenkanSenCrossedUnderKijunSen = isTenkanSenCrossedUnderKijunSen; - - // - Cleanup(); - - // - zBar.Clean(); - cBar.Clean(); - pBar.Clean(); - - // - return result; - } - - // - // Protected ... - protected: - // - // Private ... - private: - // - // Props ... - X121XICHInputs mInputs; // Inputs ... - - // - // Buffers ... - double kijunSenBuffer[]; - double tenkanSenBuffer[]; - double chikouSpanBuffer[]; - double senkouSpanABuffer[]; - double senkouSpanBBuffer[]; - - // - void Calculate( - int barIndex = 0, - int maxRequiredBars = 100 // - ) - { - // - // Buffers ... - if (barIndex < 0) - { - barIndex = 0; - } - - // - CopyBuffer( - mHandler, - X121_XICH_KIJUNSEN_LINE, - barIndex, - maxRequiredBars, - kijunSenBuffer - // - ); - - // - CopyBuffer( - mHandler, - X121_XICH_TENKANSEN_LINE, - barIndex, - maxRequiredBars, - tenkanSenBuffer - // - ); - - // - CopyBuffer( - mHandler, - X121_XICH_CHIKOUSPAN_LINE, - barIndex, - maxRequiredBars, - chikouSpanBuffer - // - ); - - // - CopyBuffer( - mHandler, - X121_XICH_SENKOUSPANA_LINE, - barIndex, - maxRequiredBars, - senkouSpanABuffer - // - ); - - // - CopyBuffer( - mHandler, - X121_XICH_SENKOUSPANB_LINE, - barIndex, - maxRequiredBars, - senkouSpanBBuffer - // - ); - } - - // - void Cleanup( - int maxAllowed = 100 // - ) - { - // - CleanupArray( - kijunSenBuffer, - maxAllowed // - ); - - // - CleanupArray( - tenkanSenBuffer, - maxAllowed // - ); - - // - CleanupArray( - chikouSpanBuffer, - maxAllowed // - ); - - // - CleanupArray( - senkouSpanABuffer, - maxAllowed // - ); - - // - CleanupArray( - senkouSpanBBuffer, - maxAllowed // - ); - - // - } - - // -}; - -// -// Tools ... \ No newline at end of file diff --git a/Helpers/x-saherelm.x121.xmas.helper.mq5 b/Helpers/x-saherelm.x121.xmas.helper.mq5 deleted file mode 100644 index 5fbedf38..00000000 --- a/Helpers/x-saherelm.x121.xmas.helper.mq5 +++ /dev/null @@ -1,797 +0,0 @@ -/////////////////////////////////////////////////////// -// -// SaherElm IT Center MQL5 Helper Class Library -// ---------------------------------------------- -// Name: XCX121XMASHelper -// Description: provides all Indicator -// Helper requirements ... -// -// -// Maintainer: -// ------------ -// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) -// -////////////////////////////////////////////////////// -// -// Global Properties ... -#property library -#property copyright "Copyright 2023, SaherElm IT Center" -#property link "https://www.saherelm.ir" -#property version "1.00" -#property strict - -// -// Imports ... -#include "../Classes/x-saherelm.x-helper.class.mq5" - -// -// Definitions ... - -enum ENUM_X121_XMAS_BUFFERS -{ - // - X121_XMAS_UPPER_LINE = 0, - X121_XMAS_MID_LINE = 1, - X121_XMAS_LOWER_LINE = 2, -}; - -// -// Input Models ... -struct X121XMASInputs -{ - // - // Props ... - int length; // MA Length - ENUM_MA_METHOD method; // MA Method - ENUM_APPLIED_PRICE upperAppliedTo; // Upper Applied To - ENUM_APPLIED_PRICE midAppliedTo; // Mid Applied To - ENUM_APPLIED_PRICE lowerAppliedTo; // Lower Applied To - - // - int startCalculationForLastBars; // Calculate Last n Bars - bool showUpper; // Show Upper - bool showMid; // Show Mid - bool showLower; // Show Lower - - // - // Constructor(s) ... - X121XMASInputs() - { - Clean(); - } - - // - // Tools ... - - // - // Clean ... - void Clean() - { - // - length = 0; // MA Length - method = MODE_EMA; // MA Method - upperAppliedTo = PRICE_HIGH; // Upper Applied To - midAppliedTo = PRICE_MEDIAN; // Mid Applied To - lowerAppliedTo = PRICE_LOW; // Lower Applied To - - // - startCalculationForLastBars = 0; // Calculate Last n Bars - showUpper = false; // Show Upper - showMid = false; // Show Mid - showLower = false; // Show Lower - - // - ZeroMemory(this); - } - - // - // Default ... - void Default() - { - // - length = 14; // MA Length - method = MODE_EMA; // MA Method - upperAppliedTo = PRICE_HIGH; // Upper Applied To - midAppliedTo = PRICE_MEDIAN; // Mid Applied To - lowerAppliedTo = PRICE_LOW; // Lower Applied To - - // - startCalculationForLastBars = 1000; // Calculate Last n Bars - showUpper = true; // Show Upper - showMid = true; // Show Mid - showLower = true; // Show Lower - } - - // - // Validate ... - bool IsValid() - { - // - bool result = false; - - // - result = - // - length > 0 - // - ; - - // - return result; - } - - // - // Retrieve MAx Length ... - int Max() - { - // - int result = 0; - - // - result = MathMax(result, length); - - // - return result; - } -}; - -// -// Conditions ... -struct X121XMASConditions -{ - // - // Common ... - string symbol; - ENUM_TIMEFRAMES period; - datetime time; - - // - // Buffers ... - double upperBuffer[]; - double midBuffer[]; - double lowerBuffer[]; - - // - // Conditions ... - - // - // Constructor ... - X121XMASConditions() - { - Clean(); - } - - // - // Tools ... - - /** - * Cleaning Up ... - */ - void Clean() - { - // - // Commons ... - symbol = NULL; - period = NULL; - time = NULL; - - // - // Buffers ... - - // - Clean(upperBuffer); - Clean(midBuffer); - Clean(lowerBuffer); - - // - ArraySetAsSeries(upperBuffer, true); - ArraySetAsSeries(midBuffer, true); - ArraySetAsSeries(lowerBuffer, true); - - // - // Conditions ... - - // - ZeroMemory(this); - } - - /** - * Generate Conditions Scores ... - * - * @param bullishScore: Double, Directional Scores Reference ... - * @param bearishScore: Double, Directional Scores Reference ... - */ - void GenerateScore( - double &bullishScore, - double &bearishScore // - ) - { - // - bullishScore = 0; - bearishScore = 0; - - // - // TODO: Implement if Required ... - } - - /** - * Generate Summary String for Represent Conditions State ... - * - * @param onlyCommons: Boolean, Just Generate Only Commons Conditions ... - * @param onlyConditions: Boolean, Just Generate Only Conditions ... - * @param includeScores: Boolean, Attach Scores Representations on Result ... - * @param ignoreFalseConditions: Boolean, Ignore False Conditions on Result ... - * @param separator: String, Separate Lines ... - * - * @return ( string ) - */ - string GenerateSummary( - bool onlyCommons = false, - bool onlyConditions = false, - bool includeScores = true, - bool ignoreFalseConditions = true, - string separator = "\n" // - ) - { - // - string result = NULL; - - // - double bullishScore = 0; - double bearishScore = 0; - GenerateScore( - bullishScore, - bearishScore // - ); - - // - string scoresStr = - // - "Scores: " + separator + - "---------------" + separator + - "Bullish: " + ToString(bullishScore) + separator + - "Bearish: " + ToString(bearishScore) + separator + - "" - // - ; - - // - string commonStr = GenerateSpecifiedCommonSummary( - this, - separator, - includeScores // - ); - - // - string conditionsStr = - // - // - "" - // - ; - - // - result = - // - "[" + GetTag() + "]" + separator + - (onlyConditions - ? "" - : commonStr) + - (!includeScores - ? "" - : scoresStr) + - " " + separator + - (onlyCommons - ? "" - : conditionsStr) + - "" - // - ; - - // - return result; - } - - /** - * Retrieve nique Tag Identifier ... - * - * @return ( string ) - */ - string GetTag() - { - return GetTypeName(this); - } - - // -}; - -// -// Class ... -class XCX121XMASHelper : public XCBaseHelper -{ - // - // Public ... - public: - // - // Props ... - - // - // Constructors ... - XCX121XMASHelper() - : XCBaseHelper(_Symbol, _Period) - { - } - - // - // Deconstructor ... - ~XCX121XMASHelper() - { - // - mInputs.Clean(); - - // - Clean(upperBuffer); - Clean(midBuffer); - Clean(lowerBuffer); - } - - // - // Tools ... - bool Init( - string symbol, // Trading Symbol - ENUM_TIMEFRAMES period, // Trading Period - X121XMASInputs &inputs // Inputs - ) - { - // - bool result = false; - - // - mSymbol = symbol; - mPeriod = period; - - // - result = inputs.IsValid(); - if (!result) - { - return result; - } - - // - ArraySetAsSeries(upperBuffer, true); - ArraySetAsSeries(midBuffer, true); - ArraySetAsSeries(lowerBuffer, true); - - // - mInputs = inputs; - - // - mHandler = iCustom( - mSymbol, - mPeriod, - "x-saherelm.x121.xmas", - // - // Inputs ... - // - // Market ... - "", - mInputs.length, - mInputs.method, - mInputs.upperAppliedTo, - mInputs.midAppliedTo, - mInputs.lowerAppliedTo, - // - // Presentation ... - "", - // - mInputs.startCalculationForLastBars, - // - mInputs.showUpper, - mInputs.showMid, - mInputs.showLower - // - ); - result = mHandler != INVALID_HANDLE; - if (!result) - { - return result; - } - - // - return result; - } - - // - // Inputs ... - - // - X121XMASInputs GetInputs() - { - return mInputs; - } - - // - bool SetInputs( - X121XMASInputs &inputs // Configs - ) - { - // - return Init( - mSymbol, - mPeriod, - inputs - // - ); - } - - // - // Readers ... - - // - // Upper ... - - // - double GetUpper( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(upperBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return upperBuffer[barIndex]; - } - - // - int CopyUpper( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - upperBuffer, - buffer, - forceClean - // - ); - } - - // - // Mid ... - - // - double GetUMid( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(midBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return midBuffer[barIndex]; - } - - // - int CopyMid( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - midBuffer, - buffer, - forceClean - // - ); - } - - // - // Lower ... - - // - double GetULower( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(lowerBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return lowerBuffer[barIndex]; - } - - // - int CopyLower( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - lowerBuffer, - buffer, - forceClean - // - ); - } - - // - void Free() override - { - Cleanup(10); - } - - // - bool GetConditions( - X121XMASConditions &conditions, // - int barIndex = 0, // - int loopback = 5 // - ) - { - // - bool result = true; - - // - if (loopback < 5) - { - loopback = 5; - } - - // - conditions.Clean(); - - // - conditions.symbol = mSymbol; - conditions.period = mPeriod; - conditions.time = TimeCurrent(); - - // - int zIndex = barIndex; - int cIndex = zIndex + 1; - int pIndex = cIndex + 1; - int ppIndex = pIndex + 1; - - // - XOHCL zBar; - result = zBar.Init( - mSymbol, - mPeriod, - zIndex // - ); - if (!result) - { - return result; - } - - // - XOHCL cBar; - result = cBar.Init( - mSymbol, - mPeriod, - cIndex // - ); - if (!result) - { - return result; - } - - // - XOHCL pBar; - result = pBar.Init( - mSymbol, - mPeriod, - pIndex // - ); - if (!result) - { - return result; - } - - // - // Buffers ... - - // - CopyUpper( - zIndex, - loopback, - conditions.upperBuffer // - ); - - // - CopyMid( - zIndex, - loopback, - conditions.midBuffer // - ); - - // - CopyLower( - zIndex, - loopback, - conditions.lowerBuffer // - ); - - // - // Conditions ... - - // - int cIDX = 1; - int pIDX = cIDX + 1; - - // - // SAR ... - - // - Cleanup(); - - // - zBar.Clean(); - cBar.Clean(); - pBar.Clean(); - - // - return result; - } - - // - // Protected ... - protected: - // - // Private ... - private: - // - // Props ... - X121XMASInputs mInputs; // Inputs ... - - // - // Buffers ... - double upperBuffer[]; - double midBuffer[]; - double lowerBuffer[]; - - // - void Calculate( - int barIndex = 0, - int maxRequiredBars = 100 // - ) - { - // - // Buffers ... - if (barIndex < 0) - { - barIndex = 0; - } - - // - // FAST ... - CopyBuffer( - mHandler, - X121_XMAS_UPPER_LINE, - barIndex, - maxRequiredBars, - upperBuffer - // - ); - - // - // FAST STATE ... - CopyBuffer( - mHandler, - X121_XMAS_MID_LINE, - barIndex, - maxRequiredBars, - midBuffer - // - ); - - // - // MID ... - CopyBuffer( - mHandler, - X121_XMAS_LOWER_LINE, - barIndex, - maxRequiredBars, - lowerBuffer - // - ); - } - - // - void Cleanup( - int maxAllowed = 100 // - ) - { - // - CleanupArray( - upperBuffer, - maxAllowed // - ); - - // - CleanupArray( - midBuffer, - maxAllowed // - ); - - // - CleanupArray( - lowerBuffer, - maxAllowed // - ); - - // - } - - // -}; - -// -// Tools ... \ No newline at end of file diff --git a/Helpers/x-saherelm.x121.xpv.helper.mq5 b/Helpers/x-saherelm.x121.xpv.helper.mq5 deleted file mode 100644 index 71529242..00000000 --- a/Helpers/x-saherelm.x121.xpv.helper.mq5 +++ /dev/null @@ -1,3276 +0,0 @@ -/////////////////////////////////////////////////////// -// -// SaherElm IT Center MQL5 Helper Class Library -// ---------------------------------------------- -// Name: XCX121XPVHelper -// Description: provides all Indicator -// Helper requirements ... -// -// -// Maintainer: -// ------------ -// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) -// -////////////////////////////////////////////////////// -// -// Global Properties ... -#property library -#property copyright "Copyright 2023, SaherElm IT Center" -#property link "https://www.saherelm.ir" -#property version "1.00" -#property strict - -// -// Imports ... -#include "../Classes/x-saherelm.x-helper.class.mq5" - -// -// Definitions ... - -// -// Definitions ... -enum ENUM_X121_XPV_BUFFERS -{ - // - X121_XPV_PEAK_LINE = 0, - X121_XPV_VALE_LINE = 1, - X121_XPV_SAR_LINE = 2, - X121_XPV_SWING_LOW_LINE = 3, - X121_XPV_SWING_HIGH_LINE = 4, - X121_XPV_PEAK_GOLDEN_ZONE_LINE = 5, - X121_XPV_VALE_GOLDEN_ZONE_LINE = 6, - X121_XPV_SUPPORT_LINE = 7, - X121_XPV_RESISTANCE_LINE = 8, - X121_XPV_TREND_LINE = 9, - X121_XPV_TREND_COLOR_LINE = 10, - X121_XPV_C_HH_LINE = 11, - X121_XPV_C_LL_LINE = 12, - X121_XPV_S_HH_LINE = 13, - X121_XPV_S_LL_LINE = 14, - X121_XPV_M_HH_LINE = 15, - X121_XPV_M_LL_LINE = 16, - X121_XPV_L_HH_LINE = 17, - X121_XPV_L_LL_LINE = 18, - X121_XPV_H_HH_LINE = 19, - X121_XPV_H_LL_LINE = 20, - X121_XPV_FRACTALS_UPPER_LINE = 21, - X121_XPV_FRACTALS_LOWER_LINE = 22, - X121_XPV_TREND_STATE_LINE = 23, -}; - -// -// Input Models ... -struct X121XPVInputs -{ - // - // Props ... - - // - // Short ... - ENUM_X_PERIOD_METHOD scMethod; // How to Find Period - ENUM_TIMEFRAMES scPeriod; // Time Period - - // - // Medium ... - ENUM_X_PERIOD_METHOD mcMethod; // How to Find Period - ENUM_TIMEFRAMES mcPeriod; // Time Period - - // - // Long ... - ENUM_X_PERIOD_METHOD lcMethod; // How to Find Period - ENUM_TIMEFRAMES lcPeriod; // Time Period - - // - // Hind ... - ENUM_X_PERIOD_METHOD hcMethod; // How to Find Period - ENUM_TIMEFRAMES hcPeriod; // Time Period - - // - // Boundary Detection ... - ENUM_SERIESMODE hhMode; // Highest High Calculation Method - ENUM_SERIESMODE llMode; // Lowest Low Calculation Method - ENUM_X_FIBO_LEVELS goldenZoneLevel; // Golden Zone Detection - - // - // Sar Detection ... - double sarStep; // Step - double sarMax; // Maximum - - // - // Swing Detection ... - int swingLength; // Length - - // - int startCalculationForLastBars; // Calculate Last n Bars - - // - int sarArrowCode; // Parabolic Sar Arrow Code - int peaksArrowCode; // Peaks Arrow Code - int valesArrowCode; // Vales Arrow Code - int trendArrowCode; // Trend Arrow Code - int swingLowsArrowCode; // Swing Lows Arrow Code - int swingHighsArrowCode; // Swing Highs Arrow Code - int supportsArrowCode; // Supports Arrow Code - int resistancesArrowCode; // Resistances Arrow Code - - // - bool showSar; // Show Parabolic Sar - bool showPeaks; // Show Peaks - bool showVales; // Show Vales - bool showGoldenZones; // Show Golden Zones - bool showTrend; // Show Trend - bool showSwingLows; // Show Swing Lows - bool showSwingHighs; // Show Swing Highs - bool showSupports; // Show Supports - bool showResistances; // Show Resistances - - // - // Constructor(s) ... - X121XPVInputs() - { - // - Clean(); - } - - // - // Tools ... - - // - // Clean ... - void Clean() - { - // - // Short ... - scMethod = X_PERIOD_NONE; - scPeriod = NULL; - - // - // Medium ... - mcMethod = X_PERIOD_NONE; - mcPeriod = NULL; - - // - // Long ... - lcMethod = X_PERIOD_NONE; - lcPeriod = NULL; - - // - // Hind ... - hcMethod = X_PERIOD_NONE; - hcPeriod = NULL; - - // - // Boundary Detection ... - hhMode = MODE_HIGH; - llMode = MODE_LOW; - goldenZoneLevel = X_FIBO_LEVEL_382; - - // - sarStep = 0; - sarMax = 0; - - // - swingLength = 0; - - // - startCalculationForLastBars = 0; - - // - sarArrowCode = 0; - peaksArrowCode = 0; - valesArrowCode = 0; - trendArrowCode = 0; - swingLowsArrowCode = 0; - swingHighsArrowCode = 0; - supportsArrowCode = 0; - resistancesArrowCode = 0; - - // - showSar = false; - showPeaks = false; - showVales = false; - showTrend = false; - showSwingLows = false; - showSwingHighs = false; - showGoldenZones = false; - showSupports = false; - showResistances = false; - - // - ZeroMemory(this); - } - - // - // Default ... - void Default() - { - // - // Short ... - scMethod = X_PERIOD_AUTO; - scPeriod = NULL; - - // - // Medium ... - mcMethod = X_PERIOD_AUTO; - mcPeriod = NULL; - - // - // Long ... - lcMethod = X_PERIOD_AUTO; - lcPeriod = NULL; - - // - // Hind ... - hcMethod = X_PERIOD_AUTO; - hcPeriod = NULL; - - // - // Boundary Detection ... - hhMode = MODE_HIGH; - llMode = MODE_LOW; - goldenZoneLevel = X_FIBO_LEVEL_236; - - // - sarStep = 0.02; - sarMax = 0.2; - - // - swingLength = 5; - - // - startCalculationForLastBars = 1000; - - // - sarArrowCode = 159; - peaksArrowCode = 159; - valesArrowCode = 159; - trendArrowCode = 117; - swingLowsArrowCode = 225; - swingHighsArrowCode = 226; - supportsArrowCode = 159; - resistancesArrowCode = 159; - - // - showSar = true; - showPeaks = true; - showVales = true; - showTrend = true; - showSwingLows = true; - showSwingHighs = true; - showGoldenZones = true; - showSupports = true; - showResistances = true; - } - - // - // Validate ... - bool IsValid() - { - // - bool result = false; - - // - result = - // - // SAR ... - sarMax > 0 && - sarStep > 0 && - swingLength > 0 && - sarMax > sarStep && - // - // XPV ... - (IsValid(scMethod, scPeriod) && - IsValid(mcMethod, mcPeriod) && - IsValid(lcMethod, lcPeriod) && - IsValid(hcMethod, hcPeriod)) - // - ; - - // - return result; - } - - // - // Retrieve MAx Length ... - int Max() - { - // - int result = 0; - - // - result = MathMax(0, swingLength); - - // - return result; - } -}; - -// -// Conditions ... -struct X121XPVConditions -{ - // - // Common ... - string symbol; - ENUM_TIMEFRAMES period; - datetime time; - - // - // Buffers ... - double sarBuffer[]; - double cHHBuffer[]; - double cLLBuffer[]; - double sHHBuffer[]; - double sLLBuffer[]; - double mHHBuffer[]; - double mLLBuffer[]; - double lHHBuffer[]; - double lLLBuffer[]; - double hHHBuffer[]; - double hLLBuffer[]; - double trendBuffer[]; - double peaksBuffer[]; - double valesBuffer[]; - double supportsBuffer[]; - double swingLowsBuffer[]; - double swingHighsBuffer[]; - double trendColorBuffer[]; - double trendStateBuffer[]; - double peaksGoldenBuffer[]; - double valesGoldenBuffer[]; - double resistancesBuffer[]; - double fractalsUpperBuffer[]; - double fractalsLowerBuffer[]; - - // - // Conditions ... - - // - // SAR ... - - // - bool isSarBullish; - bool isSarBearish; - - // - bool isSarSwitchedToBullish; - bool isSarSwitchedToBearish; - - // - // XPV ... - - // - bool isNewPeak; - bool isNewPeakOverLast; - bool isNewPeakUnderLast; - - // - bool isNewVale; - bool isNewValeOverLast; - bool isNewValeUnderLast; - - // - // Constructor ... - X121XPVConditions() - { - Clean(); - } - - // - // Tools ... - - /** - * Cleaning Up ... - */ - void Clean() - { - // - // Commons ... - symbol = NULL; - period = NULL; - time = NULL; - - // - // Buffers ... - - // - Clean(sarBuffer); - Clean(cHHBuffer); - Clean(cLLBuffer); - Clean(sHHBuffer); - Clean(sLLBuffer); - Clean(mHHBuffer); - Clean(mLLBuffer); - Clean(lHHBuffer); - Clean(lLLBuffer); - Clean(hHHBuffer); - Clean(hLLBuffer); - Clean(trendBuffer); - Clean(peaksBuffer); - Clean(valesBuffer); - Clean(supportsBuffer); - Clean(swingLowsBuffer); - Clean(swingHighsBuffer); - Clean(trendColorBuffer); - Clean(trendStateBuffer); - Clean(peaksGoldenBuffer); - Clean(valesGoldenBuffer); - Clean(resistancesBuffer); - Clean(fractalsUpperBuffer); - Clean(fractalsLowerBuffer); - - // - // Clean(bullishTrendBuffer); - // Clean(bearishTrendBuffer); - - // - ArraySetAsSeries(sarBuffer, true); - ArraySetAsSeries(cHHBuffer, true); - ArraySetAsSeries(cLLBuffer, true); - ArraySetAsSeries(sHHBuffer, true); - ArraySetAsSeries(sLLBuffer, true); - ArraySetAsSeries(mHHBuffer, true); - ArraySetAsSeries(mLLBuffer, true); - ArraySetAsSeries(lHHBuffer, true); - ArraySetAsSeries(lLLBuffer, true); - ArraySetAsSeries(hHHBuffer, true); - ArraySetAsSeries(hLLBuffer, true); - ArraySetAsSeries(trendBuffer, true); - ArraySetAsSeries(peaksBuffer, true); - ArraySetAsSeries(valesBuffer, true); - ArraySetAsSeries(supportsBuffer, true); - ArraySetAsSeries(swingLowsBuffer, true); - ArraySetAsSeries(swingHighsBuffer, true); - ArraySetAsSeries(trendColorBuffer, true); - ArraySetAsSeries(trendStateBuffer, true); - ArraySetAsSeries(peaksGoldenBuffer, true); - ArraySetAsSeries(valesGoldenBuffer, true); - ArraySetAsSeries(resistancesBuffer, true); - ArraySetAsSeries(fractalsUpperBuffer, true); - ArraySetAsSeries(fractalsLowerBuffer, true); - - // - // Conditions ... - - // - isSarBullish = false; - isSarBearish = false; - - // - isSarSwitchedToBullish = false; - isSarSwitchedToBearish = false; - - // - isNewPeak = false; - isNewPeakOverLast = false; - isNewPeakUnderLast = false; - - // - isNewVale = false; - isNewValeOverLast = false; - isNewValeUnderLast = false; - - // - ZeroMemory(this); - } - - /** - * Generate Conditions Scores ... - * - * @param bullishScore: Double, Directional Scores Reference ... - * @param bearishScore: Double, Directional Scores Reference ... - */ - void GenerateScore( - double &bullishScore, - double &bearishScore // - ) - { - // - bullishScore = 0; - bearishScore = 0; - - // - double score = 1; - double minScore = 0.5; - double highScore = 1.5; - - // - if (isSarBullish) - { - bullishScore += minScore; - } - if (isSarSwitchedToBullish) - { - bullishScore += score; - } - - // - if (isSarBearish) - { - bearishScore += minScore; - } - if (isSarSwitchedToBearish) - { - bearishScore += score; - } - } - - /** - * Generate Summary String for Represent Conditions State ... - * - * @param onlyCommons: Boolean, Just Generate Only Commons Conditions ... - * @param onlyConditions: Boolean, Just Generate Only Conditions ... - * @param includeScores: Boolean, Attach Scores Representations on Result ... - * @param ignoreFalseConditions: Boolean, Ignore False Conditions on Result ... - * @param separator: String, Separate Lines ... - * - * @return ( string ) - */ - string GenerateSummary( - bool onlyCommons = false, - bool onlyConditions = false, - bool includeScores = true, - bool ignoreFalseConditions = true, - string separator = "\n" // - ) - { - // - string result = NULL; - - // - double bullishScore = 0; - double bearishScore = 0; - GenerateScore( - bullishScore, - bearishScore // - ); - - // - string scoresStr = - // - "Scores: " + separator + - "---------------" + separator + - "Bullish: " + ToString(bullishScore) + separator + - "Bearish: " + ToString(bearishScore) + separator + - "" - // - ; - - // - string commonStr = GenerateSpecifiedCommonSummary( - this, - separator, - includeScores // - ); - - // - string conditionsStr = - // - "-----------------------" + separator + - "XPV: " + separator + - "-----------------------" + separator + - ToString("isSarBullish", isSarBullish, ignoreFalseConditions, separator) + - ToString("isSarBearish", isSarBearish, ignoreFalseConditions, separator) + - ToString("isSarSwitchedToBullish", isSarSwitchedToBullish, ignoreFalseConditions, separator) + - ToString("isSarSwitchedToBearish", isSarSwitchedToBearish, ignoreFalseConditions, separator) + - ToString("isNewPeak", isNewPeak, ignoreFalseConditions, separator) + - ToString("isNewPeakOverLast", isNewPeakOverLast, ignoreFalseConditions, separator) + - ToString("isNewPeakUnderLast", isNewPeakUnderLast, ignoreFalseConditions, separator) + - ToString("isNewVale", isNewVale, ignoreFalseConditions, separator) + - ToString("isNewValeOverLast", isNewValeOverLast, ignoreFalseConditions, separator) + - ToString("isNewValeUnderLast", isNewValeUnderLast, ignoreFalseConditions, separator) + - // - "" - // - ; - - // - result = - // - "[" + GetTag() + "]" + separator + - (onlyConditions - ? "" - : commonStr) + - (!includeScores - ? "" - : scoresStr) + - " " + separator + - (onlyCommons - ? "" - : conditionsStr) + - "" - // - ; - - // - return result; - } - - /** - * Retrieve nique Tag Identifier ... - * - * @return ( string ) - */ - string GetTag() - { - return GetTypeName(this); - } - - // -}; - -// -// Class ... -class XCX121XPVHelper : public XCBaseHelper -{ - // - // Public ... - public: - // - // Props ... - - // - // Constructors ... - XCX121XPVHelper() - : XCBaseHelper(_Symbol, _Period) - { - } - - // - // Deconstructor ... - ~XCX121XPVHelper() - { - // - mInputs.Clean(); - - // - Clean(sarBuffer); - Clean(cHHBuffer); - Clean(cLLBuffer); - Clean(sHHBuffer); - Clean(sLLBuffer); - Clean(mHHBuffer); - Clean(mLLBuffer); - Clean(lHHBuffer); - Clean(lLLBuffer); - Clean(hHHBuffer); - Clean(hLLBuffer); - Clean(trendBuffer); - Clean(peaksBuffer); - Clean(valesBuffer); - Clean(supportsBuffer); - Clean(swingLowsBuffer); - Clean(swingHighsBuffer); - Clean(trendColorBuffer); - Clean(trendStateBuffer); - Clean(peaksGoldenBuffer); - Clean(valesGoldenBuffer); - Clean(resistancesBuffer); - Clean(fractalsUpperBuffer); - Clean(fractalsLowerBuffer); - } - - // - // Tools ... - bool Init( - string symbol, // Trading Symbol - ENUM_TIMEFRAMES period, // Trading Period - X121XPVInputs &inputs // Inputs - ) - { - // - bool result = false; - - // - mSymbol = symbol; - mPeriod = period; - - // - result = inputs.IsValid(); - if (!result) - { - return result; - } - - // - ArraySetAsSeries(sarBuffer, true); - ArraySetAsSeries(cHHBuffer, true); - ArraySetAsSeries(cLLBuffer, true); - ArraySetAsSeries(sHHBuffer, true); - ArraySetAsSeries(sLLBuffer, true); - ArraySetAsSeries(mHHBuffer, true); - ArraySetAsSeries(mLLBuffer, true); - ArraySetAsSeries(lHHBuffer, true); - ArraySetAsSeries(lLLBuffer, true); - ArraySetAsSeries(hHHBuffer, true); - ArraySetAsSeries(hLLBuffer, true); - ArraySetAsSeries(trendBuffer, true); - ArraySetAsSeries(peaksBuffer, true); - ArraySetAsSeries(valesBuffer, true); - ArraySetAsSeries(supportsBuffer, true); - ArraySetAsSeries(swingLowsBuffer, true); - ArraySetAsSeries(swingHighsBuffer, true); - ArraySetAsSeries(trendColorBuffer, true); - ArraySetAsSeries(trendStateBuffer, true); - ArraySetAsSeries(peaksGoldenBuffer, true); - ArraySetAsSeries(valesGoldenBuffer, true); - ArraySetAsSeries(resistancesBuffer, true); - ArraySetAsSeries(fractalsUpperBuffer, true); - ArraySetAsSeries(fractalsLowerBuffer, true); - - // - mInputs = inputs; - - // - mHandler = iCustom( - mSymbol, - mPeriod, - "x-saherelm.x121.xpv", - // - // Inputs ... - // - // Market ... - "", - // - // Short ... - "", - mInputs.scMethod, - mInputs.scPeriod, - // - // Medium ... - "", - mInputs.mcMethod, - mInputs.mcPeriod, - // - // Long ... - "", - mInputs.lcMethod, - mInputs.lcPeriod, - // - // Hind ... - "", - mInputs.hcMethod, - mInputs.hcPeriod, - // - // Boundary Detection ... - "", - mInputs.hhMode, - mInputs.llMode, - mInputs.goldenZoneLevel, - // - // SAr Detection ... - "", - mInputs.sarStep, - mInputs.sarMax, - // - // Swing Detection ... - "", - mInputs.swingLength, - // - // Presentation ... - "", - // - mInputs.startCalculationForLastBars, - mInputs.sarArrowCode, - mInputs.peaksArrowCode, - mInputs.valesArrowCode, - mInputs.trendArrowCode, - mInputs.swingLowsArrowCode, - mInputs.swingHighsArrowCode, - mInputs.supportsArrowCode, - mInputs.resistancesArrowCode, - // - mInputs.showSar, - mInputs.showPeaks, - mInputs.showVales, - mInputs.showTrend, - mInputs.showSwingLows, - mInputs.showSwingHighs, - mInputs.showGoldenZones, - mInputs.showSupports, - mInputs.showResistances - // - ); - result = mHandler != INVALID_HANDLE; - if (!result) - { - return result; - } - - // - return result; - } - - // - // Inputs ... - - // - X121XPVInputs GetInputs() - { - return mInputs; - } - - // - bool SetInputs( - X121XPVInputs &inputs // Configs - ) - { - // - return Init( - mSymbol, - mPeriod, - inputs - // - ); - } - - // - // Readers ... - - // - // SAR ... - - // - double GetSar( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(sarBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return sarBuffer[barIndex]; - } - - // - int CopySar( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - sarBuffer, - buffer, - forceClean - // - ); - } - - // - // PV ... - - // - // PEAKS ... - - // - double GetPeak( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(peaksBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return peaksBuffer[barIndex]; - } - - // - int CopyPeak( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - peaksBuffer, - buffer, - forceClean - // - ); - } - - // - // VALES ... - - // - double GetVale( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(valesBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return valesBuffer[barIndex]; - } - - // - int CopyVale( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - valesBuffer, - buffer, - forceClean - // - ); - } - - // - // SWINGLOW ... - - // - double GetSwingLow( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(swingLowsBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return swingLowsBuffer[barIndex]; - } - - // - int CopySwingLow( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - swingLowsBuffer, - buffer, - forceClean - // - ); - } - - // - // SWINGHIGH ... - - // - double GetSwingHigh( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(swingHighsBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return swingHighsBuffer[barIndex]; - } - - // - int CopySwingHigh( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - swingHighsBuffer, - buffer, - forceClean - // - ); - } - - // - // TREND ... - - // - double GetTrend( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(trendBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return trendBuffer[barIndex]; - } - - // - int CopyTrend( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - trendBuffer, - buffer, - forceClean - // - ); - } - - // - // TRENDCOLOR ... - - // - double GetTrendColor( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(trendColorBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return trendColorBuffer[barIndex]; - } - - // - int CopyTrendColor( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - trendColorBuffer, - buffer, - forceClean - // - ); - } - - // - // TRENDSTATE ... - - // - double GetTrendState( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(trendStateBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return trendStateBuffer[barIndex]; - } - - // - int CopyTrendState( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - trendStateBuffer, - buffer, - forceClean - // - ); - } - - // - // SUPPORTS ... - - // - double GetSupport( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(supportsBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return supportsBuffer[barIndex]; - } - - // - int CopySupport( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - supportsBuffer, - buffer, - forceClean - // - ); - } - - // - // RESISTANCES ... - - // - double GetResistance( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(resistancesBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return resistancesBuffer[barIndex]; - } - - // - int CopyResistance( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - resistancesBuffer, - buffer, - forceClean - // - ); - } - - // - // GOLDEN PEAKS ... - - // - double GetPeakGoldenZone( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(peaksGoldenBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return peaksGoldenBuffer[barIndex]; - } - - // - int CopyPeakGoldenZone( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - peaksGoldenBuffer, - buffer, - forceClean - // - ); - } - - // - // GOLDEN VALES ... - - // - double GetValeGoldenZone( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(valesGoldenBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return valesGoldenBuffer[barIndex]; - } - - // - int CopyValeGoldenZone( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - valesGoldenBuffer, - buffer, - forceClean - // - ); - } - - // - // CURRENT ... - - // - // HH ... - - // - double GetCHH( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(cHHBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return cHHBuffer[barIndex]; - } - - // - int CopyCHH( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - cHHBuffer, - buffer, - forceClean - // - ); - } - - // - // LL ... - - // - double GetCLL( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(cLLBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return cLLBuffer[barIndex]; - } - - // - int CopyCLL( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - cLLBuffer, - buffer, - forceClean - // - ); - } - - // - // SHORT ... - - // - // HH ... - - // - double GetSHH( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(sHHBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return sHHBuffer[barIndex]; - } - - // - int CopySHH( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - sHHBuffer, - buffer, - forceClean - // - ); - } - - // - // LL ... - - // - double GetSLL( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(sLLBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return sLLBuffer[barIndex]; - } - - // - int CopySLL( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - sLLBuffer, - buffer, - forceClean - // - ); - } - - // - // MEDIUM ... - - // - // HH ... - - // - double GetMHH( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(mHHBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return mHHBuffer[barIndex]; - } - - // - int CopyMHH( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - mHHBuffer, - buffer, - forceClean - // - ); - } - - // - // LL ... - - // - double GetMLL( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(mLLBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return mLLBuffer[barIndex]; - } - - // - int CopyMLL( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - mLLBuffer, - buffer, - forceClean - // - ); - } - - // - // LONG ... - - // - // HH ... - - // - double GetLHH( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(lHHBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return lHHBuffer[barIndex]; - } - - // - int CopyLHH( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - lHHBuffer, - buffer, - forceClean - // - ); - } - - // - // LL ... - - // - double GetLLL( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(lLLBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return lLLBuffer[barIndex]; - } - - // - int CopyLLL( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - lLLBuffer, - buffer, - forceClean - // - ); - } - - // - // HIND ... - - // - // HH ... - - // - double GetHHH( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(hHHBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return hHHBuffer[barIndex]; - } - - // - int CopyHHH( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - hHHBuffer, - buffer, - forceClean - // - ); - } - - // - // LL ... - - // - double GetHLL( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(hLLBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return hLLBuffer[barIndex]; - } - - // - int CopyHLL( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - hLLBuffer, - buffer, - forceClean - // - ); - } - - // - // FRACTALS Upper ... - - // - double GetFractalsUpper( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(fractalsUpperBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return fractalsUpperBuffer[barIndex]; - } - - // - int CopyFractalsUpper( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - fractalsUpperBuffer, - buffer, - forceClean - // - ); - } - - // - // FRACTALS Lower ... - - // - double GetFractalsLower( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(fractalsLowerBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return fractalsLowerBuffer[barIndex]; - } - - // - int CopyFractalsLower( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - fractalsLowerBuffer, - buffer, - forceClean - // - ); - } - - // - // Tools Function ... - - // - double GetHigherPeak( - int &index, // Bar Index - double peak, // Peak Source - int barIndex = 0, // Bar Index - int loopback = 576 // Max Allowed Loopback - ) - { - // - double result = 0; - - // - index = -1; - - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - if (loopback < 576) - { - loopback = 576; - } - - // - if (peak <= 0) - { - return result; - } - - // - double iValue = 0; - int sIndex = barIndex; - bool canContinue = true; - while (canContinue) - { - // - iValue = GetPeak(sIndex); - if (iValue > peak) - { - // - index = sIndex; - result = iValue; - break; - } - - // - canContinue = sIndex < barIndex + loopback; - sIndex++; - } - - // - return result; - } - - // - double GetLowerPeak( - int &index, // Bar Index - double peak, // Peak Source - int barIndex = 0, // Bar Index - int loopback = 576 // Max Allowed Loopback - ) - { - // - double result = 0; - - // - index = -1; - - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - if (loopback < 576) - { - loopback = 576; - } - - // - if (peak <= 0) - { - return result; - } - - // - double iValue = 0; - int sIndex = barIndex; - bool canContinue = true; - while (canContinue) - { - // - iValue = GetPeak(sIndex); - if (iValue < peak) - { - // - index = sIndex; - result = iValue; - break; - } - - // - canContinue = sIndex < barIndex + loopback; - sIndex++; - } - - // - return result; - } - - // - double GetHigherVale( - int &index, // Bar Index - double vale, // Vale Source - int barIndex = 0, // Bar Index - int loopback = 576 // Max Allowed Loopback - ) - { - // - double result = 0; - - // - index = -1; - - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - if (loopback < 576) - { - loopback = 576; - } - - // - if (vale <= 0) - { - return result; - } - - // - double iValue = 0; - int sIndex = barIndex; - bool canContinue = true; - while (canContinue) - { - // - iValue = GetVale(sIndex); - if (iValue > vale) - { - // - index = sIndex; - result = iValue; - break; - } - - // - canContinue = sIndex < barIndex + loopback; - sIndex++; - } - - // - return result; - } - - // - double GetLowerVale( - int &index, // Bar Index - double vale, // Vale Source - int barIndex = 0, // Bar Index - int loopback = 576 // Max Allowed Loopback - ) - { - // - double result = 0; - - // - index = -1; - - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - if (loopback < 576) - { - loopback = 576; - } - - // - if (vale <= 0) - { - return result; - } - - // - double iValue = 0; - int sIndex = barIndex; - bool canContinue = true; - while (canContinue) - { - // - iValue = GetVale(sIndex); - if (iValue < vale) - { - // - index = sIndex; - result = iValue; - break; - } - - // - canContinue = sIndex < barIndex + loopback; - sIndex++; - } - - // - return result; - } - - // - double GetLowestPeak( - int barIndex, - int &index, - double &vale, - int loopback = 576 // - ) - { - // - double result = 0; - - // - index = -1; - vale = 0; - - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - if (loopback < 576) - { - loopback = 576; - } - - // - Calculate(barIndex); - - // - for (int i = 0; i < barIndex + loopback; i++) - { - // - double iPeak = GetPeak(i); - if (iPeak == 0) - { - break; - } - - // - if (iPeak > 0 && (result == 0 || - result >= iPeak)) - { - // - index = i; - result = iPeak; - vale = GetVale(index); - } - } - - // - return result; - } - - // - double GetHighestPeak( - int barIndex, - int &index, - double &vale, - int loopback = 576 // - ) - { - // - double result = 0; - - // - index = -1; - vale = 0; - - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - if (loopback < 576) - { - loopback = 576; - } - - // - Calculate(barIndex); - - // - for (int i = 0; i < barIndex + loopback; i++) - { - // - double iPeak = GetPeak(i); - if (iPeak == 0) - { - break; - } - - // - if (iPeak > 0 && (result == 0 || - result <= iPeak)) - { - // - index = i; - result = iPeak; - vale = GetVale(index); - } - } - - // - return result; - } - - // - double GetLowestVale( - int barIndex, - int &index, - double &peak, - int loopback = 576 // - ) - { - // - double result = 0; - - // - index = -1; - peak = 0; - - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - if (loopback < 576) - { - loopback = 576; - } - - // - Calculate(barIndex); - - // - for (int i = 0; i < barIndex + loopback; i++) - { - // - double iPeak = GetVale(i); - if (iPeak == 0) - { - break; - } - - // - if (iPeak > 0 && (result == 0 || - result >= iPeak)) - { - // - index = i; - result = iPeak; - peak = GetPeak(index); - } - } - - // - return result; - } - - // - double GetHighestVale( - int barIndex, - int &index, - double &peak, - int loopback = 576 // - ) - { - // - double result = 0; - - // - index = -1; - peak = 0; - - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - if (loopback < 576) - { - loopback = 576; - } - - // - Calculate(barIndex); - - // - for (int i = 0; i < barIndex + loopback; i++) - { - // - double iPeak = GetVale(i); - if (iPeak == 0) - { - break; - } - - // - if (iPeak > 0 && (result == 0 || - result <= iPeak)) - { - // - index = i; - result = iPeak; - peak = GetPeak(index); - } - } - - // - return result; - } - - // - void Free() override - { - Cleanup(10); - } - - // - bool GetConditions( - X121XPVConditions &conditions, // - int barIndex = 0, // - int loopback = 5 // - ) - { - // - bool result = true; - - // - if (loopback < 5) - { - loopback = 5; - } - - // - conditions.Clean(); - - // - conditions.symbol = mSymbol; - conditions.period = mPeriod; - conditions.time = TimeCurrent(); - - // - int zIndex = barIndex; - int cIndex = zIndex + 1; - int pIndex = cIndex + 1; - int ppIndex = pIndex + 1; - - // - XOHCL zBar; - result = zBar.Init( - mSymbol, - mPeriod, - zIndex // - ); - if (!result) - { - return result; - } - - // - XOHCL cBar; - result = cBar.Init( - mSymbol, - mPeriod, - cIndex // - ); - if (!result) - { - return result; - } - - // - XOHCL pBar; - result = pBar.Init( - mSymbol, - mPeriod, - pIndex // - ); - if (!result) - { - return result; - } - - // - // Buffers ... - - // - CopySar( - zIndex, - loopback, - conditions.sarBuffer // - ); - - // - CopyCHH( - zIndex, - loopback, - conditions.cHHBuffer // - ); - - // - CopyCLL( - zIndex, - loopback, - conditions.cLLBuffer // - ); - - // - CopySHH( - zIndex, - loopback, - conditions.sHHBuffer // - ); - - // - CopySLL( - zIndex, - loopback, - conditions.sLLBuffer // - ); - - // - CopyMHH( - zIndex, - loopback, - conditions.mHHBuffer // - ); - - // - CopyMLL( - zIndex, - loopback, - conditions.mLLBuffer // - ); - - // - CopyLHH( - zIndex, - loopback, - conditions.lHHBuffer // - ); - - // - CopyLLL( - zIndex, - loopback, - conditions.lLLBuffer // - ); - - // - CopyHHH( - zIndex, - loopback, - conditions.hHHBuffer // - ); - - // - CopyHLL( - zIndex, - loopback, - conditions.hLLBuffer // - ); - - // - CopyTrend( - zIndex, - loopback, - conditions.trendBuffer // - ); - - // - CopyPeak( - zIndex, - loopback, - conditions.peaksBuffer // - ); - - // - CopyVale( - zIndex, - loopback, - conditions.valesBuffer // - ); - - // - CopySupport( - zIndex, - loopback, - conditions.supportsBuffer // - ); - - // - CopySwingLow( - zIndex, - loopback, - conditions.swingLowsBuffer // - ); - - // - CopySwingHigh( - zIndex, - loopback, - conditions.swingHighsBuffer // - ); - - // - CopyTrendColor( - zIndex, - loopback, - conditions.trendColorBuffer // - ); - - // - CopyTrendState( - zIndex, - loopback, - conditions.trendStateBuffer // - ); - - // - CopyPeakGoldenZone( - zIndex, - loopback, - conditions.peaksGoldenBuffer // - ); - - // - CopyValeGoldenZone( - zIndex, - loopback, - conditions.valesGoldenBuffer // - ); - - // - CopyResistance( - zIndex, - loopback, - conditions.resistancesBuffer // - ); - - // - CopyFractalsUpper( - zIndex, - loopback, - conditions.fractalsUpperBuffer // - ); - - // - CopyFractalsLower( - zIndex, - loopback, - conditions.fractalsLowerBuffer // - ); - - // - // Conditions ... - - // - int cIDX = 1; - int pIDX = cIDX + 1; - - // - // SAR ... - - // - bool isSarBullish = conditions.sarBuffer[cIDX] < cBar.low; - bool isSarBullishPrev = conditions.sarBuffer[pIDX] < pBar.low; - - // - bool isSarBearish = conditions.sarBuffer[cIDX] > cBar.high; - bool isSarBearishPrev = conditions.sarBuffer[pIDX] > pBar.high; - - // - bool isSarSwitchedToBullish = isSarBullish && - !isSarBullishPrev; - bool isSarSwitchedToBearish = isSarBearish && - !isSarBearishPrev; - - // - // XPV ... - - // - bool isNewPeak = conditions.peaksBuffer[cIDX] != conditions.peaksBuffer[pIDX]; - bool isNewPeakOverLast = isNewPeak && - conditions.peaksBuffer[cIDX] > conditions.peaksBuffer[pIDX]; - bool isNewPeakUnderLast = isNewPeak && - conditions.peaksBuffer[cIDX] < conditions.peaksBuffer[pIDX]; - - // - bool isNewVale = conditions.valesBuffer[cIDX] != conditions.valesBuffer[pIDX]; - bool isNewValeOverLast = isNewVale && - conditions.valesBuffer[cIDX] > conditions.valesBuffer[pIDX]; - bool isNewValeUnderLast = isNewVale && - conditions.valesBuffer[cIDX] < conditions.valesBuffer[pIDX]; - - // - conditions.isSarBullish = isSarBullish; - conditions.isSarBearish = isSarBearish; - conditions.isSarSwitchedToBullish = isSarSwitchedToBullish; - conditions.isSarSwitchedToBearish = isSarSwitchedToBearish; - conditions.isNewPeak = isNewPeak; - conditions.isNewPeakOverLast = isNewPeakOverLast; - conditions.isNewPeakUnderLast = isNewPeakUnderLast; - conditions.isNewVale = isNewVale; - conditions.isNewValeOverLast = isNewValeOverLast; - conditions.isNewValeUnderLast = isNewValeUnderLast; - - // - Cleanup(); - - // - zBar.Clean(); - cBar.Clean(); - pBar.Clean(); - - // - return result; - } - - // - // Protected ... - protected: - // - // Private ... - private: - // - // Props ... - X121XPVInputs mInputs; // Inputs ... - - // - // Buffers ... - double sarBuffer[]; - double cHHBuffer[]; - double cLLBuffer[]; - double sHHBuffer[]; - double sLLBuffer[]; - double mHHBuffer[]; - double mLLBuffer[]; - double lHHBuffer[]; - double lLLBuffer[]; - double hHHBuffer[]; - double hLLBuffer[]; - double trendBuffer[]; - double peaksBuffer[]; - double valesBuffer[]; - double supportsBuffer[]; - double swingLowsBuffer[]; - double swingHighsBuffer[]; - double trendColorBuffer[]; - double trendStateBuffer[]; - double peaksGoldenBuffer[]; - double valesGoldenBuffer[]; - double resistancesBuffer[]; - double fractalsUpperBuffer[]; - double fractalsLowerBuffer[]; - - // - void Calculate( - int barIndex = 0, - int maxRequiredBars = 100 // - ) - { - // - // Buffers ... - if (barIndex < 0) - { - barIndex = 0; - } - - // - CopyBuffer( - mHandler, - X121_XPV_SAR_LINE, - barIndex, - maxRequiredBars, - sarBuffer // - ); - - // - CopyBuffer( - mHandler, - X121_XPV_C_HH_LINE, - barIndex, - maxRequiredBars, - cHHBuffer // - ); - - // - CopyBuffer( - mHandler, - X121_XPV_C_LL_LINE, - barIndex, - maxRequiredBars, - cLLBuffer // - ); - - // - CopyBuffer( - mHandler, - X121_XPV_S_HH_LINE, - barIndex, - maxRequiredBars, - sHHBuffer // - ); - - // - CopyBuffer( - mHandler, - X121_XPV_S_LL_LINE, - barIndex, - maxRequiredBars, - sLLBuffer // - ); - - // - CopyBuffer( - mHandler, - X121_XPV_M_HH_LINE, - barIndex, - maxRequiredBars, - mHHBuffer // - ); - - // - CopyBuffer( - mHandler, - X121_XPV_M_LL_LINE, - barIndex, - maxRequiredBars, - mLLBuffer // - ); - - // - CopyBuffer( - mHandler, - X121_XPV_L_HH_LINE, - barIndex, - maxRequiredBars, - lHHBuffer // - ); - - // - CopyBuffer( - mHandler, - X121_XPV_L_LL_LINE, - barIndex, - maxRequiredBars, - lLLBuffer // - ); - - // - CopyBuffer( - mHandler, - X121_XPV_H_HH_LINE, - barIndex, - maxRequiredBars, - hHHBuffer // - ); - - // - CopyBuffer( - mHandler, - X121_XPV_H_LL_LINE, - barIndex, - maxRequiredBars, - hLLBuffer // - ); - - // - CopyBuffer( - mHandler, - X121_XPV_TREND_LINE, - barIndex, - maxRequiredBars, - trendBuffer // - ); - - // - CopyBuffer( - mHandler, - X121_XPV_PEAK_LINE, - barIndex, - maxRequiredBars, - peaksBuffer // - ); - - // - CopyBuffer( - mHandler, - X121_XPV_VALE_LINE, - barIndex, - maxRequiredBars, - valesBuffer // - ); - - // - CopyBuffer( - mHandler, - X121_XPV_SUPPORT_LINE, - barIndex, - maxRequiredBars, - supportsBuffer // - ); - - // - CopyBuffer( - mHandler, - X121_XPV_SWING_LOW_LINE, - barIndex, - maxRequiredBars, - swingLowsBuffer // - ); - - // - CopyBuffer( - mHandler, - X121_XPV_SWING_HIGH_LINE, - barIndex, - maxRequiredBars, - swingHighsBuffer // - ); - - // - CopyBuffer( - mHandler, - X121_XPV_TREND_COLOR_LINE, - barIndex, - maxRequiredBars, - trendColorBuffer // - ); - - // - CopyBuffer( - mHandler, - X121_XPV_TREND_STATE_LINE, - barIndex, - maxRequiredBars, - trendStateBuffer // - ); - - // - CopyBuffer( - mHandler, - X121_XPV_PEAK_GOLDEN_ZONE_LINE, - barIndex, - maxRequiredBars, - peaksGoldenBuffer // - ); - - // - CopyBuffer( - mHandler, - X121_XPV_VALE_GOLDEN_ZONE_LINE, - barIndex, - maxRequiredBars, - valesGoldenBuffer // - ); - - // - CopyBuffer( - mHandler, - X121_XPV_RESISTANCE_LINE, - barIndex, - maxRequiredBars, - resistancesBuffer // - ); - - // - CopyBuffer( - mHandler, - X121_XPV_FRACTALS_UPPER_LINE, - barIndex, - maxRequiredBars, - fractalsUpperBuffer // - ); - - // - CopyBuffer( - mHandler, - X121_XPV_FRACTALS_LOWER_LINE, - barIndex, - maxRequiredBars, - fractalsLowerBuffer // - ); - } - - // - void Cleanup( - int maxAllowed = 100 // - ) - { - // - CleanupArray( - sarBuffer, - maxAllowed // - ); - - // - CleanupArray( - cHHBuffer, - maxAllowed // - ); - - // - CleanupArray( - cLLBuffer, - maxAllowed // - ); - - // - CleanupArray( - sHHBuffer, - maxAllowed // - ); - - // - CleanupArray( - sLLBuffer, - maxAllowed // - ); - - // - CleanupArray( - mHHBuffer, - maxAllowed // - ); - - // - CleanupArray( - mLLBuffer, - maxAllowed // - ); - - // - CleanupArray( - lHHBuffer, - maxAllowed // - ); - - // - CleanupArray( - lLLBuffer, - maxAllowed // - ); - - // - CleanupArray( - hHHBuffer, - maxAllowed // - ); - - // - CleanupArray( - hLLBuffer, - maxAllowed // - ); - - // - CleanupArray( - trendBuffer, - maxAllowed // - ); - - // - CleanupArray( - peaksBuffer, - maxAllowed // - ); - - // - CleanupArray( - valesBuffer, - maxAllowed // - ); - - // - CleanupArray( - supportsBuffer, - maxAllowed // - ); - - // - CleanupArray( - swingLowsBuffer, - maxAllowed // - ); - - // - CleanupArray( - swingHighsBuffer, - maxAllowed // - ); - - // - CleanupArray( - trendColorBuffer, - maxAllowed // - ); - - // - CleanupArray( - trendStateBuffer, - maxAllowed // - ); - - // - CleanupArray( - peaksGoldenBuffer, - maxAllowed // - ); - - // - CleanupArray( - valesGoldenBuffer, - maxAllowed // - ); - - // - CleanupArray( - resistancesBuffer, - maxAllowed // - ); - - // - CleanupArray( - fractalsUpperBuffer, - maxAllowed // - ); - - // - CleanupArray( - fractalsLowerBuffer, - maxAllowed // - ); - } - - // -}; - -// -// Tools ... \ No newline at end of file diff --git a/Helpers/x-saherelm.x121.xstr.helper.mq5 b/Helpers/x-saherelm.x121.xstr.helper.mq5 deleted file mode 100644 index 79dd07d2..00000000 --- a/Helpers/x-saherelm.x121.xstr.helper.mq5 +++ /dev/null @@ -1,1900 +0,0 @@ -/////////////////////////////////////////////////////// -// -// SaherElm IT Center MQL5 Helper Class Library -// ---------------------------------------------- -// Name: XCX121XSTRHelper -// Description: provides all Indicator -// Helper requirements ... -// -// -// Maintainer: -// ------------ -// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) -// -////////////////////////////////////////////////////// -// -// Global Properties ... -#property library -#property copyright "Copyright 2023, SaherElm IT Center" -#property link "https://www.saherelm.ir" -#property version "1.00" -#property strict - -// -// Imports ... -#include "../Classes/x-saherelm.x-helper.class.mq5" - -// -// Definitions ... - -// -// Definitions ... -enum ENUM_X121_XSTR_BUFFERS -{ - // - X121_XSTR_LINE = 0, - X121_XSTR_COLOR_LINE = 1, - X121_XSTR_UP_LINE = 2, - X121_XSTR_DOWN_LINE = 3, - X121_XSTR_HSM_LINE = 4, - X121_XSTR_LSM_LINE = 5, - X121_XSTR_XVIDYA_LINE = 6, - X121_XSTR_ATR_LINE = 7, - X121_XSTR_PRICE_LINE = 8, - X121_XSTR_STATE_LINE = 9, -}; - -// -// Input Models ... -struct X121XSTRInputs -{ - // - // Props ... - - int strLength; // Length - double strMultiplier; // Multiplier - int vidyaLength; // Smothing Length - ENUM_MA_METHOD strBoundaryMode; // Boundary Mode - ENUM_APPLIED_PRICE strAppliedTo; // Applied To - ENUM_APPLIED_PRICE vidyaAppliedTo; // Smoothing Applied To - - // - bool showStr; // Show Str - bool showVidya; // Show Vidya - bool showStrUpper; // Show Str Upper - bool showStrLower; // Show Str Lower - bool showStrSMLow; // Show Str SM Low - bool showStrSMHigh; // Show Str SM High - - // - // Constructor(s) ... - X121XSTRInputs() - { - // - Clean(); - } - - // - // Tools ... - - // - // Clean ... - void Clean() - { - // - strLength = 0; - strMultiplier = 0.0; - vidyaLength = 0; - strBoundaryMode = MODE_SMA; - strAppliedTo = PRICE_MEDIAN; - vidyaAppliedTo = PRICE_CLOSE; - - // - showStr = false; - showVidya = false; - showStrUpper = false; - showStrLower = false; - showStrSMLow = false; - showStrSMHigh = false; - - // - ZeroMemory(this); - } - - // - // Default ... - void Default() - { - // - strLength = 14; - vidyaLength = 14; - strMultiplier = 3.0; - strBoundaryMode = MODE_SMA; - strAppliedTo = PRICE_CLOSE; - vidyaAppliedTo = PRICE_CLOSE; - - // - showStr = true; - showVidya = true; - showStrUpper = true; - showStrLower = true; - showStrSMLow = true; - showStrSMHigh = true; - } - - // - // Validate ... - bool IsValid() - { - // - bool result = false; - - // - result = - // - strLength > 0 && - strMultiplier > 0 - // - ; - - // - return result; - } - - // - // Retrieve MAx Length ... - int Max() - { - // - int result = 0; - - // - result = MathMax(strLength, vidyaLength); - - // - return result; - } -}; - -// -// Conditions ... -struct X121XSTRConditions -{ - // - // Common ... - string symbol; - ENUM_TIMEFRAMES period; - datetime time; - - // - // Buffers ... - double strBuffer[]; - double atrBuffer[]; - double vidyaBuffer[]; - double strUpBuffer[]; - double strDownBuffer[]; - double strPriceBuffer[]; - double strStateBuffer[]; - double strSMLowBuffer[]; - double strSMHighBuffer[]; - - // - // Conditions ... - - // - // STR ... - - // - bool isStrBullish; - bool isStrBearish; - - // - bool isStrSwitchedToBullish; - bool isStrSwitchedToBearish; - - // - // VIDYA ... - - // - bool isRejectUpVidya; - bool isCloseOverVidya; - bool isCrossedOverVidya; - - // - bool isRejectDownVidya; - bool isCloseUnderVidya; - bool isCrossedUnderVidya; - - // - // HMS ... - - // - bool isRejectUpLSM; - bool isCloseOverLSM; - bool isCrossedOverLSM; - - // - bool isRejectDownLSM; - bool isCloseUnderLSM; - bool isCrossedUnderLSM; - - // - // HSM .. - - // - bool isRejectUpHSM; - bool isCloseOverHSM; - bool isCrossedOverHSM; - - // - bool isRejectDownHSM; - bool isCloseUnderHSM; - bool isCrossedUnderHSM; - - // - // STR ... - - // - bool isRejectUpStr; - bool isCloseOverStr; - bool isCrossedOverStr; - - // - bool isRejectDownStr; - bool isCloseUnderStr; - bool isCrossedUnderStr; - - // - // HSM / ViDYA ... - - // - bool isVidyaOverHSM; - bool isVidyaCrossedOverHSM; - - // - bool isVidyaUnderHSM; - bool isVidyaCrossedUnderHSM; - - // - // LSM / VIDYA ... - - // - bool isVidyaOverLSM; - bool isVidyaCrossedOverLSM; - - // - bool isVidyaUnderLSM; - bool isVidyaCrossedUnderLSM; - - // - // STR / VIDYA ... - - // - bool isVidyaOverStr; - bool isVidyaCrossedOverStr; - - // - bool isVidyaUnderStr; - bool isVidyaCrossedUnderStr; - - // - // bool isCloseLower - - // - // Constructor ... - X121XSTRConditions() - { - Clean(); - } - - // - // Tools ... - - /** - * Cleaning Up ... - */ - void Clean() - { - // - // Commons ... - symbol = NULL; - period = NULL; - time = NULL; - - // - // Buffers ... - - // - Clean(strBuffer); - Clean(atrBuffer); - Clean(vidyaBuffer); - Clean(strUpBuffer); - Clean(strDownBuffer); - Clean(strPriceBuffer); - Clean(strStateBuffer); - Clean(strSMLowBuffer); - Clean(strSMHighBuffer); - - // - ArraySetAsSeries(strBuffer, true); - ArraySetAsSeries(atrBuffer, true); - ArraySetAsSeries(vidyaBuffer, true); - ArraySetAsSeries(strUpBuffer, true); - ArraySetAsSeries(strDownBuffer, true); - ArraySetAsSeries(strPriceBuffer, true); - ArraySetAsSeries(strStateBuffer, true); - ArraySetAsSeries(strSMLowBuffer, true); - ArraySetAsSeries(strSMHighBuffer, true); - - // - // Conditions ... - - isStrBullish = false; - isStrBearish = false; - isRejectUpLSM = false; - isRejectUpHSM = false; - isRejectUpStr = false; - isCloseOverHSM = false; - isCloseOverLSM = false; - isCloseOverStr = false; - isVidyaOverHSM = false; - isVidyaOverLSM = false; - isVidyaOverStr = false; - isRejectDownLSM = false; - isRejectDownHSM = false; - isVidyaUnderStr = false; - isVidyaUnderHSM = false; - isVidyaUnderLSM = false; - isCloseUnderStr = false; - isRejectDownStr = false; - isRejectUpVidya = false; - isCloseUnderHSM = false; - isCloseUnderLSM = false; - isCrossedOverLSM = false; - isCrossedOverHSM = false; - isCrossedOverStr = false; - isCrossedUnderHSM = false; - isCrossedUnderLSM = false; - isCrossedUnderStr = false; - isCloseOverVidya = false; - isRejectDownVidya = false; - isCloseUnderVidya = false; - isCrossedOverVidya = false; - isCrossedUnderVidya = false; - isVidyaCrossedOverHSM = false; - isVidyaCrossedOverStr = false; - isVidyaCrossedOverLSM = false; - isVidyaCrossedUnderHSM = false; - isVidyaCrossedUnderLSM = false; - isVidyaCrossedUnderStr = false; - isStrSwitchedToBullish = false; - isStrSwitchedToBearish = false; - - // - ZeroMemory(this); - } - - /** - * Generate Conditions Scores ... - * - * @param bullishScore: Double, Directional Scores Reference ... - * @param bearishScore: Double, Directional Scores Reference ... - */ - void GenerateScore( - double &bullishScore, - double &bearishScore // - ) - { - // - bullishScore = 0; - bearishScore = 0; - - // - double score = 1; - double minScore = 0.5; - double highScore = 1.5; - - // - if (isStrBullish) - { - bullishScore += minScore; - } - if (isStrSwitchedToBullish) - { - bullishScore += score; - } - if (isRejectUpVidya) - { - bullishScore += minScore; - } - if (isCloseOverVidya) - { - bullishScore += minScore; - } - if (isCrossedOverVidya) - { - bullishScore += minScore; - } - if (isRejectUpLSM) - { - bullishScore += minScore; - } - if (isCloseOverLSM) - { - bullishScore += minScore; - } - if (isCrossedOverLSM) - { - bullishScore += minScore; - } - if (isRejectUpHSM) - { - bullishScore += minScore; - } - if (isCloseOverHSM) - { - bullishScore += minScore; - } - if (isCrossedOverHSM) - { - bullishScore += minScore; - } - if (isRejectUpStr) - { - bullishScore += minScore; - } - if (isCloseOverStr) - { - bullishScore += minScore; - } - if (isCrossedOverStr) - { - bullishScore += minScore; - } - if (isVidyaOverHSM) - { - bullishScore += minScore; - } - if (isVidyaCrossedOverHSM) - { - bullishScore += minScore; - } - if (isVidyaOverLSM) - { - bullishScore += minScore; - } - if (isVidyaCrossedOverLSM) - { - bullishScore += minScore; - } - if (isVidyaOverStr) - { - bullishScore += minScore; - } - if (isVidyaCrossedOverStr) - { - bullishScore += minScore; - } - - // - if (isStrBearish) - { - bearishScore += minScore; - } - if (isStrSwitchedToBearish) - { - bearishScore += score; - } - if (isRejectDownVidya) - { - bearishScore += minScore; - } - if (isCloseUnderVidya) - { - bearishScore += minScore; - } - if (isCrossedUnderVidya) - { - bearishScore += minScore; - } - if (isRejectDownLSM) - { - bearishScore += minScore; - } - if (isCloseUnderLSM) - { - bearishScore += minScore; - } - if (isCrossedUnderLSM) - { - bearishScore += minScore; - } - if (isRejectDownHSM) - { - bearishScore += minScore; - } - if (isCloseUnderHSM) - { - bearishScore += minScore; - } - if (isCrossedUnderHSM) - { - bearishScore += minScore; - } - if (isRejectDownStr) - { - bearishScore += minScore; - } - if (isCloseUnderStr) - { - bearishScore += minScore; - } - if (isCrossedUnderStr) - { - bearishScore += minScore; - } - if (isVidyaUnderHSM) - { - bearishScore += minScore; - } - if (isVidyaCrossedUnderHSM) - { - bearishScore += minScore; - } - if (isVidyaUnderLSM) - { - bearishScore += minScore; - } - if (isVidyaCrossedUnderLSM) - { - bearishScore += minScore; - } - if (isVidyaUnderStr) - { - bearishScore += minScore; - } - if (isVidyaCrossedUnderStr) - { - bearishScore += minScore; - } - } - - /** - * Generate Summary String for Represent Conditions State ... - * - * @param onlyCommons: Boolean, Just Generate Only Commons Conditions ... - * @param onlyConditions: Boolean, Just Generate Only Conditions ... - * @param includeScores: Boolean, Attach Scores Representations on Result ... - * @param ignoreFalseConditions: Boolean, Ignore False Conditions on Result ... - * @param separator: String, Separate Lines ... - * - * @return ( string ) - */ - string GenerateSummary( - bool onlyCommons = false, - bool onlyConditions = false, - bool includeScores = true, - bool ignoreFalseConditions = true, - string separator = "\n" // - ) - { - // - string result = NULL; - - // - double bullishScore = 0; - double bearishScore = 0; - GenerateScore( - bullishScore, - bearishScore // - ); - - // - string scoresStr = - // - "Scores: " + separator + - "---------------" + separator + - "Bullish: " + ToString(bullishScore) + separator + - "Bearish: " + ToString(bearishScore) + separator + - "" - // - ; - - // - string commonStr = GenerateSpecifiedCommonSummary( - this, - separator, - includeScores // - ); - - // - string conditionsStr = - // - "-----------------------" + separator + - "XSTR: " + separator + - "-----------------------" + separator + - ToString("isStrBullish", isStrBullish, ignoreFalseConditions, separator) + - ToString("isStrBearish", isStrBearish, ignoreFalseConditions, separator) + - ToString("isStrSwitchedToBullish", isStrSwitchedToBullish, ignoreFalseConditions, separator) + - ToString("isStrSwitchedToBearish", isStrSwitchedToBearish, ignoreFalseConditions, separator) + - ToString("isRejectUpVidya", isRejectUpVidya, ignoreFalseConditions, separator) + - ToString("isCloseOverVidya", isCloseOverVidya, ignoreFalseConditions, separator) + - ToString("isCrossedOverVidya", isCrossedOverVidya, ignoreFalseConditions, separator) + - ToString("isRejectDownVidya", isRejectDownVidya, ignoreFalseConditions, separator) + - ToString("isCloseUnderVidya", isCloseUnderVidya, ignoreFalseConditions, separator) + - ToString("isCrossedUnderVidya", isCrossedUnderVidya, ignoreFalseConditions, separator) + - ToString("isRejectUpLSM", isRejectUpLSM, ignoreFalseConditions, separator) + - ToString("isCloseOverLSM", isCloseOverLSM, ignoreFalseConditions, separator) + - ToString("isCrossedOverLSM", isCrossedOverLSM, ignoreFalseConditions, separator) + - ToString("isRejectDownLSM", isRejectDownLSM, ignoreFalseConditions, separator) + - ToString("isCloseUnderLSM", isCloseUnderLSM, ignoreFalseConditions, separator) + - ToString("isCrossedUnderLSM", isCrossedUnderLSM, ignoreFalseConditions, separator) + - ToString("isRejectUpHSM", isRejectUpHSM, ignoreFalseConditions, separator) + - ToString("isCloseOverHSM", isCloseOverHSM, ignoreFalseConditions, separator) + - ToString("isCrossedOverHSM", isCrossedOverHSM, ignoreFalseConditions, separator) + - ToString("isRejectDownHSM", isRejectDownHSM, ignoreFalseConditions, separator) + - ToString("isCloseUnderHSM", isCloseUnderHSM, ignoreFalseConditions, separator) + - ToString("isCrossedUnderHSM", isCrossedUnderHSM, ignoreFalseConditions, separator) + - ToString("isRejectUpStr", isRejectUpStr, ignoreFalseConditions, separator) + - ToString("isCloseOverStr", isCloseOverStr, ignoreFalseConditions, separator) + - ToString("isCrossedOverStr", isCrossedOverStr, ignoreFalseConditions, separator) + - ToString("isRejectDownStr", isRejectDownStr, ignoreFalseConditions, separator) + - ToString("isCloseUnderStr", isCloseUnderStr, ignoreFalseConditions, separator) + - ToString("isCrossedUnderStr", isCrossedUnderStr, ignoreFalseConditions, separator) + - ToString("isVidyaOverHSM", isVidyaOverHSM, ignoreFalseConditions, separator) + - ToString("isVidyaCrossedOverHSM", isVidyaCrossedOverHSM, ignoreFalseConditions, separator) + - ToString("isVidyaUnderHSM", isVidyaUnderHSM, ignoreFalseConditions, separator) + - ToString("isVidyaCrossedUnderHSM", isVidyaCrossedUnderHSM, ignoreFalseConditions, separator) + - ToString("isVidyaOverLSM", isVidyaOverLSM, ignoreFalseConditions, separator) + - ToString("isVidyaCrossedOverLSM", isVidyaCrossedOverLSM, ignoreFalseConditions, separator) + - ToString("isVidyaUnderLSM", isVidyaUnderLSM, ignoreFalseConditions, separator) + - ToString("isVidyaCrossedUnderLSM", isVidyaCrossedUnderLSM, ignoreFalseConditions, separator) + - ToString("isVidyaOverStr", isVidyaOverStr, ignoreFalseConditions, separator) + - ToString("isVidyaCrossedOverStr", isVidyaCrossedOverStr, ignoreFalseConditions, separator) + - ToString("isVidyaUnderStr", isVidyaUnderStr, ignoreFalseConditions, separator) + - ToString("isVidyaCrossedUnderStr", isVidyaCrossedUnderStr, ignoreFalseConditions, separator) + - // - "" - // - ; - - // - result = - // - "[" + GetTag() + "]" + separator + - (onlyConditions - ? "" - : commonStr) + - (!includeScores - ? "" - : scoresStr) + - " " + separator + - (onlyCommons - ? "" - : conditionsStr) + - "" - // - ; - - // - return result; - } - - /** - * Retrieve nique Tag Identifier ... - * - * @return ( string ) - */ - string GetTag() - { - return GetTypeName(this); - } - - // -}; - -// -// Class ... -class XCX121XSTRHelper : public XCBaseHelper -{ - // - // Public ... - public: - // - // Props ... - - // - // Constructors ... - XCX121XSTRHelper() - : XCBaseHelper(_Symbol, _Period) - { - } - - // - // Deconstructor ... - ~XCX121XSTRHelper() - { - // - mInputs.Clean(); - - // - Clean(strBuffer); - Clean(atrBuffer); - Clean(strPriceBuffer); - Clean(strUpBuffer); - Clean(strDownBuffer); - Clean(strStateBuffer); - } - - // - // Tools ... - bool Init( - string symbol, // Trading Symbol - ENUM_TIMEFRAMES period, // Trading Period - X121XSTRInputs &inputs // Inputs - ) - { - // - bool result = false; - - // - mSymbol = symbol; - mPeriod = period; - - // - result = inputs.IsValid(); - if (!result) - { - return result; - } - - // - ArraySetAsSeries(strBuffer, true); - ArraySetAsSeries(atrBuffer, true); - ArraySetAsSeries(vidyaBuffer, true); - ArraySetAsSeries(strUpBuffer, true); - ArraySetAsSeries(strDownBuffer, true); - ArraySetAsSeries(strPriceBuffer, true); - ArraySetAsSeries(strStateBuffer, true); - ArraySetAsSeries(strSMLowBuffer, true); - ArraySetAsSeries(strSMHighBuffer, true); - - // - mInputs = inputs; - - // - mHandler = iCustom( - mSymbol, - mPeriod, - "x-saherelm.x121.xstr", - // - // Inputs ... - // - // Market ... - "", - mInputs.strLength, - mInputs.strMultiplier, - mInputs.vidyaLength, - mInputs.strBoundaryMode, - mInputs.strAppliedTo, - mInputs.vidyaAppliedTo, - // - // Presentation ... - "", - mInputs.showStr, - mInputs.showVidya, - mInputs.showStrUpper, - mInputs.showStrLower, - mInputs.showStrSMLow, - mInputs.showStrSMHigh - // - ); - result = mHandler != INVALID_HANDLE; - if (!result) - { - return result; - } - - // - return result; - } - - // - // Inputs ... - - // - X121XSTRInputs GetInputs() - { - return mInputs; - } - - // - bool SetInputs( - X121XSTRInputs &inputs // Configs - ) - { - // - return Init( - mSymbol, - mPeriod, - inputs - // - ); - } - - // - // Readers ... - - // - // Vidya ... - - // - double GetVidya( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(vidyaBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return vidyaBuffer[barIndex]; - } - - // - int CopyVidya( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - vidyaBuffer, - buffer, - forceClean - // - ); - } - - // - // ATR ... - - // - double GetATR( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(atrBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return atrBuffer[barIndex]; - } - - // - int CopyATR( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - atrBuffer, - buffer, - forceClean - // - ); - } - - // - double GetSTR( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(strBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return strBuffer[barIndex]; - } - - // - int CopySTR( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - strBuffer, - buffer, - forceClean - // - ); - } - - // - double GetSTRState( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(strStateBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return strStateBuffer[barIndex]; - } - - // - int CopySTRState( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - strStateBuffer, - buffer, - forceClean - // - ); - } - - // - double GetSTRPrice( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(strPriceBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return strPriceBuffer[barIndex]; - } - - // - int CopySTRPrice( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - strPriceBuffer, - buffer, - forceClean - // - ); - } - - // - double GetSTRUp( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(strUpBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return strUpBuffer[barIndex]; - } - - // - int CopySTRUp( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - strUpBuffer, - buffer, - forceClean - // - ); - } - - // - double GetSTRDown( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(strDownBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return strDownBuffer[barIndex]; - } - - // - int CopySTRDown( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - strDownBuffer, - buffer, - forceClean - // - ); - } - - // - double GetSTRSMLow( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(strSMLowBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return strSMLowBuffer[barIndex]; - } - - // - int CopySTRSMLow( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - strSMLowBuffer, - buffer, - forceClean - // - ); - } - - // - double GetSTRSMHigh( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(strSMHighBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return strSMHighBuffer[barIndex]; - } - - // - int CopySTRSMHigh( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - strSMHighBuffer, - buffer, - forceClean - // - ); - } - - // - double GetLastSTR( - ENUM_X_DIRECTION dir, - int barIndex = 0 // - ) - { - // - double result = 0; - - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - if (!HasDirection(dir)) - { - return result; - } - - // - int index = barIndex; - bool isBullish = IsBullish(dir); - - // - bool canContinue = true; - while (canContinue) - { - // - double iStr = GetSTR(index); - double iState = GetSTRState(index); - - // - canContinue = - isBullish - ? iState < 0 - : iState > 0; - if (!canContinue) - { - // - result = iStr; - break; - } - - // - index++; - } - - // - return result; - } - - // - void Free() override - { - Cleanup(10); - } - - // - bool GetConditions( - X121XSTRConditions &conditions, // - int barIndex = 0, // - int loopback = 5 // - ) - { - // - bool result = true; - - // - if (loopback < 5) - { - loopback = 5; - } - - // - conditions.Clean(); - - // - conditions.symbol = mSymbol; - conditions.period = mPeriod; - conditions.time = TimeCurrent(); - - // - int zIndex = barIndex; - int cIndex = zIndex + 1; - int pIndex = cIndex + 1; - int ppIndex = pIndex + 1; - - // - XOHCL zBar; - result = zBar.Init( - mSymbol, - mPeriod, - zIndex // - ); - if (!result) - { - return result; - } - - // - XOHCL cBar; - result = cBar.Init( - mSymbol, - mPeriod, - cIndex // - ); - if (!result) - { - return result; - } - - // - XOHCL pBar; - result = pBar.Init( - mSymbol, - mPeriod, - pIndex // - ); - if (!result) - { - return result; - } - - // - // Buffers ... - - // - CopyVidya( - zIndex, - loopback, - conditions.vidyaBuffer // - ); - - // - CopyATR( - zIndex, - loopback, - conditions.atrBuffer // - ); - - // - CopySTR( - zIndex, - loopback, - conditions.strBuffer // - ); - - // - CopySTRState( - zIndex, - loopback, - conditions.strStateBuffer // - ); - - // - CopySTRPrice( - zIndex, - loopback, - conditions.strPriceBuffer // - ); - - // - CopySTRUp( - zIndex, - loopback, - conditions.strUpBuffer // - ); - - // - CopySTRDown( - zIndex, - loopback, - conditions.strDownBuffer // - ); - - // - CopySTRSMLow( - zIndex, - loopback, - conditions.strSMLowBuffer // - ); - - // - CopySTRSMHigh( - zIndex, - loopback, - conditions.strSMHighBuffer // - ); - - // - // Conditions ... - - // - int cIDX = 1; - int pIDX = cIDX + 1; - - // - // STR ... - - // - bool isStrBullish = strStateBuffer[cIDX] > 0; - bool isStrBullishPrev = strStateBuffer[pIDX] > 0; - - // - bool isStrBearish = strStateBuffer[cIDX] < 0; - bool isStrBearishPrev = strStateBuffer[pIDX] < 0; - - // - bool isStrSwitchedToBullish = isStrBullish && - !isStrBullishPrev; - bool isStrSwitchedToBearish = isStrBearish && - !isStrBearishPrev; - - // - // VIDYA ... - - // - bool isRejectUpVidya = cBar.IsRejected( - vidyaBuffer[cIDX], - X_DIRECTION_BULLISH // - ); - - // - bool isCloseOverVidya = cBar.close > vidyaBuffer[cIDX]; - bool isCloseOverVidyaPrev = pBar.close > vidyaBuffer[pIDX]; - bool isCrossedOverVidya = isCloseOverVidya && - !isCloseOverVidyaPrev; - - // - bool isRejectDownVidya = cBar.IsRejected( - vidyaBuffer[cIDX], - X_DIRECTION_BEARISH // - ); - - // - bool isCloseUnderVidya = cBar.close < vidyaBuffer[cIDX]; - bool isCloseUnderVidyaPrev = pBar.close < vidyaBuffer[pIDX]; - bool isCrossedUnderVidya = isCloseUnderVidya && - !isCloseUnderVidyaPrev; - - // - // LMS ... - - // - bool isRejectUpLSM = cBar.IsRejected( - strSMLowBuffer[cIDX], - X_DIRECTION_BULLISH // - ); - - // - bool isCloseOverLSM = cBar.close > strSMLowBuffer[cIDX]; - bool isCloseOverLSMPrev = pBar.close > strSMLowBuffer[pIDX]; - bool isCrossedOverLSM = isCloseOverLSM && - !isCloseOverLSMPrev; - - // - bool isRejectDownLSM = cBar.IsRejected( - strSMLowBuffer[cIDX], - X_DIRECTION_BEARISH // - ); - - // - bool isCloseUnderLSM = cBar.close < strSMLowBuffer[cIDX]; - bool isCloseUnderLSMPrev = pBar.close < strSMLowBuffer[pIDX]; - bool isCrossedUnderLSM = isCloseUnderLSM && - !isCloseUnderLSMPrev; - - // - // HSM .. - - // - bool isRejectUpHSM = cBar.IsRejected( - strSMHighBuffer[cIDX], - X_DIRECTION_BULLISH // - ); - - // - bool isCloseOverHSM = cBar.close > strSMHighBuffer[cIDX]; - bool isCloseOverHSMPrev = pBar.close > strSMHighBuffer[pIDX]; - bool isCrossedOverHSM = isCloseOverHSM && - !isCloseOverHSMPrev; - - // - bool isRejectDownHSM = cBar.IsRejected( - strSMHighBuffer[cIDX], - X_DIRECTION_BEARISH // - ); - - // - bool isCloseUnderHSM = cBar.close > strSMHighBuffer[cIDX]; - bool isCloseUnderHSMPrev = pBar.close > strSMHighBuffer[pIDX]; - bool isCrossedUnderHSM = isCloseUnderHSM && - !isCloseUnderHSMPrev; - - // - // STR ... - - // - bool isRejectUpStr = cBar.IsRejected( - strBuffer[cIDX], - X_DIRECTION_BULLISH // - ); - - // - bool isCloseOverStr = cBar.close > strBuffer[cIDX]; - bool isCloseOverStrPrev = pBar.close > strBuffer[pIDX]; - bool isCrossedOverStr = isCloseOverStr && - !isCloseOverStrPrev; - - // - bool isRejectDownStr = cBar.IsRejected( - strBuffer[cIDX], - X_DIRECTION_BEARISH // - ); - - // - bool isCloseUnderStr = cBar.close < strBuffer[cIDX]; - bool isCloseUnderStrPrev = pBar.close < strBuffer[pIDX]; - bool isCrossedUnderStr = isCloseUnderStr && - !isCloseUnderStrPrev; - - // - // HSM / ViDYA ... - - // - bool isVidyaOverHSM = vidyaBuffer[cIDX] > strSMHighBuffer[cIDX]; - bool isVidyaOverHSMPrev = vidyaBuffer[pIDX] > strSMHighBuffer[pIDX]; - bool isVidyaCrossedOverHSM = isVidyaOverHSM && - !isVidyaOverHSMPrev; - - // - bool isVidyaUnderHSM = vidyaBuffer[cIDX] < strSMHighBuffer[cIDX]; - bool isVidyaUnderHSMPrev = vidyaBuffer[pIDX] < strSMHighBuffer[pIDX]; - bool isVidyaCrossedUnderHSM = isVidyaUnderHSM && - !isVidyaUnderHSMPrev; - - // - // LSM / VIDYA ... - - // - bool isVidyaOverLSM = vidyaBuffer[cIDX] > strSMLowBuffer[cIDX]; - bool isVidyaOverLSMPrev = vidyaBuffer[pIDX] > strSMLowBuffer[pIDX]; - bool isVidyaCrossedOverLSM = isVidyaOverLSM && - !isVidyaOverLSMPrev; - - // - bool isVidyaUnderLSM = vidyaBuffer[cIDX] < strSMLowBuffer[cIDX]; - bool isVidyaUnderLSMPrev = vidyaBuffer[pIDX] < strSMLowBuffer[pIDX]; - bool isVidyaCrossedUnderLSM = isVidyaUnderLSM && - !isVidyaUnderLSMPrev; - - // - // STR / VIDYA ... - - // - bool isVidyaOverStr = vidyaBuffer[cIDX] > strBuffer[cIDX]; - bool isVidyaOverStrPrev = vidyaBuffer[pIDX] > strBuffer[pIDX]; - bool isVidyaCrossedOverStr = isVidyaOverStr && - !isVidyaOverStrPrev; - - // - bool isVidyaUnderStr = vidyaBuffer[cIDX] < strBuffer[cIDX]; - bool isVidyaUnderStrPrev = vidyaBuffer[pIDX] < strBuffer[pIDX]; - bool isVidyaCrossedUnderStr = isVidyaUnderStr && - !isVidyaUnderStrPrev; - - // - // - // - - // - conditions.isStrBullish = isStrBullish; - conditions.isStrBearish = isStrBearish; - conditions.isRejectUpLSM = isRejectUpLSM; - conditions.isRejectUpHSM = isRejectUpHSM; - conditions.isRejectUpStr = isRejectUpStr; - conditions.isCloseOverHSM = isCloseOverHSM; - conditions.isCloseOverLSM = isCloseOverLSM; - conditions.isCloseOverStr = isCloseOverStr; - conditions.isVidyaOverHSM = isVidyaOverHSM; - conditions.isVidyaOverLSM = isVidyaOverLSM; - conditions.isVidyaOverStr = isVidyaOverStr; - conditions.isRejectDownLSM = isRejectDownLSM; - conditions.isRejectDownHSM = isRejectDownHSM; - conditions.isVidyaUnderStr = isVidyaUnderStr; - conditions.isVidyaUnderHSM = isVidyaUnderHSM; - conditions.isVidyaUnderLSM = isVidyaUnderLSM; - conditions.isCloseUnderStr = isCloseUnderStr; - conditions.isRejectDownStr = isRejectDownStr; - conditions.isRejectUpVidya = isRejectUpVidya; - conditions.isCloseUnderHSM = isCloseUnderHSM; - conditions.isCloseUnderLSM = isCloseUnderLSM; - conditions.isCrossedOverLSM = isCrossedOverLSM; - conditions.isCrossedOverHSM = isCrossedOverHSM; - conditions.isCrossedOverStr = isCrossedOverStr; - conditions.isCrossedUnderHSM = isCrossedUnderHSM; - conditions.isCrossedUnderLSM = isCrossedUnderLSM; - conditions.isCrossedUnderStr = isCrossedUnderStr; - conditions.isCloseOverVidya = isCloseOverVidya; - conditions.isRejectDownVidya = isRejectDownVidya; - conditions.isCloseUnderVidya = isCloseUnderVidya; - conditions.isCrossedOverVidya = isCrossedOverVidya; - conditions.isCrossedUnderVidya = isCrossedUnderVidya; - conditions.isVidyaCrossedOverHSM = isVidyaCrossedOverHSM; - conditions.isVidyaCrossedOverStr = isVidyaCrossedOverStr; - conditions.isVidyaCrossedOverLSM = isVidyaCrossedOverLSM; - conditions.isVidyaCrossedUnderHSM = isVidyaCrossedUnderHSM; - conditions.isVidyaCrossedUnderLSM = isVidyaCrossedUnderLSM; - conditions.isVidyaCrossedUnderStr = isVidyaCrossedUnderStr; - conditions.isStrSwitchedToBullish = isStrSwitchedToBullish; - conditions.isStrSwitchedToBearish = isStrSwitchedToBearish; - - // - Cleanup(); - - // - zBar.Clean(); - cBar.Clean(); - pBar.Clean(); - - // - return result; - } - - // - // Protected ... - protected: - // - // Private ... - private: - // - // Props ... - X121XSTRInputs mInputs; // Inputs ... - - // - // Buffers ... - double strBuffer[]; - double atrBuffer[]; - double vidyaBuffer[]; - double strUpBuffer[]; - double strDownBuffer[]; - double strPriceBuffer[]; - double strStateBuffer[]; - double strSMLowBuffer[]; - double strSMHighBuffer[]; - - // - void Calculate( - int barIndex = 0, - int maxRequiredBars = 100 // - ) - { - // - // Buffers ... - if (barIndex < 0) - { - barIndex = 0; - } - - // - // VIDYA ... - CopyBuffer( - mHandler, - X121_XSTR_XVIDYA_LINE, - barIndex, - maxRequiredBars, - vidyaBuffer - // - ); - - // - // STR ... - CopyBuffer( - mHandler, - X121_XSTR_LINE, - barIndex, - maxRequiredBars, - strBuffer - // - ); - - // - // State ... - CopyBuffer( - mHandler, - X121_XSTR_STATE_LINE, - barIndex, - maxRequiredBars, - strStateBuffer - // - ); - - // - // Price ... - CopyBuffer( - mHandler, - X121_XSTR_PRICE_LINE, - barIndex, - maxRequiredBars, - strPriceBuffer - // - ); - - // - // Up ... - CopyBuffer( - mHandler, - X121_XSTR_UP_LINE, - barIndex, - maxRequiredBars, - strUpBuffer - // - ); - - // - // STR ... - CopyBuffer( - mHandler, - X121_XSTR_DOWN_LINE, - barIndex, - maxRequiredBars, - strDownBuffer - // - ); - - // - CopyBuffer( - mHandler, - X121_XSTR_LSM_LINE, - barIndex, - maxRequiredBars, - strSMLowBuffer - // - ); - - // - CopyBuffer( - mHandler, - X121_XSTR_HSM_LINE, - barIndex, - maxRequiredBars, - strSMHighBuffer - // - ); - - // - // ATR ... - - // - CopyBuffer( - mHandler, - X121_XSTR_ATR_LINE, - barIndex, - maxRequiredBars, - atrBuffer - // - ); - } - - // - void Cleanup( - int maxAllowed = 100 // - ) - { - // - CleanupArray( - vidyaBuffer, - maxAllowed // - ); - - // - CleanupArray( - strBuffer, - maxAllowed // - ); - - // - CleanupArray( - atrBuffer, - maxAllowed // - ); - - // - CleanupArray( - strUpBuffer, - maxAllowed // - ); - - // - CleanupArray( - strDownBuffer, - maxAllowed // - ); - - // - CleanupArray( - strPriceBuffer, - maxAllowed // - ); - - // - CleanupArray( - strStateBuffer, - maxAllowed // - ); - - // - CleanupArray( - strSMLowBuffer, - maxAllowed // - ); - - // - CleanupArray( - strSMHighBuffer, - maxAllowed // - ); - } - - // -}; - -// -// Tools ... \ No newline at end of file diff --git a/Helpers/x-saherelm.x121.xtrend.helper.mq5 b/Helpers/x-saherelm.x121.xtrend.helper.mq5 deleted file mode 100644 index c3b8eafd..00000000 --- a/Helpers/x-saherelm.x121.xtrend.helper.mq5 +++ /dev/null @@ -1,1309 +0,0 @@ -/////////////////////////////////////////////////////// -// -// SaherElm IT Center MQL5 Helper Class Library -// ---------------------------------------------- -// Name: XCX121XTRENDHelper -// Description: provides all Indicator -// Helper requirements ... -// -// -// Maintainer: -// ------------ -// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) -// -////////////////////////////////////////////////////// -// -// Global Properties ... -#property library -#property copyright "Copyright 2023, SaherElm IT Center" -#property link "https://www.saherelm.ir" -#property version "1.00" -#property strict - -// -// Imports ... -#include "../Classes/x-saherelm.x-helper.class.mq5" - -// -// Definitions ... - -// -// Definitions ... -enum ENUM_X121_XTREND_BUFFERS -{ - // - X121_XTREND_UP_LINE = 0, - X121_XTREND_DOWN_LINE = 1, - X121_XTREND_MA_LINE = 2, - X121_XTREND_ADX_LINE = 3, - X121_XTREND_ADX_P_LINE = 4, - X121_XTREND_ADX_M_LINE = 5, - X121_XTREND_UP_T_LINE = 6, - X121_XTREND_DOWN_T_LINE = 7, -}; - -// -// Input Models ... -struct X121XTRENDInputs -{ - // - // Props ... - // - // Market ... - ENUM_APPLIED_PRICE trendPriceType; // Detect Trend Price Type - - // - // MA Detection ... - int maLength; // MA Length - ENUM_MA_METHOD maMethod; // MA Method - ENUM_APPLIED_PRICE maAppliedTo; // MA Applied To - - // - // ADX Detection ... - int adxLength; // ADX Length - double adxThreshold; // ADX Threshold for Strong Trends - - // - // Presentation ... - - // - int startCalculationForLastBars; // Calculate Last n Bars - int upTrendArrowCode; // Up Trend Arrow Code - int downTrendArrowCode; // Down Trend Arrow Code - - // - bool showOnlyTrendStart; // Show Only Trend Start - bool showUpTrend; // Show Up Trend - bool showDownTrend; // Show Down Trend - - // - // Constructor(s) ... - X121XTRENDInputs() - { - Clean(); - } - - // - // Tools ... - - // - // Clean ... - void Clean() - { - // - trendPriceType = PRICE_CLOSE; - maLength = 50; - maMethod = MODE_EMA; - maAppliedTo = PRICE_CLOSE; - adxLength = 14; - adxThreshold = 25; - startCalculationForLastBars = 1000; - upTrendArrowCode = 233; - downTrendArrowCode = 234; - showOnlyTrendStart = false; - showUpTrend = false; - showDownTrend = false; - - // - ZeroMemory(this); - } - - // - // Default ... - void Default() - { - // - trendPriceType = PRICE_CLOSE; - maLength = 50; - maMethod = MODE_EMA; - maAppliedTo = PRICE_CLOSE; - adxLength = 14; - adxThreshold = 25; - startCalculationForLastBars = 1000; - upTrendArrowCode = 233; - downTrendArrowCode = 234; - showOnlyTrendStart = true; - showUpTrend = true; - showDownTrend = true; - } - - // - // Validate ... - bool IsValid() - { - // - bool result = false; - - // - result = - // - // MA ... - maLength > 0 && - // - // ADX ... - adxLength > 0 && - adxThreshold > 0 - // - ; - - // - return result; - } - - // - // Retrieve MAx Length ... - int Max() - { - // - int result = 0; - - // - result = MathMax(maLength, adxLength); - - // - return result; - } -}; - -// -// Conditions ... -struct X121XTRENDConditions -{ - // - // Common ... - string symbol; - ENUM_TIMEFRAMES period; - datetime time; - - // - // Buffers ... - double upTrendBuffer[]; - double downTrendBuffer[]; - double maBuffer[]; - double adxBuffer[]; - double adxPBuffer[]; - double adxMBuffer[]; - double upTBuffer[]; - double downTBuffer[]; - - // - // Conditions ... - - // - bool isTrendBullish; - bool isTrendBearish; - - // - bool isTrendSwitchedToBullish; - bool isTrendSwitchedToBearish; - - // - // bool isCloseLower - - // - // Constructor ... - X121XTRENDConditions() - { - Clean(); - } - - // - // Tools ... - - /** - * Cleaning Up ... - */ - void Clean() - { - // - // Commons ... - symbol = NULL; - period = NULL; - time = NULL; - - // - // Buffers ... - - // - Clean(upTrendBuffer); - Clean(downTrendBuffer); - Clean(maBuffer); - Clean(adxBuffer); - Clean(adxPBuffer); - Clean(adxMBuffer); - Clean(upTBuffer); - Clean(downTBuffer); - - // - ArraySetAsSeries(upTrendBuffer, true); - ArraySetAsSeries(downTrendBuffer, true); - ArraySetAsSeries(maBuffer, true); - ArraySetAsSeries(adxBuffer, true); - ArraySetAsSeries(adxPBuffer, true); - ArraySetAsSeries(adxMBuffer, true); - ArraySetAsSeries(upTBuffer, true); - ArraySetAsSeries(downTBuffer, true); - - // - // Conditions ... - - // - isTrendBullish = false; - isTrendBearish = false; - - // - isTrendSwitchedToBullish = false; - isTrendSwitchedToBearish = false; - - // - ZeroMemory(this); - } - - /** - * Generate Conditions Scores ... - * - * @param bullishScore: Double, Directional Scores Reference ... - * @param bearishScore: Double, Directional Scores Reference ... - */ - void GenerateScore( - double &bullishScore, - double &bearishScore // - ) - { - // - bullishScore = 0; - bearishScore = 0; - - // - double score = 1; - double minScore = 0.5; - double highScore = 1.5; - - // - if (isTrendBullish) - { - bullishScore += minScore; - } - if (isTrendSwitchedToBullish) - { - bullishScore += score; - } - - // - if (isTrendBearish) - { - bearishScore += minScore; - } - if (isTrendSwitchedToBearish) - { - bearishScore += score; - } - } - - /** - * Generate Summary String for Represent Conditions State ... - * - * @param onlyCommons: Boolean, Just Generate Only Commons Conditions ... - * @param onlyConditions: Boolean, Just Generate Only Conditions ... - * @param includeScores: Boolean, Attach Scores Representations on Result ... - * @param ignoreFalseConditions: Boolean, Ignore False Conditions on Result ... - * @param separator: String, Separate Lines ... - * - * @return ( string ) - */ - string GenerateSummary( - bool onlyCommons = false, - bool onlyConditions = false, - bool includeScores = true, - bool ignoreFalseConditions = true, - string separator = "\n" // - ) - { - // - string result = NULL; - - // - double bullishScore = 0; - double bearishScore = 0; - GenerateScore( - bullishScore, - bearishScore // - ); - - // - string scoresStr = - // - "Scores: " + separator + - "---------------" + separator + - "Bullish: " + ToString(bullishScore) + separator + - "Bearish: " + ToString(bearishScore) + separator + - "" - // - ; - - // - string commonStr = GenerateSpecifiedCommonSummary( - this, - separator, - includeScores // - ); - - // - string conditionsStr = - // - "-----------------------" + separator + - "XTREND: " + separator + - "-----------------------" + separator + - ToString("isTrendBullish", isTrendBullish, ignoreFalseConditions, separator) + - ToString("isTrendBearish", isTrendBearish, ignoreFalseConditions, separator) + - ToString("isTrendSwitchedToBullish", isTrendSwitchedToBullish, ignoreFalseConditions, separator) + - ToString("isTrendSwitchedToBearish", isTrendSwitchedToBearish, ignoreFalseConditions, separator) + - // - "" - // - ; - - // - result = - // - "[" + GetTag() + "]" + separator + - (onlyConditions - ? "" - : commonStr) + - (!includeScores - ? "" - : scoresStr) + - " " + separator + - (onlyCommons - ? "" - : conditionsStr) + - "" - // - ; - - // - return result; - } - - /** - * Retrieve nique Tag Identifier ... - * - * @return ( string ) - */ - string GetTag() - { - return GetTypeName(this); - } - - // -}; - -// -// Class ... -class XCX121XTRENDHelper : public XCBaseHelper -{ - // - // Public ... - public: - // - // Props ... - - // - // Constructors ... - XCX121XTRENDHelper() - : XCBaseHelper(_Symbol, _Period) - { - } - - // - // Deconstructor ... - ~XCX121XTRENDHelper() - { - // - mInputs.Clean(); - - // - Clean(upTrendBuffer); - Clean(downTrendBuffer); - Clean(maBuffer); - Clean(adxBuffer); - Clean(adxPBuffer); - Clean(adxMBuffer); - Clean(upTBuffer); - Clean(downTBuffer); - } - - // - // Tools ... - bool Init( - string symbol, // Trading Symbol - ENUM_TIMEFRAMES period, // Trading Period - X121XTRENDInputs &inputs // Inputs - ) - { - // - bool result = false; - - // - mSymbol = symbol; - mPeriod = period; - - // - result = inputs.IsValid(); - if (!result) - { - return result; - } - - // - ArraySetAsSeries(upTrendBuffer, true); - ArraySetAsSeries(downTrendBuffer, true); - ArraySetAsSeries(maBuffer, true); - ArraySetAsSeries(adxBuffer, true); - ArraySetAsSeries(adxPBuffer, true); - ArraySetAsSeries(adxMBuffer, true); - ArraySetAsSeries(upTBuffer, true); - ArraySetAsSeries(downTBuffer, true); - - // - mInputs = inputs; - - // - mHandler = iCustom( - mSymbol, - mPeriod, - "x-saherelm.x121.xtrend", - // - // Inputs ... - // - // Market ... - "", - mInputs.trendPriceType, - // - // MA Detection ... - "", - mInputs.maLength, - mInputs.maMethod, - mInputs.maAppliedTo, - // - // ADX Detection ... - "", - mInputs.adxLength, - mInputs.adxThreshold, - // - // Presentation ... - "", - mInputs.startCalculationForLastBars, - mInputs.upTrendArrowCode, - mInputs.downTrendArrowCode, - mInputs.showOnlyTrendStart, - mInputs.showUpTrend, - mInputs.showDownTrend - // - ); - result = mHandler != INVALID_HANDLE; - if (!result) - { - return result; - } - - // - return result; - } - - // - // Inputs ... - - // - X121XTRENDInputs GetInputs() - { - return mInputs; - } - - // - bool SetInputs( - X121XTRENDInputs &inputs // Configs - ) - { - // - return Init( - mSymbol, - mPeriod, - inputs - // - ); - } - - // - // Readers ... - - // - // Up Trend ... - - // - double GetUpTrend( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(upTrendBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return upTrendBuffer[barIndex]; - } - - // - int CopyUpTrend( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - upTrendBuffer, - buffer, - forceClean - // - ); - } - - // - // Down Trend ... - - // - double GetDownTrend( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(downTrendBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return downTrendBuffer[barIndex]; - } - - // - int CopyDownTrend( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - downTrendBuffer, - buffer, - forceClean - // - ); - } - - // - // Ma ... - - // - double GetMA( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(downTrendBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return downTrendBuffer[barIndex]; - } - - // - int CopyMA( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - downTrendBuffer, - buffer, - forceClean - // - ); - } - - // - // ADX ... - - // - double GetADX( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(adxBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return adxBuffer[barIndex]; - } - - // - int CopyADX( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - adxBuffer, - buffer, - forceClean - // - ); - } - - // - // ADX P... - - // - double GetADXP( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(adxPBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return adxPBuffer[barIndex]; - } - - // - int CopyADXP( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - adxPBuffer, - buffer, - forceClean - // - ); - } - - // - // ADX M ... - - // - double GetADXM( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(adxMBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return adxMBuffer[barIndex]; - } - - // - int CopyADXM( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - adxMBuffer, - buffer, - forceClean - // - ); - } - - // - // Up Trend ... - - // - double GetUpT( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(upTBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return upTBuffer[barIndex]; - } - - // - int CopyUpT( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - upTBuffer, - buffer, - forceClean - // - ); - } - - // - // Down Trend ... - - // - double GetDownT( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(downTBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return downTBuffer[barIndex]; - } - - // - int CopyDownT( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - downTBuffer, - buffer, - forceClean - // - ); - } - - // - void Free() override - { - Cleanup(10); - } - - // - bool GetConditions( - X121XTRENDConditions &conditions, // - int barIndex = 0, // - int loopback = 5 // - ) - { - // - bool result = true; - - // - if (loopback < 5) - { - loopback = 5; - } - - // - conditions.Clean(); - - // - conditions.symbol = mSymbol; - conditions.period = mPeriod; - conditions.time = TimeCurrent(); - - // - int zIndex = barIndex; - int cIndex = zIndex + 1; - int pIndex = cIndex + 1; - int ppIndex = pIndex + 1; - - // - XOHCL zBar; - result = zBar.Init( - mSymbol, - mPeriod, - zIndex // - ); - if (!result) - { - return result; - } - - // - XOHCL cBar; - result = cBar.Init( - mSymbol, - mPeriod, - cIndex // - ); - if (!result) - { - return result; - } - - // - XOHCL pBar; - result = pBar.Init( - mSymbol, - mPeriod, - pIndex // - ); - if (!result) - { - return result; - } - - // - // Buffers ... - - // - CopyUpTrend( - zIndex, - loopback, - conditions.upTrendBuffer // - ); - - // - CopyDownTrend( - zIndex, - loopback, - conditions.downTrendBuffer // - ); - - // - CopyMA( - zIndex, - loopback, - conditions.maBuffer // - ); - - // - CopyADX( - zIndex, - loopback, - conditions.adxBuffer // - ); - - // - CopyADXP( - zIndex, - loopback, - conditions.adxPBuffer // - ); - - // - CopyADXM( - zIndex, - loopback, - conditions.adxMBuffer // - ); - - // - CopyUpT( - zIndex, - loopback, - conditions.upTBuffer // - ); - - // - CopyDownT( - zIndex, - loopback, - conditions.downTBuffer // - ); - - // - // Conditions ... - - // - int cIDX = 1; - int pIDX = cIDX + 1; - - // - bool isTrendBullish = upTBuffer[cIDX] != 0; - bool isTrendBullishPrev = upTBuffer[pIDX] != 0; - - // - bool isTrendBearish = downTBuffer[cIDX] != 0; - bool isTrendBearishPrev = downTBuffer[pIDX] != 0; - - // - bool isTrendSwitchedToBullish = isTrendBullish && - !isTrendBullishPrev; - bool isTrendSwitchedToBearish = isTrendBearish && - !isTrendBearishPrev; - - // - conditions.isTrendBullish = isTrendBullish; - conditions.isTrendBearish = isTrendBearish; - conditions.isTrendSwitchedToBullish = isTrendSwitchedToBullish; - conditions.isTrendSwitchedToBearish = isTrendSwitchedToBearish; - - // - Cleanup(); - - // - zBar.Clean(); - cBar.Clean(); - pBar.Clean(); - - // - return result; - } - - // - // Protected ... - protected: - // - // Private ... - private: - // - // Props ... - X121XTRENDInputs mInputs; // Inputs ... - - // - // Buffers ... - double upTrendBuffer[]; - double downTrendBuffer[]; - double maBuffer[]; - double adxBuffer[]; - double adxPBuffer[]; - double adxMBuffer[]; - double upTBuffer[]; - double downTBuffer[]; - - // - void Calculate( - int barIndex = 0, - int maxRequiredBars = 100 // - ) - { - // - // Buffers ... - if (barIndex < 0) - { - barIndex = 0; - } - - // - // Up Trend ... - CopyBuffer( - mHandler, - X121_XTREND_UP_LINE, - barIndex, - maxRequiredBars, - upTrendBuffer - // - ); - - // - // Down Trend ... - CopyBuffer( - mHandler, - X121_XTREND_DOWN_LINE, - barIndex, - maxRequiredBars, - downTrendBuffer - // - ); - - // - // MA ... - CopyBuffer( - mHandler, - X121_XTREND_MA_LINE, - barIndex, - maxRequiredBars, - maBuffer - // - ); - - // - // ADX ... - CopyBuffer( - mHandler, - X121_XTREND_ADX_LINE, - barIndex, - maxRequiredBars, - adxBuffer - // - ); - - // - // ADX P ... - CopyBuffer( - mHandler, - X121_XTREND_ADX_P_LINE, - barIndex, - maxRequiredBars, - adxPBuffer - // - ); - - // - // ADX M ... - CopyBuffer( - mHandler, - X121_XTREND_ADX_M_LINE, - barIndex, - maxRequiredBars, - adxMBuffer - // - ); - - // - // Up T ... - CopyBuffer( - mHandler, - X121_XTREND_UP_T_LINE, - barIndex, - maxRequiredBars, - upTBuffer - // - ); - - // - // Down T ... - CopyBuffer( - mHandler, - X121_XTREND_DOWN_T_LINE, - barIndex, - maxRequiredBars, - downTBuffer - // - ); - } - - // - void Cleanup( - int maxAllowed = 100 // - ) - { - // - CleanupArray( - upTrendBuffer, - maxAllowed // - ); - - // - CleanupArray( - downTrendBuffer, - maxAllowed // - ); - - // - CleanupArray( - maBuffer, - maxAllowed // - ); - - // - CleanupArray( - adxBuffer, - maxAllowed // - ); - - // - CleanupArray( - adxPBuffer, - maxAllowed // - ); - - // - CleanupArray( - adxMBuffer, - maxAllowed // - ); - - // - CleanupArray( - upTBuffer, - maxAllowed // - ); - - // - CleanupArray( - downTBuffer, - maxAllowed // - ); - - // - } - - // -}; - -// -// Tools ... \ No newline at end of file diff --git a/Helpers/x-saherelm.x121.xvolume.helper.mq5 b/Helpers/x-saherelm.x121.xvolume.helper.mq5 deleted file mode 100644 index 4fc0c242..00000000 --- a/Helpers/x-saherelm.x121.xvolume.helper.mq5 +++ /dev/null @@ -1,1158 +0,0 @@ -/////////////////////////////////////////////////////// -// -// SaherElm IT Center MQL5 Helper Class Library -// ---------------------------------------------- -// Name: XCX121XVOLUMESHelper -// Description: provides all Indicator -// Helper requirements ... -// -// -// Maintainer: -// ------------ -// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) -// -////////////////////////////////////////////////////// -// -// Global Properties ... -#property library -#property copyright "Copyright 2023, SaherElm IT Center" -#property link "https://www.saherelm.ir" -#property version "1.00" -#property strict - -// -// Imports ... -#include "../Classes/x-saherelm.x-helper.class.mq5" - -// -// Definitions ... -enum ENUM_X121_XVOLUME_BUFFERS -{ - // - X121_XVOLUME_BULLISH_LINE = 0, - X121_XVOLUME_BULLISH_MA_LINE = 1, - X121_XVOLUME_BEARISH_LINE = 2, - X121_XVOLUME_BEARISH_MA_LINE = 3, -}; - -// -// Input Models ... -struct X121XVOLUMEInputs -{ - // - // Props ... - - // - // Makret ... - int maLength; // Moving Averge Length - ENUM_X_MA_METHOD maMethod; // Moving Averge Method - - // - // Presentation ... - int startCalculationForLastBars; // Calculate Last n Bars - bool showBullishVolume; // Show Bullish Volume - bool showBullishVolumeMa; // Show Bullish Volume Moving Average - bool showBearishVolume; // Show Bearish Volume - bool showBearishVolumeMa; // Show Bearish Volume Moving Average - - // - // Constructor(s) ... - X121XVOLUMEInputs() - { - Clean(); - } - - // - // Tools ... - - /** - * Cleanup Model ... - */ - void Clean() - { - // - // Makret ... - maLength = 0; // Moving Averge Length - maMethod = X_MA_MODE_NONE; // Moving Averge Method - - // - // Presentation ... - startCalculationForLastBars = 0; // Calculate Last n Bars - showBullishVolume = false; // Show Bullish Volume - showBullishVolumeMa = false; // Show Bullish Volume Moving Average - showBearishVolume = false; // Show Bearish Volume - showBearishVolumeMa = false; // Show Bearish Volume Moving Average - - // - ZeroMemory(this); - } - - /** - * Default Inputs ... - */ - void Default() - { - // - // Makret ... - maLength = 14; // Moving Averge Length - maMethod = X_MA_MODE_EMA; // Moving Averge Method - - // - // Presentation ... - startCalculationForLastBars = 1000; // Calculate Last n Bars - showBullishVolume = true; // Show Bullish Volume - showBullishVolumeMa = true; // Show Bullish Volume Moving Average - showBearishVolume = true; // Show Bearish Volume - showBearishVolumeMa = true; // Show Bearish Volume Moving Average - } - - /** - * Validate Model ... - * - * @return ( bool ) - */ - bool IsValid() - { - // - bool result = false; - - // - result = - // - maLength > 0 && - IsValid(maMethod) - // - ; - - // - return result; - } - - /** - * Retrieve Max Input Length ... - * - * @return ( int ) - */ - int Max() - { - // - int result = 0; - - // - result = MathMax(result, maLength); - - // - return result; - } - - // -}; - -// -// Conditions ... -struct X121XVOLUMEConditions -{ - // - // Common ... - string symbol; - ENUM_TIMEFRAMES period; - datetime time; - - // - // Buffers ... - double bullishVolumeBuffer[]; - double bullishVolumeMaBuffer[]; - double bearishVolumeBuffer[]; - double bearishVolumeMaBuffer[]; - - // - // Conditions ... - - // - bool isBullishVolumeOverMa; - bool isBullishVolumeCrossedOverMa; - - // - bool isBullishVolumeUnderMa; - bool isBullishVolumeCrossedUnderMa; - - // - bool isBullishVolumeIncreased; - bool isBullishVolumeSwitchedToIncreased; - - // - bool isBullishVolumeDecreased; - bool isBullishVolumeSwitchedToDecreased; - - // - bool isBearishVolumeOverMa; - bool isBearishVolumeCrossedOverMa; - - // - bool isBearishVolumeUnderMa; - bool isBearishVolumeCrossedUnderMa; - - // - bool isBearishVolumeIncreased; - bool isBearishVolumeSwitchedToIncreased; - - // - bool isBearishVolumeDecreased; - bool isBearishVolumeSwitchedToDecreased; - - // - bool isVolumeSwitchedToBullish; - bool isVolumeSwitchedToBearish; - bool isBullishVolumeMaOverBearishVolumeMa; - bool isBullishVolumeMaUnderBearishVolumeMa; - - // - // Constructor ... - X121XVOLUMEConditions() - { - Clean(); - } - - // - // Tools ... - - /** - * Cleaning Up ... - */ - void Clean() - { - // - // Commons ... - time = NULL; - symbol = NULL; - period = NULL; - - // - // Buffers ... - - // - Clean(bullishVolumeBuffer); - Clean(bullishVolumeMaBuffer); - Clean(bearishVolumeBuffer); - Clean(bearishVolumeMaBuffer); - - // - ArraySetAsSeries(bullishVolumeBuffer, true); - ArraySetAsSeries(bullishVolumeMaBuffer, true); - ArraySetAsSeries(bearishVolumeBuffer, true); - ArraySetAsSeries(bearishVolumeMaBuffer, true); - - // - // Conditions ... - - // - isBullishVolumeOverMa = false; - isBullishVolumeCrossedOverMa = false; - - // - isBullishVolumeUnderMa = false; - isBullishVolumeCrossedUnderMa = false; - - // - isBullishVolumeIncreased = false; - isBullishVolumeSwitchedToIncreased = false; - - // - isBullishVolumeDecreased = false; - isBullishVolumeSwitchedToDecreased = false; - - // - isBearishVolumeOverMa = false; - isBearishVolumeCrossedOverMa = false; - - // - isBearishVolumeUnderMa = false; - isBearishVolumeCrossedUnderMa = false; - - // - isBearishVolumeIncreased = false; - isBearishVolumeSwitchedToIncreased = false; - - // - isBearishVolumeDecreased = false; - isBearishVolumeSwitchedToDecreased = false; - - // - isVolumeSwitchedToBullish = false; - isVolumeSwitchedToBearish = false; - isBullishVolumeMaOverBearishVolumeMa = false; - isBullishVolumeMaUnderBearishVolumeMa = false; - - // - ZeroMemory(this); - } - - /** - * Generate Conditions Scores ... - * - * @param bullishScore: Double, Directional Scores Reference ... - * @param bearishScore: Double, Directional Scores Reference ... - */ - void GenerateScore( - double &bullishScore, - double &bearishScore // - ) - { - // - bullishScore = 0; - bearishScore = 0; - - // - double score = 1; - double minScore = 0.5; - double highScore = 1.5; - - // - if (isBullishVolumeOverMa) - { - bullishScore += minScore; - } - if (isBearishVolumeUnderMa) - { - bullishScore += minScore; - } - if (isBullishVolumeIncreased) - { - bullishScore += minScore; - } - if (isBearishVolumeDecreased) - { - bullishScore += minScore; - } - if (isBullishVolumeMaOverBearishVolumeMa) - { - bullishScore += minScore; - } - - // - if (isVolumeSwitchedToBullish) - { - bullishScore += score; - } - if (isBullishVolumeCrossedOverMa) - { - bullishScore += score; - } - if (isBearishVolumeCrossedUnderMa) - { - bullishScore += score; - } - if (isBullishVolumeSwitchedToIncreased) - { - bullishScore += score; - } - if (isBearishVolumeSwitchedToDecreased) - { - bullishScore += score; - } - - // - if (isBearishVolumeOverMa) - { - bearishScore += minScore; - } - if (isBullishVolumeUnderMa) - { - bearishScore += minScore; - } - if (isBullishVolumeDecreased) - { - bearishScore += minScore; - } - if (isBearishVolumeIncreased) - { - bearishScore += minScore; - } - if (isBullishVolumeMaUnderBearishVolumeMa) - { - bearishScore += minScore; - } - - // - if (isVolumeSwitchedToBearish) - { - bearishScore += score; - } - if (isBearishVolumeCrossedOverMa) - { - bearishScore += score; - } - if (isBullishVolumeCrossedUnderMa) - { - bearishScore += score; - } - if (isBullishVolumeSwitchedToDecreased) - { - bearishScore += score; - } - if (isBearishVolumeSwitchedToIncreased) - { - bearishScore += score; - } - } - - /** - * Generate Summary String for Represent Conditions State ... - * - * @param onlyCommons: Boolean, Just Generate Only Commons Conditions ... - * @param onlyConditions: Boolean, Just Generate Only Conditions ... - * @param includeScores: Boolean, Attach Scores Representations on Result ... - * @param ignoreFalseConditions: Boolean, Ignore False Conditions on Result ... - * @param separator: String, Separate Lines ... - * - * @return ( string ) - */ - string GenerateSummary( - bool onlyCommons = false, - bool onlyConditions = false, - bool includeScores = true, - bool ignoreFalseConditions = true, - string separator = "\n" // - ) - { - // - string result = NULL; - - // - double bullishScore = 0; - double bearishScore = 0; - GenerateScore( - bullishScore, - bearishScore // - ); - - // - string scoresStr = - // - "Scores: " + separator + - "---------------" + separator + - "Bullish: " + ToString(bullishScore) + separator + - "Bearish: " + ToString(bearishScore) + separator + - "" - // - ; - - // - string commonStr = GenerateSpecifiedCommonSummary( - this, - separator, - includeScores // - ); - - // - string conditionsStr = - // - "-----------------------" + separator + - "XVOLUME: " + separator + - "-----------------------" + separator + - ToString("isBullishVolumeOverMa", isBullishVolumeOverMa, ignoreFalseConditions, separator) + - ToString("isBullishVolumeCrossedOverMa", isBullishVolumeCrossedOverMa, ignoreFalseConditions, separator) + - ToString("isBullishVolumeUnderMa", isBullishVolumeUnderMa, ignoreFalseConditions, separator) + - ToString("isBullishVolumeCrossedUnderMa", isBullishVolumeCrossedUnderMa, ignoreFalseConditions, separator) + - ToString("isBullishVolumeIncreased", isBullishVolumeIncreased, ignoreFalseConditions, separator) + - ToString("isBullishVolumeSwitchedToIncreased", isBullishVolumeSwitchedToIncreased, ignoreFalseConditions, separator) + - ToString("isBullishVolumeDecreased", isBullishVolumeDecreased, ignoreFalseConditions, separator) + - ToString("isBullishVolumeSwitchedToDecreased", isBullishVolumeSwitchedToDecreased, ignoreFalseConditions, separator) + - ToString("isBearishVolumeOverMa", isBearishVolumeOverMa, ignoreFalseConditions, separator) + - ToString("isBearishVolumeCrossedOverMa", isBearishVolumeCrossedOverMa, ignoreFalseConditions, separator) + - ToString("isBearishVolumeUnderMa", isBearishVolumeUnderMa, ignoreFalseConditions, separator) + - ToString("isBearishVolumeCrossedUnderMa", isBearishVolumeCrossedUnderMa, ignoreFalseConditions, separator) + - ToString("isBearishVolumeIncreased", isBearishVolumeIncreased, ignoreFalseConditions, separator) + - ToString("isBearishVolumeSwitchedToIncreased", isBearishVolumeSwitchedToIncreased, ignoreFalseConditions, separator) + - ToString("isBearishVolumeDecreased", isBearishVolumeDecreased, ignoreFalseConditions, separator) + - ToString("isBearishVolumeSwitchedToDecreased", isBearishVolumeSwitchedToDecreased, ignoreFalseConditions, separator) + - ToString("isVolumeSwitchedToBullish", isVolumeSwitchedToBullish, ignoreFalseConditions, separator) + - ToString("isVolumeSwitchedToBearish", isVolumeSwitchedToBearish, ignoreFalseConditions, separator) + - ToString("isBullishVolumeMaOverBearishVolumeMa", isBullishVolumeMaOverBearishVolumeMa, ignoreFalseConditions, separator) + - ToString("isBullishVolumeMaUnderBearishVolumeMa", isBullishVolumeMaUnderBearishVolumeMa, ignoreFalseConditions, separator) + - // - "" - // - ; - - // - result = - // - "[" + GetTag() + "]" + separator + - (onlyConditions - ? "" - : commonStr) + - (!includeScores - ? "" - : scoresStr) + - " " + separator + - (onlyCommons - ? "" - : conditionsStr) + - "" - // - ; - - // - return result; - } - - /** - * Retrieve nique Tag Identifier ... - * - * @return ( string ) - */ - string GetTag() - { - return GetTypeName(this); - } - - // -}; - -// -// Class ... -class XCX121XVOLUMEHelper : public XCBaseHelper -{ - // - // Public ... - public: - // - // Props ... - - // - // Constructors ... - XCX121XVOLUMEHelper() - : XCBaseHelper(_Symbol, _Period) - { - } - - // - // Deconstructor ... - ~XCX121XVOLUMEHelper() - { - // - mInputs.Clean(); - - // - Clean(bullishVolumeBuffer); - Clean(bullishVolumeMaBuffer); - Clean(bearishVolumeBuffer); - Clean(bearishVolumeMaBuffer); - } - - // - // Tools ... - bool Init( - string symbol, // Trading Symbol - ENUM_TIMEFRAMES period, // Trading Period - X121XVOLUMEInputs &inputs // Inputs - ) - { - // - bool result = false; - - // - mSymbol = symbol; - mPeriod = period; - - // - result = inputs.IsValid(); - if (!result) - { - return result; - } - - // - ArraySetAsSeries(bullishVolumeBuffer, true); - ArraySetAsSeries(bullishVolumeMaBuffer, true); - ArraySetAsSeries(bearishVolumeBuffer, true); - ArraySetAsSeries(bearishVolumeMaBuffer, true); - - // - mInputs = inputs; - - // - mHandler = iCustom( - mSymbol, - mPeriod, - "x-saherelm.x121.xvolume", - // - // Inputs ... - // - // Market ... - "", - mInputs.maLength, - mInputs.maMethod, - // - // Presentation ... - "", - // - mInputs.startCalculationForLastBars, - mInputs.showBullishVolume, - mInputs.showBullishVolumeMa, - mInputs.showBearishVolume, - mInputs.showBearishVolumeMa - // - ); - result = mHandler != INVALID_HANDLE; - if (!result) - { - return result; - } - - // - return result; - } - - // - // Inputs ... - - // - X121XVOLUMEInputs GetInputs() - { - return mInputs; - } - - // - bool SetInputs( - X121XVOLUMEInputs &inputs // Configs - ) - { - // - return Init( - mSymbol, - mPeriod, - inputs - // - ); - } - - // - // Readers ... - - // - // Bullish ... - - // - double GetBullishVolume( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(bullishVolumeBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return bullishVolumeBuffer[barIndex]; - } - - // - int CopyBullishVolume( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - bullishVolumeBuffer, - buffer, - forceClean - // - ); - } - - // - double GetBullishVolumeMa( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(bullishVolumeMaBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return bullishVolumeMaBuffer[barIndex]; - } - - // - int CopyBullishVolumeMa( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - bullishVolumeMaBuffer, - buffer, - forceClean - // - ); - } - - // - // Bearish ... - - // - double GetBearishVolume( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(bearishVolumeBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return bearishVolumeBuffer[barIndex]; - } - - // - int CopyBearishVolume( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - bearishVolumeBuffer, - buffer, - forceClean - // - ); - } - - // - double GetBearishVolumeMa( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(bearishVolumeMaBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return bearishVolumeMaBuffer[barIndex]; - } - - // - int CopyBearishVolumeMa( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - bearishVolumeMaBuffer, - buffer, - forceClean - // - ); - } - - // - bool GetConditions( - X121XVOLUMEConditions &conditions, // - int barIndex = 0, // - int loopback = 5 // - ) - { - // - bool result = true; - - // - if (loopback < 5) - { - loopback = 5; - } - - // - conditions.Clean(); - - // - conditions.symbol = mSymbol; - conditions.period = mPeriod; - conditions.time = TimeCurrent(); - - // - int zIndex = barIndex; - int cIndex = zIndex + 1; - int pIndex = cIndex + 1; - int ppIndex = pIndex + 1; - - // - XOHCL zBar; - result = zBar.Init( - mSymbol, - mPeriod, - zIndex // - ); - if (!result) - { - return result; - } - - // - XOHCL cBar; - result = cBar.Init( - mSymbol, - mPeriod, - cIndex // - ); - if (!result) - { - return result; - } - - // - XOHCL pBar; - result = pBar.Init( - mSymbol, - mPeriod, - pIndex // - ); - if (!result) - { - return result; - } - - // - // Buffers ... - - // - CopyBullishVolume( - zIndex, - loopback, - conditions.bullishVolumeBuffer // - ); - - // - CopyBullishVolumeMa( - zIndex, - loopback, - conditions.bullishVolumeMaBuffer // - ); - - // - CopyBearishVolume( - zIndex, - loopback, - conditions.bearishVolumeBuffer // - ); - - // - CopyBearishVolumeMa( - zIndex, - loopback, - conditions.bearishVolumeMaBuffer // - ); - - // - // Conditions ... - - // - int cIDX = 1; - int pIDX = cIDX + 1; - int pPIDX = pIDX + 1; - - // - bool isBullishVolumeOverMa = conditions.bullishVolumeBuffer[cIDX] > conditions.bullishVolumeMaBuffer[cIDX]; - bool isBullishVolumeOverMaP = conditions.bullishVolumeBuffer[pIDX] > conditions.bullishVolumeMaBuffer[pIDX]; - bool isBullishVolumeCrossedOverMa = isBullishVolumeOverMa && - !isBullishVolumeOverMaP; - - // - bool isBullishVolumeUnderMa = conditions.bullishVolumeBuffer[cIDX] < conditions.bullishVolumeMaBuffer[cIDX]; - bool isBullishVolumeUnderMaP = conditions.bullishVolumeBuffer[pIDX] < conditions.bullishVolumeMaBuffer[pIDX]; - bool isBullishVolumeCrossedUnderMa = isBullishVolumeUnderMa && - !isBullishVolumeUnderMaP; - - // - bool isBullishVolumeIncreased = conditions.bullishVolumeBuffer[cIDX] > conditions.bullishVolumeBuffer[pIDX]; - bool isBullishVolumeIncreasedP = conditions.bullishVolumeBuffer[pIDX] > conditions.bullishVolumeBuffer[pPIDX]; - bool isBullishVolumeSwitchedToIncreased = isBullishVolumeIncreased && - !isBullishVolumeIncreasedP; - - // - bool isBullishVolumeDecreased = conditions.bullishVolumeBuffer[cIDX] < conditions.bullishVolumeBuffer[pIDX]; - bool isBullishVolumeDecreasedP = conditions.bullishVolumeBuffer[pIDX] < conditions.bullishVolumeBuffer[pPIDX]; - bool isBullishVolumeSwitchedToDecreased = isBullishVolumeDecreased && - !isBullishVolumeDecreasedP; - - // - bool isBearishVolumeOverMa = conditions.bearishVolumeBuffer[cIDX] > conditions.bearishVolumeMaBuffer[cIDX]; - bool isBearishVolumeOverMaP = conditions.bearishVolumeBuffer[pIDX] > conditions.bearishVolumeMaBuffer[pIDX]; - bool isBearishVolumeCrossedOverMa = isBearishVolumeOverMa && - !isBearishVolumeOverMaP; - - // - bool isBearishVolumeUnderMa = conditions.bearishVolumeBuffer[cIDX] < conditions.bearishVolumeMaBuffer[cIDX]; - bool isBearishVolumeUnderMaP = conditions.bearishVolumeBuffer[pIDX] < conditions.bearishVolumeMaBuffer[pIDX]; - bool isBearishVolumeCrossedUnderMa = isBearishVolumeUnderMa && - !isBearishVolumeUnderMaP; - - // - bool isBearishVolumeIncreased = conditions.bearishVolumeBuffer[cIDX] > conditions.bearishVolumeBuffer[pIDX]; - bool isBearishVolumeIncreasedP = conditions.bearishVolumeBuffer[pIDX] > conditions.bearishVolumeBuffer[pPIDX]; - bool isBearishVolumeSwitchedToIncreased = isBearishVolumeIncreased && - !isBearishVolumeIncreasedP; - - // - bool isBearishVolumeDecreased = conditions.bearishVolumeBuffer[cIDX] < conditions.bearishVolumeBuffer[pIDX]; - bool isBearishVolumeDecreasedP = conditions.bearishVolumeBuffer[pIDX] < conditions.bearishVolumeBuffer[pPIDX]; - bool isBearishVolumeSwitchedToDecreased = isBearishVolumeDecreased && - !isBearishVolumeDecreasedP; - - // - bool isBullishVolumeMaOverBearishVolumeMa = conditions.bullishVolumeMaBuffer[cIDX] > conditions.bearishVolumeMaBuffer[cIDX]; - bool isBullishVolumeMaOverBearishVolumeMaP = conditions.bullishVolumeMaBuffer[pIDX] > conditions.bearishVolumeMaBuffer[pIDX]; - bool isVolumeSwitchedToBullish = isBullishVolumeMaOverBearishVolumeMa && - !isBullishVolumeMaOverBearishVolumeMaP; - - // - bool isBullishVolumeMaUnderBearishVolumeMa = conditions.bullishVolumeMaBuffer[cIDX] < conditions.bearishVolumeMaBuffer[cIDX]; - bool isBullishVolumeMaUnderBearishVolumeMaP = conditions.bullishVolumeMaBuffer[pIDX] < conditions.bearishVolumeMaBuffer[pIDX]; - bool isVolumeSwitchedToBearish = isBullishVolumeMaUnderBearishVolumeMa && - !isBullishVolumeMaUnderBearishVolumeMaP; - - // - // - // - - // - conditions.isBullishVolumeOverMa = isBullishVolumeOverMa; - conditions.isBullishVolumeCrossedOverMa = isBullishVolumeCrossedOverMa; - - // - conditions.isBullishVolumeUnderMa = isBullishVolumeUnderMa; - conditions.isBullishVolumeCrossedUnderMa = isBullishVolumeCrossedUnderMa; - - // - conditions.isBullishVolumeIncreased = isBullishVolumeIncreased; - conditions.isBullishVolumeSwitchedToIncreased = isBullishVolumeSwitchedToIncreased; - - // - conditions.isBullishVolumeDecreased = isBullishVolumeDecreased; - conditions.isBullishVolumeSwitchedToDecreased = isBullishVolumeSwitchedToDecreased; - - // - conditions.isBearishVolumeOverMa = isBearishVolumeOverMa; - conditions.isBearishVolumeCrossedOverMa = isBearishVolumeCrossedOverMa; - - // - conditions.isBearishVolumeUnderMa = isBearishVolumeUnderMa; - conditions.isBearishVolumeCrossedUnderMa = isBearishVolumeCrossedUnderMa; - - // - conditions.isBearishVolumeIncreased = isBearishVolumeIncreased; - conditions.isBearishVolumeSwitchedToIncreased = isBearishVolumeSwitchedToIncreased; - - // - conditions.isBearishVolumeDecreased = isBearishVolumeDecreased; - conditions.isBearishVolumeSwitchedToDecreased = isBearishVolumeSwitchedToDecreased; - - // - conditions.isVolumeSwitchedToBullish = isVolumeSwitchedToBullish; - conditions.isVolumeSwitchedToBearish = isVolumeSwitchedToBearish; - conditions.isBullishVolumeMaOverBearishVolumeMa = isBullishVolumeMaOverBearishVolumeMa; - conditions.isBullishVolumeMaUnderBearishVolumeMa = isBullishVolumeMaUnderBearishVolumeMa; - - // - Cleanup(); - - // - zBar.Clean(); - cBar.Clean(); - pBar.Clean(); - - // - return result; - } - - // - // Protected ... - protected: - // - // Private ... - private: - // - // Props ... - X121XVOLUMEInputs mInputs; // Inputs ... - - // - // Buffers ... - double bullishVolumeBuffer[]; - double bullishVolumeMaBuffer[]; - double bearishVolumeBuffer[]; - double bearishVolumeMaBuffer[]; - - // - void Calculate( - int barIndex = 0, - int maxRequiredBars = 100 // - ) - { - // - // Buffers ... - if (barIndex < 0) { - barIndex = 0; - } - - // - CopyBuffer( - mHandler, - X121_XVOLUME_BULLISH_LINE, - barIndex, - maxRequiredBars, - bullishVolumeBuffer - // - ); - - // - CopyBuffer( - mHandler, - X121_XVOLUME_BULLISH_MA_LINE, - barIndex, - maxRequiredBars, - bullishVolumeMaBuffer - // - ); - - // - CopyBuffer( - mHandler, - X121_XVOLUME_BEARISH_LINE, - barIndex, - maxRequiredBars, - bearishVolumeBuffer - // - ); - - // - CopyBuffer( - mHandler, - X121_XVOLUME_BEARISH_MA_LINE, - barIndex, - maxRequiredBars, - bearishVolumeMaBuffer - // - ); - } - - // - void Cleanup( - int maxAllowed = 100 // - ) - { - // - CleanupArray( - bullishVolumeBuffer, - maxAllowed // - ); - - // - CleanupArray( - bullishVolumeMaBuffer, - maxAllowed // - ); - - // - CleanupArray( - bearishVolumeBuffer, - maxAllowed // - ); - - // - CleanupArray( - bearishVolumeMaBuffer, - maxAllowed // - ); - } - - // -}; - -// diff --git a/Helpers/x-saherelm.x121.xvwap.helper.mq5 b/Helpers/x-saherelm.x121.xvwap.helper.mq5 deleted file mode 100644 index 3ac9211f..00000000 --- a/Helpers/x-saherelm.x121.xvwap.helper.mq5 +++ /dev/null @@ -1,1605 +0,0 @@ -/////////////////////////////////////////////////////// -// -// SaherElm IT Center MQL5 Helper Class Library -// ---------------------------------------------- -// Name: XCX121XVWAPHelper -// Description: provides all Indicator -// Helper requirements ... -// -// -// Maintainer: -// ------------ -// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) -// -////////////////////////////////////////////////////// -// -// Global Properties ... -#property library -#property copyright "Copyright 2023, SaherElm IT Center" -#property link "https://www.saherelm.ir" -#property version "1.00" -#property strict - -// -// Imports ... -#include "../Classes/x-saherelm.x-helper.class.mq5" - -// -// Definitions ... - -// -// Definitions ... -enum ENUM_X121_XVWAP_BUFFERS -{ - // - X121_XVWAP_FAST_LINE = 0, - X121_XVWAP_FAST_STATE_LINE = 8, - X121_XVWAP_MID_LINE = 2, - X121_XVWAP_MID_STATE_LINE = 9, - X121_XVWAP_SLOW_LINE = 4, - X121_XVWAP_SLOW_STATE_LINE = 10, - X121_XVWAP_VOLUME_LINE = 6, - X121_XVWAP_PRICE_LINE = 7, -}; - -// -enum ENUM_XVWAP_STATES -{ - XVWAP_STATE_BULLISH = 1, - XVWAP_STATE_BEARISH = 2, - XVWAP_STATE_NEUTURAL = 3, -}; - -// -// Input Models ... -struct X121XVWAPInputs -{ - // - // Props ... - - int vwapFastLength; // Fast Length - int vwapMidLength; // Mid Length - int vwapSlowLength; // Slow Length - ENUM_APPLIED_PRICE vwapAppliedTo; // Applied To - - // - int startCalculationForLastBars; // Calculate Last n Bars - - // - bool showVWapFast; // Show VWap Fast - bool showVWapMedium; // Show VWap Medium - bool showVWapSlow; // Show VWap Slow - - // - // Constructor(s) ... - X121XVWAPInputs() - { - // - Clean(); - } - - // - // Tools ... - - // - // Clean ... - void Clean() - { - // - vwapFastLength = 0; - vwapMidLength = 0; - vwapSlowLength = 0; - vwapAppliedTo = PRICE_CLOSE; - - // - startCalculationForLastBars = 0; - - // - showVWapFast = false; - showVWapMedium = false; - showVWapSlow = false; - - // - ZeroMemory(this); - } - - // - // Default ... - void Default() - { - // - vwapFastLength = 20; - vwapMidLength = 50; - vwapSlowLength = 200; - vwapAppliedTo = PRICE_CLOSE; - - // - startCalculationForLastBars = 1000; - - // - showVWapFast = true; - showVWapMedium = true; - showVWapSlow = true; - } - - // - // Validate ... - bool IsValid() - { - // - bool result = false; - - // - result = - // - vwapFastLength > 2 && - vwapMidLength > vwapFastLength && - vwapSlowLength > vwapMidLength - // - ; - - // - return result; - } - - // - // Retrieve MAx Length ... - int Max() - { - // - int result = 0; - - // - result = MathMax(vwapFastLength, vwapMidLength); - result = MathMax(result, vwapSlowLength); - - // - return result; - } -}; - -// -// Conditions ... -struct X121XVWAPConditions -{ - // - // Common ... - string symbol; - ENUM_TIMEFRAMES period; - datetime time; - - // - // Buffers ... - double vwapFastBuffer[]; - double vwapMidBuffer[]; - double vwapSlowBuffer[]; - double vwapVolumeBuffer[]; - double vwapPriceBuffer[]; - double vwapFastStateBuffer[]; - double vwapMidStateBuffer[]; - double vwapSlowStateBuffer[]; - - // - // Conditions ... - - // - bool isVWapFastBullish; - bool isVWapFastBearish; - bool isVWapFastNeutural; - - // - bool isVWapMidBullish; - bool isVWapMidBearish; - bool isVWapMidNeutural; - - // - bool isVWapSlowBullish; - bool isVWapSlowBearish; - bool isVWapSlowNeutural; - - // - bool isVWapFastOverMid; - bool isVWapMidOverSlow; - - // - bool isVWapFastUnderMid; - bool isVWapMidUnderSlow; - - // - bool isVWapBullishState; - bool isVWapBearishState; - bool isVWapNeuturalState; - - // - bool isVWapBullishOrdered; - bool isVWapBearishOrdered; - - // - bool isVWapSwitchedToBullishOrdered; - bool isVWapSwitchedToBearishOrdered; - - // - bool isVWapSwitchedToBullishState; - bool isVWapSwitchedToBearishState; - bool isVWapSwitchedToNeuturalState; - - // - // Constructor ... - X121XVWAPConditions() - { - Clean(); - } - - // - // Tools ... - - /** - * Cleaning Up ... - */ - void Clean() - { - // - // Commons ... - symbol = NULL; - period = NULL; - time = NULL; - - // - // Buffers ... - - // - Clean(vwapFastBuffer); - Clean(vwapMidBuffer); - Clean(vwapSlowBuffer); - Clean(vwapVolumeBuffer); - Clean(vwapPriceBuffer); - Clean(vwapFastStateBuffer); - Clean(vwapMidStateBuffer); - Clean(vwapSlowStateBuffer); - - // - ArraySetAsSeries(vwapFastBuffer, true); - ArraySetAsSeries(vwapMidBuffer, true); - ArraySetAsSeries(vwapSlowBuffer, true); - ArraySetAsSeries(vwapVolumeBuffer, true); - ArraySetAsSeries(vwapPriceBuffer, true); - ArraySetAsSeries(vwapFastStateBuffer, true); - ArraySetAsSeries(vwapMidStateBuffer, true); - ArraySetAsSeries(vwapSlowStateBuffer, true); - - // - // Conditions ... - - // - isVWapFastBullish = false; - isVWapFastBearish = false; - isVWapFastNeutural = false; - - // - isVWapMidBullish = false; - isVWapMidBearish = false; - isVWapMidNeutural = false; - - // - isVWapSlowBullish = false; - isVWapSlowBearish = false; - isVWapSlowNeutural = false; - - // - isVWapFastOverMid = false; - isVWapMidOverSlow = false; - - // - isVWapFastUnderMid = false; - isVWapMidUnderSlow = false; - - // - isVWapBullishState = false; - isVWapBearishState = false; - isVWapNeuturalState = false; - - // - isVWapBullishOrdered = false; - isVWapBearishOrdered = false; - - // - isVWapSwitchedToBullishOrdered = false; - isVWapSwitchedToBearishOrdered = false; - - // - isVWapSwitchedToBullishState = false; - isVWapSwitchedToBearishState = false; - isVWapSwitchedToNeuturalState = false; - - // - ZeroMemory(this); - } - - /** - * Generate Conditions Scores ... - * - * @param bullishScore: Double, Directional Scores Reference ... - * @param bearishScore: Double, Directional Scores Reference ... - */ - void GenerateScore( - double &bullishScore, - double &bearishScore // - ) - { - // - bullishScore = 0; - bearishScore = 0; - // - double score = 1; - double minScore = 0.5; - double highScore = 1.5; - - // - if (isVWapBullishState) - { - bullishScore += score; - } - if (isVWapBullishOrdered) - { - bullishScore += score; - } - if (isVWapSwitchedToBullishState) - { - bullishScore += highScore; - } - if (isVWapSwitchedToBullishOrdered) - { - bullishScore += highScore; - } - if (!isVWapBullishState && - !isVWapSwitchedToBullishState) - { - // - if (isVWapFastBullish) - { - bullishScore += minScore; - } - if (isVWapSlowBullish) - { - bullishScore += minScore; - } - } - if (!isVWapBullishOrdered && - !isVWapSwitchedToBullishOrdered) - { - // - if (isVWapFastOverMid) - { - bullishScore += minScore; - } - if (isVWapMidOverSlow) - { - bullishScore += minScore; - } - } - - // - if (isVWapBearishState) - { - bearishScore += score; - } - if (isVWapBearishOrdered) - { - bearishScore += score; - } - if (isVWapSwitchedToBearishState) - { - bearishScore += highScore; - } - if (isVWapSwitchedToBearishOrdered) - { - bearishScore += highScore; - } - if (!isVWapBearishState && - !isVWapSwitchedToBearishState) - { - // - if (isVWapFastBearish) - { - bearishScore += minScore; - } - if (isVWapSlowBearish) - { - bearishScore += minScore; - } - } - if (!isVWapBearishOrdered && - !isVWapSwitchedToBearishOrdered) - { - // - if (isVWapFastUnderMid) - { - bearishScore += minScore; - } - if (isVWapMidUnderSlow) - { - bearishScore += minScore; - } - } - } - - /** - * Generate Summary String for Represent Conditions State ... - * - * @param onlyCommons: Boolean, Just Generate Only Commons Conditions ... - * @param onlyConditions: Boolean, Just Generate Only Conditions ... - * @param includeScores: Boolean, Attach Scores Representations on Result ... - * @param ignoreFalseConditions: Boolean, Ignore False Conditions on Result ... - * @param separator: String, Separate Lines ... - * - * @return ( string ) - */ - string GenerateSummary( - bool onlyCommons = false, - bool onlyConditions = false, - bool includeScores = true, - bool ignoreFalseConditions = true, - string separator = "\n" // - ) - { - // - string result = NULL; - - // - double bullishScore = 0; - double bearishScore = 0; - GenerateScore( - bullishScore, - bearishScore // - ); - - // - string scoresStr = - // - "Scores: " + separator + - "---------------" + separator + - "Bullish: " + ToString(bullishScore) + separator + - "Bearish: " + ToString(bearishScore) + separator + - "" - // - ; - - // - string commonStr = GenerateSpecifiedCommonSummary( - this, - separator, - includeScores // - ); - - // - string conditionsStr = - // - "-----------------------" + separator + - "XVWAP: " + separator + - "-----------------------" + separator + - ToString("isVWapFastBullish", isVWapFastBullish, ignoreFalseConditions, separator) + - ToString("isVWapFastBearish", isVWapFastBearish, ignoreFalseConditions, separator) + - ToString("isVWapFastNeutural", isVWapFastNeutural, ignoreFalseConditions, separator) + - ToString("isVWapMidBullish", isVWapMidBullish, ignoreFalseConditions, separator) + - ToString("isVWapMidBearish", isVWapMidBearish, ignoreFalseConditions, separator) + - ToString("isVWapMidNeutural", isVWapMidNeutural, ignoreFalseConditions, separator) + - ToString("isVWapSlowBullish", isVWapSlowBullish, ignoreFalseConditions, separator) + - ToString("isVWapSlowBearish", isVWapSlowBearish, ignoreFalseConditions, separator) + - ToString("isVWapSlowNeutural", isVWapSlowNeutural, ignoreFalseConditions, separator) + - ToString("isVWapFastOverMid", isVWapFastOverMid, ignoreFalseConditions, separator) + - ToString("isVWapMidOverSlow", isVWapMidOverSlow, ignoreFalseConditions, separator) + - ToString("isVWapFastUnderMid", isVWapFastUnderMid, ignoreFalseConditions, separator) + - ToString("isVWapMidUnderSlow", isVWapMidUnderSlow, ignoreFalseConditions, separator) + - ToString("isVWapBullishState", isVWapBullishState, ignoreFalseConditions, separator) + - ToString("isVWapBearishState", isVWapBearishState, ignoreFalseConditions, separator) + - ToString("isVWapNeuturalState", isVWapNeuturalState, ignoreFalseConditions, separator) + - ToString("isVWapBullishOrdered", isVWapBullishOrdered, ignoreFalseConditions, separator) + - ToString("isVWapBearishOrdered", isVWapBearishOrdered, ignoreFalseConditions, separator) + - ToString("isVWapSwitchedToBullishOrdered", isVWapSwitchedToBullishOrdered, ignoreFalseConditions, separator) + - ToString("isVWapSwitchedToBearishOrdered", isVWapSwitchedToBearishOrdered, ignoreFalseConditions, separator) + - ToString("isVWapSwitchedToBullishState", isVWapSwitchedToBullishState, ignoreFalseConditions, separator) + - ToString("isVWapSwitchedToBearishState", isVWapSwitchedToBearishState, ignoreFalseConditions, separator) + - ToString("isVWapSwitchedToNeuturalState", isVWapSwitchedToNeuturalState, ignoreFalseConditions, separator) + - // - "" - // - ; - - // - result = - // - "[" + GetTag() + "]" + separator + - (onlyConditions - ? "" - : commonStr) + - (!includeScores - ? "" - : scoresStr) + - " " + separator + - (onlyCommons - ? "" - : conditionsStr) + - "" - // - ; - - // - return result; - } - - /** - * Retrieve nique Tag Identifier ... - * - * @return ( string ) - */ - string GetTag() - { - return GetTypeName(this); - } - - // -}; - -// -// Class ... -class XCX121XVWAPHelper : public XCBaseHelper -{ - // - // Public ... - public: - // - // Props ... - - // - // Constructors ... - XCX121XVWAPHelper() - : XCBaseHelper(_Symbol, _Period) - { - } - - // - // Deconstructor ... - ~XCX121XVWAPHelper() - { - // - mInputs.Clean(); - - // - Clean(vwapFastBuffer); - Clean(vwapMidBuffer); - Clean(vwapSlowBuffer); - Clean(vwapVolumeBuffer); - Clean(vwapPriceBuffer); - Clean(vwapFastStateBuffer); - Clean(vwapMidStateBuffer); - Clean(vwapSlowStateBuffer); - } - - // - // Tools ... - bool Init( - string symbol, // Trading Symbol - ENUM_TIMEFRAMES period, // Trading Period - X121XVWAPInputs &inputs // Inputs - ) - { - // - bool result = false; - - // - mSymbol = symbol; - mPeriod = period; - - // - result = inputs.IsValid(); - if (!result) - { - return result; - } - - // - ArraySetAsSeries(vwapFastBuffer, true); - ArraySetAsSeries(vwapMidBuffer, true); - ArraySetAsSeries(vwapSlowBuffer, true); - ArraySetAsSeries(vwapVolumeBuffer, true); - ArraySetAsSeries(vwapPriceBuffer, true); - ArraySetAsSeries(vwapFastStateBuffer, true); - ArraySetAsSeries(vwapMidStateBuffer, true); - ArraySetAsSeries(vwapSlowStateBuffer, true); - - // - mInputs = inputs; - - // - mHandler = iCustom( - mSymbol, - mPeriod, - "x-saherelm.x121.xvwap", - // - // Inputs ... - // - // Market ... - "", - mInputs.vwapFastLength, - mInputs.vwapMidLength, - mInputs.vwapSlowLength, - mInputs.vwapAppliedTo, - // - // Presentation ... - "", - // - mInputs.startCalculationForLastBars, - // - mInputs.showVWapFast, - mInputs.showVWapMedium, - mInputs.showVWapSlow - // - ); - result = mHandler != INVALID_HANDLE; - if (!result) - { - return result; - } - - // - return result; - } - - // - // Inputs ... - - // - X121XVWAPInputs GetInputs() - { - return mInputs; - } - - // - bool SetInputs( - X121XVWAPInputs &inputs // Configs - ) - { - // - return Init( - mSymbol, - mPeriod, - inputs - // - ); - } - - // - // Readers ... - - // - double GetVWapFast( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(vwapFastBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return vwapFastBuffer[barIndex]; - } - - // - int CopyVWapFast( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - vwapFastBuffer, - buffer, - forceClean - // - ); - } - - // - // STATE FAST ... - - // - double GetVWapFastState( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(vwapFastStateBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return vwapFastStateBuffer[barIndex]; - } - - // - int CopyVWapFastState( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - vwapFastStateBuffer, - buffer, - forceClean - // - ); - } - - // - // MID ... - - // - double GetVWapMid( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(vwapMidBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return vwapMidBuffer[barIndex]; - } - - // - int CopyVWapMid( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - vwapMidBuffer, - buffer, - forceClean - // - ); - } - - // - // STATE MID ... - - // - double GetVWapMidState( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(vwapMidStateBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return vwapMidStateBuffer[barIndex]; - } - - // - int CopyVWapMidState( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - vwapMidStateBuffer, - buffer, - forceClean - // - ); - } - - // - // SLOW ... - - // - double GetVWapSlowBuffer( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(vwapSlowBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return vwapSlowBuffer[barIndex]; - } - - // - int CopyVWapSlow( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - vwapSlowBuffer, - buffer, - forceClean - // - ); - } - - // - // STATE SLOW ... - - // - double GetVWapSlowState( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(vwapSlowStateBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return vwapSlowStateBuffer[barIndex]; - } - - // - int CopyVWapSlowState( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - vwapSlowStateBuffer, - buffer, - forceClean - // - ); - } - - // - // VOLUME ... - - // - double GetVWapVolume( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(vwapVolumeBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return vwapVolumeBuffer[barIndex]; - } - - // - int CopyVWapVolume( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - vwapVolumeBuffer, - buffer, - forceClean - // - ); - } - - // - // PRICE ... - - // - double GetVWapPrice( - int barIndex // Bar Index - ) - { - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - Calculate(barIndex); - - // - int count = ArraySize(vwapPriceBuffer); - if (barIndex >= count) - { - barIndex = count - 1; - } - - // - return vwapPriceBuffer[barIndex]; - } - - // - int CopyVWapPrice( - int start, // Start - int count, // Number of Items for read - double &buffer[], // Dest Buffer - bool forceClean = true // Force To Clean buffer - ) - { - // - // Update Calculations ... - Calculate(start); - - // - // Copy Items ... - return Copy( - 0, - count, - vwapPriceBuffer, - buffer, - forceClean - // - ); - } - - // - // Converts to State ... - ENUM_XVWAP_STATES ToVWAPState(double value) - { - // - ENUM_XVWAP_STATES result = - value == 1 - ? XVWAP_STATE_BULLISH - : value == 2 - ? XVWAP_STATE_BEARISH - : XVWAP_STATE_NEUTURAL; - - // - return result; - } - - // - bool IsVWAPBullish(double value) - { - // - bool result = false; - - // - result = ToVWAPState(value) == XVWAP_STATE_BULLISH; - - // - return result; - } - - // - bool IsVWAPBearish(double value) - { - // - bool result = false; - - // - result = ToVWAPState(value) == XVWAP_STATE_BEARISH; - - // - return result; - } - - // - bool IsVWAPNeutural(double value) - { - // - bool result = false; - - // - result = ToVWAPState(value) == XVWAP_STATE_NEUTURAL; - - // - return result; - } - - // - void Free() override - { - Cleanup(10); - } - - // - bool GetConditions( - X121XVWAPConditions &conditions, // - int barIndex = 0, // - int loopback = 5 // - ) - { - // - bool result = true; - - // - if (loopback < 5) - { - loopback = 5; - } - - // - conditions.Clean(); - - // - conditions.symbol = mSymbol; - conditions.period = mPeriod; - conditions.time = TimeCurrent(); - - // - int zIndex = barIndex; - int cIndex = zIndex + 1; - int pIndex = cIndex + 1; - int ppIndex = pIndex + 1; - - // - XOHCL zBar; - result = zBar.Init( - mSymbol, - mPeriod, - zIndex // - ); - if (!result) - { - return result; - } - - // - XOHCL cBar; - result = cBar.Init( - mSymbol, - mPeriod, - cIndex // - ); - if (!result) - { - return result; - } - - // - XOHCL pBar; - result = pBar.Init( - mSymbol, - mPeriod, - pIndex // - ); - if (!result) - { - return result; - } - - // - // Buffers ... - - // - CopyVWapFast( - zIndex, - loopback, - conditions.vwapFastBuffer // - ); - - // - CopyVWapFastState( - zIndex, - loopback, - conditions.vwapFastStateBuffer // - ); - - // - CopyVWapMid( - zIndex, - loopback, - conditions.vwapMidBuffer // - ); - - // - CopyVWapMidState( - zIndex, - loopback, - conditions.vwapMidStateBuffer // - ); - - // - CopyVWapSlow( - zIndex, - loopback, - conditions.vwapSlowBuffer // - ); - - // - CopyVWapSlowState( - zIndex, - loopback, - conditions.vwapSlowStateBuffer // - ); - - // - CopyVWapVolume( - zIndex, - loopback, - conditions.vwapVolumeBuffer // - ); - - // - CopyVWapPrice( - zIndex, - loopback, - conditions.vwapPriceBuffer // - ); - - // - // Conditions ... - - // - int cIDX = 1; - int pIDX = cIDX + 1; - - // - // SAR ... - - // - bool isVWapFastBullish = IsVWAPBullish(conditions.vwapFastStateBuffer[cIDX]); - bool isVWapFastBullishPrev = IsVWAPBullish(conditions.vwapFastStateBuffer[pIDX]); - - // - bool isVWapFastBearish = IsVWAPBearish(conditions.vwapFastStateBuffer[cIDX]); - bool isVWapFastBearishPrev = IsVWAPBearish(conditions.vwapFastStateBuffer[pIDX]); - - // - bool isVWapFastNeutural = IsVWAPNeutural(conditions.vwapFastStateBuffer[cIDX]); - bool isVWapFastNeuturalPrev = IsVWAPNeutural(conditions.vwapFastStateBuffer[pIDX]); - - // - bool isVWapMidBullish = IsVWAPBullish(conditions.vwapMidStateBuffer[cIDX]); - bool isVWapMidBullishPrev = IsVWAPBullish(conditions.vwapMidStateBuffer[pIDX]); - - // - bool isVWapMidBearish = IsVWAPBearish(conditions.vwapMidStateBuffer[cIDX]); - bool isVWapMidBearishPrev = IsVWAPBearish(conditions.vwapMidStateBuffer[pIDX]); - - // - bool isVWapMidNeutural = IsVWAPNeutural(conditions.vwapMidStateBuffer[cIDX]); - bool isVWapMidNeuturalPrev = IsVWAPNeutural(conditions.vwapMidStateBuffer[pIDX]); - - // - bool isVWapSlowBullish = IsVWAPBullish(conditions.vwapSlowStateBuffer[cIDX]); - bool isVWapSlowBullishPrev = IsVWAPBullish(conditions.vwapSlowStateBuffer[pIDX]); - - // - bool isVWapSlowBearish = IsVWAPBearish(conditions.vwapSlowStateBuffer[cIDX]); - bool isVWapSlowBearishPrev = IsVWAPBearish(conditions.vwapSlowStateBuffer[pIDX]); - - // - bool isVWapSlowNeutural = IsVWAPNeutural(conditions.vwapSlowStateBuffer[cIDX]); - bool isVWapSlowNeuturalPrev = IsVWAPNeutural(conditions.vwapSlowStateBuffer[pIDX]); - - // - bool isVWapFastOverMid = conditions.vwapFastBuffer[cIDX] > conditions.vwapMidBuffer[cIDX]; - bool isVWapFastOverMidPrev = conditions.vwapFastBuffer[pIDX] > conditions.vwapMidBuffer[pIDX]; - - // - bool isVWapMidOverSlow = conditions.vwapMidBuffer[cIDX] > conditions.vwapSlowBuffer[cIDX]; - bool isVWapMidOverSlowPrev = conditions.vwapMidBuffer[pIDX] > conditions.vwapSlowBuffer[pIDX]; - - // - bool isVWapFastUnderMid = conditions.vwapFastBuffer[cIDX] < conditions.vwapMidBuffer[cIDX]; - bool isVWapFastUnderMidPrev = conditions.vwapFastBuffer[pIDX] < conditions.vwapMidBuffer[pIDX]; - - // - bool isVWapMidUnderSlow = conditions.vwapMidBuffer[cIDX] < conditions.vwapSlowBuffer[cIDX]; - bool isVWapMidUnderSlowPrev = conditions.vwapMidBuffer[pIDX] < conditions.vwapSlowBuffer[pIDX]; - - // - bool isVWapBullishState = isVWapFastBullish && - isVWapMidBullish && - isVWapSlowBullish; - bool isVWapBullishStatePrev = isVWapFastBullishPrev && - isVWapMidBullishPrev && - isVWapSlowBullishPrev; - - // - bool isVWapBearishState = isVWapFastBearish && - isVWapMidBearish && - isVWapSlowBearish; - bool isVWapBearishStatePrev = isVWapFastBearishPrev && - isVWapMidBearishPrev && - isVWapSlowBearishPrev; - - // - bool isVWapNeuturalState = isVWapFastNeutural && - isVWapMidNeutural && - isVWapSlowNeutural; - bool isVWapNeuturalStatePrev = isVWapFastNeuturalPrev && - isVWapMidNeuturalPrev && - isVWapSlowNeuturalPrev; - - // - bool isVWapBullishOrdered = isVWapFastOverMid && - isVWapMidOverSlow; - bool isVWapBullishOrderedPrev = isVWapFastOverMidPrev && - isVWapMidOverSlowPrev; - - // - bool isVWapBearishOrdered = isVWapFastUnderMid && - isVWapMidUnderSlow; - bool isVWapBearishOrderedPrev = isVWapFastUnderMidPrev && - isVWapMidUnderSlowPrev; - - // - bool isVWapSwitchedToBullishOrdered = isVWapBullishOrdered && - !isVWapBullishOrderedPrev; - bool isVWapSwitchedToBearishOrdered = isVWapBearishOrdered && - !isVWapBearishOrderedPrev; - - // - bool isVWapSwitchedToBullishState = isVWapBullishState && - !isVWapBullishStatePrev; - bool isVWapSwitchedToBearishState = isVWapBearishState && - !isVWapBearishStatePrev; - bool isVWapSwitchedToNeuturalState = isVWapNeuturalState && - !isVWapNeuturalStatePrev; - - // - conditions.isVWapFastBullish = isVWapFastBullish; - conditions.isVWapFastBearish = isVWapFastBearish; - conditions.isVWapFastNeutural = isVWapFastNeutural; - conditions.isVWapMidBullish = isVWapMidBullish; - conditions.isVWapMidBearish = isVWapMidBearish; - conditions.isVWapMidNeutural = isVWapMidNeutural; - conditions.isVWapSlowBullish = isVWapSlowBullish; - conditions.isVWapSlowBearish = isVWapSlowBearish; - conditions.isVWapSlowNeutural = isVWapSlowNeutural; - conditions.isVWapFastOverMid = isVWapFastOverMid; - conditions.isVWapMidOverSlow = isVWapMidOverSlow; - conditions.isVWapFastUnderMid = isVWapFastUnderMid; - conditions.isVWapMidUnderSlow = isVWapMidUnderSlow; - conditions.isVWapBullishState = isVWapBullishState; - conditions.isVWapBearishState = isVWapBearishState; - conditions.isVWapNeuturalState = isVWapNeuturalState; - conditions.isVWapBullishOrdered = isVWapBullishOrdered; - conditions.isVWapBearishOrdered = isVWapBearishOrdered; - conditions.isVWapSwitchedToBullishOrdered = isVWapSwitchedToBullishOrdered; - conditions.isVWapSwitchedToBearishOrdered = isVWapSwitchedToBearishOrdered; - conditions.isVWapSwitchedToBullishState = isVWapSwitchedToBullishState; - conditions.isVWapSwitchedToBearishState = isVWapSwitchedToBearishState; - conditions.isVWapSwitchedToNeuturalState = isVWapSwitchedToNeuturalState; - - // - Cleanup(); - - // - zBar.Clean(); - cBar.Clean(); - pBar.Clean(); - - // - return result; - } - - // - // Protected ... - protected: - // - // Private ... - private: - // - // Props ... - X121XVWAPInputs mInputs; // Inputs ... - - // - // Buffers ... - double vwapFastBuffer[]; - double vwapMidBuffer[]; - double vwapSlowBuffer[]; - double vwapVolumeBuffer[]; - double vwapPriceBuffer[]; - double vwapFastStateBuffer[]; - double vwapMidStateBuffer[]; - double vwapSlowStateBuffer[]; - - // - void Calculate( - int barIndex = 0, - int maxRequiredBars = 100 // - ) - { - // - // Buffers ... - if (barIndex < 0) - { - barIndex = 0; - } - - // - // FAST ... - CopyBuffer( - mHandler, - X121_XVWAP_FAST_LINE, - barIndex, - maxRequiredBars, - vwapFastBuffer - // - ); - - // - // FAST STATE ... - CopyBuffer( - mHandler, - X121_XVWAP_FAST_STATE_LINE, - barIndex, - maxRequiredBars, - vwapFastStateBuffer - // - ); - - // - // MID ... - CopyBuffer( - mHandler, - X121_XVWAP_MID_LINE, - barIndex, - maxRequiredBars, - vwapMidBuffer - // - ); - - // - // MID STATE ... - CopyBuffer( - mHandler, - X121_XVWAP_MID_STATE_LINE, - barIndex, - maxRequiredBars, - vwapMidStateBuffer - // - ); - - // - // SLOW ... - CopyBuffer( - mHandler, - X121_XVWAP_SLOW_LINE, - barIndex, - maxRequiredBars, - vwapSlowBuffer - // - ); - - // - // SLOW STATE ... - CopyBuffer( - mHandler, - X121_XVWAP_SLOW_STATE_LINE, - barIndex, - maxRequiredBars, - vwapSlowStateBuffer - // - ); - - // - // VOLUME ... - CopyBuffer( - mHandler, - X121_XVWAP_VOLUME_LINE, - barIndex, - maxRequiredBars, - vwapVolumeBuffer - // - ); - - // - // PRICE ... - CopyBuffer( - mHandler, - X121_XVWAP_PRICE_LINE, - barIndex, - maxRequiredBars, - vwapPriceBuffer - // - ); - } - - // - void Cleanup( - int maxAllowed = 100 // - ) - { - // - CleanupArray( - vwapFastBuffer, - maxAllowed // - ); - - // - CleanupArray( - vwapMidBuffer, - maxAllowed // - ); - - // - CleanupArray( - vwapSlowBuffer, - maxAllowed // - ); - - // - CleanupArray( - vwapVolumeBuffer, - maxAllowed // - ); - - // - CleanupArray( - vwapPriceBuffer, - maxAllowed // - ); - - // - CleanupArray( - vwapFastStateBuffer, - maxAllowed // - ); - - // - CleanupArray( - vwapMidStateBuffer, - maxAllowed // - ); - - // - CleanupArray( - vwapSlowStateBuffer, - maxAllowed // - ); - - // - } - - // -}; - -// -// Tools ... \ No newline at end of file diff --git a/Indicators/x-saherelm.x121.x3ma.mq5 b/Indicators/x-saherelm.x121.x3ma.mq5 deleted file mode 100644 index 7950817e..00000000 --- a/Indicators/x-saherelm.x121.x3ma.mq5 +++ /dev/null @@ -1,659 +0,0 @@ -/////////////////////////////////////////////////////// -// -// SaherElm IT Center MQL5 Indicator -// ------------------------------------------------- -// Name: X121 XWZ -// Description: XWZ ... -// -// -// 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 XWZ Indicator" -#property strict - -// -// Definitions ... - -// -#define ShortName "X121_X3MA" - -// -// Imports ... -#include "../Libraries/x-saherelm.common.lib.mq5" - -// -// Inputs ... - -// -// Market ... -input group "Market"; -input int fastMALength = 20; // Fast MA Length -input int midMALength = 50; // Mid MA Length -input int slowMALength = 200; // Slow MA Length -input ENUM_MA_METHOD maMethod = MODE_EMA; // MA Method -input ENUM_APPLIED_PRICE maAppliedTo = PRICE_CLOSE; // Applied To - -// -// Presentation ... -input group "Presentation"; - -// -input int startCalculationForLastBars = 1000; // Calculate Last n Bars -input bool showMaFast = true; // Show Fast MA -input bool showMaMid = true; // Show Mid MA -input bool showMaSlow = true; // Show Slow MA - -// -// Buffers ... - -// -#define hideColorIDX 0 -#define bullishColorIDX 1 -#define bearishColorIDX 2 -#define neuturalColorIDX 3 - -// -#property indicator_chart_window - -// -#property indicator_buffers 9 -#property indicator_plots 3 - -// -// Plot Buffers ... - -// -// FAST ... -#define maFastBufferIndex 0 -double maFastBuffer[]; - -#define maFastColorBufferIndex 1 -double maFastColorBuffer[]; - -// -#define maFastPlotBufferIndex 0 -#property indicator_label1 "X121 MAF" -#property indicator_type1 DRAW_COLOR_LINE -#property indicator_color1 CLR_NONE, clrAqua, clrMagenta, clrGray -#property indicator_style1 STYLE_SOLID -#property indicator_width1 2 - -// -// MID ... -#define maMidBufferIndex 2 -double maMidBuffer[]; - -#define maMidColorBufferIndex 3 -double maMidColorBuffer[]; - -// -#define maMidPlotBufferIndex 1 -#property indicator_label2 "X121 MAM" -#property indicator_type2 DRAW_COLOR_LINE -#property indicator_color2 CLR_NONE, clrGreen, clrRed, clrGray -#property indicator_style2 STYLE_SOLID -#property indicator_width2 2 - -// -// SLOW ... -#define maSlowBufferIndex 4 -double maSlowBuffer[]; - -#define maSlowColorBufferIndex 5 -double maSlowColorBuffer[]; - -// -#define maSlowPlotBufferIndex 2 -#property indicator_label3 "X121 MAS" -#property indicator_type3 DRAW_COLOR_LINE -#property indicator_color3 CLR_NONE, clrSteelBlue, clrDarkRed, clrGray -#property indicator_style3 STYLE_SOLID -#property indicator_width3 2 - -// -// Data Buffers ... - -// -int mLastBufferIndex = 5; - -// -// Fast State ... -#define maFastStateBufferIndex mLastBufferIndex + 1 -double maFastStateBuffer[]; - -// -// Mid State ... -#define maMidStateBufferIndex mLastBufferIndex + 2 -double maMidStateBuffer[]; - -// -// Slow State ... -#define maSlowStateBufferIndex mLastBufferIndex + 3 -double maSlowStateBuffer[]; - -// -// Variables, Properties and etc ... - -// -// this counts Available Bars ... -int limit; - -// -int maxLength; - -// -int maFastHandler = INVALID_HANDLE; -int maMidHandler = INVALID_HANDLE; -int maSlowHandler = INVALID_HANDLE; - -// -// Event Handlers ... - -/** - * Initialize Indicator ... - * - * @return ( int ) - */ -int OnInit() -{ - // - // Validate Inputs ... - if (!ValidateInputs()) - { - return INIT_PARAMETERS_INCORRECT; - } - - // - // Initialize Indicator Handlers ... - - // - // Fast MA ... - maFastHandler = iMA( - _Symbol, - _Period, - fastMALength, - 0, - maMethod, - maAppliedTo // - ); - bool isInited = maFastHandler != INVALID_HANDLE; - if (!isInited) - { - return INIT_FAILED; - } - - // - // Mid MA ... - maMidHandler = iMA( - _Symbol, - _Period, - midMALength, - 0, - maMethod, - maAppliedTo // - ); - isInited = maMidHandler != INVALID_HANDLE; - if (!isInited) - { - return INIT_FAILED; - } - - // - // Slow MA ... - maSlowHandler = iMA( - _Symbol, - _Period, - slowMALength, - 0, - maMethod, - maAppliedTo // - ); - isInited = maSlowHandler != INVALID_HANDLE; - if (!isInited) - { - return INIT_FAILED; - } - - // - // 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(); - IndicatorSetInteger(INDICATOR_DIGITS, 2); - - // - // Init Succeed ... - return INIT_SUCCEEDED; -} - -/** - * De Initialize Indicator ... - * - * @param reason: Integer, De Initialization Reason ... - */ -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 - - // - IndicatorRelease(maFastHandler); - IndicatorRelease(maMidHandler); - IndicatorRelease(maSlowHandler); -} - -/** - * Calculate Bars ... - * - * @param rates_total: Integer, Total Bars on Chart ... - * @param prev_calculated: Integer, Total Calculated Bars on Charts ... - * @param time: DateTime Array, History of Open Time ... - * @param open: Double Array, History of Open Prices ... - * @param high: Double Array, History of High Prices ... - * @param low: Double Array, History of Low Prices ... - * @param close: Double Array, History of Close Prices ... - * @param tick_volume: Long, History of Tick Volumes on Bar ... - * @param volume: Long, History of Trade Volumes ... - * @param spread: Double, History of Spread Price ... - * - * @return ( int ) - */ -int OnCalculate( - const int rates_total, - const int prev_calculated, - const datetime &time[], - const double &open[], - const double &high[], - const double &low[], - const double &close[], - const long &tick_volume[], - const long &volume[], - const int &spread[] // -) -{ - // - // 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); - - // - // Validate Calculated Bars ... - - // - // Fast MA ... - int maFastCalculatedBars = BarsCalculated(maFastHandler); - - // - // Mid MA ... - int maMidCalculatedBars = BarsCalculated(maMidHandler); - - // - // Slow MA ... - int maSlowCalculatedBars = BarsCalculated(maSlowHandler); - - // - bool isPassedRequiredCalculatedBars = - // - // Fast MA ... - maFastCalculatedBars >= maxLength && - // - // Slow MA ... - maMidCalculatedBars >= maxLength && - // - // Slow MA ... - maSlowCalculatedBars >= maxLength - // - ; - if (!isPassedRequiredCalculatedBars) - { - return prev_calculated; - } - - // - limit = (prev_calculated > rates_total || prev_calculated <= 0) - ? rates_total - : (rates_total - prev_calculated) + 1; - - // - // Buffers Copy ... - - // - // Fast MA ... - int copiedFastMas = CopyBuffer(maFastHandler, 0, 0, limit, maFastBuffer); - - // - // Mid MA ... - int copiedMidMas = CopyBuffer(maMidHandler, 0, 0, limit, maMidBuffer); - - // - // Slow MA ... - int copiedSlowMas = CopyBuffer(maSlowHandler, 0, 0, limit, maSlowBuffer); - - // - // Validate Copied Items ... - bool isPassedRequiredCopiedItems = - // - // Fast MA ... - copiedFastMas > 0 && - // - // Mid MA ... - copiedMidMas > 0 && - // - // Slow MA ... - copiedSlowMas > 0 - // - ; - if (!isPassedRequiredCopiedItems) - { - return prev_calculated; - } - - // - // Main Loop ... - for (int i = limit - 1; i >= 0 && !IsStopped(); i--) - { - // - CalculateBuffers( - // - i, - prev_calculated, - rates_total, - // - open, - high, - close, - low, - tick_volume // - ); - } - - // - return rates_total; -} - -// -// Functions ... - -/** - * Validate Input Args for Initialization ... - * - * @return ( bool ) - */ -bool ValidateInputs() -{ - // - bool result = false; - - // - result = fastMALength > 0 && - midMALength > 0 && - slowMALength > 0 && - midMALength > fastMALength && - slowMALength > midMALength; - - // - return result; -} - -/** - * Extract Max Length of Inputs ... - * - * @return ( int ) - */ -int ExtractMaxLengthOfInputs() -{ - // - int result = 0; - - // - result = MathMax(fastMALength, midMALength); - result = MathMax(result, slowMALength); - - // - return result; -} - -/** - * Set Indicator Short Name and also we can define Buffers Labels ... - */ -void SetIndicatorName() -{ - IndicatorSetString(INDICATOR_SHORTNAME, ShortName); -} - -/** - * Define Required Buffers ... - */ -void DefineBuffers() -{ - // - // Plot Buffers ... - - // - // Fast ... - ArraySetAsSeries(maFastBuffer, true); - ArraySetAsSeries(maFastColorBuffer, true); - SetIndexBuffer(maFastBufferIndex, maFastBuffer, INDICATOR_DATA); - SetIndexBuffer(maFastColorBufferIndex, maFastColorBuffer, INDICATOR_COLOR_INDEX); - - // - // Mid ... - ArraySetAsSeries(maMidBuffer, true); - ArraySetAsSeries(maMidColorBuffer, true); - SetIndexBuffer(maMidBufferIndex, maMidBuffer, INDICATOR_DATA); - SetIndexBuffer(maMidColorBufferIndex, maMidColorBuffer, INDICATOR_COLOR_INDEX); - - // - // Slow ... - ArraySetAsSeries(maSlowBuffer, true); - ArraySetAsSeries(maSlowColorBuffer, true); - SetIndexBuffer(maSlowBufferIndex, maSlowBuffer, INDICATOR_DATA); - SetIndexBuffer(maSlowColorBufferIndex, maSlowColorBuffer, INDICATOR_COLOR_INDEX); - - // - // Data Buffers ... - - // - // Fast State ... - ArraySetAsSeries(maFastStateBuffer, true); - SetIndexBuffer(maFastStateBufferIndex, maFastStateBuffer, INDICATOR_CALCULATIONS); - - // - // Mid State ... - ArraySetAsSeries(maMidStateBuffer, true); - SetIndexBuffer(maMidStateBufferIndex, maMidStateBuffer, INDICATOR_CALCULATIONS); - - // - // Slow State ... - ArraySetAsSeries(maSlowStateBuffer, true); - SetIndexBuffer(maSlowStateBufferIndex, maSlowStateBuffer, INDICATOR_CALCULATIONS); -} - -/** - * Calculate Custom Buffers ... - * - * @param bar_index: Integer, Represent Current Bar ... - * @param prevCalculated: Integer, Represent Previous Calculated Bars ... - * @param ratesTotal: Integer, Represents All Available Bars ... - * @param open: Double Array, History of Open Prices ... - * @param high: Double Array, History of High Prices ... - * @param close: Double Array, History of Close Prices ... - * @param low: Double Array, History of Low Prices ... - * @param tickVolume: Long, History of Tick Volumes on Bar ... - */ -void CalculateBuffers( - int bar_index, // Selected Bar Index - const int prevCalculated, - const int ratesTotal, - const double &open[], - const double &high[], - const double &close[], - const double &low[], - const long &tickVolume[] // -) -{ - // - int barsLimit = startCalculationForLastBars > 0 - ? startCalculationForLastBars - : 0; - // - // bool canCalculate = true; - bool canCalculate = - barsLimit == 0 || - bar_index <= barsLimit; - if (canCalculate) - { - // - CalculateValues( - bar_index, - prevCalculated, - ratesTotal, - open, - high, - close, - low, - tickVolume // - ); - } - else - { - FillBuffersZero(bar_index); - } -} - -/** - * Fill All Bufers to Zero Vlue for Specified Bar Index ... - * - * @param barIndex: Integer ... - */ -void FillBuffersZero(int barIndex) -{ - // - maMidBuffer[barIndex] = 0; - maFastBuffer[barIndex] = 0; - maSlowBuffer[barIndex] = 0; - - // - maFastColorBuffer[barIndex] = hideColorIDX; - maMidColorBuffer[barIndex] = hideColorIDX; - maSlowColorBuffer[barIndex] = hideColorIDX; - maFastStateBuffer[barIndex] = hideColorIDX; - maMidStateBuffer[barIndex] = hideColorIDX; - maSlowStateBuffer[barIndex] = hideColorIDX; -} - -/** - * Calculate Vales ... - * - * @param bar_index: Integer, Represent Current Bar ... - * @param prevCalculated: Integer, Represent Previous Calculated Bars ... - * @param ratesTotal: Integer, Represents All Available Bars ... - * @param open: Double Array, History of Open Prices ... - * @param high: Double Array, History of High Prices ... - * @param close: Double Array, History of Close Prices ... - * @param low: Double Array, History of Low Prices ... - * @param tickVolume: Long, History of Tick Volumes on Bar ... - */ -void CalculateValues( - int bar_index, // Selected Bar Index - const int prevCalculated, - const int ratesTotal, - const double &open[], - const double &high[], - const double &close[], - const double &low[], - const long &tickVolume[] // -) -{ - // - // Implement Colorify Mechanism ... - - // - // Calculate Applied Price ... - ENUM_X_PRICE mPType = ToXPrice(maAppliedTo); - double iPrice = GetAppliedPrice( - mPType, - open, - high, - low, - close, - bar_index // - ); - - // - double iFast = maFastBuffer[bar_index]; - double iMid = maMidBuffer[bar_index]; - double iSlow = maSlowBuffer[bar_index]; - - // - double iFastState = iPrice > iFast - ? bullishColorIDX - : iPrice < iFast - ? bearishColorIDX - : neuturalColorIDX; - double iMidState = iPrice > iMid - ? bullishColorIDX - : iPrice < iMid - ? bearishColorIDX - : neuturalColorIDX; - double iSlowState = iPrice > iSlow - ? bullishColorIDX - : iPrice < iSlow - ? bearishColorIDX - : neuturalColorIDX; - - // - maFastColorBuffer[bar_index] = - showMaFast - ? iFastState - : hideColorIDX; - maFastStateBuffer[bar_index] = iFastState; - - // - maMidColorBuffer[bar_index] = - showMaMid - ? iMidState - : hideColorIDX; - maMidStateBuffer[bar_index] = iMidState; - - // - maSlowColorBuffer[bar_index] = - showMaSlow - ? iSlowState - : hideColorIDX; - maSlowStateBuffer[bar_index] = iSlowState; -} - -// diff --git a/Indicators/x-saherelm.x121.xatr.mq5 b/Indicators/x-saherelm.x121.xatr.mq5 deleted file mode 100644 index 08dbc820..00000000 --- a/Indicators/x-saherelm.x121.xatr.mq5 +++ /dev/null @@ -1,882 +0,0 @@ -/////////////////////////////////////////////////////// -// -// SaherElm IT Center MQL5 Indicator -// ------------------------------------------------- -// Name: X121 XATR -// Description: XATR ... -// -// -// 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 XATR Indicator" -#property strict - -// -// Definitions ... - -// -#define ShortName "X121 XATR" - -// -// Includes Common Library ... -#include "../Libraries/x-saherelm.common.lib.mq5" - -// -// Inputs ... - -// -// Market ... -input group "Market"; - -// -input group "RSI Detection"; -input int rsiLength = 14; // Length -input ENUM_X_PRICE rsiPriceType = X_PRICE_CLOSE; // Applied To -input ENUM_X_MA_METHOD rsiSmoothingMethod = X_MA_MODE_SMA; // Smoothing Method; - -// -input group "ATR Detection"; -input int atrLength = 14; // Length -input double atrMultiplier = 1; // Multiplier -input ENUM_X_PRICE atrUpperPriceType = X_PRICE_HIGH; // Upper Zone Applied To -input ENUM_X_PRICE atrLowerPriceType = X_PRICE_LOW; // Lower Zone Applied To -input ENUM_X_MA_METHOD atrSmoothingMethod = X_MA_MODE_SMA; // Smoothing Method - -// -input group "Price Change"; -input int priceChangeSmoothingLength = 14; // Length -input ENUM_X_PRICE priceChangeType = X_PRICE_CLOSE; // Price Type -input ENUM_X_MA_METHOD priceChangeSmoothingMethod = X_MA_MODE_SMA; // Moving Average Moethod - -// -input group "Presentation"; - -// -input int startCalculationForLastBars = 1000; // Calculate Last n Bars - -// -input bool showAtrUpper = true; // Show Upper Zone -input bool showAtrLower = true; // Show Lower Zone -input bool showSmoothedAtrUpper = true; // Show Smoothed Upper Zone -input bool showSmoothedAtrLower = true; // Show Smoothed Lower Zone -input bool showRSIChange = true; // Show RSI Change -input bool showSmoothedRSIChange = true; // ShowSmoothed RSI Change -input bool showPriceChange = true; // Show Price Change -input bool showSmoothedPriceChange = true; // ShowSmoothed Price Change - -// -// Buffers ... - -// -#define hideColorIDX 0 -#define bullishColorIDX 1 -#define bearishColorIDX 2 -#define neuturalColorIDX 3 - -// -#property indicator_chart_window - -// -#property indicator_buffers 10 -#property indicator_plots 8 - -// -// ATR ... - -// -// Upper ... - -// -#define atrUpperBufferIndex 0 -double atrUpperBuffer[]; - -#property indicator_label1 "X121 ATRU" -#property indicator_type1 DRAW_LINE -#property indicator_color1 clrYellow -#property indicator_style1 STYLE_SOLID -#property indicator_width1 1 - -// -// Lower ... - -// -#define atrLowerBufferIndex 1 -double atrLowerBuffer[]; - -#property indicator_label2 "X121 ATRL" -#property indicator_type2 DRAW_LINE -#property indicator_color2 clrYellow -#property indicator_style2 STYLE_SOLID -#property indicator_width2 1 - -// -// ATR Smoothed ... - -// -// Upper ... - -// -#define atrSmoothedUpperBufferIndex 2 -double atrSmoothedUpperBuffer[]; - -#property indicator_label3 "X121 ATRUSM" -#property indicator_type3 DRAW_LINE -#property indicator_color3 clrYellow -#property indicator_style3 STYLE_DASH -#property indicator_width3 1 - -// -// Lower ... - -// -#define atrSmoothedLowerBufferIndex 3 -double atrSmoothedLowerBuffer[]; - -#property indicator_label4 "X121 ATRLSM" -#property indicator_type4 DRAW_LINE -#property indicator_color4 clrYellow -#property indicator_style4 STYLE_DASH -#property indicator_width4 1 - -// -// Price Change ... - -// -#define priceChangeBufferIndex 4 -double priceChangeBuffer[]; - -#property indicator_label5 "X121 PCH" -#property indicator_type5 DRAW_LINE -#property indicator_color5 clrOrchid -#property indicator_style5 STYLE_SOLID -#property indicator_width5 1 - -// -// Price Change Smoothed ... - -// -#define priceChangeSmoothedBufferIndex 5 -double priceChangeSmoothedBuffer[]; - -#property indicator_label6 "X121 PCHSM" -#property indicator_type6 DRAW_LINE -#property indicator_color6 clrOrchid -#property indicator_style6 STYLE_SOLID -#property indicator_width6 1 - -// -// RSI Change ... - -// -#define rsiChangeBufferIndex 6 -double rsiChangeBuffer[]; - -#property indicator_label7 "X121 RSICH" -#property indicator_type7 DRAW_LINE -#property indicator_color7 clrCornflowerBlue -#property indicator_style7 STYLE_SOLID -#property indicator_width7 1 - -// -// RSI Change Smoothed ... - -// -#define rsiChangeSmoothedBufferIndex 7 -double rsiChangeSmoothedBuffer[]; - -#property indicator_label8 "X121 RSICHSM" -#property indicator_type8 DRAW_LINE -#property indicator_color8 clrCornflowerBlue -#property indicator_style8 STYLE_SOLID -#property indicator_width8 1 - -// -// Data Buffers ... - -// -int mLastBufferIndex = 7; - -// -// ATR ... - -#define atrBufferIndex mLastBufferIndex + 1 -double atrBuffer[]; - -// -// RSI ... -#define rsiBufferIndex mLastBufferIndex + 2 -double rsiBuffer[]; - -// -// Variables, Properties and etc ... - -// -// this counts Available Bars ... -int limit; - -// -int maxLength; - -// -// RSI Handler ... -int rsiHandler = INVALID_HANDLE; - -// -// ATR Handler ... -int atrHandler = INVALID_HANDLE; - -// -ENUM_APPLIED_PRICE rsiAppliedTo = ToAppliedPrice(rsiPriceType); - -// -// Event Handlers ... - -/** - * Initialize Indicator ... - * - * @return ( int ) - */ -int OnInit() -{ - // - // Validate Inputs ... - if (!ValidateInputs()) - { - return INIT_PARAMETERS_INCORRECT; - } - - // - // Initialize Indicator Handlers ... - - // - // RSI ... - rsiHandler = iRSI( - _Symbol, - _Period, - rsiLength, - rsiAppliedTo // - ); - bool isInited = rsiHandler != INVALID_HANDLE; - if (!isInited) - { - return INIT_FAILED; - } - - // - // ATR ... - atrHandler = iATR( - _Symbol, - _Period, - atrLength // - ); - isInited = atrHandler != INVALID_HANDLE; - if (!isInited) - { - return INIT_FAILED; - } - - // - // 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; -} - -/** - * De Initialize Indicator ... - * - * @param reason: Integer, De Initialization Reason ... - */ -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 - - // - IndicatorRelease(rsiHandler); - IndicatorRelease(atrHandler); -} - -/** - * Calculate Bars ... - * - * @param rates_total: Integer, Total Bars on Chart ... - * @param prev_calculated: Integer, Total Calculated Bars on Charts ... - * @param time: DateTime Array, History of Open Time ... - * @param open: Double Array, History of Open Prices ... - * @param high: Double Array, History of High Prices ... - * @param low: Double Array, History of Low Prices ... - * @param close: Double Array, History of Close Prices ... - * @param tick_volume: Long, History of Tick Volumes on Bar ... - * @param volume: Long, History of Trade Volumes ... - * @param spread: Double, History of Spread Price ... - * - * @return ( int ) - */ -int OnCalculate( - const int rates_total, - const int prev_calculated, - const datetime &time[], - const double &open[], - const double &high[], - const double &low[], - const double &close[], - const long &tick_volume[], - const long &volume[], - const int &spread[] // -) -{ - // - // 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); - - // - // Fill All Buffers by Zero ... - if (prev_calculated == 0) - { - } - - // - // Validate Calculated Bars ... - - // - // RSI ... - int rsiCalculatedBars = BarsCalculated(rsiHandler); - - // - // ATR ... - int atrCalculatedBars = BarsCalculated(atrHandler); - - // - bool isPassedRequiredCalculatedBars = - // - // RSI ... - rsiCalculatedBars >= maxLength && - // - // ATR ... - atrCalculatedBars >= maxLength - // - ; - if (!isPassedRequiredCalculatedBars) - { - return prev_calculated; - } - - // - limit = (prev_calculated > rates_total || prev_calculated <= 0) - ? rates_total - : (rates_total - prev_calculated) + 1; - - // - // Buffers Copy ... - - // - // RSI ... - int copiedRsis = CopyBuffer(rsiHandler, 0, 0, limit, rsiBuffer); - - // - // ATR ... - int copiedAtrs = CopyBuffer(atrHandler, 0, 0, limit, atrBuffer); - - // - // Validate Copied Items ... - bool isPassedRequiredCopiedItems = - // - // - // RSI ... - copiedRsis > 0 && - // - // ATR ... - copiedAtrs > 0 - // - ; - if (!isPassedRequiredCopiedItems) - { - return prev_calculated; - } - - // - // Main Loop ... - for (int i = limit - 1; i >= 0 && !IsStopped(); i--) - { - // - CalculateBuffers( - i, - prev_calculated, - rates_total, - // - open, - high, - close, - low, - tick_volume // - ); - } - - // - return rates_total; -} - -// -// Functions ... - -/** - * Validate Input Args for Initialization ... - * - * @return ( bool ) - */ -bool ValidateInputs() -{ - // - bool result = - // - // RSI ... - rsiLength > 0 && - // - // ATR ... - atrLength > 0 && - atrMultiplier > 0 && - // - priceChangeSmoothingLength > 0 && - // - IsValid(rsiPriceType) && - IsValid(priceChangeType) && - IsValid(atrUpperPriceType) && - IsValid(atrLowerPriceType) - // - ; - - // - return result; -} - -/** - * Extract Max Length of Inputs ... - * - * @return ( int ) - */ -int ExtractMaxLengthOfInputs() -{ - // - int result = 0; - - // - result = MathMax(rsiLength, atrLength); - result = MathMax(result, priceChangeSmoothingLength); - - // - return result; -} - -/** - * Define Required Buffers ... - */ -void DefineBuffers() -{ - // - // ATR ... - - // - // UPPER ... - ENUM_DRAW_TYPE atrUpperDrawType = showAtrUpper ? DRAW_LINE : DRAW_NONE; - ArraySetAsSeries(atrUpperBuffer, true); - SetIndexBuffer(atrUpperBufferIndex, atrUpperBuffer, INDICATOR_DATA); - PlotIndexSetDouble(atrUpperBufferIndex, PLOT_EMPTY_VALUE, EMPTY_VALUE); - PlotIndexSetInteger(atrUpperBufferIndex, PLOT_SHOW_DATA, showAtrUpper); - PlotIndexSetInteger(atrUpperBufferIndex, PLOT_DRAW_TYPE, atrUpperDrawType); - - // - // LOWER ... - ENUM_DRAW_TYPE atrLowerDrawType = showAtrLower ? DRAW_LINE : DRAW_NONE; - ArraySetAsSeries(atrLowerBuffer, true); - SetIndexBuffer(atrLowerBufferIndex, atrLowerBuffer, INDICATOR_DATA); - PlotIndexSetDouble(atrLowerBufferIndex, PLOT_EMPTY_VALUE, EMPTY_VALUE); - PlotIndexSetInteger(atrLowerBufferIndex, PLOT_SHOW_DATA, showAtrLower); - PlotIndexSetInteger(atrLowerBufferIndex, PLOT_DRAW_TYPE, atrLowerDrawType); - - // - // ATR Smoothed ... - - // - // UPPER ... - ENUM_DRAW_TYPE atrSmoothedUpperDrawType = showSmoothedAtrUpper ? DRAW_LINE : DRAW_NONE; - ArraySetAsSeries(atrSmoothedUpperBuffer, true); - SetIndexBuffer(atrSmoothedUpperBufferIndex, atrSmoothedUpperBuffer, INDICATOR_DATA); - PlotIndexSetDouble(atrSmoothedUpperBufferIndex, PLOT_EMPTY_VALUE, EMPTY_VALUE); - PlotIndexSetInteger(atrSmoothedUpperBufferIndex, PLOT_SHOW_DATA, showSmoothedAtrUpper); - PlotIndexSetInteger(atrSmoothedUpperBufferIndex, PLOT_DRAW_TYPE, atrSmoothedUpperDrawType); - - // - // LOWER ... - ENUM_DRAW_TYPE atrSmoothedLowerDrawType = showSmoothedAtrLower ? DRAW_LINE : DRAW_NONE; - ArraySetAsSeries(atrSmoothedLowerBuffer, true); - SetIndexBuffer(atrSmoothedLowerBufferIndex, atrSmoothedLowerBuffer, INDICATOR_DATA); - PlotIndexSetDouble(atrSmoothedLowerBufferIndex, PLOT_EMPTY_VALUE, EMPTY_VALUE); - PlotIndexSetInteger(atrSmoothedLowerBufferIndex, PLOT_SHOW_DATA, showSmoothedAtrLower); - PlotIndexSetInteger(atrSmoothedLowerBufferIndex, PLOT_DRAW_TYPE, atrSmoothedLowerDrawType); - - // - // PriceChange ... - ENUM_DRAW_TYPE priceChangeDrawType = showPriceChange ? DRAW_LINE : DRAW_NONE; - ArraySetAsSeries(priceChangeBuffer, true); - SetIndexBuffer(priceChangeBufferIndex, priceChangeBuffer, INDICATOR_DATA); - PlotIndexSetDouble(priceChangeBufferIndex, PLOT_EMPTY_VALUE, 0.0); - PlotIndexSetInteger(priceChangeBufferIndex, PLOT_SHOW_DATA, showPriceChange); - PlotIndexSetInteger(priceChangeBufferIndex, PLOT_DRAW_TYPE, priceChangeDrawType); - - // - // PriceChange Smoothed ... - ENUM_DRAW_TYPE priceChangeSmoothedaDrawType = showSmoothedPriceChange ? DRAW_LINE : DRAW_NONE; - ArraySetAsSeries(priceChangeSmoothedBuffer, true); - SetIndexBuffer(priceChangeSmoothedBufferIndex, priceChangeSmoothedBuffer, INDICATOR_DATA); - PlotIndexSetDouble(priceChangeSmoothedBufferIndex, PLOT_EMPTY_VALUE, 0.0); - PlotIndexSetInteger(priceChangeSmoothedBufferIndex, PLOT_SHOW_DATA, showSmoothedPriceChange); - PlotIndexSetInteger(priceChangeSmoothedBufferIndex, PLOT_DRAW_TYPE, priceChangeSmoothedaDrawType); - - // - // RSIChange ... - ENUM_DRAW_TYPE rsiChangeDrawType = showRSIChange ? DRAW_LINE : DRAW_NONE; - ArraySetAsSeries(rsiChangeBuffer, true); - SetIndexBuffer(rsiChangeBufferIndex, rsiChangeBuffer, INDICATOR_DATA); - PlotIndexSetDouble(rsiChangeBufferIndex, PLOT_EMPTY_VALUE, 0.0); - PlotIndexSetInteger(rsiChangeBufferIndex, PLOT_SHOW_DATA, showRSIChange); - PlotIndexSetInteger(rsiChangeBufferIndex, PLOT_DRAW_TYPE, rsiChangeDrawType); - - // - // RSIChangeMa ... - ENUM_DRAW_TYPE rsiChangeMaDrawType = showSmoothedRSIChange ? DRAW_LINE : DRAW_NONE; - ArraySetAsSeries(rsiChangeSmoothedBuffer, true); - SetIndexBuffer(rsiChangeSmoothedBufferIndex, rsiChangeSmoothedBuffer, INDICATOR_DATA); - PlotIndexSetDouble(rsiChangeSmoothedBufferIndex, PLOT_EMPTY_VALUE, 0.0); - PlotIndexSetInteger(rsiChangeSmoothedBufferIndex, PLOT_SHOW_DATA, showSmoothedRSIChange); - PlotIndexSetInteger(rsiChangeSmoothedBufferIndex, PLOT_DRAW_TYPE, rsiChangeMaDrawType); - - // - // Data Buffers ... - - // - // ATR ... - ArraySetAsSeries(atrBuffer, true); - SetIndexBuffer(atrBufferIndex, atrBuffer, INDICATOR_CALCULATIONS); - - // - // RSI ... - ArraySetAsSeries(rsiBuffer, true); - SetIndexBuffer(rsiBufferIndex, rsiBuffer, INDICATOR_CALCULATIONS); -} - -/** - * Set Indicator Short Name and also we can define Buffers Labels ... - */ -void SetIndicatorName() -{ - // - IndicatorSetString(INDICATOR_SHORTNAME, ShortName); - IndicatorSetInteger(INDICATOR_DIGITS, 2); -} - -/** - * Calculate Custom Buffers ... - * - * @param bar_index: Integer, Represent Current Bar ... - * @param prevCalculated: Integer, Represent Previous Calculated Bars ... - * @param ratesTotal: Integer, Represents All Available Bars ... - * @param open: Double Array, History of Open Prices ... - * @param high: Double Array, History of High Prices ... - * @param close: Double Array, History of Close Prices ... - * @param low: Double Array, History of Low Prices ... - * @param tickVolume: Long, History of Tick Volumes on Bar ... - */ -void CalculateBuffers( - int bar_index, // Selected Bar Index - const int prevCalculated, - const int ratesTotal, - const double &open[], - const double &high[], - const double &close[], - const double &low[], - const long &tickVolume[] // -) -{ - // - int barsLimit = startCalculationForLastBars > 0 - ? startCalculationForLastBars - : 0; - // - // bool canCalculate = true; - bool canCalculate = - barsLimit == 0 || - bar_index <= barsLimit; - if (canCalculate) - { - // - CalculateAtrZones( - bar_index, - prevCalculated, - ratesTotal, - open, - high, - close, - low // - ); - } - else - { - FillBuffersZero(bar_index); - } -} - -// -// Custom ... - -/** - * Fill All Bufers to Zero Vlue for Specified Bar Index ... - * - * @param barIndex: Integer ... - */ -void FillBuffersZero(int barIndex) -{ - // - rsiBuffer[barIndex] = 0; - atrBuffer[barIndex] = 0; - atrUpperBuffer[barIndex] = 0; - atrLowerBuffer[barIndex] = 0; - rsiChangeBuffer[barIndex] = 0; - priceChangeBuffer[barIndex] = 0; - atrSmoothedUpperBuffer[barIndex] = 0; - atrSmoothedLowerBuffer[barIndex] = 0; - rsiChangeSmoothedBuffer[barIndex] = 0; - priceChangeSmoothedBuffer[barIndex] = 0; -} - -/** - * Calculate ATR Zones ... - * - * @param bar_index: Integer, Represent Current Bar ... - * @param prevCalculated: Integer, Represent Previous Calculated Bars ... - * @param ratesTotal: Integer, Represents All Available Bars ... - * @param open: Double Array, History of Open Prices ... - * @param high: Double Array, History of High Prices ... - * @param close: Double Array, History of Close Prices ... - * @param low: Double Array, History of Low Prices ... - */ -void CalculateAtrZones( - 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 points = GetPoints(_Symbol); - - // - // ATR Calculations ... - double iAtr = atrBuffer[bar_index]; - double iMultiPliedAtr = iAtr * atrMultiplier; - - // - // Select Upper Price ... - double iUpperPrice = GetAppliedPrice( - atrUpperPriceType, - open, - high, - low, - close, - bar_index // - ); - - // - // Select Lower Price ... - double iLowerPrice = GetAppliedPrice( - atrLowerPriceType, - open, - high, - low, - close, - bar_index // - ); - - // - // Calculate Atrs ... - - // - double iAtrUpper = iUpperPrice + iMultiPliedAtr; - double iAtrLower = iLowerPrice - iMultiPliedAtr; - - // - atrUpperBuffer[bar_index] = iAtrUpper; - atrLowerBuffer[bar_index] = iAtrLower; - - // - bool canSmoothAtr = atrSmoothingMethod != X_MA_MODE_NONE; - if (canSmoothAtr) - { - // - // Upper ... - iMAOnBuffer( - ratesTotal, - prevCalculated, - bar_index, - atrLength, - atrUpperBuffer, - atrSmoothedUpperBuffer, - atrSmoothingMethod // - ); - - // - // Lower ... - iMAOnBuffer( - ratesTotal, - prevCalculated, - bar_index, - atrLength, - atrLowerBuffer, - atrSmoothedLowerBuffer, - atrSmoothingMethod // - ); - } - else - { - // - atrSmoothedUpperBuffer[bar_index] = iAtrUpper; - atrSmoothedLowerBuffer[bar_index] = iAtrLower; - } - - // - // RSI Change Calculations ... - - // - double iRsi = rsiBuffer[bar_index]; - double iRsiP = rsiBuffer[bar_index + 1]; - double iRsiPrice = GetAppliedPrice( - rsiPriceType, - open, - high, - low, - close, - bar_index // - ); - - // - double iRsiChanged = iRsi - iRsiP; - double iRsiPointsChanged = iRsiChanged / points; - - // - double iRChange = iRsiPrice + (iRsiChanged * points); - rsiChangeBuffer[bar_index] = iRChange; - - // - bool canSmoothRsi = rsiSmoothingMethod != X_MA_MODE_NONE; - if (canSmoothRsi) - { - // - // Upper ... - iMAOnBuffer( - ratesTotal, - prevCalculated, - bar_index, - atrLength, - rsiChangeBuffer, - rsiChangeSmoothedBuffer, - rsiSmoothingMethod // - ); - } - else - { - rsiChangeSmoothedBuffer[bar_index] = iRChange; - } - - // - // PRICE Change Calculation ... - - // - double iPChangePrice = GetAppliedPrice( - priceChangeType, - open, - high, - low, - close, - bar_index // - ); - double iPPChangePrice = GetAppliedPrice( - priceChangeType, - open, - high, - low, - close, - bar_index + 1 // - ); - - // - double iPriceChange = iPChangePrice - iPPChangePrice; - double iPricePointsChanged = iPriceChange / points; - double iVolatilityChange = iPriceChange / iAtr; - - // - double iPChange = iPChangePrice + (iPricePointsChanged * points); - priceChangeBuffer[bar_index] = iPChange; - - // - bool canSmoothPriceChange = priceChangeSmoothingMethod != X_MA_MODE_NONE; - if (canSmoothPriceChange) - { - // - // Upper ... - iMAOnBuffer( - ratesTotal, - prevCalculated, - bar_index, - atrLength, - priceChangeBuffer, - priceChangeSmoothedBuffer, - priceChangeSmoothingMethod // - ); - } - else - { - priceChangeSmoothedBuffer[bar_index] = iPChange; - } -} - -// \ No newline at end of file diff --git a/Indicators/x-saherelm.x121.xche.mq5 b/Indicators/x-saherelm.x121.xche.mq5 deleted file mode 100644 index d8ed1040..00000000 --- a/Indicators/x-saherelm.x121.xche.mq5 +++ /dev/null @@ -1,624 +0,0 @@ -/////////////////////////////////////////////////////// -// -// SaherElm IT Center MQL5 Indicator -// ------------------------------------------------- -// Name: X121 XCHE -// Description: XCHE ... -// -// -// 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 XCHE Indicator" -#property strict - -// -// Definitions ... - -// -#define ShortName "X121 XCHE" - -// -// Includes Common Library ... -#include "../Libraries/x-saherelm.common.lib.mq5" - -// -// Inputs ... - -// -// Market ... -input group "Market"; -input int cheLength = 35; // Length -input int cheLoopback = 26; // Loopback -input double cheMultiplier1 = 3.0; // 1st Multiplier -input double cheMultiplier2 = 3.5; // 2nd Multiplier -input ENUM_APPLIED_PRICE cheUpperAppliedTo = PRICE_HIGH; // Upper Zone Applied to -input ENUM_APPLIED_PRICE cheLowerAppliedTo = PRICE_LOW; // Lower Zone Applied to - -// -input group "Presentation"; - -// -input int cheArrowCode = 159; // CHE Arrow Code - -// -input bool showLE1 = true; // Show 1st Long Exit -input bool showSE1 = true; // Show 1st Short Exit -input bool showLE2 = true; // Show 2st Long Exit -input bool showSE2 = true; // Show 2st Short Exit - -// -// Buffers ... - -// -#define hideColorIDX 0 -#define bullishColorIDX 1 -#define bearishColorIDX 2 -#define neuturalColorIDX 3 - -// -#property indicator_chart_window - -// -#property indicator_buffers 8 -#property indicator_plots 8 - -// -// Exit 1 ... - -// -// LONG ... - -// -#define le1BufferIndex 0 -double le1Buffer[]; - -#property indicator_label1 "X121 LE1" -#property indicator_type1 DRAW_LINE -#property indicator_color1 clrAqua -#property indicator_style1 STYLE_DOT -#property indicator_width1 1 - -// -// SHORT ... - -// -#define se1BufferIndex 1 -double se1Buffer[]; - -#property indicator_label2 "X121 SE1" -#property indicator_type2 DRAW_LINE -#property indicator_color2 clrMagenta -#property indicator_style2 STYLE_DOT -#property indicator_width2 1 - -// -// Exit 2 ... - -// -// LONG ... - -// -#define le2BufferIndex 2 -double le2Buffer[]; - -#property indicator_label3 "X121 LE2" -#property indicator_type3 DRAW_LINE -#property indicator_color3 clrAqua -#property indicator_style3 STYLE_SOLID -#property indicator_width3 1 - -// -// SHORT ... - -// -#define se2BufferIndex 3 -double se2Buffer[]; - -#property indicator_label4 "X121 SE2" -#property indicator_type4 DRAW_LINE -#property indicator_color4 clrMagenta -#property indicator_style4 STYLE_SOLID -#property indicator_width4 1 - -// -// Start Buffers ... - -// -#define le1StartBufferIndex 4 -double le1StartBuffer[]; - -// -#property indicator_label5 "X121 LE1 S" -#property indicator_type5 DRAW_ARROW -#property indicator_color5 clrLime - -// -#define se1StartBufferIndex 5 -double se1StartBuffer[]; - -// -#property indicator_label6 "X121 SE1 S" -#property indicator_type6 DRAW_ARROW -#property indicator_color6 clrRed - -// -#define le2StartBufferIndex 6 -double le2StartBuffer[]; - -// -#property indicator_label7 "X121 LE2 S" -#property indicator_type7 DRAW_ARROW -#property indicator_color7 clrLime - -// -#define se2StartBufferIndex 7 -double se2StartBuffer[]; - -// -#property indicator_label8 "X121 SE2 S" -#property indicator_type8 DRAW_ARROW -#property indicator_color8 clrRed - -// -// Variables, Properties and etc ... - -// -// this counts Available Bars ... -int limit; - -// -int maxLength; - -// -// Working Array ... -double work[][6]; -#define hi1Idx 0 -#define lo1Idx 1 -#define hi2Idx 2 -#define lo2Idx 3 -#define trend1Idx 4 -#define trend2Idx 5 - -// -// Event Handlers ... - -/** - * Initialize Indicator ... - * - * @return ( int ) - */ -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 cheLength, here we get max Input cheLength - // and then wait until pass it ... - maxLength = ExtractMaxLengthOfInputs(); - - // - // Define Index Buffers ... - DefineBuffers(); - - // - // Set Indicator ShortName ... - SetIndicatorName(); - - // - // Init Succeed ... - return INIT_SUCCEEDED; -} - -/** - * De Initialize Indicator ... - * - * @param reason: Integer, De Initialization Reason ... - */ -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 -} - -/** - * Calculate Bars ... - * - * @param rates_total: Integer, Total Bars on Chart ... - * @param prev_calculated: Integer, Total Calculated Bars on Charts ... - * @param time: DateTime Array, History of Open Time ... - * @param open: Double Array, History of Open Prices ... - * @param high: Double Array, History of High Prices ... - * @param low: Double Array, History of Low Prices ... - * @param close: Double Array, History of Close Prices ... - * @param tick_volume: Long, History of Tick Volumes on Bar ... - * @param volume: Long, History of Trade Volumes ... - * @param spread: Double, History of Spread Price ... - * - * @return ( int ) - */ -int OnCalculate( - const int rates_total, - const int prev_calculated, - const datetime &time[], - const double &open[], - const double &high[], - const double &low[], - const double &close[], - const long &tick_volume[], - const long &volume[], - const int &spread[] // -) -{ - // - if (Bars(_Symbol, _Period) < rates_total) - { - return (prev_calculated); - } - - // - if (ArrayRange(work, 0) != rates_total) - { - ArrayResize(work, rates_total); - } - - // - // this counts Available Bars ... - - // - limit = prev_calculated - 1; - if (limit < 0) - { - limit = 0; - } - - // - // Main Loop ... - for (int i = limit; i < rates_total && !IsStopped(); i++) - { - CalculateBuffers( - i, - prev_calculated, - rates_total, - // - open, - high, - low, - close); - } - - // - return rates_total; -} - -// -// Functions ... - -/** - * Validate Input Args for Initialization ... - * - * @return ( bool ) - */ -bool ValidateInputs() -{ - // - bool result = true; - - // - result = - cheLength >= 9 && - cheLoopback >= 0; - - // - return result; -} - -/** - * Extract Max Length of Inputs ... - * - * @return ( int ) - */ -int ExtractMaxLengthOfInputs() -{ - // - int result = 0; - - // - result = MathMax(cheLength, cheLoopback); - - // - return result; -} - -/** - * Define Required Buffers ... - */ -void DefineBuffers() -{ - // - // LEVEL 1 ... - - // - // Long Exit 1 ... - - // - // Draw Type ... - ENUM_DRAW_TYPE le1DrawType = showLE1 ? DRAW_LINE : DRAW_NONE; - ENUM_DRAW_TYPE le1StartDrawType = showLE1 ? DRAW_ARROW : DRAW_NONE; - - // - // Buffer ... - SetIndexBuffer(le1BufferIndex, le1Buffer, INDICATOR_DATA); - PlotIndexSetInteger(le1BufferIndex, PLOT_SHOW_DATA, showLE1); - PlotIndexSetInteger(le1BufferIndex, PLOT_DRAW_TYPE, le1DrawType); - - // - // Start Buffer ... - SetIndexBuffer(le1StartBufferIndex, le1StartBuffer, INDICATOR_DATA); - PlotIndexSetInteger(le1StartBufferIndex, PLOT_SHOW_DATA, false); - PlotIndexSetInteger(le1StartBufferIndex, PLOT_DRAW_TYPE, le1StartDrawType); - PlotIndexSetInteger(le1StartBufferIndex, PLOT_ARROW, cheArrowCode); - - // - // Short Exit 1 ... - - // - // Draw Type ... - ENUM_DRAW_TYPE se1DrawType = showSE1 ? DRAW_LINE : DRAW_NONE; - ENUM_DRAW_TYPE se1StartDrawType = showSE1 ? DRAW_ARROW : DRAW_NONE; - - // - // Buffer ... - SetIndexBuffer(se1BufferIndex, se1Buffer, INDICATOR_DATA); - PlotIndexSetInteger(se1BufferIndex, PLOT_SHOW_DATA, showSE1); - PlotIndexSetInteger(se1BufferIndex, PLOT_DRAW_TYPE, se1DrawType); - - // - // Start Buffer ... - SetIndexBuffer(se1StartBufferIndex, se1StartBuffer, INDICATOR_DATA); - PlotIndexSetInteger(se1StartBufferIndex, PLOT_SHOW_DATA, false); - PlotIndexSetInteger(se1StartBufferIndex, PLOT_DRAW_TYPE, se1StartDrawType); - PlotIndexSetInteger(se1StartBufferIndex, PLOT_ARROW, cheArrowCode); - - // - // LEVEL 2 ... - - // - // Long Exit 2 ... - - // - // Draw Type ... - ENUM_DRAW_TYPE le2DrawType = showLE2 ? DRAW_LINE : DRAW_NONE; - ENUM_DRAW_TYPE le2StartDrawType = showLE2 ? DRAW_ARROW : DRAW_NONE; - - // - // Buffer ... - SetIndexBuffer(le2BufferIndex, le2Buffer, INDICATOR_DATA); - PlotIndexSetInteger(le2BufferIndex, PLOT_SHOW_DATA, showLE2); - PlotIndexSetInteger(le2BufferIndex, PLOT_DRAW_TYPE, le2DrawType); - - // - // Start Buffer ... - SetIndexBuffer(le2StartBufferIndex, le2StartBuffer, INDICATOR_DATA); - PlotIndexSetInteger(le2StartBufferIndex, PLOT_SHOW_DATA, false); - PlotIndexSetInteger(le2StartBufferIndex, PLOT_DRAW_TYPE, le2StartDrawType); - PlotIndexSetInteger(le2StartBufferIndex, PLOT_ARROW, cheArrowCode); - - // - // Short Exit 2 ... - - // - // Draw Type ... - ENUM_DRAW_TYPE se2DrawType = showSE2 ? DRAW_LINE : DRAW_NONE; - ENUM_DRAW_TYPE se2StartDrawType = showSE2 ? DRAW_ARROW : DRAW_NONE; - - // - // Buffer ... - SetIndexBuffer(se2BufferIndex, se2Buffer, INDICATOR_DATA); - PlotIndexSetInteger(se2BufferIndex, PLOT_SHOW_DATA, showSE2); - PlotIndexSetInteger(se2BufferIndex, PLOT_DRAW_TYPE, se2DrawType); - - // - // Start Buffer ... - SetIndexBuffer(se2StartBufferIndex, se2StartBuffer, INDICATOR_DATA); - PlotIndexSetInteger(se2StartBufferIndex, PLOT_SHOW_DATA, false); - PlotIndexSetInteger(se2StartBufferIndex, PLOT_DRAW_TYPE, se2StartDrawType); - PlotIndexSetInteger(se2StartBufferIndex, PLOT_ARROW, cheArrowCode); -} - -/** - * 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 - 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 ... - le1Buffer[bar_index] = le1StartBuffer[bar_index] = se1Buffer[bar_index] = se1StartBuffer[bar_index] = EMPTY_VALUE; - le2Buffer[bar_index] = le2StartBuffer[bar_index] = se2Buffer[bar_index] = se2StartBuffer[bar_index] = EMPTY_VALUE; - - // - int start = MathMax(bar_index - cheLoopback, 0); - - // - // Calculate ATR Value ... - double atrValue = 0; - for (int k = 1; k <= cheLength && (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)cheLength; - - // - // Retrieve Highest High and Lowest Lows ... - double cheLoopbackMax = high[ArrayMaximum(high, start, cheLoopback)]; - double cheLoopbackMin = low[ArrayMinimum(low, start, cheLoopback)]; - - // - // Fill Multi Dimesional Working Array ... - work[bar_index][hi1Idx] = cheLoopbackMax - cheMultiplier1 * atrValue; - work[bar_index][lo1Idx] = cheLoopbackMin + cheMultiplier1 * atrValue; - work[bar_index][hi2Idx] = cheLoopbackMax - cheMultiplier2 * atrValue; - work[bar_index][lo2Idx] = cheLoopbackMin + cheMultiplier2 * 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 (cheMultiplier1 > 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]; - } - - // - le1Buffer[bar_index] = work[bar_index][hi1Idx]; - - // - if (le1Buffer[bar_index - 1] == EMPTY_VALUE) - { - le1StartBuffer[bar_index] = le1Buffer[bar_index]; - } - } - - // - // Short ... - if (cheMultiplier1 > 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]; - } - - // - se1Buffer[bar_index] = work[bar_index][lo1Idx]; - - // - if (se1Buffer[bar_index - 1] == EMPTY_VALUE) - { - se1StartBuffer[bar_index] = se1Buffer[bar_index]; - } - } - - // - // Exit 2 ... - - // - // Long ... - if (cheMultiplier2 > 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]; - } - - // - le2Buffer[bar_index] = work[bar_index][hi2Idx]; - - // - if (le2Buffer[bar_index - 1] == EMPTY_VALUE) - { - le2StartBuffer[bar_index] = le2Buffer[bar_index]; - } - } - - // - // Short ... - if (cheMultiplier2 > 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]; - } - - // - se2Buffer[bar_index] = work[bar_index][lo2Idx]; - - // - if (se2Buffer[bar_index - 1] == EMPTY_VALUE) - { - se2StartBuffer[bar_index] = se2Buffer[bar_index]; - } - } - } -} - -// \ No newline at end of file diff --git a/Indicators/x-saherelm.x121.xdelta.mq5 b/Indicators/x-saherelm.x121.xdelta.mq5 deleted file mode 100644 index b422765f..00000000 --- a/Indicators/x-saherelm.x121.xdelta.mq5 +++ /dev/null @@ -1,532 +0,0 @@ -/////////////////////////////////////////////////////// -// -// SaherElm IT Center MQL5 Ocillator -// ------------------------------------------------- -// Name: X121 XDelta -// Description: Detect Comulative Volumes Delta ... -// -// -// 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 XDelta Ocillator" -#property strict - -// -// Definitions ... - -// -#define ShortName "X121_XDELTA" - -// -// Imports ... -#include "../Libraries/x-saherelm.common.lib.mq5" - -// -// Inputs ... - -// -// Makret ... -input group "Market"; -input int maLength = 14; // Moving Averge Length -input ENUM_X_MA_METHOD maMethod = X_MA_MODE_EMA; // Moving Averge Method - -// -// Presentation ... -input group "Presentation"; -input int startCalculationForLastBars = 1000; // Calculate Last n Bars -input bool showDeltaLine = true; // Show Delta Line -input bool showDeltaHistogram = true; // Show Delta Histogram -input bool showDeltaMa = true; // Show Delta Moving Average - -// -// Buffers Props ... - -// -#property indicator_separate_window - -// -#property indicator_buffers 6 -#property indicator_plots 3 - -// -#define hideColorIDX 0 -#define bullishColorIDX 1 -#define bearishColorIDX 2 - -// -// Buffers ... - -// -#define deltaLineBufferIndex 0 -double deltaLineBuffer[]; - -#property indicator_label1 "Delta Line" -#property indicator_type1 DRAW_LINE -#property indicator_color1 clrYellow -#property indicator_style1 STYLE_SOLID -#property indicator_width1 1 - -// -#define deltaHistogramBufferIndex 1 -double deltaHistogramBuffer[]; - -// -#define deltaHistogramColorBufferIndex 2 -double deltaHistogramColorBuffer[]; - -#property indicator_label2 "Delta Histogram" -#property indicator_type2 DRAW_COLOR_HISTOGRAM -#property indicator_color2 CLR_NONE, clrGreen, clrDarkRed -#property indicator_style2 STYLE_DOT -#property indicator_width2 1 - -// -#define deltaMaBufferIndex 3 -double deltaMaBuffer[]; - -#property indicator_label3 "Delta MA" -#property indicator_type3 DRAW_LINE -#property indicator_color3 clrOrchid -#property indicator_style3 STYLE_SOLID -#property indicator_width3 1 - -// -// Data Buffers ... - -#define mLastBufferIndex 3 - -// -#define rawDeltaBufferIndex mLastBufferIndex + 1 -double rawDeltaBuffer[]; - -// -#define deltaStateBufferIndex mLastBufferIndex + 2 -double deltaStateBuffer[]; - -// -// Variables, Properties and etc ... - -// -// this counts Available Bars ... -int limit; - -// -int maxLength; - -// -// Event Handlers ... - -/** - * Initialize Indicator ... - * - * @return ( int ) - */ -int OnInit() -{ - // - // Validate Inputs ... - if (!ValidateInputs()) - { - return INIT_PARAMETERS_INCORRECT; - } - - // - // Initialize Indicator Handlers ... - - // - // 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(); - IndicatorSetInteger(INDICATOR_DIGITS, 2); - - // - // Init Succeed ... - return INIT_SUCCEEDED; -} - -/** - * De Initialize Indicator ... - * - * @param reason: Integer, De Initialization Reason ... - */ -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 -} - -/** - * Calculate Bars ... - * - * @param rates_total: Integer, Total Bars on Chart ... - * @param prev_calculated: Integer, Total Calculated Bars on Charts ... - * @param time: DateTime Array, History of Open Time ... - * @param open: Double Array, History of Open Prices ... - * @param high: Double Array, History of High Prices ... - * @param low: Double Array, History of Low Prices ... - * @param close: Double Array, History of Close Prices ... - * @param tick_volume: Long, History of Tick Volumes on Bar ... - * @param volume: Long, History of Trade Volumes ... - * @param spread: Double, History of Spread Price ... - * - * @return ( int ) - */ -int OnCalculate( - const int rates_total, - const int prev_calculated, - const datetime &time[], - const double &open[], - const double &high[], - const double &low[], - const double &close[], - const long &tick_volume[], - const long &volume[], - const int &spread[] // -) -{ - // - // 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); - - // - limit = (prev_calculated > rates_total || prev_calculated <= 0) - ? rates_total - : (rates_total - prev_calculated) + 1; - - // - // Main Loop ... - for (int i = limit - 1; i >= 0 && !IsStopped(); i--) - { - // - CalculateBuffers( - // - i, - prev_calculated, - rates_total, - // - open, - high, - close, - low, - tick_volume // - ); - } - - // - return rates_total; -} - -// -// Functions ... - -/** - * Validate Input Args for Initialization ... - * - * @return ( bool ) - */ -bool ValidateInputs() -{ - // - bool result = false; - - // - result = maLength > 0 && - IsValid(maMethod); - - // - return result; -} - -/** - * Extract Max Length of Inputs ... - * - * @return ( int ) - */ -int ExtractMaxLengthOfInputs() -{ - // - int result = 0; - - // - result = MathMax(0, maLength); - - // - return result; -} - -/** - * Set Indicator Short Name and also we can define Buffers Labels ... - */ -void SetIndicatorName() -{ - IndicatorSetString(INDICATOR_SHORTNAME, ShortName); -} - -/** - * Define Required Buffers ... - */ -void DefineBuffers() -{ - // - // Plot Buffers ... - - // - // Delta Line ... - ENUM_DRAW_TYPE deltaLineDrawType = showDeltaLine ? DRAW_LINE : DRAW_NONE; - - // - ArraySetAsSeries(deltaLineBuffer, true); - SetIndexBuffer(deltaLineBufferIndex, deltaLineBuffer, INDICATOR_DATA); - PlotIndexSetDouble(deltaLineBufferIndex, PLOT_EMPTY_VALUE, 0.0); - PlotIndexSetInteger(deltaLineBufferIndex, PLOT_SHOW_DATA, showDeltaLine); - PlotIndexSetInteger(deltaLineBufferIndex, PLOT_DRAW_TYPE, deltaLineDrawType); - - // - // Delta Histogram ... - ENUM_DRAW_TYPE deltaHistogramDrawType = showDeltaHistogram ? DRAW_COLOR_HISTOGRAM : DRAW_NONE; - - // - ArraySetAsSeries(deltaHistogramBuffer, true); - SetIndexBuffer(deltaHistogramBufferIndex, deltaHistogramBuffer, INDICATOR_DATA); - PlotIndexSetDouble(deltaHistogramBufferIndex, PLOT_EMPTY_VALUE, 0.0); - PlotIndexSetInteger(deltaHistogramBufferIndex, PLOT_SHOW_DATA, showDeltaHistogram); - PlotIndexSetInteger(deltaHistogramBufferIndex, PLOT_DRAW_TYPE, deltaHistogramDrawType); - - // - ArraySetAsSeries(deltaHistogramColorBuffer, true); - SetIndexBuffer(deltaHistogramColorBufferIndex, deltaHistogramColorBuffer, INDICATOR_COLOR_INDEX); - - // - // Delta Ma ... - ENUM_DRAW_TYPE deltaMaDrawType = showDeltaMa ? DRAW_LINE : DRAW_NONE; - - // - ArraySetAsSeries(deltaMaBuffer, true); - SetIndexBuffer(deltaMaBufferIndex, deltaMaBuffer, INDICATOR_DATA); - PlotIndexSetDouble(deltaMaBufferIndex, PLOT_EMPTY_VALUE, EMPTY_VALUE); - PlotIndexSetInteger(deltaMaBufferIndex, PLOT_SHOW_DATA, showDeltaMa); - PlotIndexSetInteger(deltaMaBufferIndex, PLOT_DRAW_TYPE, deltaMaDrawType); - - // - // Data Buffers ... - - // - ArraySetAsSeries(rawDeltaBuffer, true); - SetIndexBuffer(rawDeltaBufferIndex, rawDeltaBuffer, INDICATOR_CALCULATIONS); - - // - ArraySetAsSeries(deltaStateBuffer, true); - SetIndexBuffer(deltaStateBufferIndex, deltaStateBuffer, INDICATOR_CALCULATIONS); -} - -/** - * Calculate Custom Buffers ... - * - * @param bar_index: Integer, Represent Current Bar ... - * @param prevCalculated: Integer, Represent Previous Calculated Bars ... - * @param ratesTotal: Integer, Represents All Available Bars ... - * @param open: Double Array, History of Open Prices ... - * @param high: Double Array, History of High Prices ... - * @param close: Double Array, History of Close Prices ... - * @param low: Double Array, History of Low Prices ... - * @param tickVolume: Long, History of Tick Volumes on Bar ... - */ -void CalculateBuffers( - int bar_index, // Selected Bar Index - const int prevCalculated, - const int ratesTotal, - const double &open[], - const double &high[], - const double &close[], - const double &low[], - const long &tickVolume[] // -) -{ - // - int barsLimit = startCalculationForLastBars > 0 - ? startCalculationForLastBars - : 0; - // - // bool canCalculate = true; - bool canCalculate = - barsLimit == 0 || - bar_index <= barsLimit; - if (canCalculate) - { - // - CalculateValues( - bar_index, - prevCalculated, - ratesTotal, - open, - high, - close, - low, - tickVolume // - ); - } - else - { - FillBuffersZero(bar_index); - } -} - -/** - * Fill All Bufers to Zero Vlue for Specified Bar Index ... - * - * @param barIndex: Integer ... - */ -void FillBuffersZero(int barIndex) -{ - // - rawDeltaBuffer[barIndex] = 0.0; - deltaLineBuffer[barIndex] = 0.0; - deltaStateBuffer[barIndex] = 0.0; - deltaHistogramBuffer[barIndex] = 0.0; - deltaMaBuffer[barIndex] = 0.0; - deltaHistogramColorBuffer[barIndex] = hideColorIDX; -} - -/** - * Calculate Vales ... - * - * @param bar_index: Integer, Represent Current Bar ... - * @param prevCalculated: Integer, Represent Previous Calculated Bars ... - * @param ratesTotal: Integer, Represents All Available Bars ... - * @param open: Double Array, History of Open Prices ... - * @param high: Double Array, History of High Prices ... - * @param close: Double Array, History of Close Prices ... - * @param low: Double Array, History of Low Prices ... - * @param tickVolume: Long, History of Tick Volumes on Bar ... - */ -void CalculateValues( - int bar_index, // Selected Bar Index - const int prevCalculated, - const int ratesTotal, - const double &open[], - const double &high[], - const double &close[], - const double &low[], - const long &tickVolume[] // -) -{ - // - XOHCL bar; - bool has = bar.Init( - _Symbol, - _Period, - bar_index // - ); - if (!has) - { - return; - } - - // - double iDelta = 0.0; - - // - // Detecting Delta Volume ... - if (bar.IsBullish()) - { - iDelta = (double)bar.volume; - } - else if (bar.IsBearish()) - { - iDelta = -(double)bar.volume; - } - - // - // Checking First Bar Conditions ... - bool isFirstBar = - startCalculationForLastBars > 0 - ? bar_index == startCalculationForLastBars - : bar_index == ratesTotal; - if (isFirstBar) - { - // - rawDeltaBuffer[bar_index] = iDelta; - deltaLineBuffer[bar_index] = iDelta; - deltaHistogramBuffer[bar_index] = iDelta; - } - else - { - // - iDelta += deltaLineBuffer[bar_index + 1]; - - // - rawDeltaBuffer[bar_index] = iDelta; - deltaLineBuffer[bar_index] = iDelta; - deltaHistogramBuffer[bar_index] = iDelta; - } - - // - // Setting iDelta State ... - double iState = iDelta > 0 - ? bullishColorIDX - : iDelta < 0 - ? bearishColorIDX - : hideColorIDX; - // - // Setting iDelta Color ... - double iDeltaColor = iDelta > 0 - ? bullishColorIDX - : iDelta < 0 - ? bearishColorIDX - : hideColorIDX; - - // - deltaStateBuffer[bar_index] = iState; - deltaHistogramColorBuffer[bar_index] = iDeltaColor; - - // - // Calculate Moving Averages ... - int deltaMAsCount = iMAOnBuffer( - ratesTotal, - prevCalculated, - bar_index, - maLength, - rawDeltaBuffer, - deltaMaBuffer, - maMethod // - ); - - // - bar.Clean(); -} - -// diff --git a/Indicators/x-saherelm.x121.xdon.mq5 b/Indicators/x-saherelm.x121.xdon.mq5 deleted file mode 100644 index 49785d41..00000000 --- a/Indicators/x-saherelm.x121.xdon.mq5 +++ /dev/null @@ -1,692 +0,0 @@ -/////////////////////////////////////////////////////// -// -// SaherElm IT Center MQL5 Indicator -// ------------------------------------------------- -// Name: X121 XDON -// Description: XDON ... -// -// -// 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 XDON Indicator" -#property strict - -// -// Definitions ... - -// -#define ShortName "X121 XDON" - -// -// Includes Common Library ... -#include "../Libraries/x-saherelm.common.lib.mq5" - -// -// Inputs ... - -// -// Market ... -input group "Market"; -input int donchainLength = 40; // Donchain Length - -// -// Presentation ... -input group "Presentation"; - -// -input int startCalculationForLastBars = 1000; // Calculate Last n Bars - -// -input bool showUpper = true; // Show Upper Band -input bool showLower = true; // Show Lower Band - -// -input bool showOpen = true; // Show Open -input bool showHigh = true; // Show High -input bool showClose = true; // Show Close -input bool showLow = true; // Show Low - -// -// Buffers ... - -// -#define hideColorIDX 0 -#define bullishColorIDX 1 -#define bearishColorIDX 2 -#define neuturalColorIDX 3 - -// -#property indicator_chart_window - -// -#property indicator_buffers 8 -#property indicator_plots 8 - -// -// Plot Buffers ... - -// -// Open ... - -// -#define donOpenUpperBufferIndex 0 -double donOpenUpperBuffer[]; - -// -#define donOpenUpperPlotBufferIndex 0 -#property indicator_label1 "X121 O U" -#property indicator_type1 DRAW_LINE -#property indicator_color1 clrCornflowerBlue -#property indicator_width1 1 - -// -#define donOpenLowerBufferIndex 1 -double donOpenLowerBuffer[]; - -// -#define donOpenLowerPlotBufferIndex 1 -#property indicator_label2 "X121 O L" -#property indicator_type2 DRAW_LINE -#property indicator_color2 clrCornflowerBlue -#property indicator_width2 1 - -// -// High ... - -// -#define donHighUpperBufferIndex 2 -double donHighUpperBuffer[]; - -// -#define donHighUpperPlotBufferIndex 2 -#property indicator_label3 "X121 H U" -#property indicator_type3 DRAW_LINE -#property indicator_color3 clrAquamarine -#property indicator_width3 1 - -// -#define donHighLowerBufferIndex 3 -double donHighLowerBuffer[]; - -// -#define donHighLowerPlotBufferIndex 3 -#property indicator_label4 "X121 H L" -#property indicator_type4 DRAW_LINE -#property indicator_color4 clrAquamarine -#property indicator_width4 1 - -// -// Low ... - -// -#define donLowUpperBufferIndex 4 -double donLowUpperBuffer[]; - -// -#define donLowUpperPlotBufferIndex 4 -#property indicator_label5 "X121 L U" -#property indicator_type5 DRAW_LINE -#property indicator_color5 clrDarkOrchid -#property indicator_width5 1 - -// -#define donLowLowerBufferIndex 5 -double donLowLowerBuffer[]; - -// -#define donLowLowerPlotBufferIndex 5 -#property indicator_label6 "X121 L L" -#property indicator_type6 DRAW_LINE -#property indicator_color6 clrDarkOrchid -#property indicator_width6 1 - -// -// Close ... - -// -#define donCloseUpperBufferIndex 6 -double donCloseUpperBuffer[]; - -// -#define donCloseUpperPlotBufferIndex 6 -#property indicator_label7 "X121 C U" -#property indicator_type7 DRAW_LINE -#property indicator_color7 clrCoral -#property indicator_width7 1 - -// -#define donCloseLowerBufferIndex 7 -double donCloseLowerBuffer[]; - -// -#define donCloseLowerPlotBufferIndex 7 -#property indicator_label8 "X121 C L" -#property indicator_type8 DRAW_LINE -#property indicator_color8 clrCoral -#property indicator_width8 1 - -// -// Data Buffers ... - -// -int mLastBufferIndex = 7; - -// -// Variables, Properties and etc ... - -// -// this counts Available Bars ... -int limit; - -// -int maxLength; - -// -// Event Handlers ... - -/** - * Initialize Indicator ... - * - * @return ( int ) - */ -int OnInit() -{ - // - // Validate Inputs ... - if (!ValidateInputs()) - { - return INIT_PARAMETERS_INCORRECT; - } - - // - // Initialize Indicator Handlers ... - - // - // 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; -} - -/** - * De Initialize Indicator ... - * - * @param reason: Integer, De Initialization Reason ... - */ -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 -} - -/** - * Calculate Bars ... - * - * @param rates_total: Integer, Total Bars on Chart ... - * @param prev_calculated: Integer, Total Calculated Bars on Charts ... - * @param time: DateTime Array, History of Open Time ... - * @param open: Double Array, History of Open Prices ... - * @param high: Double Array, History of High Prices ... - * @param low: Double Array, History of Low Prices ... - * @param close: Double Array, History of Close Prices ... - * @param tick_volume: Long, History of Tick Volumes on Bar ... - * @param volume: Long, History of Trade Volumes ... - * @param spread: Double, History of Spread Price ... - * - * @return ( int ) - */ -int OnCalculate( - const int rates_total, - const int prev_calculated, - const datetime &time[], - const double &open[], - const double &high[], - const double &low[], - const double &close[], - const long &tick_volume[], - const long &volume[], - const int &spread[] // -) -{ - // - // 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); - - // - // Validate Calculated Bars ... - - // - limit = (prev_calculated > rates_total || prev_calculated <= 0) - ? rates_total - : (rates_total - prev_calculated) + 1; - - // - // Buffers Copy ... - - // - // Main Loop ... - for (int i = limit - 1; i >= 0 && !IsStopped(); i--) - { - // - CalculateBuffers( - i, - prev_calculated, - rates_total, - // - open, - high, - close, - low, - tick_volume // - ); - } - - // - return rates_total; -} - -// -// Functions ... - -/** - * Validate Input Args for Initialization ... - * - * @return ( bool ) - */ -bool ValidateInputs() -{ - // - bool result = false; - - // - result = - // - donchainLength > 0 - // - ; - - // - return result; -} - -/** - * Extract Max Length of Inputs ... - * - * @return ( int ) - */ -int ExtractMaxLengthOfInputs() -{ - // - int result = 0; - - // - return result; -} - -/** - * Define Required Buffers ... - */ -void DefineBuffers() -{ - // - // Plot Buffers ... - // - // Open ... - - // - // UPPER ... - bool canShowCOpenUpper = showUpper && showOpen; - ENUM_DRAW_TYPE donOpenUpperDrawType = canShowCOpenUpper ? DRAW_LINE : DRAW_NONE; - ArraySetAsSeries(donOpenUpperBuffer, true); - SetIndexBuffer(donOpenUpperBufferIndex, donOpenUpperBuffer, INDICATOR_DATA); - PlotIndexSetDouble(donOpenUpperPlotBufferIndex, PLOT_EMPTY_VALUE, EMPTY_VALUE); - PlotIndexSetInteger(donOpenUpperPlotBufferIndex, PLOT_SHOW_DATA, canShowCOpenUpper); - PlotIndexSetInteger(donOpenUpperPlotBufferIndex, PLOT_DRAW_TYPE, donOpenUpperDrawType); - - // - // LOWER ... - bool canShowCOpenLower = showLower && showOpen; - ENUM_DRAW_TYPE donOpenLowerDrawType = canShowCOpenLower ? DRAW_LINE : DRAW_NONE; - ArraySetAsSeries(donOpenLowerBuffer, true); - SetIndexBuffer(donOpenLowerBufferIndex, donOpenLowerBuffer, INDICATOR_DATA); - PlotIndexSetDouble(donOpenLowerPlotBufferIndex, PLOT_EMPTY_VALUE, EMPTY_VALUE); - PlotIndexSetInteger(donOpenLowerPlotBufferIndex, PLOT_SHOW_DATA, canShowCOpenLower); - PlotIndexSetInteger(donOpenLowerPlotBufferIndex, PLOT_DRAW_TYPE, donOpenLowerDrawType); - - // - // Close ... - - // - // UPPER ... - bool canShowCCloseUpper = showUpper && showClose; - ENUM_DRAW_TYPE donCloseUpperDrawType = canShowCCloseUpper ? DRAW_LINE : DRAW_NONE; - ArraySetAsSeries(donCloseUpperBuffer, true); - SetIndexBuffer(donCloseUpperBufferIndex, donCloseUpperBuffer, INDICATOR_DATA); - PlotIndexSetDouble(donCloseUpperPlotBufferIndex, PLOT_EMPTY_VALUE, EMPTY_VALUE); - PlotIndexSetInteger(donCloseUpperPlotBufferIndex, PLOT_SHOW_DATA, canShowCCloseUpper); - PlotIndexSetInteger(donCloseUpperPlotBufferIndex, PLOT_DRAW_TYPE, donCloseUpperDrawType); - - // - // LOWER ... - bool canShowCCloseLower = showLower && showClose; - ENUM_DRAW_TYPE donCloseLowerDrawType = canShowCCloseLower ? DRAW_LINE : DRAW_NONE; - ArraySetAsSeries(donCloseLowerBuffer, true); - SetIndexBuffer(donCloseLowerBufferIndex, donCloseLowerBuffer, INDICATOR_DATA); - PlotIndexSetDouble(donCloseLowerPlotBufferIndex, PLOT_EMPTY_VALUE, EMPTY_VALUE); - PlotIndexSetInteger(donCloseLowerPlotBufferIndex, PLOT_SHOW_DATA, canShowCCloseLower); - PlotIndexSetInteger(donCloseLowerPlotBufferIndex, PLOT_DRAW_TYPE, donCloseLowerDrawType); - - // - // High ... - - // - // UPPER ... - bool canShowCHighUpper = showUpper && showHigh; - ENUM_DRAW_TYPE donHighUpperDrawType = canShowCHighUpper ? DRAW_LINE : DRAW_NONE; - ArraySetAsSeries(donHighUpperBuffer, true); - SetIndexBuffer(donHighUpperBufferIndex, donHighUpperBuffer, INDICATOR_DATA); - PlotIndexSetDouble(donHighUpperPlotBufferIndex, PLOT_EMPTY_VALUE, EMPTY_VALUE); - PlotIndexSetInteger(donHighUpperPlotBufferIndex, PLOT_SHOW_DATA, canShowCHighUpper); - PlotIndexSetInteger(donHighUpperPlotBufferIndex, PLOT_DRAW_TYPE, donHighUpperDrawType); - - // - // LOWER ... - bool canShowCHighLower = showLower && showHigh; - ENUM_DRAW_TYPE donHighLowerDrawType = canShowCHighLower ? DRAW_LINE : DRAW_NONE; - ArraySetAsSeries(donHighLowerBuffer, true); - SetIndexBuffer(donHighLowerBufferIndex, donHighLowerBuffer, INDICATOR_DATA); - PlotIndexSetDouble(donHighLowerPlotBufferIndex, PLOT_EMPTY_VALUE, EMPTY_VALUE); - PlotIndexSetInteger(donHighLowerPlotBufferIndex, PLOT_SHOW_DATA, canShowCHighLower); - PlotIndexSetInteger(donHighLowerPlotBufferIndex, PLOT_DRAW_TYPE, donHighLowerDrawType); - - // - // Low ... - - // - // UPPER ... - bool canShowCLowUpper = showUpper && showLow; - ENUM_DRAW_TYPE donLowUpperDrawType = canShowCLowUpper ? DRAW_LINE : DRAW_NONE; - ArraySetAsSeries(donLowUpperBuffer, true); - SetIndexBuffer(donLowUpperBufferIndex, donLowUpperBuffer, INDICATOR_DATA); - PlotIndexSetDouble(donLowUpperPlotBufferIndex, PLOT_EMPTY_VALUE, EMPTY_VALUE); - PlotIndexSetInteger(donLowUpperPlotBufferIndex, PLOT_SHOW_DATA, canShowCLowUpper); - PlotIndexSetInteger(donLowUpperPlotBufferIndex, PLOT_DRAW_TYPE, donLowUpperDrawType); - - // - // LOWER ... - bool canShowCLowLower = showLower && showLow; - ENUM_DRAW_TYPE donLowLowerDrawType = canShowCLowLower ? DRAW_LINE : DRAW_NONE; - ArraySetAsSeries(donLowLowerBuffer, true); - SetIndexBuffer(donLowLowerBufferIndex, donLowLowerBuffer, INDICATOR_DATA); - PlotIndexSetDouble(donLowLowerPlotBufferIndex, PLOT_EMPTY_VALUE, EMPTY_VALUE); - PlotIndexSetInteger(donLowLowerPlotBufferIndex, PLOT_SHOW_DATA, canShowCLowLower); - PlotIndexSetInteger(donLowLowerPlotBufferIndex, PLOT_DRAW_TYPE, donLowLowerDrawType); - - // - // Data Buffers ... -} - -/** - * Set Indicator Short Name and also we can define Buffers Labels ... - */ -void SetIndicatorName() -{ - IndicatorSetString(INDICATOR_SHORTNAME, ShortName); -} - -/** - * Calculate Custom Buffers ... - * - * @param bar_index: Integer, Represent Current Bar ... - * @param prevCalculated: Integer, Represent Previous Calculated Bars ... - * @param ratesTotal: Integer, Represents All Available Bars ... - * @param open: Double Array, History of Open Prices ... - * @param high: Double Array, History of High Prices ... - * @param close: Double Array, History of Close Prices ... - * @param low: Double Array, History of Low Prices ... - * @param tickVolume: Long, History of Tick Volumes on Bar ... - */ -void CalculateBuffers( - int bar_index, // Selected Bar Index - const int prevCalculated, - const int ratesTotal, - const double &open[], - const double &high[], - const double &close[], - const double &low[], - const long &tickVolume[] // -) -{ - // - int barsLimit = startCalculationForLastBars > 0 - ? startCalculationForLastBars - : 0; - // - // bool canCalculate = true; - bool canCalculate = - barsLimit == 0 || - bar_index <= barsLimit; - if (canCalculate) - { - // - CalculateDonchains( - bar_index, - prevCalculated, - ratesTotal, - open, - high, - close, - low, - tickVolume // - ); - } - else - { - FillBuffersZero(bar_index); - } -} - -// -// Custom ... - -/** - * Fill All Bufers to Zero Vlue for Specified Bar Index ... - * - * @param barIndex: Integer ... - */ -void FillBuffersZero(int barIndex) -{ - // - donOpenUpperBuffer[barIndex] = EMPTY_VALUE; - donOpenLowerBuffer[barIndex] = EMPTY_VALUE; - donCloseUpperBuffer[barIndex] = EMPTY_VALUE; - donCloseLowerBuffer[barIndex] = EMPTY_VALUE; - donHighUpperBuffer[barIndex] = EMPTY_VALUE; - donHighLowerBuffer[barIndex] = EMPTY_VALUE; - donLowUpperBuffer[barIndex] = EMPTY_VALUE; - donLowLowerBuffer[barIndex] = EMPTY_VALUE; -} - -/** - * Calculate Donchain ... - * - * @param bar_index: Integer, Bar Index ... - * @param prevCalculated: Integer, Represent Previous Calculated Bars ... - * @param ratesTotal: Integer, Represents All Available Bars ... - * @param open: Double Array, History of Open Prices ... - * @param high: Double Array, History of High Prices ... - * @param close: Double Array, History of Close Prices ... - * @param low: Double Array, History of Low Prices ... - * @param tickVolume: Long, History of Tick Volumes on Bar ... - * @param _length: Integer, Donchain Length ... - * @param _ouBuffer: Double Array Reference ... - * @param _olBuffer: Double Array Reference ... - * @param _huBuffer: Double Array Reference ... - * @param _hlBuffer: Double Array Reference ... - * @param _luBuffer: Double Array Reference ... - * @param _llBuffer: Double Array Reference ... - * @param _cuBuffer: Double Array Reference ... - * @param _clBuffer: Double Array Reference ... - */ -void CalculateDonchain( - int bar_index, // Selected Bar Index - const int prevCalculated, - const int ratesTotal, - // - const double &open[], - const double &high[], - const double &close[], - const double &low[], - const long &tickVolume[], - // - int _length, - // - double &_ouBuffer[], - double &_olBuffer[], - double &_huBuffer[], - double &_hlBuffer[], - double &_luBuffer[], - double &_llBuffer[], - double &_cuBuffer[], - double &_clBuffer[] // -) -{ - // - double iUpper = 0; - double iLower = 0; - - // - // OPEN ... - - // - int from = bar_index; - - // - iUpper = open[ArrayMaximum(open, from, _length)]; - iLower = open[ArrayMinimum(open, from, _length)]; - - // - _ouBuffer[bar_index] = iUpper; - _olBuffer[bar_index] = iLower; - - // - // HIGH ... - - // - iUpper = high[ArrayMaximum(high, from, _length)]; - iLower = high[ArrayMinimum(high, from, _length)]; - - // - _huBuffer[bar_index] = iUpper; - _hlBuffer[bar_index] = iLower; - - // - // LOW ... - - // - iUpper = low[ArrayMaximum(low, from, _length)]; - iLower = low[ArrayMinimum(low, from, _length)]; - - // - _luBuffer[bar_index] = iUpper; - _llBuffer[bar_index] = iLower; - - // - // CLOSE ... - - // - iUpper = close[ArrayMaximum(close, from, _length)]; - iLower = close[ArrayMinimum(close, from, _length)]; - - // - _cuBuffer[bar_index] = iUpper; - _clBuffer[bar_index] = iLower; -} - -/** - * Calculate Different VWaps ... - * - * @param bar_index: Integer, Represent Current Bar ... - * @param prevCalculated: Integer, Represent Previous Calculated Bars ... - * @param ratesTotal: Integer, Represents All Available Bars ... - * @param open: Double Array, History of Open Prices ... - * @param high: Double Array, History of High Prices ... - * @param close: Double Array, History of Close Prices ... - * @param low: Double Array, History of Low Prices ... - * @param tickVolume: Long, History of Tick Volumes on Bar ... - */ -void CalculateDonchains( - int bar_index, // Selected Bar Index - const int prevCalculated, - const int ratesTotal, - const double &open[], - const double &high[], - const double &close[], - const double &low[], - const long &tickVolume[] // -) -{ - // - CalculateDonchain( - // - bar_index, - prevCalculated, - ratesTotal, - // - open, - high, - close, - low, - tickVolume, - // - donchainLength, - // - donOpenUpperBuffer, - donOpenLowerBuffer, - donHighUpperBuffer, - donHighLowerBuffer, - donLowUpperBuffer, - donLowLowerBuffer, - donCloseUpperBuffer, - donCloseLowerBuffer // - ); -} - -// \ No newline at end of file diff --git a/Indicators/x-saherelm.x121.xhk.mq5 b/Indicators/x-saherelm.x121.xhk.mq5 deleted file mode 100644 index c6a7cfe5..00000000 --- a/Indicators/x-saherelm.x121.xhk.mq5 +++ /dev/null @@ -1,616 +0,0 @@ -/////////////////////////////////////////////////////// -// -// SaherElm IT Center MQL5 Indicator -// ------------------------------------------------- -// Name: X121 XHK -// Description: XHK ... -// -// -// 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 XHK Indicator" -#property strict - -// -// Definitions ... - -// -#define ShortName "X121 XHK" - -// -// Includes Common Library ... -#include "../Libraries/x-saherelm.common.lib.mq5" - -// -// Inputs ... - -// -// Market ... -input group "Market"; -input int xhkSmoothingLength = 14; // Length -input ENUM_X_MA_METHOD xhkSmoothingMode = X_MA_MODE_EMA; // Smoothing Method -input bool xhkIgnoreSmoothingShadows = false; // Ignore Smoothed Bar Shadows - -// -input group "Presentation"; - -// -input int startCalculationForLastBars = 1000; // Calculate Last n Bars - -// -input bool drawRawXHKCandles = true; // Draw Raw Candle -input bool drawSmoothedXHKCandles = true; // Draw Smoothed Candle - -// -// Buffers ... - -// -#property indicator_chart_window - -// -#property indicator_buffers 10 -#property indicator_plots 2 - -// -#define hideColorIDX 0 -#define bullishColorIDX 1 -#define bearishColorIDX 2 -#define neuturalColorIDX 3 - -// -// PLOTTED Buffers ... - -// -#define openHKBufferIndex 0 -double openHKBuffer[]; - -// -#define highHKBufferIndex 1 -double highHKBuffer[]; - -// -#define lowHKBufferIndex 2 -double lowHKBuffer[]; - -// -#define closeHKBufferIndex 3 -double closeHKBuffer[]; - -// -#define rawHKColorBufferIndex 4 -double rawHKColorBuffer[]; - -// -#define rawHKBufferIndex 0 -#property indicator_label1 "X121 XHK Open;X121 XHK High;X121 XHK Low;X121 XHK Close" -#property indicator_type1 DRAW_COLOR_CANDLES -#property indicator_color1 CLR_NONE, clrDodgerBlue, clrDarkGoldenrod - -// -// Open ... -#define openBufferIndex 5 -double openBuffer[]; - -// -// High ... -#define highBufferIndex 6 -double highBuffer[]; - -// -// Low ... -#define lowBufferIndex 7 -double lowBuffer[]; - -// -// Close ... -#define closeBufferIndex 8 -double closeBuffer[]; - -// -// Candle Color ... -#define candleColorBufferIndex 9 -double candleColorBuffer[]; - -// -#define candlesBufferIndex 1 -#property indicator_label2 "X121 XHKSM Open;X121 XHKSM High;X121 XHKSM Low;X121 XHKSM Close" -#property indicator_type2 DRAW_COLOR_CANDLES -#property indicator_color2 CLR_NONE, clrAqua, clrMagenta - -// -// Variables, Properties and etc ... - -// -// this counts Available Bars ... -int limit; - -// -int maxLength; - -// - -// -// Event Handlers ... - -/** - * Initialize Indicator ... - * - * @return ( int ) - */ -int OnInit() -{ - // - // Validate Inputs ... - if (!ValidateInputs()) - { - return INIT_PARAMETERS_INCORRECT; - } - - // - // Initialize Indicator Handlers ... - - // - // 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; -} - -/** - * De Initialize Indicator ... - * - * @param reason: Integer, De Initialization Reason ... - */ -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 - - // -} - -/** - * Calculate Bars ... - * - * @param rates_total: Integer, Total Bars on Chart ... - * @param prev_calculated: Integer, Total Calculated Bars on Charts ... - * @param time: DateTime Array, History of Open Time ... - * @param open: Double Array, History of Open Prices ... - * @param high: Double Array, History of High Prices ... - * @param low: Double Array, History of Low Prices ... - * @param close: Double Array, History of Close Prices ... - * @param tick_volume: Long, History of Tick Volumes on Bar ... - * @param volume: Long, History of Trade Volumes ... - * @param spread: Double, History of Spread Price ... - * - * @return ( int ) - */ -int OnCalculate( - const int rates_total, - const int prev_calculated, - const datetime &time[], - const double &open[], - const double &high[], - const double &low[], - const double &close[], - const long &tick_volume[], - const long &volume[], - const int &spread[] // -) -{ - // - // 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); - - // - // Fill All Buffers by Zero ... - if (prev_calculated == 0) - { - } - - // - limit = (prev_calculated > rates_total || prev_calculated <= 0) - ? rates_total - : (rates_total - prev_calculated) + 1; - - // - // Main Loop ... - for (int i = limit - 1; i >= 0 && !IsStopped(); i--) - { - // - CalculateBuffers( - i, - prev_calculated, - rates_total, - // - open, - high, - close, - low, - tick_volume // - ); - } - - // - return rates_total; -} - -// -// Functions ... - -/** - * Validate Input Args for Initialization ... - * - * @return ( bool ) - */ -bool ValidateInputs() -{ - // - bool result = - // - true - // - ; - - // - return result; -} - -/** - * Extract Max Length of Inputs ... - * - * @return ( int ) - */ -int ExtractMaxLengthOfInputs() -{ - // - int result = 0; - - // - result = MathMax(0, xhkSmoothingLength); - - // - return result; -} - -/** - * Define Required Buffers ... - */ -void DefineBuffers() -{ - - // - // RAW ... - - // - // Raw Candles Color ... - ArraySetAsSeries(rawHKColorBuffer, true); - SetIndexBuffer(rawHKColorBufferIndex, rawHKColorBuffer, INDICATOR_COLOR_INDEX); - - // - // Set EMPTY_VALUE on Candles Buffer ... - PlotIndexSetDouble(rawHKBufferIndex, PLOT_EMPTY_VALUE, 0.0); - PlotIndexSetInteger(rawHKBufferIndex, PLOT_SHOW_DATA, false); - - // - // Open ... - ArraySetAsSeries(openHKBuffer, true); - SetIndexBuffer(openHKBufferIndex, openHKBuffer, INDICATOR_DATA); - - // - // High ... - ArraySetAsSeries(highHKBuffer, true); - SetIndexBuffer(highHKBufferIndex, highHKBuffer, INDICATOR_DATA); - - // - // Close ... - ArraySetAsSeries(closeHKBuffer, true); - SetIndexBuffer(closeHKBufferIndex, closeHKBuffer, INDICATOR_DATA); - - // - // Low ... - ArraySetAsSeries(lowHKBuffer, true); - SetIndexBuffer(lowHKBufferIndex, lowHKBuffer, INDICATOR_DATA); - - // - // SMOOTHED ... - - // - // Candles Color ... - ArraySetAsSeries(candleColorBuffer, true); - SetIndexBuffer(candleColorBufferIndex, candleColorBuffer, INDICATOR_COLOR_INDEX); - - // - // Set EMPTY_VALUE on Candles Buffer ... - PlotIndexSetDouble(candlesBufferIndex, PLOT_EMPTY_VALUE, 0.0); - PlotIndexSetInteger(candlesBufferIndex, PLOT_SHOW_DATA, false); - - // - // Open ... - ArraySetAsSeries(openBuffer, true); - SetIndexBuffer(openBufferIndex, openBuffer, INDICATOR_DATA); - - // - // High ... - ArraySetAsSeries(highBuffer, true); - SetIndexBuffer(highBufferIndex, highBuffer, INDICATOR_DATA); - - // - // Close ... - ArraySetAsSeries(closeBuffer, true); - SetIndexBuffer(closeBufferIndex, closeBuffer, INDICATOR_DATA); - - // - // Low ... - ArraySetAsSeries(lowBuffer, true); - SetIndexBuffer(lowBufferIndex, lowBuffer, INDICATOR_DATA); -} - -/** - * Set Indicator Short Name and also we can define Buffers Labels ... - */ -void SetIndicatorName() -{ - IndicatorSetString(INDICATOR_SHORTNAME, ShortName); -} - -/** - * Calculate Custom Buffers ... - * - * @param bar_index: Integer, Represent Current Bar ... - * @param prevCalculated: Integer, Represent Previous Calculated Bars ... - * @param ratesTotal: Integer, Represents All Available Bars ... - * @param open: Double Array, History of Open Prices ... - * @param high: Double Array, History of High Prices ... - * @param close: Double Array, History of Close Prices ... - * @param low: Double Array, History of Low Prices ... - * @param tickVolume: Long, History of Tick Volumes on Bar ... - */ -void CalculateBuffers( - int bar_index, // Selected Bar Index - const int prevCalculated, - const int ratesTotal, - const double &open[], - const double &high[], - const double &close[], - const double &low[], - const long &tickVolume[] // -) -{ - // - int barsLimit = startCalculationForLastBars > 0 - ? startCalculationForLastBars - : 0; - // - bool canCalculate = - barsLimit == 0 || - bar_index <= barsLimit; - if (canCalculate) - { - // - CalculateXHK( - bar_index, - prevCalculated, - ratesTotal, - open, - high, - close, - low // - ); - } - else - { - FillBuffersZero(bar_index); - } -} - -// -// Custom ... - -/** - * Fill All Bufers to Zero Vlue for Specified Bar Index ... - * - * @param barIndex: Integer ... - */ -void FillBuffersZero(int barIndex) -{ - // - lowHKBuffer[barIndex] = 0.0; - openHKBuffer[barIndex] = 0.0; - highHKBuffer[barIndex] = 0.0; - closeHKBuffer[barIndex] = 0.0; - rawHKColorBuffer[barIndex] = hideColorIDX; - - // - lowBuffer[barIndex] = 0.0; - openBuffer[barIndex] = 0.0; - highBuffer[barIndex] = 0.0; - closeBuffer[barIndex] = 0.0; - candleColorBuffer[barIndex] = hideColorIDX; -} - -/** - * Calculate ATR Zones ... - * - * @param bar_index: Integer, Represent Current Bar ... - * @param prevCalculated: Integer, Represent Previous Calculated Bars ... - * @param ratesTotal: Integer, Represents All Available Bars ... - * @param open: Double Array, History of Open Prices ... - * @param high: Double Array, History of High Prices ... - * @param close: Double Array, History of Close Prices ... - * @param low: Double Array, History of Low Prices ... - */ -void CalculateXHK( - 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 = openHKBuffer[bar_index + 1]; - mPrevHKCloseValue = closeHKBuffer[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)); - - // - double candleColorValue = - mHKOpenValue < mHKCloseValue ? bullishColorIDX : bearishColorIDX; - - // - // Raw HK Buffers ... - openHKBuffer[bar_index] = mHKOpenValue; - highHKBuffer[bar_index] = mHKHighValue; - lowHKBuffer[bar_index] = mHKLowValue; - closeHKBuffer[bar_index] = mHKCloseValue; - rawHKColorBuffer[bar_index] = drawRawXHKCandles ? candleColorValue : hideColorIDX; - - // - // Apply Smoothing ... - bool canSmooth = xhkSmoothingLength > 0 && - xhkSmoothingMode != X_MA_MODE_NONE; - if (!canSmooth) - { - // - double min = MathMin(mHKOpenValue, mHKCloseValue); - double max = MathMax(mHKOpenValue, mHKCloseValue); - - // - openBuffer[bar_index] = mHKOpenValue; - highBuffer[bar_index] = xhkIgnoreSmoothingShadows ? max : mHKHighValue; - lowBuffer[bar_index] = xhkIgnoreSmoothingShadows ? min : mHKLowValue; - closeBuffer[bar_index] = mHKCloseValue; - candleColorBuffer[bar_index] = drawSmoothedXHKCandles ? candleColorValue : hideColorIDX; - } - else - { - // - // Open ... - iMAOnBuffer( - ratesTotal, - prevCalculated, - bar_index, - xhkSmoothingLength, - openHKBuffer, - openBuffer, - xhkSmoothingMode // - ); - - // - // Close ... - iMAOnBuffer( - ratesTotal, - prevCalculated, - bar_index, - xhkSmoothingLength, - closeHKBuffer, - closeBuffer, - xhkSmoothingMode // - ); - - // - // Ignoring Shadows ... - if (!xhkIgnoreSmoothingShadows) - { - // - // High ... - iMAOnBuffer( - ratesTotal, - prevCalculated, - bar_index, - xhkSmoothingLength, - highHKBuffer, - highBuffer, - xhkSmoothingMode // - ); - - // - // Low ... - iMAOnBuffer( - ratesTotal, - prevCalculated, - bar_index, - xhkSmoothingLength, - lowHKBuffer, - lowBuffer, - xhkSmoothingMode // - ); - } - else - { - // - double min = MathMin(closeBuffer[bar_index], openBuffer[bar_index]); - double max = MathMin(closeBuffer[bar_index], openBuffer[bar_index]); - - // - lowBuffer[bar_index] = min; - highBuffer[bar_index] = max; - } - - // - // Calculate Smoothed Color ... - candleColorValue = - openBuffer[bar_index] < closeBuffer[bar_index] ? bullishColorIDX : bearishColorIDX; - candleColorBuffer[bar_index] = drawSmoothedXHKCandles ? candleColorValue : hideColorIDX; - } -} - -// \ No newline at end of file diff --git a/Indicators/x-saherelm.x121.xich.mq5 b/Indicators/x-saherelm.x121.xich.mq5 deleted file mode 100644 index 89b3fb8a..00000000 --- a/Indicators/x-saherelm.x121.xich.mq5 +++ /dev/null @@ -1,625 +0,0 @@ -/////////////////////////////////////////////////////// -// -// SaherElm IT Center MQL5 Indicator -// ------------------------------------------------- -// Name: X121 XWZ -// Description: XWZ ... -// -// -// 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 XWZ Indicator" -#property strict - -// -// Definitions ... - -// -#define ShortName "X121_XICH" - -// -// Imports ... -#include "../Libraries/x-saherelm.common.lib.mq5" - -// -// Inputs ... - -// -// Market ... -input group "Market"; -input ENUM_X_PRICE chikouSpanMode = X_PRICE_CLOSE; // ChikouSpan Mode -input int tenkanSenLength = 9; // TenkanSen Length -input ENUM_X_BOUNDARY_PRICE tenkanSenMode = X_BOUNDARY_PRICE_HIGH_LOW; // TencanSen Mode -input int kijunSenLength = 26; // KijunSen Length -input ENUM_X_BOUNDARY_PRICE kijunSenMode = X_BOUNDARY_PRICE_HIGH_LOW; // KijunSen Mode -input int senkouSpanBLength = 52; // SenkouSpan B Length -input ENUM_X_BOUNDARY_PRICE senkouSpanBMode = X_BOUNDARY_PRICE_HIGH_LOW; // SenkouSpan B Mode - -// -// Presentation ... -input group "Presentation"; - -// -input int startCalculationForLastBars = 1000; // Calculate Last n Bars -input bool shiftKumo = true; // Shift Kumo -input bool showTenkanSen = true; // Show TenkanSen -input bool showKijunSen = true; // Show KijunSen -input bool showChikouSpan = true; // Show ChikouSpan -input bool showSenkouSpanA = true; // Show Senkou Span A -input bool showSenkouSpanB = true; // Show Senkou Span B -input bool showKumo = true; // Show Kumo - -// -// Buffers ... - -// -#define hideColorIDX 0 -#define bullishColorIDX 1 -#define bearishColorIDX 2 -#define neuturalColorIDX 3 - -// -#property indicator_chart_window - -// -#property indicator_buffers 8 -#property indicator_plots 6 - -// -// Plot Buffers ... - -// -#define tenkanSenBufferIndex 0 -double tenkanSenBuffer[]; - -// -#property indicator_label1 "XICH TK" -#property indicator_type1 DRAW_LINE -#property indicator_color1 clrBrown -#property indicator_style1 STYLE_SOLID -#property indicator_width1 2 - -// -#define kijunSenBufferIndex 1 -double kijunSenBuffer[]; - -// -#property indicator_label2 "XICH KJ" -#property indicator_type2 DRAW_LINE -#property indicator_color2 clrDodgerBlue -#property indicator_style2 STYLE_SOLID -#property indicator_width2 2 - -// -#define chikouSpanBufferIndex 2 -double chikouSpanBuffer[]; - -// -#property indicator_label3 "XICH CS" -#property indicator_type3 DRAW_LINE -#property indicator_color3 clrDarkGreen -#property indicator_style3 STYLE_SOLID -#property indicator_width3 2 - -// -#define senkouSpanABufferIndex 3 -double senkouSpanABuffer[]; - -// -#property indicator_label4 "XICH SSA" -#property indicator_type4 DRAW_LINE -#property indicator_color4 clrLightGray -#property indicator_style4 STYLE_DASHDOTDOT -#property indicator_width4 2 - -// -#define senkouSpanBBufferIndex 4 -double senkouSpanBBuffer[]; - -// -#property indicator_label5 "XICH SSB" -#property indicator_type5 DRAW_LINE -#property indicator_color5 clrLightGray -#property indicator_style5 STYLE_DASHDOTDOT -#property indicator_width5 2 - -// -#define senkouABufferIndex 5 -double senkouABuffer[]; - -// -#define senkouBBufferIndex 6 -double senkouBBuffer[]; - -// -#define kumoBufferIndex 5 - -// -#property indicator_label6 "XICH Kumo" -#property indicator_type6 DRAW_FILLING -#property indicator_color6 clrAqua, clrMagenta -#property indicator_style6 STYLE_SOLID -#property indicator_width6 2 - -// -// Data Buffers ... - -// -int mLastBufferIndex = 6; - -// -// Variables, Properties and etc ... - -// -// this counts Available Bars ... -int limit; - -// -int maxLength; - -// -// Event Handlers ... - -/** - * Initialize Indicator ... - * - * @return ( int ) - */ -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(); - IndicatorSetInteger(INDICATOR_DIGITS, 2); - - // - // Init Succeed ... - return INIT_SUCCEEDED; -} - -/** - * De Initialize Indicator ... - * - * @param reason: Integer, De Initialization Reason ... - */ -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 -} - -/** - * Calculate Bars ... - * - * @param rates_total: Integer, Total Bars on Chart ... - * @param prev_calculated: Integer, Total Calculated Bars on Charts ... - * @param time: DateTime Array, History of Open Time ... - * @param open: Double Array, History of Open Prices ... - * @param high: Double Array, History of High Prices ... - * @param low: Double Array, History of Low Prices ... - * @param close: Double Array, History of Close Prices ... - * @param tick_volume: Long, History of Tick Volumes on Bar ... - * @param volume: Long, History of Trade Volumes ... - * @param spread: Double, History of Spread Price ... - * - * @return ( int ) - */ -int OnCalculate( - const int rates_total, - const int prev_calculated, - const datetime &time[], - const double &open[], - const double &high[], - const double &low[], - const double &close[], - const long &tick_volume[], - const long &volume[], - const int &spread[] // -) -{ - // - // 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); - - // - limit = (prev_calculated > rates_total || prev_calculated <= 0) - ? rates_total - : (rates_total - prev_calculated) + 1; - - // - // Main Loop ... - for (int i = limit - 1; i >= 0 && !IsStopped(); i--) - { - // - CalculateBuffers( - // - i, - prev_calculated, - rates_total, - // - open, - high, - close, - low, - tick_volume // - ); - } - - // - return rates_total; -} - -// -// Functions ... - -/** - * Validate Input Args for Initialization ... - * - * @return ( bool ) - */ -bool ValidateInputs() -{ - // - bool result = false; - - // - result = - // - kijunSenLength > 0 && - tenkanSenLength > 0 && - senkouSpanBLength > 0 && - IsValid(kijunSenMode) && - IsValid(tenkanSenMode) && - IsValid(chikouSpanMode) && - IsValid(senkouSpanBMode) - // - ; - - // - return result; -} - -/** - * Extract Max Length of Inputs ... - * - * @return ( int ) - */ -int ExtractMaxLengthOfInputs() -{ - // - int result = 0; - - // - result = MathMax(kijunSenLength, tenkanSenLength); - result = MathMax(result, senkouSpanBLength); - - // - return result; -} - -/** - * Set Indicator Short Name and also we can define Buffers Labels ... - */ -void SetIndicatorName() -{ - IndicatorSetString(INDICATOR_SHORTNAME, ShortName); -} - -/** - * Define Required Buffers ... - */ -void DefineBuffers() -{ - // - 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); - - // - 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); - - // - 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); - - // - int shiftSize = shiftKumo ? kijunSenLength : 0; - - // - ENUM_DRAW_TYPE senkouSpanADrawType = showSenkouSpanA ? DRAW_LINE : DRAW_NONE; - - // - ArraySetAsSeries(senkouSpanABuffer, true); - SetIndexBuffer(senkouSpanABufferIndex, senkouSpanABuffer, INDICATOR_DATA); - PlotIndexSetInteger(senkouSpanABufferIndex, PLOT_SHIFT, shiftSize); - PlotIndexSetInteger(senkouSpanABufferIndex, PLOT_SHOW_DATA, showSenkouSpanA); - PlotIndexSetInteger(senkouSpanABufferIndex, PLOT_DRAW_TYPE, senkouSpanADrawType); - - // - ENUM_DRAW_TYPE senkouSpanBDrawType = showSenkouSpanB ? DRAW_LINE : DRAW_NONE; - - // - ArraySetAsSeries(senkouSpanBBuffer, true); - SetIndexBuffer(senkouSpanBBufferIndex, senkouSpanBBuffer, INDICATOR_DATA); - PlotIndexSetInteger(senkouSpanBBufferIndex, PLOT_SHIFT, shiftSize); - PlotIndexSetInteger(senkouSpanBBufferIndex, PLOT_SHOW_DATA, showSenkouSpanB); - PlotIndexSetInteger(senkouSpanBBufferIndex, PLOT_DRAW_TYPE, senkouSpanBDrawType); - - // - ArraySetAsSeries(senkouABuffer, true); - SetIndexBuffer(senkouABufferIndex, senkouABuffer, INDICATOR_DATA); - PlotIndexSetInteger(senkouABufferIndex, PLOT_DRAW_BEGIN, maxLength); - - // - ArraySetAsSeries(senkouBBuffer, true); - SetIndexBuffer(senkouBBufferIndex, senkouBBuffer, INDICATOR_DATA); - PlotIndexSetInteger(senkouBBufferIndex, PLOT_DRAW_BEGIN, maxLength); - - // - 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); -} - -/** - * Calculate Custom Buffers ... - * - * @param bar_index: Integer, Represent Current Bar ... - * @param prevCalculated: Integer, Represent Previous Calculated Bars ... - * @param ratesTotal: Integer, Represents All Available Bars ... - * @param open: Double Array, History of Open Prices ... - * @param high: Double Array, History of High Prices ... - * @param close: Double Array, History of Close Prices ... - * @param low: Double Array, History of Low Prices ... - * @param tickVolume: Long, History of Tick Volumes on Bar ... - */ -void CalculateBuffers( - int bar_index, // Selected Bar Index - const int prevCalculated, - const int ratesTotal, - const double &open[], - const double &high[], - const double &close[], - const double &low[], - const long &tickVolume[] // -) -{ - // - int barsLimit = startCalculationForLastBars > 0 - ? startCalculationForLastBars - : 0; - // - // bool canCalculate = true; - bool canCalculate = - barsLimit == 0 || - bar_index <= barsLimit; - if (canCalculate) - { - // - CalculateValues( - bar_index, - prevCalculated, - ratesTotal, - open, - high, - close, - low, - tickVolume // - ); - } - else - { - FillBuffersZero(bar_index); - } -} - -/** - * Fill All Bufers to Zero Vlue for Specified Bar Index ... - * - * @param barIndex: Integer ... - */ -void FillBuffersZero(int barIndex) -{ - // - senkouABuffer[barIndex] = 0; - senkouBBuffer[barIndex] = 0; - kijunSenBuffer[barIndex] = 0; - tenkanSenBuffer[barIndex] = 0; - chikouSpanBuffer[barIndex] = 0; - senkouSpanABuffer[barIndex] = 0; - senkouSpanBBuffer[barIndex] = 0; -} - -/** - * Calculate Vales ... - * - * @param bar_index: Integer, Represent Current Bar ... - * @param prevCalculated: Integer, Represent Previous Calculated Bars ... - * @param ratesTotal: Integer, Represents All Available Bars ... - * @param open: Double Array, History of Open Prices ... - * @param high: Double Array, History of High Prices ... - * @param close: Double Array, History of Close Prices ... - * @param low: Double Array, History of Low Prices ... - * @param tickVolume: Long, History of Tick Volumes on Bar ... - */ -void CalculateValues( - int bar_index, // Selected Bar Index - const int prevCalculated, - const int ratesTotal, - const double &open[], - const double &high[], - const double &close[], - const double &low[], - const long &tickVolume[] // -) -{ - // - double uppers[]; - double lowers[]; - - // - double uppersMax = 0; - double uppersMin = 0; - - // - double lowersMax = 0; - double lowersMin = 0; - - // - // Calculate ChikouSpan ... - double iChikouSpan = GetAppliedPrice( - _Symbol, - _Period, - bar_index, - chikouSpanMode // - ); - - // - // Calculate TenkanSen ... - GetPriceBoundary( - uppers, - lowers, - _Symbol, - _Period, - tenkanSenMode, - tenkanSenLength, - bar_index // - ); - - // - uppersMax = uppers[ArrayMaximum(uppers)]; - uppersMin = uppers[ArrayMinimum(uppers)]; - - // - lowersMax = lowers[ArrayMaximum(lowers)]; - lowersMin = lowers[ArrayMinimum(lowers)]; - - // - double iTenkanSen = (uppersMax + lowersMin) / 2; - - // - // Calculate KijunSen ... - GetPriceBoundary( - uppers, - lowers, - _Symbol, - _Period, - kijunSenMode, - kijunSenLength, - bar_index // - ); - - // - uppersMax = uppers[ArrayMaximum(uppers)]; - uppersMin = uppers[ArrayMinimum(uppers)]; - - // - lowersMax = lowers[ArrayMaximum(lowers)]; - lowersMin = lowers[ArrayMinimum(lowers)]; - - // - double iKijunSen = (uppersMax + lowersMin) / 2; - - // - // Calculate SenkouSpanB ... - GetPriceBoundary( - uppers, - lowers, - _Symbol, - _Period, - senkouSpanBMode, - senkouSpanBLength, - bar_index // - ); - - // - uppersMax = uppers[ArrayMaximum(uppers)]; - uppersMin = uppers[ArrayMinimum(uppers)]; - - // - lowersMax = lowers[ArrayMaximum(lowers)]; - lowersMin = lowers[ArrayMinimum(lowers)]; - - // - double iSenkouSpanB = (uppersMax + lowersMin) / 2; - - // - // Calculate SenkouSpanA ... - double iSenkouSpanA = (iTenkanSen + iKijunSen) / 2; - - // - // Setting Buffers ... - kijunSenBuffer[bar_index] = iKijunSen; - senkouABuffer[bar_index] = iSenkouSpanA; - senkouBBuffer[bar_index] = iSenkouSpanB; - tenkanSenBuffer[bar_index] = iTenkanSen; - chikouSpanBuffer[bar_index] = iChikouSpan; - senkouSpanABuffer[bar_index] = iSenkouSpanA; - senkouSpanBBuffer[bar_index] = iSenkouSpanB; -} - -// diff --git a/Indicators/x-saherelm.x121.xmas.mq5 b/Indicators/x-saherelm.x121.xmas.mq5 deleted file mode 100644 index e35f97c2..00000000 --- a/Indicators/x-saherelm.x121.xmas.mq5 +++ /dev/null @@ -1,574 +0,0 @@ -/////////////////////////////////////////////////////// -// -// SaherElm IT Center MQL5 Indicator -// ------------------------------------------------- -// Name: X121 XMAS -// Description: XMAS ... -// -// -// 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 XMAS Indicator" -#property strict - -// -// Definitions ... - -// -#define ShortName "X121_XMAS" - -// -// Imports ... -#include "../Libraries/x-saherelm.common.lib.mq5" - -// -// Inputs ... - -// -// Market ... -input group "Market"; -input int length = 14; // MA Length -input ENUM_MA_METHOD method = MODE_EMA; // MA Method -input ENUM_APPLIED_PRICE upperAppliedTo = PRICE_HIGH; // Upper Applied To -input ENUM_APPLIED_PRICE midAppliedTo = PRICE_MEDIAN; // Mid Applied To -input ENUM_APPLIED_PRICE lowerAppliedTo = PRICE_LOW; // Lower Applied To - -// -// Presentation ... -input group "Presentation"; - -// -input int startCalculationForLastBars = 1000; // Calculate Last n Bars -input bool showUpper = true; // Show Upper -input bool showMid = true; // Show Mid -input bool showLower = true; // Show Lower - -// -// Buffers ... - -// -#define hideColorIDX 0 -#define bullishColorIDX 1 -#define bearishColorIDX 2 -#define neuturalColorIDX 3 - -// -#property indicator_chart_window - -// -#property indicator_buffers 3 -#property indicator_plots 3 - -// -// Plot Buffers ... - -// -// UPPER ... -#define upperBufferIndex 0 -double upperBuffer[]; - -// -#property indicator_label1 "X121 MASU" -#property indicator_type1 DRAW_LINE -#property indicator_color1 clrAqua -#property indicator_style1 STYLE_SOLID -#property indicator_width1 1 - -// -// MID ... -#define midBufferIndex 1 -double midBuffer[]; - -// -#property indicator_label2 "X121 MASM" -#property indicator_type2 DRAW_LINE -#property indicator_color2 clrLightBlue -#property indicator_style2 STYLE_SOLID -#property indicator_width2 1 - -// -// LOWER ... -#define lowerBufferIndex 2 -double lowerBuffer[]; - -// -#property indicator_label3 "X121 MASL" -#property indicator_type3 DRAW_LINE -#property indicator_color3 clrMagenta -#property indicator_style3 STYLE_SOLID -#property indicator_width3 1 - -// -// Data Buffers ... - -// -int mLastBufferIndex = 2; - -// -// Variables, Properties and etc ... - -// -// this counts Available Bars ... -int limit; - -// -int maxLength; - -// -int upperHandler = INVALID_HANDLE; -int midHandler = INVALID_HANDLE; -int lowerHandler = INVALID_HANDLE; - -// -// Event Handlers ... - -/** - * Initialize Indicator ... - * - * @return ( int ) - */ -int OnInit() -{ - // - // Validate Inputs ... - if (!ValidateInputs()) - { - return INIT_PARAMETERS_INCORRECT; - } - - // - // Initialize Indicator Handlers ... - - // - // Upper ... - upperHandler = iMA( - _Symbol, - _Period, - length, - 0, - method, - upperAppliedTo // - ); - bool isInited = upperHandler != INVALID_HANDLE; - if (!isInited) - { - return INIT_FAILED; - } - - // - // Mid ... - midHandler = iMA( - _Symbol, - _Period, - length, - 0, - method, - midAppliedTo // - ); - isInited = midHandler != INVALID_HANDLE; - if (!isInited) - { - return INIT_FAILED; - } - - // - // Lower ... - lowerHandler = iMA( - _Symbol, - _Period, - length, - 0, - method, - lowerAppliedTo // - ); - isInited = lowerHandler != INVALID_HANDLE; - if (!isInited) - { - return INIT_FAILED; - } - - // - // 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(); - IndicatorSetInteger(INDICATOR_DIGITS, 2); - - // - // Init Succeed ... - return INIT_SUCCEEDED; -} - -/** - * De Initialize Indicator ... - * - * @param reason: Integer, De Initialization Reason ... - */ -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 - - // - IndicatorRelease(upperHandler); - IndicatorRelease(midHandler); - IndicatorRelease(lowerHandler); -} - -/** - * Calculate Bars ... - * - * @param rates_total: Integer, Total Bars on Chart ... - * @param prev_calculated: Integer, Total Calculated Bars on Charts ... - * @param time: DateTime Array, History of Open Time ... - * @param open: Double Array, History of Open Prices ... - * @param high: Double Array, History of High Prices ... - * @param low: Double Array, History of Low Prices ... - * @param close: Double Array, History of Close Prices ... - * @param tick_volume: Long, History of Tick Volumes on Bar ... - * @param volume: Long, History of Trade Volumes ... - * @param spread: Double, History of Spread Price ... - * - * @return ( int ) - */ -int OnCalculate( - const int rates_total, - const int prev_calculated, - const datetime &time[], - const double &open[], - const double &high[], - const double &low[], - const double &close[], - const long &tick_volume[], - const long &volume[], - const int &spread[] // -) -{ - // - // 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); - - // - // Validate Calculated Bars ... - - // - // Upper ... - int upperCalculatedBars = BarsCalculated(upperHandler); - - // - // Mid ... - int midCalculatedBars = BarsCalculated(midHandler); - - // - // Lower ... - int lowerCalculatedBars = BarsCalculated(lowerHandler); - - // - bool isPassedRequiredCalculatedBars = - // - // Upper ... - upperCalculatedBars >= maxLength && - // - // Mid ... - midCalculatedBars >= maxLength && - // - // Lower ... - lowerCalculatedBars >= maxLength - // - ; - if (!isPassedRequiredCalculatedBars) - { - return prev_calculated; - } - - // - limit = (prev_calculated > rates_total || prev_calculated <= 0) - ? rates_total - : (rates_total - prev_calculated) + 1; - - // - // Buffers Copy ... - - // - // Upper ... - int copiedUppers = CopyBuffer(upperHandler, 0, 0, limit, upperBuffer); - - // - // Mid ... - int copiedMids = CopyBuffer(midHandler, 0, 0, limit, midBuffer); - - // - // Lower ... - int copiedLowers = CopyBuffer(lowerHandler, 0, 0, limit, lowerBuffer); - - // - // Validate Copied Items ... - bool isPassedRequiredCopiedItems = - // - // Upper ... - copiedUppers > 0 && - // - // Mid ... - copiedMids > 0 && - // - // Lower ... - copiedLowers > 0 - // - ; - if (!isPassedRequiredCopiedItems) - { - return prev_calculated; - } - - // - // Main Loop ... - for (int i = limit - 1; i >= 0 && !IsStopped(); i--) - { - // - CalculateBuffers( - // - i, - prev_calculated, - rates_total, - // - open, - high, - close, - low, - tick_volume // - ); - } - - // - return rates_total; -} - -// -// Functions ... - -/** - * Validate Input Args for Initialization ... - * - * @return ( bool ) - */ -bool ValidateInputs() -{ - // - bool result = false; - - // - result = length > 0; - - // - return result; -} - -/** - * Extract Max Length of Inputs ... - * - * @return ( int ) - */ -int ExtractMaxLengthOfInputs() -{ - // - int result = 0; - - // - result = MathMax(result, length); - - // - return result; -} - -/** - * Set Indicator Short Name and also we can define Buffers Labels ... - */ -void SetIndicatorName() -{ - IndicatorSetString(INDICATOR_SHORTNAME, ShortName); -} - -/** - * Define Required Buffers ... - */ -void DefineBuffers() -{ - // - // Plot Buffers ... - - // - // Upper ... - - // - ENUM_DRAW_TYPE upperDrawType = showUpper ? DRAW_LINE : DRAW_NONE; - - // - ArraySetAsSeries(upperBuffer, true); - SetIndexBuffer(upperBufferIndex, upperBuffer, INDICATOR_DATA); - - // - PlotIndexSetInteger(upperBufferIndex, PLOT_SHOW_DATA, showUpper); - PlotIndexSetInteger(upperBufferIndex, PLOT_DRAW_TYPE, upperDrawType); - - // - PlotIndexSetDouble(upperBufferIndex, PLOT_EMPTY_VALUE, 0); - - // - // Mid ... - - // - ENUM_DRAW_TYPE midDrawType = showMid ? DRAW_LINE : DRAW_NONE; - - ArraySetAsSeries(midBuffer, true); - SetIndexBuffer(midBufferIndex, midBuffer, INDICATOR_DATA); - - // - PlotIndexSetInteger(midBufferIndex, PLOT_SHOW_DATA, showMid); - PlotIndexSetInteger(midBufferIndex, PLOT_DRAW_TYPE, midDrawType); - - // - PlotIndexSetDouble(midBufferIndex, PLOT_EMPTY_VALUE, 0); - - // - // Lower ... - - // - ENUM_DRAW_TYPE lowerDrawType = showLower ? DRAW_LINE : DRAW_NONE; - - ArraySetAsSeries(lowerBuffer, true); - SetIndexBuffer(lowerBufferIndex, lowerBuffer, INDICATOR_DATA); - - // - PlotIndexSetInteger(lowerBufferIndex, PLOT_SHOW_DATA, showLower); - PlotIndexSetInteger(lowerBufferIndex, PLOT_DRAW_TYPE, lowerDrawType); - - // - PlotIndexSetDouble(lowerBufferIndex, PLOT_EMPTY_VALUE, 0); -} - -/** - * Calculate Custom Buffers ... - * - * @param bar_index: Integer, Represent Current Bar ... - * @param prevCalculated: Integer, Represent Previous Calculated Bars ... - * @param ratesTotal: Integer, Represents All Available Bars ... - * @param open: Double Array, History of Open Prices ... - * @param high: Double Array, History of High Prices ... - * @param close: Double Array, History of Close Prices ... - * @param low: Double Array, History of Low Prices ... - * @param tickVolume: Long, History of Tick Volumes on Bar ... - */ -void CalculateBuffers( - int bar_index, // Selected Bar Index - const int prevCalculated, - const int ratesTotal, - const double &open[], - const double &high[], - const double &close[], - const double &low[], - const long &tickVolume[] // -) -{ - // - int barsLimit = startCalculationForLastBars > 0 - ? startCalculationForLastBars - : 0; - // - // bool canCalculate = true; - bool canCalculate = - barsLimit == 0 || - bar_index <= barsLimit; - if (canCalculate) - { - // - CalculateValues( - bar_index, - prevCalculated, - ratesTotal, - open, - high, - close, - low, - tickVolume // - ); - } - else - { - FillBuffersZero(bar_index); - } -} - -/** - * Fill All Bufers to Zero Vlue for Specified Bar Index ... - * - * @param barIndex: Integer ... - */ -void FillBuffersZero(int barIndex) -{ - // - upperBuffer[barIndex] = 0; - midBuffer[barIndex] = 0; - lowerBuffer[barIndex] = 0; -} - -/** - * Calculate Vales ... - * - * @param bar_index: Integer, Represent Current Bar ... - * @param prevCalculated: Integer, Represent Previous Calculated Bars ... - * @param ratesTotal: Integer, Represents All Available Bars ... - * @param open: Double Array, History of Open Prices ... - * @param high: Double Array, History of High Prices ... - * @param close: Double Array, History of Close Prices ... - * @param low: Double Array, History of Low Prices ... - * @param tickVolume: Long, History of Tick Volumes on Bar ... - */ -void CalculateValues( - int bar_index, // Selected Bar Index - const int prevCalculated, - const int ratesTotal, - const double &open[], - const double &high[], - const double &close[], - const double &low[], - const long &tickVolume[] // -) -{ - // - // Implement Colorify Mechanism ... -} - -// diff --git a/Indicators/x-saherelm.x121.xpv.mq5 b/Indicators/x-saherelm.x121.xpv.mq5 deleted file mode 100644 index 90dd823a..00000000 --- a/Indicators/x-saherelm.x121.xpv.mq5 +++ /dev/null @@ -1,1661 +0,0 @@ -/////////////////////////////////////////////////////// -// -// SaherElm IT Center MQL5 Indicator -// ------------------------------------------------- -// Name: X121 XPV -// Description: XPV ... -// -// -// 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 XPV Indicator" -#property strict - -// -// Definitions ... - -// -#define ShortName "X121 XPV" - -// -// Includes Common Library ... -#include "../Libraries/x-saherelm.common.lib.mq5" - -// -// Inputs ... - -// -// Market ... -input group "Market"; - -// -input group "Short"; -input ENUM_X_PERIOD_METHOD scMethod = X_PERIOD_AUTO; // How to Find Period -input ENUM_TIMEFRAMES scPeriod = NULL; // Time Period - -// -input group "Medium"; -input ENUM_X_PERIOD_METHOD mcMethod = X_PERIOD_AUTO; // How to Find Period -input ENUM_TIMEFRAMES mcPeriod = NULL; // Time Period - -// -input group "Long"; -input ENUM_X_PERIOD_METHOD lcMethod = X_PERIOD_AUTO; // How to Find Period -input ENUM_TIMEFRAMES lcPeriod = NULL; // Time Period - -// -input group "Hind"; -input ENUM_X_PERIOD_METHOD hcMethod = X_PERIOD_AUTO; // How to Find Period -input ENUM_TIMEFRAMES hcPeriod = NULL; // Time Period - -// -input group "Boundary Detection"; -input ENUM_SERIESMODE hhMode = MODE_HIGH; // Highest High Calculation Method -input ENUM_SERIESMODE llMode = MODE_LOW; // Lowest Low Calculation Method -input ENUM_X_FIBO_LEVELS goldenZoneLevel = X_FIBO_LEVEL_236; // Golden Zone Detection - -// -input group "Sar Detection"; -input double sarStep = 0.02; // Step -input double sarMax = 0.2; // Maximum - -// -input group "Swing Detection"; -input int swingLength = 5; // Length - -// -// Presentation ... -input group "Presentation"; - -// -input int startCalculationForLastBars = 1000; // Calculate Last n Bars -input int sarArrowCode = 159; // Parabolic Sar Arrow Code -input int peaksArrowCode = 159; // Peaks Arrow Code -input int valesArrowCode = 159; // Vales Arrow Code -input int trendArrowCode = 117; // Trend Arrow Code -input int swingLowsArrowCode = 225; // Swing Lows Arrow Code -input int swingHighsArrowCode = 226; // Swing Highs Arrow Code -input int supportsArrowCode = 159; // Supports Arrow Code -input int resistancesArrowCode = 159; // Resistances Arrow Code - -// -input bool showSar = true; // Show Parabolic Sar -input bool showPeaks = true; // Show Peaks -input bool showVales = true; // Show Vales -input bool showTrend = true; // Show Trend -input bool showSwingLows = true; // Show Swing Lows -input bool showSwingHighs = true; // Show Swing Highs -input bool showGoldenZones = true; // Show Golden Zones -input bool showSupports = true; // Show Supports -input bool showResistances = true; // Show Resistances - -// -// Buffers ... - -// -#define hideColorIDX 0 -#define bullishColorIDX 1 -#define bearishColorIDX 2 -#define neuturalColorIDX 3 - -// -#define emptyValue 0.0 - -// -#property indicator_chart_window - -// -#property indicator_buffers 24 -#property indicator_plots 10 - -// -// Plot Buffers ... - -// -// PEAKS ... - -// -#define peaksBufferIndex 0 -double peaksBuffer[]; - -// -#property indicator_label1 "X121 PEAKS" -#property indicator_type1 DRAW_ARROW -#property indicator_color1 clrMagenta -#property indicator_width1 1 - -// -// VALES ... - -// -#define valesBufferIndex 1 -double valesBuffer[]; - -// -#property indicator_label2 "X121 VALES" -#property indicator_type2 DRAW_ARROW -#property indicator_color2 clrAqua -#property indicator_width2 1 - -// -#define sarBufferIndex 2 -double sarBuffer[]; - -// -#property indicator_label3 "X121 SAR" -#property indicator_type3 DRAW_ARROW -#property indicator_color3 clrYellow -#property indicator_width3 1 - -// -// Swing Lows ... - -// -#define swingLowsBufferIndex 3 -double swingLowsBuffer[]; - -// -#property indicator_label4 "X121 SWL" -#property indicator_type4 DRAW_ARROW -#property indicator_color4 clrDodgerBlue -#property indicator_width4 1 - -// -// Swng Highs ... - -// -#define swingHighsBufferIndex 4 -double swingHighsBuffer[]; - -// -#property indicator_label5 "X121 SWH" -#property indicator_type5 DRAW_ARROW -#property indicator_color5 clrSaddleBrown -#property indicator_width5 1 - -// -#define peaksGoldenZoneBufferIndex 5 -double peaksGoldenZoneBuffer[]; - -// -#property indicator_label6 "X121 PEAKGZ" -#property indicator_type6 DRAW_LINE -#property indicator_color6 clrGold -#property indicator_style6 STYLE_DOT -#property indicator_width6 1 - -// -#define valesGoldenZoneBufferIndex 6 -double valesGoldenZoneBuffer[]; - -// -#property indicator_label7 "X121 VALEGZ" -#property indicator_type7 DRAW_LINE -#property indicator_color7 clrGold -#property indicator_style7 STYLE_DOT -#property indicator_width7 1 - -// -#define supportsBufferIndex 7 -double supportsBuffer[]; - -// -#property indicator_label8 "X121 SUPRT" -#property indicator_type8 DRAW_ARROW -#property indicator_color8 clrLime -#property indicator_width8 1 - -// -#define resistancesBufferIndex 8 -double resistancesBuffer[]; - -// -#property indicator_label9 "X121 RESIS" -#property indicator_type9 DRAW_ARROW -#property indicator_color9 clrRed -#property indicator_width9 1 - -// -// Trend ... -#define trendBufferIndex 9 -double trendBuffer[]; - -#define trendColorBufferIndex 10 -double trendColorBuffer[]; - -// -#property indicator_label10 "X121 TRND" -#property indicator_type10 DRAW_COLOR_ARROW -#property indicator_color10 CLR_NONE, clrAqua, clrMagenta, clrGray -#property indicator_width10 2 - -// -// Data Buffers ... - -// -int mLastBufferIndex = 10; - -// -// CURRENT ... - -// -#define cHHBufferIndex mLastBufferIndex + 1 -double cHHBuffer[]; - -// -#define cLLBufferIndex mLastBufferIndex + 2 -double cLLBuffer[]; - -// -// SHORT ... - -// -#define sHHBufferIndex mLastBufferIndex + 3 -double sHHBuffer[]; - -// -#define sLLBufferIndex mLastBufferIndex + 4 -double sLLBuffer[]; - -// -// MEDIUM ... - -// -#define mHHBufferIndex mLastBufferIndex + 5 -double mHHBuffer[]; - -// -#define mLLBufferIndex mLastBufferIndex + 6 -double mLLBuffer[]; - -// -// LONG ... - -// -#define lHHBufferIndex mLastBufferIndex + 7 -double lHHBuffer[]; - -// -#define lLLBufferIndex mLastBufferIndex + 8 -double lLLBuffer[]; - -// -// HIND ... - -// -#define hHHBufferIndex mLastBufferIndex + 9 -double hHHBuffer[]; - -// -#define hLLBufferIndex mLastBufferIndex + 10 -double hLLBuffer[]; - -// -// Support and Resistances ... - -// -#define fractalsUpperBufferIndex mLastBufferIndex + 11 -double fractalsUpperBuffer[]; - -// -#define fractalsLowerBufferIndex mLastBufferIndex + 12 -double fractalsLowerBuffer[]; - -// -#define trendStateBufferIndex mLastBufferIndex + 13 -double trendStateBuffer[]; - -// -// Variables, Properties and etc ... - -// -// this counts Available Bars ... -int limit; - -// -int maxLength; - -// -// SAR Handler ... -int sarHandler = INVALID_HANDLE; - -// -// FRACTALS Handler ... -int fractalHandler = INVALID_HANDLE; - -// -// XMarketCycle sc; -int mSCLength = 0; -ENUM_TIMEFRAMES mSCPeriod = NULL; - -// -// XMarketCycle mc; -int mMCLength = 0; -ENUM_TIMEFRAMES mMCPeriod = NULL; - -// -// XMarketCycle lc; -int mLCLength = 0; -ENUM_TIMEFRAMES mLCPeriod = NULL; - -// -// XMarketCycle hc; -int mHCLength = 0; -ENUM_TIMEFRAMES mHCPeriod = NULL; - -// -// Swings ... -double lSwingLow = emptyValue; -double lSwingHigh = emptyValue; -double lTrend = emptyValue; -double lTrendState = emptyValue; -double lTrendColor = hideColorIDX; - -// -// Event Handlers ... - -/** - * Initialize Indicator ... - * - * @return ( int ) - */ -int OnInit() -{ - // - // Validate Inputs ... - if (!ValidateInputs()) - { - return INIT_PARAMETERS_INCORRECT; - } - - // - // Initialize Indicator Handlers ... - - // - // SAR ... - sarHandler = iSAR( - _Symbol, - _Period, - sarStep, - sarMax // - ); - bool isInited = sarHandler != INVALID_HANDLE; - if (!isInited) - { - return INIT_FAILED; - } - - // - // Fractal ... - fractalHandler = iFractals( - _Symbol, - _Period // - ); - isInited = fractalHandler != INVALID_HANDLE; - if (!isInited) - { - return INIT_FAILED; - } - - // - if (!InitMarketCycles()) - { - 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; -} - -/** - * De Initialize Indicator ... - * - * @param reason: Integer, De Initialization Reason ... - */ -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 - - // - IndicatorRelease(sarHandler); - IndicatorRelease(fractalHandler); -} - -/** - * Calculate Bars ... - * - * @param rates_total: Integer, Total Bars on Chart ... - * @param prev_calculated: Integer, Total Calculated Bars on Charts ... - * @param time: DateTime Array, History of Open Time ... - * @param open: Double Array, History of Open Prices ... - * @param high: Double Array, History of High Prices ... - * @param low: Double Array, History of Low Prices ... - * @param close: Double Array, History of Close Prices ... - * @param tick_volume: Long, History of Tick Volumes on Bar ... - * @param volume: Long, History of Trade Volumes ... - * @param spread: Double, History of Spread Price ... - * - * @return ( int ) - */ -int OnCalculate( - const int rates_total, - const int prev_calculated, - const datetime &time[], - const double &open[], - const double &high[], - const double &low[], - const double &close[], - const long &tick_volume[], - const long &volume[], - const int &spread[] // -) -{ - // - // 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); - - // - // Validate Calculated Bars ... - - // - // SAR ... - int sarCalculatedBars = BarsCalculated(sarHandler); - - // - // FRACTALS ... - int fractalsCalculatedBars = BarsCalculated(fractalHandler); - - // - bool isPassedRequiredCalculatedBars = - // - // SAR ... - sarCalculatedBars >= maxLength && - // - // FRACTALS ... - fractalsCalculatedBars >= maxLength - // - ; - if (!isPassedRequiredCalculatedBars) - { - return prev_calculated; - } - - // - limit = (prev_calculated > rates_total || prev_calculated <= 0) - ? rates_total - : (rates_total - prev_calculated) + 1; - - // - // Buffers Copy ... - - // - // SAR ... - int copiedSars = CopyBuffer(sarHandler, 0, 0, limit, sarBuffer); - - // - // FRACTALS ... - int copiedFractalsUppers = CopyBuffer(fractalHandler, UPPER_LINE, 0, limit + 1, fractalsUpperBuffer); - int copiedFractalsLowers = CopyBuffer(fractalHandler, LOWER_LINE, 0, limit + 1, fractalsLowerBuffer); - - // - // Validate Copied Items ... - bool isPassedRequiredCopiedItems = - // - // SAR ... - copiedSars > 0 && - // - // FRACTALS ... - copiedFractalsUppers > 0 && - copiedFractalsLowers > 0 - // - ; - if (!isPassedRequiredCopiedItems) - { - return prev_calculated; - } - - // - // Main Loop ... - for (int i = limit - 1; i >= 0 && !IsStopped(); i--) - { - // - CalculateBuffers( - i, - prev_calculated, - rates_total, - // - open, - high, - close, - low, - tick_volume // - ); - } - - // - return rates_total; -} - -// -// Functions ... - -/** - * Validate Input Args for Initialization ... - * - * @return ( bool ) - */ -bool ValidateInputs() -{ - // - bool result = false; - - // - result = - // - // SAR ... - sarMax > 0 && - sarStep > 0 && - swingLength > 0 && - sarMax > sarStep && - // - // XPV ... - (IsValid(scMethod, scPeriod) && - IsValid(mcMethod, mcPeriod) && - IsValid(lcMethod, lcPeriod) && - IsValid(hcMethod, hcPeriod)) - // - ; - - // - return result; -} - -/** - * Extract Max Length of Inputs ... - * - * @return ( int ) - */ -int ExtractMaxLengthOfInputs() -{ - // - int result = 0; - - // - result = MathMax(0, swingLength); - - // - return result; -} - -/** - * Define Required Buffers ... - */ -void DefineBuffers() -{ - // - // Plot Buffers ... - - // - // PEAKS ... - - // - ENUM_DRAW_TYPE peaksDrawType = showPeaks ? DRAW_ARROW : DRAW_NONE; - - // - ArraySetAsSeries(peaksBuffer, true); - SetIndexBuffer(peaksBufferIndex, peaksBuffer, INDICATOR_DATA); - - // - PlotIndexSetInteger(peaksBufferIndex, PLOT_SHOW_DATA, showPeaks); - PlotIndexSetInteger(peaksBufferIndex, PLOT_DRAW_TYPE, peaksDrawType); - - // - PlotIndexSetDouble(peaksBufferIndex, PLOT_EMPTY_VALUE, EMPTY_VALUE); - PlotIndexSetInteger(peaksBufferIndex, PLOT_ARROW, peaksArrowCode); - - // - // VALES ... - - // - ENUM_DRAW_TYPE valesDrawType = showVales ? DRAW_ARROW : DRAW_NONE; - - // - ArraySetAsSeries(valesBuffer, true); - SetIndexBuffer(valesBufferIndex, valesBuffer, INDICATOR_DATA); - - // - PlotIndexSetInteger(valesBufferIndex, PLOT_SHOW_DATA, showVales); - PlotIndexSetInteger(valesBufferIndex, PLOT_DRAW_TYPE, valesDrawType); - - // - PlotIndexSetDouble(valesBufferIndex, PLOT_EMPTY_VALUE, EMPTY_VALUE); - PlotIndexSetInteger(valesBufferIndex, PLOT_ARROW, valesArrowCode); - - // - // SAR ... - - // - ENUM_DRAW_TYPE sarDrawType = showSar ? DRAW_ARROW : DRAW_NONE; - - // - ArraySetAsSeries(sarBuffer, true); - SetIndexBuffer(sarBufferIndex, sarBuffer, INDICATOR_DATA); - - // - PlotIndexSetInteger(sarBufferIndex, PLOT_SHOW_DATA, showSar); - PlotIndexSetInteger(sarBufferIndex, PLOT_DRAW_TYPE, sarDrawType); - - // - PlotIndexSetDouble(sarBufferIndex, PLOT_EMPTY_VALUE, EMPTY_VALUE); - PlotIndexSetInteger(sarBufferIndex, PLOT_ARROW, sarArrowCode); - - // - // Swing Lows ... - - // - ENUM_DRAW_TYPE swingLowsDrawType = showSwingLows ? DRAW_ARROW : DRAW_NONE; - - // - ArraySetAsSeries(swingLowsBuffer, true); - SetIndexBuffer(swingLowsBufferIndex, swingLowsBuffer, INDICATOR_DATA); - - // - PlotIndexSetInteger(swingLowsBufferIndex, PLOT_SHOW_DATA, showSwingLows); - PlotIndexSetInteger(swingLowsBufferIndex, PLOT_DRAW_TYPE, swingLowsDrawType); - - // - PlotIndexSetDouble(swingLowsBufferIndex, PLOT_EMPTY_VALUE, emptyValue); - PlotIndexSetInteger(swingLowsBufferIndex, PLOT_ARROW, swingLowsArrowCode); - - // - // Swing Highs ... - - // - ENUM_DRAW_TYPE swingHighsDrawType = showSwingHighs ? DRAW_ARROW : DRAW_NONE; - - // - ArraySetAsSeries(swingHighsBuffer, true); - SetIndexBuffer(swingHighsBufferIndex, swingHighsBuffer, INDICATOR_DATA); - - // - PlotIndexSetInteger(swingHighsBufferIndex, PLOT_SHOW_DATA, showSwingHighs); - PlotIndexSetInteger(swingHighsBufferIndex, PLOT_DRAW_TYPE, swingHighsDrawType); - - // - PlotIndexSetDouble(swingHighsBufferIndex, PLOT_EMPTY_VALUE, emptyValue); - PlotIndexSetInteger(swingHighsBufferIndex, PLOT_ARROW, swingHighsArrowCode); - - // - // Support ... - - // - ENUM_DRAW_TYPE supportsDrawType = showSupports ? DRAW_ARROW : DRAW_NONE; - - // - ArraySetAsSeries(supportsBuffer, true); - SetIndexBuffer(supportsBufferIndex, supportsBuffer, INDICATOR_DATA); - - // - PlotIndexSetInteger(supportsBufferIndex, PLOT_SHOW_DATA, showSupports); - PlotIndexSetInteger(supportsBufferIndex, PLOT_DRAW_TYPE, supportsDrawType); - - // - PlotIndexSetDouble(supportsBufferIndex, PLOT_EMPTY_VALUE, EMPTY_VALUE); - PlotIndexSetInteger(supportsBufferIndex, PLOT_ARROW, supportsArrowCode); - - // - // Resistances... - - // - ENUM_DRAW_TYPE resistancesDrawType = showResistances ? DRAW_ARROW : DRAW_NONE; - - // - ArraySetAsSeries(resistancesBuffer, true); - SetIndexBuffer(resistancesBufferIndex, resistancesBuffer, INDICATOR_DATA); - - // - PlotIndexSetInteger(resistancesBufferIndex, PLOT_SHOW_DATA, showResistances); - PlotIndexSetInteger(resistancesBufferIndex, PLOT_DRAW_TYPE, resistancesDrawType); - - // - PlotIndexSetDouble(resistancesBufferIndex, PLOT_EMPTY_VALUE, EMPTY_VALUE); - PlotIndexSetInteger(resistancesBufferIndex, PLOT_ARROW, resistancesArrowCode); - - // - // Golden Zones ... - - // - ENUM_DRAW_TYPE goldenZonesDrawType = showGoldenZones ? DRAW_LINE : DRAW_NONE; - - // - // PEAK Golden Zone ... - - // - ArraySetAsSeries(peaksGoldenZoneBuffer, true); - SetIndexBuffer(peaksGoldenZoneBufferIndex, peaksGoldenZoneBuffer, INDICATOR_DATA); - - // - PlotIndexSetInteger(peaksGoldenZoneBufferIndex, PLOT_SHOW_DATA, showGoldenZones); - PlotIndexSetInteger(peaksGoldenZoneBufferIndex, PLOT_DRAW_TYPE, goldenZonesDrawType); - - // - // VALE Golden Zone ... - - // - ArraySetAsSeries(valesGoldenZoneBuffer, true); - SetIndexBuffer(valesGoldenZoneBufferIndex, valesGoldenZoneBuffer, INDICATOR_DATA); - - // - PlotIndexSetInteger(valesGoldenZoneBufferIndex, PLOT_SHOW_DATA, showGoldenZones); - PlotIndexSetInteger(valesGoldenZoneBufferIndex, PLOT_DRAW_TYPE, goldenZonesDrawType); - - // - // Trends ... - - // - ENUM_DRAW_TYPE trendDrawType = showTrend ? DRAW_COLOR_ARROW : DRAW_NONE; - - // - ArraySetAsSeries(trendBuffer, true); - SetIndexBuffer(trendBufferIndex, trendBuffer, INDICATOR_DATA); - - // - PlotIndexSetInteger(trendBufferIndex, PLOT_SHOW_DATA, showTrend); - PlotIndexSetInteger(trendBufferIndex, PLOT_DRAW_TYPE, trendDrawType); - - // - PlotIndexSetDouble(trendBufferIndex, PLOT_EMPTY_VALUE, emptyValue); - PlotIndexSetInteger(trendBufferIndex, PLOT_ARROW, trendArrowCode); - - // - ArraySetAsSeries(trendColorBuffer, true); - SetIndexBuffer(trendColorBufferIndex, trendColorBuffer, INDICATOR_COLOR_INDEX); - - // - // Data Buffers ... - - // - // CURRENT ... - - // - ArraySetAsSeries(cHHBuffer, true); - SetIndexBuffer(cHHBufferIndex, cHHBuffer, INDICATOR_CALCULATIONS); - - // - ArraySetAsSeries(cLLBuffer, true); - SetIndexBuffer(cLLBufferIndex, cLLBuffer, INDICATOR_CALCULATIONS); - - // - // SHORT ... - - // - ArraySetAsSeries(sHHBuffer, true); - SetIndexBuffer(sHHBufferIndex, sHHBuffer, INDICATOR_CALCULATIONS); - - // - ArraySetAsSeries(sLLBuffer, true); - SetIndexBuffer(sLLBufferIndex, sLLBuffer, INDICATOR_CALCULATIONS); - - // - // MEDIUM ... - - // - ArraySetAsSeries(mHHBuffer, true); - SetIndexBuffer(mHHBufferIndex, mHHBuffer, INDICATOR_CALCULATIONS); - - // - ArraySetAsSeries(mLLBuffer, true); - SetIndexBuffer(mLLBufferIndex, mLLBuffer, INDICATOR_CALCULATIONS); - - // - // LONG ... - - // - ArraySetAsSeries(lHHBuffer, true); - SetIndexBuffer(lHHBufferIndex, lHHBuffer, INDICATOR_CALCULATIONS); - - // - ArraySetAsSeries(lLLBuffer, true); - SetIndexBuffer(lLLBufferIndex, lLLBuffer, INDICATOR_CALCULATIONS); - - // - // HIND ... - - // - ArraySetAsSeries(hHHBuffer, true); - SetIndexBuffer(hHHBufferIndex, hHHBuffer, INDICATOR_CALCULATIONS); - - // - ArraySetAsSeries(hLLBuffer, true); - SetIndexBuffer(hLLBufferIndex, hLLBuffer, INDICATOR_CALCULATIONS); - - // - // FRACTALS ... - - // - ArraySetAsSeries(fractalsUpperBuffer, true); - SetIndexBuffer(fractalsUpperBufferIndex, fractalsUpperBuffer, INDICATOR_CALCULATIONS); - - // - ArraySetAsSeries(fractalsLowerBuffer, true); - SetIndexBuffer(fractalsLowerBufferIndex, fractalsLowerBuffer, INDICATOR_CALCULATIONS); - - // - ArraySetAsSeries(trendStateBuffer, true); - SetIndexBuffer(trendStateBufferIndex, trendStateBuffer, INDICATOR_CALCULATIONS); -} - -/** - * Set Indicator Short Name and also we can define Buffers Labels ... - */ -void SetIndicatorName() -{ - // - IndicatorSetInteger(INDICATOR_DIGITS, 2); - IndicatorSetString(INDICATOR_SHORTNAME, ShortName); -} - -/** - * Calculate Custom Buffers ... - * - * @param bar_index: Integer, Represent Current Bar ... - * @param prevCalculated: Integer, Represent Previous Calculated Bars ... - * @param ratesTotal: Integer, Represents All Available Bars ... - * @param open: Double Array, History of Open Prices ... - * @param high: Double Array, History of High Prices ... - * @param close: Double Array, History of Close Prices ... - * @param low: Double Array, History of Low Prices ... - * @param tickVolume: Long, History of Tick Volumes on Bar ... - */ -void CalculateBuffers( - int bar_index, // Selected Bar Index - const int prevCalculated, - const int ratesTotal, - const double &open[], - const double &high[], - const double &close[], - const double &low[], - const long &tickVolume[] // -) -{ - // - int barsLimit = startCalculationForLastBars > 0 - ? startCalculationForLastBars - : 0; - // - // bool canCalculate = true; - bool canCalculate = - barsLimit == 0 || - bar_index <= barsLimit; - if (canCalculate) - { - // - // Calculate Cycles ... - CalculateCycles(bar_index); - - // - // Calculate Peaks and Vales ... - CalculatePeaksAndVales(bar_index); - - // - // Calculate Support nad Resistance ... - CalculateSupportAndResistance( - bar_index, - prevCalculated, - ratesTotal, - open, - high, - close, - low, - tickVolume // - ); - - // - int swingBarIndex = bar_index; - if (bar_index < swingLength) - { - swingBarIndex = bar_index + swingLength; - } - - // - // Calcultae Swing High and Low and Trends ... - CalculateSwingsAndTrend( - swingBarIndex, - prevCalculated, - ratesTotal, - open, - high, - close, - low, - tickVolume // - ); - - // - if (bar_index < swingLength) - { - // - // for (int i = bar_index; i < bar_index + swingLength; i++) - // { - // // - // trendBuffer[i] = lTrend; - // swingLowsBuffer[i] = lSwingLow; - // swingHighsBuffer[i] = lSwingHigh; - // trendStateBuffer[i] = lTrendState; - // trendColorBuffer[i] = lTrendColor; - // } - } - } - else - { - FillBuffersZero(bar_index); - } -} - -// -// Custom ... - -/** - * Initial Market Cycles ... - * - * @return ( bool ) - */ -bool InitMarketCycles() -{ - // - bool result = false; - - // - int cPeriodSeconds = PeriodSeconds(_Period); - - // - // Find Cycle Period ... - if (scMethod == X_PERIOD_AUTO) - { - // - // Select Period ... - mSCPeriod = GetCyclePeriod( - X_MARKET_CYCLE_SHORT, - _Period // - ); - } - else - { - mSCPeriod = scPeriod; - } - - // - if (IsValid(mSCPeriod)) - { - mSCLength = PeriodSeconds(mSCPeriod) / cPeriodSeconds; - } - - // - // Find Cycle Period ... - if (mcMethod == X_PERIOD_AUTO) - { - // - // Select Period ... - mMCPeriod = GetCyclePeriod( - X_MARKET_CYCLE_MEDIUM, - _Period // - ); - } - else - { - mMCPeriod = mcPeriod; - } - - // - if (IsValid(mMCPeriod)) - { - mMCLength = PeriodSeconds(mMCPeriod) / cPeriodSeconds; - } - - // - // Find Cycle Period ... - if (lcMethod == X_PERIOD_AUTO) - { - // - // Select Period ... - mLCPeriod = GetCyclePeriod( - X_MARKET_CYCLE_LONG, - _Period // - ); - } - else - { - mLCPeriod = lcPeriod; - } - - // - if (IsValid(mLCPeriod)) - { - mLCLength = PeriodSeconds(mLCPeriod) / cPeriodSeconds; - } - - // - // Find Cycle Period ... - if (hcMethod == X_PERIOD_AUTO) - { - // - // Select Period ... - mHCPeriod = GetCyclePeriod( - X_MARKET_CYCLE_HIND, - _Period // - ); - } - else - { - mHCPeriod = hcPeriod; - } - - // - if (IsValid(mHCPeriod)) - { - mHCLength = PeriodSeconds(mHCPeriod) / cPeriodSeconds; - } - - // - result = mSCLength > 0 && - mMCLength > mSCLength && - mLCLength > mMCLength && - mHCLength > mLCLength; - - // - return result; -} - -/** - * Fill All Bufers to Zero Vlue for Specified Bar Index ... - * - * @param barIndex: Integer ... - */ -void FillBuffersZero(int barIndex) -{ - // - // CURRENT ... - cHHBuffer[barIndex] = EMPTY_VALUE; - cLLBuffer[barIndex] = EMPTY_VALUE; - - // - // SHORT ... - sHHBuffer[barIndex] = EMPTY_VALUE; - sLLBuffer[barIndex] = EMPTY_VALUE; - - // - // MEDIUM ... - mHHBuffer[barIndex] = EMPTY_VALUE; - mLLBuffer[barIndex] = EMPTY_VALUE; - - // - // LONG ... - lHHBuffer[barIndex] = EMPTY_VALUE; - lLLBuffer[barIndex] = EMPTY_VALUE; - - // - // HIND ... - hHHBuffer[barIndex] = EMPTY_VALUE; - hLLBuffer[barIndex] = EMPTY_VALUE; - - // - // PEAKS ... - peaksBuffer[barIndex] = EMPTY_VALUE; - - // - // VALES ... - valesBuffer[barIndex] = EMPTY_VALUE; - - // - // SARS ... - sarBuffer[barIndex] = EMPTY_VALUE; - - // - // Support and Resistances ... - supportsBuffer[barIndex] = EMPTY_VALUE; - resistancesBuffer[barIndex] = EMPTY_VALUE; - - // - trendBuffer[barIndex] = emptyValue; - swingLowsBuffer[barIndex] = emptyValue; - swingHighsBuffer[barIndex] = emptyValue; - trendStateBuffer[barIndex] = emptyValue; - trendColorBuffer[barIndex] = hideColorIDX; - - // - // Fractals ... - fractalsUpperBuffer[barIndex] = EMPTY_VALUE; - fractalsLowerBuffer[barIndex] = EMPTY_VALUE; -} - -/** - * Calculate Specified Market Cycle Info ... - * - * @param barIndex: Integer, Bar Index ... - * @param cycle: ENUM_X_MARKET_CYCLES member, Specified Cycle ... - * @param hhBuffer: Highest High Buffer Reference ... - * @param llBuffer: Lowest Low Buffer Reference ... - */ -void CalculateCycle( - int barIndex, - ENUM_X_MARKET_CYCLES cycle, - double &hhBuffer[], - double &llBuffer[] // -) -{ - // - XOHCL bar; - bool isBarInited = bar.Init( - _Symbol, - _Period, - barIndex - // - ); - if (!isBarInited) - { - return; - } - - // - int mLength = 0; - switch (cycle) - { - // - case X_MARKET_CYCLE_SHORT: - mLength = mSCLength; - break; - - // - case X_MARKET_CYCLE_MEDIUM: - mLength = mMCLength; - break; - - // - case X_MARKET_CYCLE_LONG: - mLength = mLCLength; - break; - - // - case X_MARKET_CYCLE_HIND: - mLength = mHCLength; - break; - } - - // - if (mLength == 0) - { - return; - } - - // - // Find Highest High ... - double hhValue = bar.FindHighest( - mLength, - hhMode - // - ); - hhBuffer[barIndex] = hhValue; - - // - // Find Lowest Low ... - double llValue = bar.FindLowest( - mLength, - llMode - // - ); - llBuffer[barIndex] = llValue; -} - -/** - * Claculate Cycles ... - * - * @param barIndex: Integer, Bar Index ... - */ -void CalculateCycles(int barIndex) -{ - // - // SHORT ... - CalculateCycle( - barIndex, - X_MARKET_CYCLE_SHORT, - sHHBuffer, - sLLBuffer // - ); - - // - // MEDIUM ... - CalculateCycle( - barIndex, - X_MARKET_CYCLE_MEDIUM, - mHHBuffer, - mLLBuffer // - ); - - // - // LONG ... - CalculateCycle( - barIndex, - X_MARKET_CYCLE_LONG, - lHHBuffer, - lLLBuffer // - ); - - // - // HIND ... - CalculateCycle( - barIndex, - X_MARKET_CYCLE_HIND, - hHHBuffer, - hLLBuffer // - ); -} - -/** - * Calculate Peaks and Vales ... - * - * @param barIndex: Integer, Bar Index ... - */ -void CalculatePeaksAndVales(int barIndex) -{ - // - int lastIndex = barIndex + 1; - int barsCount = iBars(_Symbol, _Period); - - // - // PEAKS ... - double lastPeak = - lastIndex < barsCount - ? peaksBuffer[lastIndex] - : 0; - - // - double isHH = sHHBuffer[barIndex]; - double imHH = mHHBuffer[barIndex]; - double ilHH = lHHBuffer[barIndex]; - double ihHH = hHHBuffer[barIndex]; - - // - double iHHs[4] = { - isHH, - imHH, - ilHH, - ihHH // - }; - double rValue = GetAverage(iHHs); - bool isPeak = rValue == isHH && - isHH == imHH && - imHH == ilHH && - ilHH == ihHH; - double iPeak = - isPeak - ? rValue - : lastPeak; - peaksBuffer[barIndex] = iPeak; - - // - // VALES ... - double lastVale = - lastIndex < barsCount - ? valesBuffer[lastIndex] - : 0; - - // - double isLL = sLLBuffer[barIndex]; - double imLL = mLLBuffer[barIndex]; - double ilLL = lLLBuffer[barIndex]; - double ihLL = hLLBuffer[barIndex]; - - // - double iLLs[4] = { - isLL, - imLL, - ilLL, - ihLL // - }; - double sValue = GetAverage(iLLs); - bool isVale = sValue == isLL && - isLL == imLL && - imLL == ilLL && - ilLL == ihLL; - double iVale = - isVale - ? sValue - : lastVale; - valesBuffer[barIndex] = iVale; - - // - // Peaks Golden Zone ... - double iPeakGoldenZone = GetFibonacciLevel( - iPeak, - iVale, - goldenZoneLevel, - X_DIRECTION_BULLISH // - ); - peaksGoldenZoneBuffer[barIndex] = iPeakGoldenZone; - - // - // Vales Golden Zone ... - double iValeGoldenZone = GetFibonacciLevel( - iPeak, - iVale, - goldenZoneLevel, - X_DIRECTION_BEARISH // - ); - valesGoldenZoneBuffer[barIndex] = iValeGoldenZone; - - // -} - -/** - * Calculate Support nad Resistances ... - * - * @param bar_index: int, Specified Bar Index ... - * @param prevCalculated: int, Provides Previous Calculated Bars ... - * @param ratesTotal: int, Provides All Availabled Bars ... - * @param open: double Collection, Provides Open Prices Time Series ... - * @param high: double Collection, Provides High Prices Time Series ... - * @param close: double Collection, Provides Close Prices Time Series ... - * @param low: double Collection, Provides Low Prices Time Series ... - * @param tickVolume: long Collection, Provides Ticks Volume Prices Time Series ... - */ -void CalculateSupportAndResistance( - int bar_index, // Selected Bar Index - const int prevCalculated, - const int ratesTotal, - const double &open[], - const double &high[], - const double &close[], - const double &low[], - const long &tickVolume[] // -) -{ - // - double iUpperFractalsPrev = fractalsUpperBuffer[bar_index + 1]; - double iLowerFractalsPrev = fractalsLowerBuffer[bar_index + 1]; - - // - double iHigh = high[bar_index]; - double iLow = low[bar_index]; - - // - double iSupport = iLowerFractalsPrev != EMPTY_VALUE - ? iLow - : supportsBuffer[bar_index + 1]; - double iResistance = iUpperFractalsPrev != EMPTY_VALUE - ? iHigh - : resistancesBuffer[bar_index + 1]; - - // - supportsBuffer[bar_index] = iSupport; - resistancesBuffer[bar_index] = iResistance; -} - -/** - * Calculate Swing High and Low and Trend ... - * - * @param bar_index: int, Specified Bar Index ... - * @param prevCalculated: int, Provides Previous Calculated Bars ... - * @param ratesTotal: int, Provides All Availabled Bars ... - * @param open: double Collection, Provides Open Prices Time Series ... - * @param high: double Collection, Provides High Prices Time Series ... - * @param close: double Collection, Provides Close Prices Time Series ... - * @param low: double Collection, Provides Low Prices Time Series ... - * @param tickVolume: long Collection, Provides Ticks Volume Prices Time Series ... - */ -void CalculateSwingsAndTrend( - int bar_index, // Selected Bar Index - const int prevCalculated, - const int ratesTotal, - const double &open[], - const double &high[], - const double &close[], - const double &low[], - const long &tickVolume[] // -) -{ - // - int lastBarIndex = bar_index + 1; - bool isFirstBar = - startCalculationForLastBars > 0 - ? bar_index == startCalculationForLastBars - : bar_index == ratesTotal; - - // - double iLow = low[bar_index]; - double iHigh = high[bar_index]; - double iOpen = open[bar_index]; - double iClose = close[bar_index]; - - // - // Swing Low ... - double lastSwingLow = isFirstBar - ? emptyValue - : swingLowsBuffer[lastBarIndex]; - bool isSwingLow = IsSwingLow(high, low, bar_index, swingLength); - double iSwingLow = - !isSwingLow - ? lastSwingLow - : iLow; - swingLowsBuffer[bar_index] = iSwingLow; - if (isSwingLow) - { - lSwingLow = iSwingLow; - } - - // - // Swing High ... - double lastSwingHigh = isFirstBar - ? emptyValue - : swingHighsBuffer[lastBarIndex]; - bool isSwingHigh = IsSwingHigh(high, low, bar_index, swingLength); - double iSwingHigh = - !isSwingHigh - ? lastSwingHigh - : iHigh; - swingHighsBuffer[bar_index] = iSwingHigh; - if (isSwingHigh) - { - lSwingHigh = iSwingHigh; - } - - // - // Calculate Trend ... - - // - double lastTrend = isFirstBar - ? emptyValue - : trendBuffer[lastBarIndex]; - double iTrend = - isSwingLow && - iSwingLow > lastSwingLow - ? iSwingLow - : isSwingHigh && - iSwingHigh < lastSwingHigh - ? iSwingHigh - : lastTrend; - trendBuffer[bar_index] = iTrend; - bool isBullTrnd = - isSwingLow && - iSwingLow > lastSwingLow; - bool isBearTrnd = - isSwingHigh && - iSwingHigh < lastSwingHigh; - bool isTrnd = isBullTrnd || - isBearTrnd; - - // - double lastTrendState = isFirstBar - ? emptyValue - : trendStateBuffer[lastBarIndex]; - double iTrendState = - isSwingLow && - iSwingLow > lastSwingLow - ? 1 - : isSwingHigh && - iSwingHigh < lastSwingHigh - ? -1 - : lastTrendState; - - // - bool isTrendBraked = false; - if (!isTrendBraked) - { - // - bool isBullishState = iTrendState > 0; - bool isBearishState = iTrendState < 0; - - // - isTrendBraked = isBullishState - ? iClose < iTrend - : isBearishState - ? iClose > iTrend - : false; - if (isTrendBraked) - { - // - if (isBullishState) - { - iTrendState = -1; - } - - // - if (isBearishState) - { - iTrendState = 1; - } - } - } - trendStateBuffer[bar_index] = iTrendState; - - // - double iTrendColor = iTrendState == 0 - ? neuturalColorIDX - : iTrendState > 0 - ? bullishColorIDX - : iTrendState < 0 - ? bearishColorIDX - : hideColorIDX; - trendColorBuffer[bar_index] = iTrendColor; - - // - if (isTrnd) - { - // - lTrend = iTrend; - lTrendColor = iTrendColor; - lTrendState = iTrendState; - } -} - -// -// Tools ... - -// -bool IsSwingLow( - const double &high[], - const double &low[], - int index, - int length // -) -{ - // - bool result = false; - - // - result = index - length >= 0; - if (!result) - { - return result; - } - - // - for (int i = 1; i <= length; i++) - { - // - result = low[index] < low[index - 1] && - low[index] < low[index + i]; - if (!result) - { - break; - } - } - - // - return result; -} - -// -bool IsSwingHigh( - const double &high[], - const double &low[], - int index, - int length // -) -{ - // - bool result = false; - - // - result = index - length >= 0; - if (!result) - { - return result; - } - - // - for (int i = 1; i <= length; i++) - { - // - result = high[index] > high[index - 1] && - high[index] > high[index + i]; - if (!result) - { - break; - } - } - - // - return result; -} - -// \ No newline at end of file diff --git a/Indicators/x-saherelm.x121.xstr.mq5 b/Indicators/x-saherelm.x121.xstr.mq5 deleted file mode 100644 index 3a95d4d4..00000000 --- a/Indicators/x-saherelm.x121.xstr.mq5 +++ /dev/null @@ -1,812 +0,0 @@ -/////////////////////////////////////////////////////// -// -// SaherElm IT Center MQL5 Indicator -// ------------------------------------------------- -// Name: X121 XSTR -// Description: XSTR ... -// -// -// 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 XSTR Indicator" -#property strict - -// -// Definitions ... - -// -#define ShortName "X121 XSTR" - -// -// Includes Common Library ... -#include "../Libraries/x-saherelm.common.lib.mq5" - -// -// Inputs ... - -// -// Market ... -input group "Market"; -input int strLength = 14; // Length -input double strMultiplier = 3; // Multiplier -input int vidyaLength = 14; // Smothing Length -input ENUM_MA_METHOD strBoundaryMode = MODE_SMA; // Boundary Mode -input ENUM_APPLIED_PRICE strAppliedTo = PRICE_MEDIAN; // Applied To -input ENUM_APPLIED_PRICE vidyaAppliedTo = PRICE_CLOSE; // Smoothing Applied To - -// -input group "Presentation"; -input bool showStr = true; // Show Str -input bool showVidya = true; // Show Vidya -input bool showStrUpper = true; // Show Str Upper -input bool showStrLower = true; // Show Str Lower -input bool showStrLowMa = true; // Show Low Smoothed Buffer -input bool showStrHighMa = true; // Show High Smoothed Buffer - -// -// Buffers ... - -// -#define hideColorIDX 0 -#define bullishColorIDX 1 -#define bearishColorIDX 2 -#define neuturalColorIDX 3 - -// -#define emptyValue 0.0 - -// -#property indicator_chart_window - -// -#property indicator_buffers 10 -#property indicator_plots 6 - -// -// STR ... -#define strBufferIndex 0 -double strBuffer[]; - -#define strColorBufferIndex 1 -double strColorBuffer[]; - -// -#define strPlotBufferIndex 0 -#property indicator_label1 "X121 STR" -#property indicator_type1 DRAW_COLOR_LINE -#property indicator_color1 CLR_NONE, clrLime, clrRed, clrGray -#property indicator_style1 STYLE_SOLID -#property indicator_width1 2 - -// -// Up ... -#define strUpBufferIndex 2 -double strUpBuffer[]; - -// -#define strUpPlotBufferIndex 1 -#property indicator_label2 "X121 STR U" -#property indicator_type2 DRAW_LINE -#property indicator_color2 clrBlueViolet -#property indicator_style2 STYLE_SOLID -#property indicator_width2 1 - -// -// Down ... -#define strDownBufferIndex 3 -double strDownBuffer[]; - -// -#define strDownPlotBufferIndex 2 -#property indicator_label3 "X121 STR D" -#property indicator_type3 DRAW_LINE -#property indicator_color3 clrBlueViolet -#property indicator_style3 STYLE_SOLID -#property indicator_width3 1 - -// -// High MA ... -#define strHighMaBufferIndex 4 -double strHighMaBuffer[]; - -// -#define strHighMaPlotBufferIndex 3 -#property indicator_label4 "X121 STR HSM" -#property indicator_type4 DRAW_LINE -#property indicator_color4 clrAqua -#property indicator_style4 STYLE_SOLID -#property indicator_width4 1 - -// -// Low Ma ... -#define strLowMaBufferIndex 5 -double strLowMaBuffer[]; - -// -#define strLowMaPlotBufferIndex 4 -#property indicator_label5 "X121 STR LSM" -#property indicator_type5 DRAW_LINE -#property indicator_color5 clrMagenta -#property indicator_style5 STYLE_SOLID -#property indicator_width5 1 - -// -// VIDYA ... -#define vidyaBufferIndex 6 -double vidyaBuffer[]; - -// -#define vidyaPlotBufferIndex 5 -#property indicator_label6 "X121 VIDYA" -#property indicator_type6 DRAW_LINE -#property indicator_color6 clrYellow -#property indicator_style6 STYLE_SOLID -#property indicator_width6 1 - -// -// Data Buffers ... - -// -int mLastBufferIndex = 6; - -// -// STR ... - -// -// Atr ... -#define atrBufferIndex mLastBufferIndex + 1 -double atrBuffer[]; - -// -// Price ... -#define strPriceBufferIndex mLastBufferIndex + 2 -double strPriceBuffer[]; - -// -// Trend ... -#define strStateBufferIndex mLastBufferIndex + 3 -double strStateBuffer[]; - -// -// Variables, Properties and etc ... - -// -// this counts Available Bars ... -int limit; - -// -int maxLength; - -// -// ATR Handler ... -int atrHandler = INVALID_HANDLE; - -// -// MA Handler ... -int lowMaHandler = INVALID_HANDLE; -int highMaHandler = INVALID_HANDLE; -int vidyaHandler = INVALID_HANDLE; - -// -bool isStrTrendChanged; -bool isStrStartBearishTrend; -bool isStrStartBullishTrend; - -// -int changeOfTrend; -int startBearishTrend; -int startBullishTrend; - -// -// Event Handlers ... - -/** - * Initialize Indicator ... - * - * @return ( int ) - */ -int OnInit() -{ - // - // Validate Inputs ... - if (!ValidateInputs()) - { - return INIT_PARAMETERS_INCORRECT; - } - - // - // Initialize Indicator Handlers ... - - // - // ATR ... - atrHandler = iATR( - _Symbol, - _Period, - strLength // - ); - bool isInited = atrHandler != INVALID_HANDLE; - if (!isInited) - { - return INIT_FAILED; - } - - // - // Low Ma ... - lowMaHandler = iMA( - _Symbol, - _Period, - strLength, - 0, - strBoundaryMode, - PRICE_LOW // - ); - isInited = lowMaHandler != INVALID_HANDLE; - if (!isInited) - { - return INIT_FAILED; - } - - // - // High Ma ... - highMaHandler = iMA( - _Symbol, - _Period, - strLength, - 0, - strBoundaryMode, - PRICE_HIGH // - ); - isInited = highMaHandler != INVALID_HANDLE; - if (!isInited) - { - return INIT_FAILED; - } - - // - // Vidya ... - vidyaHandler = iVIDyA( - _Symbol, - _Period, - strLength, - vidyaLength, - 0, // Shift ... - vidyaAppliedTo // - ); - isInited = vidyaHandler != INVALID_HANDLE; - if (!isInited) - { - return INIT_FAILED; - } - - // - // 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; -} - -/** - * De Initialize Indicator ... - * - * @param reason: Integer, De Initialization Reason ... - */ -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 - - // - IndicatorRelease(atrHandler); - IndicatorRelease(vidyaHandler); - IndicatorRelease(lowMaHandler); - IndicatorRelease(highMaHandler); -} - -/** - * Calculate Bars ... - * - * @param rates_total: Integer, Total Bars on Chart ... - * @param prev_calculated: Integer, Total Calculated Bars on Charts ... - * @param time: DateTime Array, History of Open Time ... - * @param open: Double Array, History of Open Prices ... - * @param high: Double Array, History of High Prices ... - * @param low: Double Array, History of Low Prices ... - * @param close: Double Array, History of Close Prices ... - * @param tick_volume: Long, History of Tick Volumes on Bar ... - * @param volume: Long, History of Trade Volumes ... - * @param spread: Double, History of Spread Price ... - * - * @return ( int ) - */ -int OnCalculate( - const int rates_total, - const int prev_calculated, - const datetime &time[], - const double &open[], - const double &high[], - const double &low[], - const double &close[], - const long &tick_volume[], - const long &volume[], - const int &spread[] // -) -{ - // - // Prepare Buffers ... - - // - // Validate Calculated Bars ... - - // - // ATR ... - int atrCalculatedBars = BarsCalculated(atrHandler); - - // - // VIDYA ... - int vidyaCalculatedBars = BarsCalculated(vidyaHandler); - - // - // Low Ma ... - int lowMaCalculatedBars = BarsCalculated(lowMaHandler); - - // - // High Ma ... - int highMaCalculatedBars = BarsCalculated(highMaHandler); - - // - bool isPassedRequiredCalculatedBars = - // - // ATR ... - atrCalculatedBars >= 0 && - // - // VIDYA ... - vidyaCalculatedBars >= 0 && - // - // Low Ma ... - lowMaCalculatedBars >= 0 && - // - // High Ma ... - highMaCalculatedBars >= 0 - // - ; - if (!isPassedRequiredCalculatedBars) - { - return prev_calculated; - } - - // - // - // checking for the limit start of calculation of an indicator ... - limit = - (prev_calculated > rates_total || prev_calculated <= 0) - ? maxLength - : prev_calculated - 1; - - // - // Buffers Copy ... - - // - // ATR ... - int copiedAtrs = CopyBuffer(atrHandler, 0, 0, rates_total, atrBuffer); - - // - // VYDIA ... - int copiedVidyas = CopyBuffer(vidyaHandler, 0, 0, rates_total, vidyaBuffer); - - // - // Low Ma ... - int copiedLowMas = CopyBuffer(lowMaHandler, 0, 0, rates_total, strLowMaBuffer); - - // - // High Ma ... - int copiedHighMas = CopyBuffer(highMaHandler, 0, 0, rates_total, strHighMaBuffer); - - // - // Validate Copied Items ... - bool isPassedRequiredCopiedItems = - // - // ATR ... - copiedAtrs >= 0 && - // - // VIDYA ... - copiedVidyas >= 0 && - // - // Low Ma ... - copiedLowMas >= 0 && - // - // Hig Ma ... - copiedHighMas >= 0 - // - ; - if (!isPassedRequiredCopiedItems) - { - return prev_calculated; - } - - // - // Main Loop ... - for (int i = limit; i < rates_total && !IsStopped(); i++) - { - // - CalculateBuffers( - i, - prev_calculated, - rates_total, - // - open, - high, - close, - low, - tick_volume // - ); - } - - // - return rates_total; -} - -// -// Functions ... - -/** - * Validate Input Args for Initialization ... - * - * @return ( bool ) - */ -bool ValidateInputs() -{ - // - bool result = - // - // STR ... - strLength > 0 && - strMultiplier > 0 - // - ; - - // - return result; -} - -/** - * Extract Max Length of Inputs ... - * - * @return ( int ) - */ -int ExtractMaxLengthOfInputs() -{ - // - int result = 0; - - // - result = MathMax(1, strLength); - - // - return result; -} - -/** - * Define Required Buffers ... - */ -void DefineBuffers() -{ - // - // STR ... - SetIndexBuffer(strBufferIndex, strBuffer, INDICATOR_DATA); - SetIndexBuffer(strColorBufferIndex, strColorBuffer, INDICATOR_COLOR_INDEX); - - // - ENUM_DRAW_TYPE strUpDrawType = showStrUpper ? DRAW_LINE : DRAW_NONE; - SetIndexBuffer(strUpBufferIndex, strUpBuffer, INDICATOR_DATA); - PlotIndexSetDouble(strUpPlotBufferIndex, PLOT_EMPTY_VALUE, emptyValue); - PlotIndexSetInteger(strUpPlotBufferIndex, PLOT_SHOW_DATA, showStrUpper); - PlotIndexSetInteger(strUpPlotBufferIndex, PLOT_DRAW_TYPE, strUpDrawType); - - // - ENUM_DRAW_TYPE strDownDrawType = showStrLower ? DRAW_LINE : DRAW_NONE; - SetIndexBuffer(strDownBufferIndex, strDownBuffer, INDICATOR_DATA); - PlotIndexSetDouble(strDownPlotBufferIndex, PLOT_EMPTY_VALUE, emptyValue); - PlotIndexSetInteger(strDownPlotBufferIndex, PLOT_SHOW_DATA, showStrLower); - PlotIndexSetInteger(strDownPlotBufferIndex, PLOT_DRAW_TYPE, strDownDrawType); - - // - ENUM_DRAW_TYPE strLowMaDrawType = showStrLowMa ? DRAW_LINE : DRAW_NONE; - SetIndexBuffer(strLowMaBufferIndex, strLowMaBuffer, INDICATOR_DATA); - PlotIndexSetDouble(strLowMaPlotBufferIndex, PLOT_EMPTY_VALUE, emptyValue); - PlotIndexSetInteger(strLowMaPlotBufferIndex, PLOT_SHOW_DATA, showStrLowMa); - PlotIndexSetInteger(strLowMaPlotBufferIndex, PLOT_DRAW_TYPE, strLowMaDrawType); - - // - ENUM_DRAW_TYPE strHighMaDrawType = showStrHighMa ? DRAW_LINE : DRAW_NONE; - SetIndexBuffer(strHighMaBufferIndex, strHighMaBuffer, INDICATOR_DATA); - PlotIndexSetDouble(strHighMaPlotBufferIndex, PLOT_EMPTY_VALUE, emptyValue); - PlotIndexSetInteger(strHighMaPlotBufferIndex, PLOT_SHOW_DATA, showStrHighMa); - PlotIndexSetInteger(strHighMaPlotBufferIndex, PLOT_DRAW_TYPE, strHighMaDrawType); - - // - ENUM_DRAW_TYPE vidyaDrawType = showVidya ? DRAW_LINE : DRAW_NONE; - SetIndexBuffer(vidyaBufferIndex, vidyaBuffer, INDICATOR_DATA); - PlotIndexSetDouble(vidyaPlotBufferIndex, PLOT_EMPTY_VALUE, emptyValue); - PlotIndexSetInteger(vidyaPlotBufferIndex, PLOT_SHOW_DATA, showVidya); - PlotIndexSetInteger(vidyaPlotBufferIndex, PLOT_DRAW_TYPE, vidyaDrawType); - - // - // Data Buffers ... - - // - SetIndexBuffer(strPriceBufferIndex, strPriceBuffer, INDICATOR_CALCULATIONS); - SetIndexBuffer(strStateBufferIndex, strStateBuffer, INDICATOR_CALCULATIONS); -} - -/** - * Set Indicator Short Name and also we can define Buffers Labels ... - */ -void SetIndicatorName() -{ - IndicatorSetString(INDICATOR_SHORTNAME, ShortName); -} - -/** - * Calculate Custom Buffers ... - * - * @param bar_index: Integer, Represent Current Bar ... - * @param prevCalculated: Integer, Represent Previous Calculated Bars ... - * @param ratesTotal: Integer, Represents All Available Bars ... - * @param open: Double Array, History of Open Prices ... - * @param high: Double Array, History of High Prices ... - * @param close: Double Array, History of Close Prices ... - * @param low: Double Array, History of Low Prices ... - * @param tickVolume: Long, History of Tick Volumes on Bar ... - */ -void CalculateBuffers( - int bar_index, // Selected Bar Index - const int prevCalculated, - const int ratesTotal, - const double &open[], - const double &high[], - const double &close[], - const double &low[], - const long &tickVolume[] // -) -{ - // - CalculateStr( - bar_index, - prevCalculated, - ratesTotal, - open, - high, - close, - low // - ); -} - -// -// Custom ... - -/** - * Fill All Bufers to Zero Vlue for Specified Bar Index ... - * - * @param barIndex: Integer ... - */ -void FillBuffersZero(int barIndex) -{ - // - // STR ... - strBuffer[barIndex] = emptyValue; - strUpBuffer[barIndex] = emptyValue; - strDownBuffer[barIndex] = emptyValue; - strPriceBuffer[barIndex] = emptyValue; - strLowMaBuffer[barIndex] = emptyValue; - strHighMaBuffer[barIndex] = emptyValue; - - // - strColorBuffer[barIndex] = hideColorIDX; - strStateBuffer[barIndex] = hideColorIDX; -} - -/** - * Calculate STR ... - * - * @param bar_index: Integer, Represent Current Bar ... - * @param prevCalculated: Integer, Represent Previous Calculated Bars ... - * @param ratesTotal: Integer, Represents All Available Bars ... - * @param open: Double Array, History of Open Prices ... - * @param high: Double Array, History of High Prices ... - * @param close: Double Array, History of Close Prices ... - * @param low: Double Array, History of Low Prices ... - */ -void CalculateStr( - int bar_index, // Selected Bar Index - const int prevCalculated, - const int ratesTotal, - const double &open[], - const double &high[], - const double &close[], - const double &low[] // -) -{ - // - // Calculated Price ... - ENUM_X_PRICE mPType = ToXPrice(strAppliedTo); - double price = GetAppliedPrice( - mPType, - open, - high, - low, - close, - bar_index // - ); - strPriceBuffer[bar_index] = price; - - // - double atr = atrBuffer[bar_index]; - - // - // Up ... - strUpBuffer[bar_index] = price + (strMultiplier * atr); - - // - // Down ... - strDownBuffer[bar_index] = price - (strMultiplier * atr); - - // - if (close[bar_index] > strUpBuffer[bar_index - 1]) - { - // - strStateBuffer[bar_index] = 1; - if (strStateBuffer[bar_index - 1] == -1) - { - changeOfTrend = 1; - } - } - else if (close[bar_index] < strDownBuffer[bar_index - 1]) - { - // - strStateBuffer[bar_index] = -1; - if (strStateBuffer[bar_index - 1] == 1) - { - changeOfTrend = 1; - } - } - else if (strStateBuffer[bar_index - 1] == 1) - { - // - strStateBuffer[bar_index] = 1; - changeOfTrend = 0; - } - else if (strStateBuffer[bar_index - 1] == -1) - { - // - strStateBuffer[bar_index] = -1; - changeOfTrend = 0; - } - - // - // Down Trend Starting ... - if (strStateBuffer[bar_index] < 0 && strStateBuffer[bar_index - 1] > 0) - { - startBearishTrend = 1; - } - else - { - startBearishTrend = 0; - } - - // - // Up Trend Starting ... - if (strStateBuffer[bar_index] > 0 && strStateBuffer[bar_index - 1] < 0) - { - startBullishTrend = 1; - } - else - { - startBullishTrend = 0; - } - - // - if (strStateBuffer[bar_index] > 0 && strDownBuffer[bar_index] < strDownBuffer[bar_index - 1]) - { - strDownBuffer[bar_index] = strDownBuffer[bar_index - 1]; - } - - // - if (strStateBuffer[bar_index] < 0 && strUpBuffer[bar_index] > strUpBuffer[bar_index - 1]) - { - strUpBuffer[bar_index] = strUpBuffer[bar_index - 1]; - } - - // - if (startBearishTrend == 1) - { - strUpBuffer[bar_index] = strPriceBuffer[bar_index] + (strMultiplier * atr); - } - - // - if (startBullishTrend == 1) - { - strDownBuffer[bar_index] = strPriceBuffer[bar_index] - (strMultiplier * atr); - } - - // - // Draw the indicator ... - - // - double colorIDX = hideColorIDX; - strColorBuffer[bar_index] = colorIDX; - - // - if (strStateBuffer[bar_index] == 1) - { - // - strBuffer[bar_index] = strDownBuffer[bar_index]; - if (changeOfTrend == 1) - { - strBuffer[bar_index - 1] = strBuffer[bar_index - 2]; - changeOfTrend = 0; - } - - // - colorIDX = bullishColorIDX; - } - else if (strStateBuffer[bar_index] == -1) - { - // - strBuffer[bar_index] = strUpBuffer[bar_index]; - if (changeOfTrend == 1) - { - // - strBuffer[bar_index - 1] = strBuffer[bar_index - 2]; - changeOfTrend = 0; - } - - // - colorIDX = bearishColorIDX; - } - - // - if (showStr) - { - strColorBuffer[bar_index] = colorIDX; - } - - // - // Str Mid ... - - // - double iStrMid = strDownBuffer[bar_index] + ((strUpBuffer[bar_index] - strDownBuffer[bar_index]) / 2); - - // -} - -// \ No newline at end of file diff --git a/Indicators/x-saherelm.x121.xtrend.mq5 b/Indicators/x-saherelm.x121.xtrend.mq5 deleted file mode 100644 index 1da2b39a..00000000 --- a/Indicators/x-saherelm.x121.xtrend.mq5 +++ /dev/null @@ -1,701 +0,0 @@ -/////////////////////////////////////////////////////// -// -// SaherElm IT Center MQL5 Indicator -// ------------------------------------------------- -// Name: X121 XTREND -// Description: XTREND ... -// -// -// 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 XTREND Indicator" -#property strict - -// -// Definitions ... - -// -#define ShortName "X121 XTREND" - -// -// Includes Common Library ... -#include "../Libraries/x-saherelm.common.lib.mq5" - -// -// Inputs ... - -// -// Market ... -input group "Market"; - -input ENUM_APPLIED_PRICE trendPriceType = PRICE_CLOSE; // Detect Trend Price Type - -input group "MA Detection"; -input int maLength = 50; // MA Length -input ENUM_MA_METHOD maMethod = MODE_EMA; // MA Method -input ENUM_APPLIED_PRICE maAppliedTo = PRICE_CLOSE; // MA Applied To - -input group "ADX Detection"; -input int adxLength = 14; // ADX Length -input double adxThreshold = 25; // ADX Threshold for Strong Trends - -// -// Presentation ... -input group "Presentation"; - -// -input int startCalculationForLastBars = 1000; // Calculate Last n Bars -input int upTrendArrowCode = 233; // Up Trend Arrow Code -input int downTrendArrowCode = 234; // Down Trend Arrow Code - -// -input bool showOnlyTrendStart = true; // Show Only Trend Start -input bool showUpTrend = true; // Show Up Trend -input bool showDownTrend = true; // Show Down Trend - -// -#property indicator_chart_window - -// -#property indicator_buffers 8 -#property indicator_plots 2 - -// -// Plot Buffers ... - -// -#define upTrendBufferIndex 0 -double upTrendBuffer[]; - -// -#property indicator_label1 "X121 XTREND Up" -#property indicator_type1 DRAW_ARROW -#property indicator_color1 clrAqua -#property indicator_width1 1 - -// -#define downTrendBufferIndex 1 -double downTrendBuffer[]; - -// -#property indicator_label2 "X121 XTREND Down" -#property indicator_type2 DRAW_ARROW -#property indicator_color2 clrMagenta -#property indicator_width2 1 - -// -// Data Buffers ... - -// -int mLastBufferIndex = 1; - -// -#define maBufferIndex mLastBufferIndex + 1 -double maBuffer[]; - -// -#define adxBufferIndex mLastBufferIndex + 2 -double adxBuffer[]; - -// -#define adxPBufferIndex mLastBufferIndex + 3 -double adxPBuffer[]; - -// -#define adxMBufferIndex mLastBufferIndex + 4 -double adxMBuffer[]; - -// -#define upTBufferIndex mLastBufferIndex + 5 -double upTBuffer[]; - -// -#define downTBufferIndex mLastBufferIndex + 6 -double downTBuffer[]; - -// -// Variables, Properties and etc ... - -// -// this counts Available Bars ... -int limit; - -// -int maxLength; - -// -double lastValue = 0; -ENUM_X_DIRECTION lastTrendDir = X_DIRECTION_NONE; - -// -// MA Handler ... -int maHandler = INVALID_HANDLE; - -// -// ADX Handler ... -int adxHandler = INVALID_HANDLE; - -// -// Event Handlers ... - -/** - * Initialize Indicator ... - * - * @return ( int ) - */ -int OnInit() -{ - // - // Validate Inputs ... - if (!ValidateInputs()) - { - return INIT_PARAMETERS_INCORRECT; - } - - // - // Initialize Indicator Handlers ... - - // - // MA ... - maHandler = iMA( - _Symbol, - _Period, - maLength, - 0, - maMethod, - maAppliedTo // - ); - bool isInited = maHandler != INVALID_HANDLE; - if (!isInited) - { - return INIT_FAILED; - } - - // - // ADx ... - adxHandler = iADX( - _Symbol, - _Period, - adxLength // - ); - isInited = maHandler != INVALID_HANDLE; - if (!isInited) - { - return INIT_FAILED; - } - - // - // 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(); - IndicatorSetInteger(INDICATOR_DIGITS, 2); - - // - // Init Succeed ... - return INIT_SUCCEEDED; -} - -/** - * De Initialize Indicator ... - * - * @param reason: Integer, De Initialization Reason ... - */ -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 - - // - IndicatorRelease(maHandler); - IndicatorRelease(adxHandler); -} - -/** - * Calculate Bars ... - * - * @param rates_total: Integer, Total Bars on Chart ... - * @param prev_calculated: Integer, Total Calculated Bars on Charts ... - * @param time: DateTime Array, History of Open Time ... - * @param open: Double Array, History of Open Prices ... - * @param high: Double Array, History of High Prices ... - * @param low: Double Array, History of Low Prices ... - * @param close: Double Array, History of Close Prices ... - * @param tick_volume: Long, History of Tick Volumes on Bar ... - * @param volume: Long, History of Trade Volumes ... - * @param spread: Double, History of Spread Price ... - * - * @return ( int ) - */ -int OnCalculate( - const int rates_total, - const int prev_calculated, - const datetime &time[], - const double &open[], - const double &high[], - const double &low[], - const double &close[], - const long &tick_volume[], - const long &volume[], - const int &spread[] // -) -{ - // - // 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); - - // - // Validate Calculated Bars ... - - // - // MA ... - int maCalculatedBars = BarsCalculated(maHandler); - - // - // ADX ... - int adxCalculatedBars = BarsCalculated(adxHandler); - - // - bool isPassedRequiredCalculatedBars = - // - // MA ... - maCalculatedBars >= maxLength && - // - // ADX ... - adxCalculatedBars >= maxLength - // - ; - if (!isPassedRequiredCalculatedBars) - { - return prev_calculated; - } - - // - limit = (prev_calculated > rates_total || prev_calculated <= 0) - ? rates_total - : (rates_total - prev_calculated) + 1; - - // - // Buffers Copy ... - - // - // MA ... - int copiedMas = CopyBuffer(maHandler, 0, 0, limit, maBuffer); - - // - // ADX ... - int copiedAdxs = CopyBuffer(adxHandler, MAIN_LINE, 0, limit, adxBuffer); - int copiedAdxPs = CopyBuffer(adxHandler, PLUSDI_LINE, 0, limit, adxPBuffer); - int copiedAdxMs = CopyBuffer(adxHandler, MINUSDI_LINE, 0, limit, adxMBuffer); - - // - // Validate Copied Items ... - bool isPassedRequiredCopiedItems = - // - // MA ... - copiedMas > 0 && - // - // ADX ... - copiedAdxs > 0 && - copiedAdxPs > 0 && - copiedAdxMs > 0 - // - ; - if (!isPassedRequiredCopiedItems) - { - return prev_calculated; - } - - // - // Main Loop ... - for (int i = limit - 1; i >= 0 && !IsStopped(); i--) - { - // - CalculateBuffers( - i, - prev_calculated, - rates_total, - // - open, - high, - close, - low, - tick_volume // - ); - } - - // - return rates_total; -} - -// -// Functions ... - -/** - * Validate Input Args for Initialization ... - * - * @return ( bool ) - */ -bool ValidateInputs() -{ - // - bool result = false; - - // - result = - // - // MA ... - maLength > 0 && - // - // ADX ... - adxLength > 0 && - adxThreshold > 0 - // - ; - - // - return result; -} - -/** - * Extract Max Length of Inputs ... - * - * @return ( int ) - */ -int ExtractMaxLengthOfInputs() -{ - // - int result = 0; - - // - result = MathMax(maLength, adxLength); - - // - return result; -} - -/** - * Set Indicator Short Name and also we can define Buffers Labels ... - */ -void SetIndicatorName() -{ - IndicatorSetString(INDICATOR_SHORTNAME, ShortName); -} - -/** - * Define Required Buffers ... - */ -void DefineBuffers() -{ - // - // Plot Buffers ... - - // - // UP Trend ... - - // - ENUM_DRAW_TYPE upTrendDrawType = showUpTrend ? DRAW_ARROW : DRAW_NONE; - - // - ArraySetAsSeries(upTrendBuffer, true); - SetIndexBuffer(upTrendBufferIndex, upTrendBuffer, INDICATOR_DATA); - - // - PlotIndexSetInteger(upTrendBufferIndex, PLOT_SHOW_DATA, showUpTrend); - PlotIndexSetInteger(upTrendBufferIndex, PLOT_DRAW_TYPE, upTrendDrawType); - - // - PlotIndexSetDouble(upTrendBufferIndex, PLOT_EMPTY_VALUE, 0); - PlotIndexSetInteger(upTrendBufferIndex, PLOT_ARROW, upTrendArrowCode); - - // - // DOWN Trend ... - - // - ENUM_DRAW_TYPE downTrendDrawType = showDownTrend ? DRAW_ARROW : DRAW_NONE; - - // - ArraySetAsSeries(downTrendBuffer, true); - SetIndexBuffer(downTrendBufferIndex, downTrendBuffer, INDICATOR_DATA); - - // - PlotIndexSetInteger(downTrendBufferIndex, PLOT_SHOW_DATA, showDownTrend); - PlotIndexSetInteger(downTrendBufferIndex, PLOT_DRAW_TYPE, downTrendDrawType); - - // - PlotIndexSetDouble(downTrendBufferIndex, PLOT_EMPTY_VALUE, 0); - PlotIndexSetInteger(downTrendBufferIndex, PLOT_ARROW, downTrendArrowCode); - - // - // Data Buffers ... - - // - ArraySetAsSeries(maBuffer, true); - SetIndexBuffer(maBufferIndex, maBuffer, INDICATOR_CALCULATIONS); - - // - ArraySetAsSeries(adxBuffer, true); - SetIndexBuffer(adxBufferIndex, adxBuffer, INDICATOR_CALCULATIONS); - - // - ArraySetAsSeries(adxPBuffer, true); - SetIndexBuffer(adxPBufferIndex, adxPBuffer, INDICATOR_CALCULATIONS); - - // - ArraySetAsSeries(adxMBuffer, true); - SetIndexBuffer(adxMBufferIndex, adxMBuffer, INDICATOR_CALCULATIONS); - - // - ArraySetAsSeries(upTBuffer, true); - SetIndexBuffer(upTBufferIndex, upTBuffer, INDICATOR_CALCULATIONS); - - // - ArraySetAsSeries(downTBuffer, true); - SetIndexBuffer(downTBufferIndex, downTBuffer, INDICATOR_CALCULATIONS); -} - -/** - * Calculate Custom Buffers ... - * - * @param bar_index: Integer, Represent Current Bar ... - * @param prevCalculated: Integer, Represent Previous Calculated Bars ... - * @param ratesTotal: Integer, Represents All Available Bars ... - * @param open: Double Array, History of Open Prices ... - * @param high: Double Array, History of High Prices ... - * @param close: Double Array, History of Close Prices ... - * @param low: Double Array, History of Low Prices ... - * @param tickVolume: Long, History of Tick Volumes on Bar ... - */ -void CalculateBuffers( - int bar_index, // Selected Bar Index - const int prevCalculated, - const int ratesTotal, - const double &open[], - const double &high[], - const double &close[], - const double &low[], - const long &tickVolume[] // -) -{ - // - int barsLimit = startCalculationForLastBars > 0 - ? startCalculationForLastBars - : 0; - // - // bool canCalculate = true; - bool canCalculate = - barsLimit == 0 || - bar_index <= barsLimit; - if (canCalculate) - { - // - CalculateTrend( - bar_index, - prevCalculated, - ratesTotal, - open, - high, - close, - low, - tickVolume // - ); - } - else - { - FillBuffersZero(bar_index); - } -} - -/** - * Fill All Bufers to Zero Vlue for Specified Bar Index ... - * - * @param barIndex: Integer ... - */ -void FillBuffersZero(int barIndex) -{ - // - upTrendBuffer[barIndex] = 0; - downTrendBuffer[barIndex] = 0; - - // - maBuffer[barIndex] = 0; - adxBuffer[barIndex] = 0; - adxPBuffer[barIndex] = 0; - adxMBuffer[barIndex] = 0; -} - -/** - * Calculate Trends ... - * - * @param bar_index: Integer, Represent Current Bar ... - * @param prevCalculated: Integer, Represent Previous Calculated Bars ... - * @param ratesTotal: Integer, Represents All Available Bars ... - * @param open: Double Array, History of Open Prices ... - * @param high: Double Array, History of High Prices ... - * @param close: Double Array, History of Close Prices ... - * @param low: Double Array, History of Low Prices ... - * @param tickVolume: Long, History of Tick Volumes on Bar ... - */ -void CalculateTrend( - int bar_index, // Selected Bar Index - const int prevCalculated, - const int ratesTotal, - const double &open[], - const double &high[], - const double &close[], - const double &low[], - const long &tickVolume[] // -) -{ - // - ENUM_X_PRICE mPType = ToXPrice(trendPriceType); - double iPrice = GetAppliedPrice( - mPType, - open, - high, - low, - close, - bar_index // - ); - - // - double iMa = maBuffer[bar_index]; - double iAdx = adxBuffer[bar_index]; - double points = GetPoints(_Symbol); - double points10 = 10 * points; - - // - bool isUpTrend = - iPrice > iMa && - iAdx > adxThreshold; - bool isDownTrend = - iPrice < iMa && - iAdx > adxThreshold; - - // - if (isUpTrend) - { - // - // double iLastValue = - // prevCalculated <= 0 - // ? 0 - // : upTrendBuffer[bar_index + 1]; - // if (iLastValue > 0 && - // iValue > iLastValue) - // { - // iValue = iLastValue; - // } - - // - double selectedValue = low[bar_index] - points10; - - // - double iValue = - !IsBullish(lastTrendDir) ? selectedValue - : !showOnlyTrendStart - ? lastValue - : 0; - - // - upTrendBuffer[bar_index] = iValue; - upTBuffer[bar_index] = selectedValue; - - // - downTrendBuffer[bar_index] = 0; - - // - lastValue = iValue; - lastTrendDir = X_DIRECTION_BULLISH; - } - else if (isDownTrend) - { - // - // double iLastValue = - // prevCalculated <= 0 - // ? 0 - // : downTrendBuffer[bar_index + 1]; - // if (iLastValue > 0 && - // iValue < iLastValue) - // { - // iValue = iLastValue; - // } - - // - double selectedValue = high[bar_index] + points10; - - // - double iValue = - !IsBearish(lastTrendDir) ? selectedValue - : !showOnlyTrendStart - ? lastValue - : 0; - - // - upTrendBuffer[bar_index] = 0; - downTrendBuffer[bar_index] = iValue; - downTBuffer[bar_index] = selectedValue; - - // - lastValue = iValue; - lastTrendDir = X_DIRECTION_BEARISH; - } - else - { - // - double iValue = - IsBullish(lastTrendDir) - ? showOnlyTrendStart - ? 0 - : lastValue - : IsBearish(lastTrendDir) - ? showOnlyTrendStart - ? 0 - : lastValue - : 0; - - // - upTrendBuffer[bar_index] = 0; - downTrendBuffer[bar_index] = 0; - - // - upTBuffer[bar_index] = 0; - downTBuffer[bar_index] = 0; - - // - lastValue = 0; - lastTrendDir = X_DIRECTION_NONE; - } -} \ No newline at end of file diff --git a/Indicators/x-saherelm.x121.xvolume.mq5 b/Indicators/x-saherelm.x121.xvolume.mq5 deleted file mode 100644 index 0c2bb28c..00000000 --- a/Indicators/x-saherelm.x121.xvolume.mq5 +++ /dev/null @@ -1,544 +0,0 @@ -/////////////////////////////////////////////////////// -// -// SaherElm IT Center MQL5 Ocillator -// ------------------------------------------------- -// Name: X121 XVolume -// Description: Detect Bullish/Bearish Volumes ... -// -// -// 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 XVolume Ocillator" -#property strict - -// -// Definitions ... - -// -#define ShortName "X121_XVOLUME" - -// -// Imports ... -#include "../Libraries/x-saherelm.common.lib.mq5" - -// -// Inputs ... - -// -// Makret ... -input group "Market"; -input int maLength = 14; // Moving Averge Length -input ENUM_X_MA_METHOD maMethod = X_MA_MODE_EMA; // Moving Averge Method - -// -// Presentation ... -input group "Presentation"; -input int startCalculationForLastBars = 1000; // Calculate Last n Bars -input bool showBullishVolume = true; // Show Bullish Volume -input bool showBullishVolumeMa = true; // Show Bullish Volume Moving Average -input bool showBearishVolume = true; // Show Bearish Volume -input bool showBearishVolumeMa = true; // Show Bearish Volume Moving Average - -// -// Buffers Props ... - -// -#property indicator_separate_window - -// -#property indicator_buffers 6 -#property indicator_plots 4 - -// -// Buffers ... - -// -#define bullishVolumeBufferIndex 0 -double bullishVolumeBuffer[]; - -#property indicator_label1 "Bullish Volume" -#property indicator_type1 DRAW_HISTOGRAM -#property indicator_color1 clrLime -#property indicator_style1 STYLE_DOT -#property indicator_width1 1 - -// -#define bullishVolumeMaBufferIndex 1 -double bullishVolumeMaBuffer[]; - -#property indicator_label2 "Bullish Volume MA" -#property indicator_type2 DRAW_LINE -#property indicator_color2 clrLime -#property indicator_style2 STYLE_SOLID -#property indicator_width2 1 - -// -#define bearishVolumeBufferIndex 2 -double bearishVolumeBuffer[]; - -#property indicator_label3 "Bearish Volume" -#property indicator_type3 DRAW_HISTOGRAM -#property indicator_color3 clrRed -#property indicator_style3 STYLE_DOT -#property indicator_width3 1 - -// -#define bearishVolumeMaBufferIndex 3 -double bearishVolumeMaBuffer[]; - -#property indicator_label4 "Bearish Volume MA" -#property indicator_type4 DRAW_LINE -#property indicator_color4 clrRed -#property indicator_style4 STYLE_SOLID -#property indicator_width4 1 - -// -// Data Buffers ... - -#define mLastBufferIndex 3 - -// -#define rawBullishVolumeBufferIndex mLastBufferIndex + 1 -double rawBullishVolumeBuffer[]; - -// -#define rawBearishVolumeBufferIndex mLastBufferIndex + 2 -double rawBearishVolumeBuffer[]; - -// -// Variables, Properties and etc ... - -// -// this counts Available Bars ... -int limit; - -// -int maxLength; - -// -// Event Handlers ... - -/** - * Initialize Indicator ... - * - * @return ( int ) - */ -int OnInit() -{ - // - // Validate Inputs ... - if (!ValidateInputs()) - { - return INIT_PARAMETERS_INCORRECT; - } - - // - // Initialize Indicator Handlers ... - - // - // 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(); - IndicatorSetInteger(INDICATOR_DIGITS, 2); - - // - // Init Succeed ... - return INIT_SUCCEEDED; -} - -/** - * De Initialize Indicator ... - * - * @param reason: Integer, De Initialization Reason ... - */ -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 -} - -/** - * Calculate Bars ... - * - * @param rates_total: Integer, Total Bars on Chart ... - * @param prev_calculated: Integer, Total Calculated Bars on Charts ... - * @param time: DateTime Array, History of Open Time ... - * @param open: Double Array, History of Open Prices ... - * @param high: Double Array, History of High Prices ... - * @param low: Double Array, History of Low Prices ... - * @param close: Double Array, History of Close Prices ... - * @param tick_volume: Long, History of Tick Volumes on Bar ... - * @param volume: Long, History of Trade Volumes ... - * @param spread: Double, History of Spread Price ... - * - * @return ( int ) - */ -int OnCalculate( - const int rates_total, - const int prev_calculated, - const datetime &time[], - const double &open[], - const double &high[], - const double &low[], - const double &close[], - const long &tick_volume[], - const long &volume[], - const int &spread[] // -) -{ - // - // 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); - - // - limit = (prev_calculated > rates_total || prev_calculated <= 0) - ? rates_total - : (rates_total - prev_calculated) + 1; - - // - // Main Loop ... - for (int i = limit - 1; i >= 0 && !IsStopped(); i--) - { - // - CalculateBuffers( - // - i, - prev_calculated, - rates_total, - // - open, - high, - close, - low, - tick_volume // - ); - } - - // - return rates_total; -} - -// -// Functions ... - -/** - * Validate Input Args for Initialization ... - * - * @return ( bool ) - */ -bool ValidateInputs() -{ - // - bool result = false; - - // - result = maLength > 0 && - IsValid(maMethod); - - // - return result; -} - -/** - * Extract Max Length of Inputs ... - * - * @return ( int ) - */ -int ExtractMaxLengthOfInputs() -{ - // - int result = 0; - - // - result = MathMax(0, maLength); - - // - return result; -} - -/** - * Set Indicator Short Name and also we can define Buffers Labels ... - */ -void SetIndicatorName() -{ - IndicatorSetString(INDICATOR_SHORTNAME, ShortName); -} - -/** - * Define Required Buffers ... - */ -void DefineBuffers() -{ - // - // Plot Buffers ... - - // - // Bullish ... - - // - // Volume ... - ENUM_DRAW_TYPE bullishVolumeDrawType = showBullishVolume ? DRAW_HISTOGRAM : DRAW_NONE; - - // - ArraySetAsSeries(bullishVolumeBuffer, true); - SetIndexBuffer(bullishVolumeBufferIndex, bullishVolumeBuffer, INDICATOR_DATA); - PlotIndexSetDouble(bullishVolumeBufferIndex, PLOT_EMPTY_VALUE, EMPTY_VALUE); - PlotIndexSetInteger(bullishVolumeBufferIndex, PLOT_SHOW_DATA, showBullishVolume); - PlotIndexSetInteger(bullishVolumeBufferIndex, PLOT_DRAW_TYPE, bullishVolumeDrawType); - - // - // Average ... - ENUM_DRAW_TYPE bullishVolumeMaDrawType = showBullishVolumeMa ? DRAW_LINE : DRAW_NONE; - - // - ArraySetAsSeries(bullishVolumeMaBuffer, true); - SetIndexBuffer(bullishVolumeMaBufferIndex, bullishVolumeMaBuffer, INDICATOR_DATA); - PlotIndexSetDouble(bullishVolumeMaBufferIndex, PLOT_EMPTY_VALUE, 0.0); - PlotIndexSetInteger(bullishVolumeMaBufferIndex, PLOT_SHOW_DATA, showBullishVolumeMa); - PlotIndexSetInteger(bullishVolumeMaBufferIndex, PLOT_DRAW_TYPE, bullishVolumeMaDrawType); - - // - // Bearish ... - - // - // Volume ... - ENUM_DRAW_TYPE bearishVolumeDrawType = showBearishVolume ? DRAW_HISTOGRAM : DRAW_NONE; - - // - ArraySetAsSeries(bearishVolumeBuffer, true); - SetIndexBuffer(bearishVolumeBufferIndex, bearishVolumeBuffer, INDICATOR_DATA); - PlotIndexSetDouble(bearishVolumeBufferIndex, PLOT_EMPTY_VALUE, EMPTY_VALUE); - PlotIndexSetInteger(bearishVolumeBufferIndex, PLOT_SHOW_DATA, showBearishVolume); - PlotIndexSetInteger(bearishVolumeBufferIndex, PLOT_DRAW_TYPE, bearishVolumeDrawType); - - // - // Average ... - ENUM_DRAW_TYPE bearishVolumeMaDrawType = showBearishVolumeMa ? DRAW_LINE : DRAW_NONE; - - // - ArraySetAsSeries(bearishVolumeMaBuffer, true); - SetIndexBuffer(bearishVolumeMaBufferIndex, bearishVolumeMaBuffer, INDICATOR_DATA); - PlotIndexSetDouble(bearishVolumeMaBufferIndex, PLOT_EMPTY_VALUE, 0.0); - PlotIndexSetInteger(bearishVolumeMaBufferIndex, PLOT_SHOW_DATA, showBearishVolumeMa); - PlotIndexSetInteger(bearishVolumeMaBufferIndex, PLOT_DRAW_TYPE, bearishVolumeMaDrawType); - - // - // Data Buffers ... - - // - ArraySetAsSeries(rawBullishVolumeBuffer, true); - SetIndexBuffer(rawBullishVolumeBufferIndex, rawBullishVolumeBuffer, INDICATOR_CALCULATIONS); - - // - ArraySetAsSeries(rawBearishVolumeBuffer, true); - SetIndexBuffer(rawBearishVolumeBufferIndex, rawBearishVolumeBuffer, INDICATOR_CALCULATIONS); -} - -/** - * Calculate Custom Buffers ... - * - * @param bar_index: Integer, Represent Current Bar ... - * @param prevCalculated: Integer, Represent Previous Calculated Bars ... - * @param ratesTotal: Integer, Represents All Available Bars ... - * @param open: Double Array, History of Open Prices ... - * @param high: Double Array, History of High Prices ... - * @param close: Double Array, History of Close Prices ... - * @param low: Double Array, History of Low Prices ... - * @param tickVolume: Long, History of Tick Volumes on Bar ... - */ -void CalculateBuffers( - int bar_index, // Selected Bar Index - const int prevCalculated, - const int ratesTotal, - const double &open[], - const double &high[], - const double &close[], - const double &low[], - const long &tickVolume[] // -) -{ - // - int barsLimit = startCalculationForLastBars > 0 - ? startCalculationForLastBars - : 0; - // - // bool canCalculate = true; - bool canCalculate = - barsLimit == 0 || - bar_index <= barsLimit; - if (canCalculate) - { - // - CalculateValues( - bar_index, - prevCalculated, - ratesTotal, - open, - high, - close, - low, - tickVolume // - ); - } - else - { - FillBuffersZero(bar_index); - } -} - -/** - * Fill All Bufers to Zero Vlue for Specified Bar Index ... - * - * @param barIndex: Integer ... - */ -void FillBuffersZero(int barIndex) -{ - // - bullishVolumeBuffer[barIndex] = EMPTY_VALUE; - bullishVolumeMaBuffer[barIndex] = EMPTY_VALUE; - rawBullishVolumeBuffer[barIndex] = 0; - - // - bearishVolumeBuffer[barIndex] = EMPTY_VALUE; - bearishVolumeMaBuffer[barIndex] = EMPTY_VALUE; - rawBearishVolumeBuffer[barIndex] = 0; -} - -/** - * Calculate Vales ... - * - * @param bar_index: Integer, Represent Current Bar ... - * @param prevCalculated: Integer, Represent Previous Calculated Bars ... - * @param ratesTotal: Integer, Represents All Available Bars ... - * @param open: Double Array, History of Open Prices ... - * @param high: Double Array, History of High Prices ... - * @param close: Double Array, History of Close Prices ... - * @param low: Double Array, History of Low Prices ... - * @param tickVolume: Long, History of Tick Volumes on Bar ... - */ -void CalculateValues( - int bar_index, // Selected Bar Index - const int prevCalculated, - const int ratesTotal, - const double &open[], - const double &high[], - const double &close[], - const double &low[], - const long &tickVolume[] // -) -{ - // - XOHCL bar; - bool has = bar.Init( - _Symbol, - _Period, - bar_index // - ); - if (!has) - { - return; - } - - // - double iBullishVolume = 0; - double iBearishVolume = 0; - - // - if (bar.IsBullish()) - { - // - iBullishVolume = (double)bar.volume; - iBearishVolume = 0; - } - else if (bar.IsBearish()) - { - // - iBearishVolume = (double)bar.volume; - iBullishVolume = 0; - } - else - { - // - double volume = ((double)bar.volume) / 2.0; - iBullishVolume = volume; - iBearishVolume = volume; - } - - // - bullishVolumeBuffer[bar_index] = - iBullishVolume == 0 - ? EMPTY_VALUE - : iBullishVolume; - rawBullishVolumeBuffer[bar_index] = iBullishVolume; - - // - bearishVolumeBuffer[bar_index] = - iBearishVolume == 0 - ? EMPTY_VALUE - : iBearishVolume; - rawBearishVolumeBuffer[bar_index] = iBearishVolume; - - // - // Calculate Moving Averages ... - - // - int bullishMAsCount = iMAOnBuffer( - ratesTotal, - prevCalculated, - bar_index, - maLength, - rawBullishVolumeBuffer, - bullishVolumeMaBuffer, - maMethod // - ); - - // - int bearishMAsCount = iMAOnBuffer( - ratesTotal, - prevCalculated, - bar_index, - maLength, - rawBearishVolumeBuffer, - bearishVolumeMaBuffer, - maMethod // - ); - - // - bar.Clean(); -} - -// diff --git a/Indicators/x-saherelm.x121.xvwap.mq5 b/Indicators/x-saherelm.x121.xvwap.mq5 deleted file mode 100644 index ca2a2c46..00000000 --- a/Indicators/x-saherelm.x121.xvwap.mq5 +++ /dev/null @@ -1,712 +0,0 @@ -/////////////////////////////////////////////////////// -// -// SaherElm IT Center MQL5 Indicator -// ------------------------------------------------- -// Name: X121 XVWAP -// Description: XVWAP ... -// -// -// 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 XVWAP Indicator" -#property strict - -// -// Definitions ... - -// -#define ShortName "X121 XVWAP" - -// -// Includes Common Library ... -#include "../Libraries/x-saherelm.common.lib.mq5" - -// -// Inputs ... - -// -// Market ... -input group "Market"; -input int vwapFastLength = 20; // Fast Length -input int vwapMidLength = 40; // Mid Length -input int vwapSlowLength = 60; // Slow Length -input ENUM_APPLIED_PRICE vwapAppliedTo = PRICE_CLOSE; // Applied To - -// -// Presentation ... -input group "Presentation"; - -// -input int startCalculationForLastBars = 1000; // Calculate Last n Bars - -// -input bool showVWapFast = true; // Show VWap Fast -input bool showVWapMedium = true; // Show VWap Medium -input bool showVWapSlow = true; // Show VWap Slow - -// -// Buffers ... - -// -#define hideColorIDX 0 -#define bullishColorIDX 1 -#define bearishColorIDX 2 -#define neuturalColorIDX 3 - -// -#property indicator_chart_window - -// -#property indicator_buffers 11 -#property indicator_plots 3 - -// -// Plot Buffers ... - -// -// FAST ... -#define vwapFastBufferIndex 0 -double vwapFastBuffer[]; - -#define vwapFastColorBufferIndex 1 -double vwapFastColorBuffer[]; - -// -#define vwapFastPlotBufferIndex 0 -#property indicator_label1 "X121 VWF" -#property indicator_type1 DRAW_COLOR_LINE -#property indicator_color1 CLR_NONE, clrAqua, clrMagenta, clrGray -#property indicator_style1 STYLE_SOLID -#property indicator_width1 2 - -// -// MID ... -#define vwapMidBufferIndex 2 -double vwapMidBuffer[]; - -#define vwapMidColorBufferIndex 3 -double vwapMidColorBuffer[]; - -// -#define vwapMidPlotBufferIndex 1 -#property indicator_label2 "X121 VWM" -#property indicator_type2 DRAW_COLOR_LINE -#property indicator_color2 CLR_NONE, clrGreen, clrRed, clrGray -#property indicator_style2 STYLE_SOLID -#property indicator_width2 2 - -// -// SLOW ... -#define vwapSlowBufferIndex 4 -double vwapSlowBuffer[]; - -#define vwapSlowColorBufferIndex 5 -double vwapSlowColorBuffer[]; - -// -#define vwapSlowPlotBufferIndex 2 -#property indicator_label3 "X121 VWS" -#property indicator_type3 DRAW_COLOR_LINE -#property indicator_color3 CLR_NONE, clrSteelBlue, clrDarkRed, clrGray -#property indicator_style3 STYLE_SOLID -#property indicator_width3 2 - -// -// Data Buffers ... - -// -int mLastBufferIndex = 5; - -// -// Volume ... -#define vwapVolumeBufferIndex mLastBufferIndex + 1 -double vwapVolumeBuffer[]; - -// -// Price ... -#define vwapPriceBufferIndex mLastBufferIndex + 2 -double vwapPriceBuffer[]; - -// -// Fast State ... -#define vwapFastStateBufferIndex mLastBufferIndex + 3 -double vwapFastStateBuffer[]; - -// -// Mid State ... -#define vwapMidStateBufferIndex mLastBufferIndex + 4 -double vwapMidStateBuffer[]; - -// -// Slow State ... -#define vwapSlowStateBufferIndex mLastBufferIndex + 5 -double vwapSlowStateBuffer[]; - -// -// Variables, Properties and etc ... - -// -// this counts Available Bars ... -int limit; - -// -int maxLength; - -// -// Event Handlers ... - -/** - * Initialize Indicator ... - * - * @return ( int ) - */ -int OnInit() -{ - // - // Validate Inputs ... - if (!ValidateInputs()) - { - return INIT_PARAMETERS_INCORRECT; - } - - // - // Initialize Indicator Handlers ... - - // - // 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; -} - -/** - * De Initialize Indicator ... - * - * @param reason: Integer, De Initialization Reason ... - */ -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 -} - -/** - * Calculate Bars ... - * - * @param rates_total: Integer, Total Bars on Chart ... - * @param prev_calculated: Integer, Total Calculated Bars on Charts ... - * @param time: DateTime Array, History of Open Time ... - * @param open: Double Array, History of Open Prices ... - * @param high: Double Array, History of High Prices ... - * @param low: Double Array, History of Low Prices ... - * @param close: Double Array, History of Close Prices ... - * @param tick_volume: Long, History of Tick Volumes on Bar ... - * @param volume: Long, History of Trade Volumes ... - * @param spread: Double, History of Spread Price ... - * - * @return ( int ) - */ -int OnCalculate( - const int rates_total, - const int prev_calculated, - const datetime &time[], - const double &open[], - const double &high[], - const double &low[], - const double &close[], - const long &tick_volume[], - const long &volume[], - const int &spread[] // -) -{ - // - // 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); - - // - // Validate Calculated Bars ... - - // - limit = (prev_calculated > rates_total || prev_calculated <= 0) - ? rates_total - : (rates_total - prev_calculated) + 1; - - // - // Buffers Copy ... - - // - // Main Loop ... - for (int i = limit - 1; i >= 0 && !IsStopped(); i--) - { - // - CalculateBuffers( - i, - prev_calculated, - rates_total, - // - open, - high, - close, - low, - tick_volume // - ); - } - - // - return rates_total; -} - -// -// Functions ... - -/** - * Validate Input Args for Initialization ... - * - * @return ( bool ) - */ -bool ValidateInputs() -{ - // - bool result = false; - - // - result = - // - vwapFastLength > 2 && - vwapMidLength > vwapFastLength && - vwapSlowLength > vwapMidLength - // - ; - - // - return result; -} - -/** - * Extract Max Length of Inputs ... - * - * @return ( int ) - */ -int ExtractMaxLengthOfInputs() -{ - // - int result = 0; - - // - // XVWAP ... - result = MathMax(result, vwapFastLength); - result = MathMax(result, vwapMidLength); - result = MathMax(result, vwapSlowLength); - - // - return result; -} - -/** - * Define Required Buffers ... - */ -void DefineBuffers() -{ - // - // Plot Buffers ... - - // - // Fast ... - ArraySetAsSeries(vwapFastBuffer, true); - ArraySetAsSeries(vwapFastColorBuffer, true); - SetIndexBuffer(vwapFastBufferIndex, vwapFastBuffer, INDICATOR_DATA); - SetIndexBuffer(vwapFastColorBufferIndex, vwapFastColorBuffer, INDICATOR_COLOR_INDEX); - - // - // Mid ... - ArraySetAsSeries(vwapMidBuffer, true); - ArraySetAsSeries(vwapMidColorBuffer, true); - SetIndexBuffer(vwapMidBufferIndex, vwapMidBuffer, INDICATOR_DATA); - SetIndexBuffer(vwapMidColorBufferIndex, vwapMidColorBuffer, INDICATOR_COLOR_INDEX); - - // - // Slow ... - ArraySetAsSeries(vwapSlowBuffer, true); - ArraySetAsSeries(vwapSlowColorBuffer, true); - SetIndexBuffer(vwapSlowBufferIndex, vwapSlowBuffer, INDICATOR_DATA); - SetIndexBuffer(vwapSlowColorBufferIndex, vwapSlowColorBuffer, INDICATOR_COLOR_INDEX); - - // - // Data Buffers ... - - // - // Volumes ... - ArraySetAsSeries(vwapVolumeBuffer, true); - SetIndexBuffer(vwapVolumeBufferIndex, vwapVolumeBuffer, INDICATOR_CALCULATIONS); - - // - // Price ... - ArraySetAsSeries(vwapPriceBuffer, true); - SetIndexBuffer(vwapPriceBufferIndex, vwapPriceBuffer, INDICATOR_CALCULATIONS); - - // - // Fast State ... - ArraySetAsSeries(vwapFastStateBuffer, true); - SetIndexBuffer(vwapFastStateBufferIndex, vwapFastStateBuffer, INDICATOR_CALCULATIONS); - - // - // Mid State ... - ArraySetAsSeries(vwapMidStateBuffer, true); - SetIndexBuffer(vwapMidStateBufferIndex, vwapMidStateBuffer, INDICATOR_CALCULATIONS); - - // - // Slow State ... - ArraySetAsSeries(vwapSlowStateBuffer, true); - SetIndexBuffer(vwapSlowStateBufferIndex, vwapSlowStateBuffer, INDICATOR_CALCULATIONS); -} - -/** - * Set Indicator Short Name and also we can define Buffers Labels ... - */ -void SetIndicatorName() -{ - IndicatorSetString(INDICATOR_SHORTNAME, ShortName); -} - -/** - * Calculate Custom Buffers ... - * - * @param bar_index: Integer, Represent Current Bar ... - * @param prevCalculated: Integer, Represent Previous Calculated Bars ... - * @param ratesTotal: Integer, Represents All Available Bars ... - * @param open: Double Array, History of Open Prices ... - * @param high: Double Array, History of High Prices ... - * @param close: Double Array, History of Close Prices ... - * @param low: Double Array, History of Low Prices ... - * @param tickVolume: Long, History of Tick Volumes on Bar ... - */ -void CalculateBuffers( - int bar_index, // Selected Bar Index - const int prevCalculated, - const int ratesTotal, - const double &open[], - const double &high[], - const double &close[], - const double &low[], - const long &tickVolume[] // -) -{ - // - int barsLimit = startCalculationForLastBars > 0 - ? startCalculationForLastBars - : 0; - // - // bool canCalculate = true; - bool canCalculate = - barsLimit == 0 || - bar_index <= barsLimit; - if (canCalculate) - { - // - // Calculate Required VWAP Data Buffers ... - if (ratesTotal - bar_index <= maxLength) - { - // - CalculateVWAPDataBuffers( - bar_index, - prevCalculated, - ratesTotal, - open, - high, - close, - low, - tickVolume // - ); - - // - // Prevent Moving Forward ... - } - else - { - // - CalculateVWAPDataBuffers( - bar_index, - prevCalculated, - ratesTotal, - open, - high, - close, - low, - tickVolume // - ); - - // - CalculateVWAPS( - bar_index, - prevCalculated, - ratesTotal, - open, - high, - close, - low, - tickVolume // - ); - } - } - else - { - FillBuffersZero(bar_index); - } -} - -// -// Custom ... - -/** - * Fill All Bufers to Zero Vlue for Specified Bar Index ... - * - * @param barIndex: Integer ... - */ -void FillBuffersZero(int barIndex) -{ - // - vwapFastBuffer[barIndex] = EMPTY_VALUE; - vwapMidBuffer[barIndex] = EMPTY_VALUE; - vwapSlowBuffer[barIndex] = EMPTY_VALUE; - vwapVolumeBuffer[barIndex] = EMPTY_VALUE; - vwapPriceBuffer[barIndex] = EMPTY_VALUE; - - // - vwapFastColorBuffer[barIndex] = hideColorIDX; - vwapMidColorBuffer[barIndex] = hideColorIDX; - vwapSlowColorBuffer[barIndex] = hideColorIDX; - vwapFastStateBuffer[barIndex] = hideColorIDX; - vwapMidStateBuffer[barIndex] = hideColorIDX; - vwapSlowStateBuffer[barIndex] = hideColorIDX; -} - -/** - * Calculate VWAP Value for Specified Bar ... - * - * @param bar_index: Integer, Represent Current Bar ... - * @param prevCalculated: Integer, Represent Previous Calculated Bars ... - * @param ratesTotal: Integer, Represents All Available Bars ... - * @param open: Double Array, History of Open Prices ... - * @param high: Double Array, History of High Prices ... - * @param close: Double Array, History of Close Prices ... - * @param low: Double Array, History of Low Prices ... - * @param tickVolume: Long, History of Tick Volumes on Bar ... - * @param _length: Integer, Specified VWAP Length ... - * @param _show: Boolean, Specified Show Buffer or not ... - * @param _buffer: Double Array Reference, Points to Buffer ... - * @param _colorBuffer: Double Array Reference, Points to Color Buffer ... - * @param _stateBuffer: Double Array Reference, Points to State Buffer ... - */ -void CalculateVWAP( - int bar_index, // Selected Bar Index - const int prevCalculated, - const int ratesTotal, - const double &open[], - const double &high[], - const double &close[], - const double &low[], - const long &tickVolume[], - // - int _length, // Calculation Length - bool _show, - double &_buffer[], - double &_colorBuffer[], - double &_stateBuffer[] // -) -{ - // - double vSum = 0; - double pSum = 0; - double mSum = 0; - for (int x = 0; x < _length; x++) - { - // - pSum += vwapPriceBuffer[x + bar_index]; - vSum += vwapVolumeBuffer[x + bar_index]; - mSum += vwapPriceBuffer[x + bar_index] * vwapVolumeBuffer[x + bar_index]; - } - - // - double iValue = mSum / vSum; - iValue = NormalizeDouble(iValue, _Digits); - - // - _buffer[bar_index] = iValue; - - // - bool isBullish = low[bar_index] > iValue; - bool isBearish = high[bar_index] < iValue; - - // - double iColor = - isBullish - ? bullishColorIDX - : isBearish - ? bearishColorIDX - : neuturalColorIDX; - - // - _colorBuffer[bar_index] = hideColorIDX; - _stateBuffer[bar_index] = iColor; - if (_show) - { - _colorBuffer[bar_index] = iColor; - } -} - -/** - * Calculate VWAP Required Data Buffers ... - * - * @param bar_index: Integer, Represent Current Bar ... - * @param prevCalculated: Integer, Represent Previous Calculated Bars ... - * @param ratesTotal: Integer, Represents All Available Bars ... - * @param open: Double Array, History of Open Prices ... - * @param high: Double Array, History of High Prices ... - * @param close: Double Array, History of Close Prices ... - * @param low: Double Array, History of Low Prices ... - * @param tickVolume: Long, History of Tick Volumes on Bar ... - */ -void CalculateVWAPDataBuffers( - int bar_index, // Selected Bar Index - const int prevCalculated, - const int ratesTotal, - const double &open[], - const double &high[], - const double &close[], - const double &low[], - const long &tickVolume[] // -) -{ - // - ENUM_X_PRICE mPType = ToXPrice(vwapAppliedTo); - double price = GetAppliedPrice( - mPType, - open, - high, - low, - close, - bar_index // - ); - vwapPriceBuffer[bar_index] = price; - vwapVolumeBuffer[bar_index] = (double)tickVolume[bar_index]; -} - -/** - * Calculate Different VWaps ... - * - * @param bar_index: Integer, Represent Current Bar ... - * @param prevCalculated: Integer, Represent Previous Calculated Bars ... - * @param ratesTotal: Integer, Represents All Available Bars ... - * @param open: Double Array, History of Open Prices ... - * @param high: Double Array, History of High Prices ... - * @param close: Double Array, History of Close Prices ... - * @param low: Double Array, History of Low Prices ... - * @param tickVolume: Long, History of Tick Volumes on Bar ... - */ -void CalculateVWAPS( - int bar_index, // Selected Bar Index - const int prevCalculated, - const int ratesTotal, - const double &open[], - const double &high[], - const double &close[], - const double &low[], - const long &tickVolume[] // -) -{ - // - // Fast ... - CalculateVWAP( - bar_index, - prevCalculated, - ratesTotal, - open, - high, - close, - low, - tickVolume, - // - vwapFastLength, - showVWapFast, - vwapFastBuffer, - vwapFastColorBuffer, - vwapFastStateBuffer // - ); - - // - // Mid ... - CalculateVWAP( - bar_index, - prevCalculated, - ratesTotal, - open, - high, - close, - low, - tickVolume, - // - vwapMidLength, - showVWapMedium, - vwapMidBuffer, - vwapMidColorBuffer, - vwapMidStateBuffer // - ); - - // - // Fast ... - CalculateVWAP( - bar_index, - prevCalculated, - ratesTotal, - open, - high, - close, - low, - tickVolume, - // - vwapSlowLength, - showVWapSlow, - vwapSlowBuffer, - vwapSlowColorBuffer, - vwapSlowStateBuffer // - ); -} - -// \ No newline at end of file diff --git a/X121SMCEA/Classes/x-121.smc.base.strategy.class.mq5 b/X121SMCEA/Classes/x-121.smc.base.strategy.class.mq5 deleted file mode 100644 index 302d397c..00000000 --- a/X121SMCEA/Classes/x-121.smc.base.strategy.class.mq5 +++ /dev/null @@ -1,627 +0,0 @@ -/////////////////////////////////////////////////////// -// -// SaherElm IT Center MQL5 Class Library -// -------------------------------------- -// Name: XSCX121SMCBaseStrategy -// Description: provides all based classes for use ... -// -// -// Maintainer: -// ------------ -// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) -// -////////////////////////////////////////////////////// -// -// Global Properties ... -#property library -#property copyright "Copyright 2023, SaherElm IT Center" -#property link "https://www.saherelm.ir" -#property version "1.00" -#property strict - -// -// Imports ... - -// -#include "../../Classes/x-saherelm.x-alert.class.mq5" -#include "../../Classes/x-saherelm.x-bar.analyser.class.mq5" -#include "../../Classes/x-saherelm.x-poi.class.mq5" -#include "../../Classes/x-saherelm.x-trade.class.mq5" -#include "../Classes/x-121.smc.cobjects.class.mq5" -#include "../Libraries/x-121.smc.lib.mq5" - -// -// Helper(s) ... - -// -// XStrategy Class Implementation(s) ... -class XCX121SMCBaseStrategy : public XCBaseAlert -{ - // - // Public ... - public: - // - XCAccount mAccount; - - // - // Constructor(s) ... - XCX121SMCBaseStrategy( - // - // Base ... - string _symbol, // Trading Symbol - ENUM_TIMEFRAMES _period // Trading TimeFrame - ) - { - // - mSymbol = _symbol; - mPeriod = _period; - - // - Init(); - } - - // - // Deconstructor ... - ~XCX121SMCBaseStrategy() - { - DeInit(); - } - - // - // Getter / Setter (s) ... - - /** - * Retrieve Symbol ... - * - * @return ( string ) - */ - string GetSymbol() - { - return mSymbol; - } - - /** - * Retrieve TimeFrame ... - * - * @return ( ENUM_TIMEFRAMES ) - */ - ENUM_TIMEFRAMES GetPeriod() - { - return mPeriod; - } - - /** - * Check Strategy is Disabled or not ... - * - * @return ( bool ) - */ - bool IsDisabled() - { - return mForceDisabled; - } - - /** - * Get Signal Volume ... - * - * @return ( double ) - */ - double Volume() - { - return mVolume; - } - - /** - * Set Signal Volume ... - * - * @param value: Double ... - */ - void Volume(double value) - { - // - if (value < 0.01) - { - value = 0.01; - } - - // - mVolume = value; - } - - /** - * Get Risk/Reward Ratio ... - * - * @return ( double ) - */ - double R2R() - { - return mR2R; - } - - /** - * Set Risk/Reward Ratio ... - * - * @param value: Double ... - */ - void R2R(double value) - { - // - if (value < 0) - { - value = 1.5; - } - - // - mR2R = value; - } - - /** - * Get Long Signalling State ... - * - * @return ( bool ) - */ - bool AllowLong() - { - return mAllowLong; - } - - /** - * Set Long Signalling State ... - * - * @param value: Boolean ... - */ - void AllowLong(bool value) - { - mAllowLong = value; - } - - /** - * Get Short Signalling State ... - * - * @return ( bool ) - */ - bool AllowShort() - { - return mAllowShort; - } - - /** - * Set Short Signalling State ... - * - * @param value: Argument 1 - */ - void AllowShort(bool value) - { - mAllowShort = value; - } - - // - // Actions ... - - /** - * Disable Strategy ... - */ - void Disable() - { - mForceDisabled = true; - } - - /** - * Enable Strategy ... - */ - void Enable() - { - mForceDisabled = false; - } - - /** - * Register Signal Event Handler ... - * - * @param handler: an Instance of TOnXSignal ... - */ - void AddXSignalEventHandler(TOnX121SMCSignal handler) - { - // - Add( - handler, - mSignalEventHandlers // - ); - } - - // - // Virtual Actions ... - - /** - * Destroy All Class Implementations ... - */ - virtual void Destroy() - { - } - - /** - * Handle Tick Processing ... - * - * @param positions: XPosition instance Collection ... - */ - virtual void HandleTick() - { - // - DoUnwaitedTicksWork(); - - // - // Check State ... - if (IsDisabled()) - { - return; - } - - // - // Check Signalling State ... - if (!AllowLong() && !AllowShort()) - { - return; - } - - // - // Check Bar Tracker State ... - if (!mBarTracker.CanProcessBar()) - { - return; - } - - // - // Retrieve Current Tick and Check it's Time - // by Last Issued Tick ... - MqlTick cTick; - bool hasTick = GetTick( - mSymbol, - cTick // - ); - bool isSameAsLast = cTick.time == mLastTick.time; - if (isSameAsLast) - { - return; - } - - // - // Update Last Issued Tick ... - mLastTick = cTick; - - // - // Check Current Processing Tick has Signal or not ... - XSignal signal; - X121SMCStrategyConditions conditions; - bool hasSignal = HasSignal( - signal, - conditions // - ); - if (!hasSignal) - { - return; - } - - // - // Waits Until Next Candle if Current Tick has Signal ... - mBarTracker.Waits(); - - // - // Notify Signal Event Handlers ... - NotifyOnSignalEventHandlers( - signal, - conditions // - ); - } - - /** - * Check for any Guards ... - * - * @param guards: X121SMCGuard instance Collection ... - * @param positions: XPosition instance Collection ... - * - * @return ( virtual bool ) - */ - virtual bool HandleGuard( - X121SMCGuard &guards[], - XPosition &positions[] // - ) - { - // - bool result = false; - - // - // Check State ... - if (IsDisabled()) - { - return result; - } - - // - // Check Signalling State ... - if (!AllowLong() && !AllowShort()) - { - return result; - } - - // - // Check Bar Tracker State ... - if (!mGuardBarTracker.CanProcessBar()) - { - return result; - } - - // - // Check For Guards ... - result = CheckGuard( - guards, - positions // - ); - - // - // Waits Until Next Candle if Current Tick has Guard ... - mGuardBarTracker.Waits(); - - // - Clean(positions); - - // - return result; - } - - /** - * Check For Signal ... - * - * @param signal: XSignal instance ... - * @param conditions: X121SMCStrategyConditions instance ... - * - * @return ( virtual bool ) - */ - virtual bool HasSignal( - XSignal &signal, - X121SMCStrategyConditions &conditions // - ) - { - // - bool result = false; - - // - signal.Clean(); - conditions.Clean(); - - // - return result; - } - - /** - * Check for any Guard Actions ... - * - * @param guards: X121SMCGuard instance Collection ... - * - * @return ( virtual bool ) - */ - virtual bool CheckGuard( - X121SMCGuard &guards[], - const XPosition &positions[] // Positions ... - ) - { - // - bool result = false; - - // - return result; - } - - /** - * Update all Requirements without waiting ... - */ - virtual void DoUnwaitedTicksWork() - { - } - - /** - * Detect SL Candidates based on Strategy and Conditions ... - * - * @param result: Double array reference ... - * @param entry: Double, Position Entry Price ... - * @param conditions: X121SMCStrategyConditions instance, Provides Configurations ... - * @param type: ENUM_X_POSITION_TYPES member, Specified Position Type ... - */ - virtual void DetectSLCandidates( - double &result[], - double entry, - X121SMCStrategyConditions &conditions, - ENUM_X_POSITION_TYPES type // - ) - { - } - - /** - * Customize Strategy Identifier ... - * - * @return ( virtual string ) - */ - virtual string GetTag() - { - return X121SMCStrategyToken; - } - - // - // Protected ... - protected: - // - - // - // Props ... - - // - MqlTick mLastTick; // Last Issued Tick ... - - // - XBarTracker mBarTracker; // Strategy Bar Tracker ... - XBarTracker mGuardBarTracker; // Strategy Guard Bar Tracker ... - XCBarAnalyser *mBarAnalyser; // Bar Analyser Instance - - // - // Actions ... - - /** - * Prepare and Normalize Signal for Execution in Strategy ... - * - * @param signal: XSignal instance ... - * - * @return ( bool ) - */ - bool PrepareSignal(XSignal &signal) - { - // - bool result = false; - - // - // Check Strategy Is Enables ... - result = !IsDisabled(); - if (!result) - { - return result; - } - - // - // Validate Signal ... - result = signal.IsValid(); - if (!result) - { - return result; - } - - // - bool isLong = IsLong(signal.type); - - // - // TODO: Implement Signal Preparation Mechanism here ... - - // - return result; - } - - // - - /** - * Notified Signal Event Handler(s) ... - * - * @param signal: XSignal instance ... - * @param conditions: XStrategyConditions instance ... - */ - void NotifyOnSignalEventHandlers( - XSignal &signal, - X121SMCStrategyConditions &conditions // - ) - { - // - if (!signal.IsValid() || !conditions.IsValid()) - { - return; - } - - // - int count = ArraySize(mSignalEventHandlers); - if (!IsValidSize(count)) - { - return; - } - - // - for (int i = 0; i < count; i++) - { - // - mSignalEventHandlers[i]( - signal, - conditions // - ); - } - } - - // - // Private ... - private: - // - // Props ... - - // - string mSymbol; // Trading Symbol ... - ENUM_TIMEFRAMES mPeriod; // Trading TimeFrame ... - bool mForceDisabled; // Force Disabled ... - bool mAllowLong; // Allow Long Signals - bool mAllowShort; // Allow Short Signals - double mR2R; // Risk/Rewar Ratio ... - double mVolume; // Static Volume Per Trades ... - - // - // On X121 Signal Recieved Event Handler(s) ... - TOnX121SMCSignal mSignalEventHandlers[]; - - // - // Actions ... - - /** - * Install all Helpers and Prepare all Configurations for required Indicators ... - */ - void Init() - { - // - mForceDisabled = false; - - // - R2R(1); - Volume(0.01); - - // - string symbol = Symbol(); - ENUM_TIMEFRAMES period = Period(); - - // - // Initialize Bar Tracker ... - mBarTracker.Init( - symbol, - period // - ); - - // - // Initialize Guard Bar Tracker ... - mGuardBarTracker.Init( - symbol, - period // - ); - - // - mBarAnalyser = new XCBarAnalyser(); - - // - } - - /** - * De Initialize all Tools ... - */ - void DeInit() - { - // - ZeroMemory(mBarAnalyser); - - // - delete mBarAnalyser; - - // - Clean(mSignalEventHandlers); - - // - Destroy(); - } - - /** - * Reste Bar Tracker ... - */ - void ResetBarTracker() - { - mBarTracker.Clean(); - } - - // -}; - -// \ No newline at end of file diff --git a/X121SMCEA/Classes/x-121.smc.cobjects.class.mq5 b/X121SMCEA/Classes/x-121.smc.cobjects.class.mq5 deleted file mode 100644 index 3f37d87a..00000000 --- a/X121SMCEA/Classes/x-121.smc.cobjects.class.mq5 +++ /dev/null @@ -1,35 +0,0 @@ -/////////////////////////////////////////////////////// -// -// SaherElm IT Center MQL5 Class Library -// -------------------------------------- -// Name: XChartObjects -// Description: provides all require Chart Objects ... -// -// -// 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 "../../Classes/x-saherelm.x-cobject.class.mq5" -#include "../Libraries/x-121.smc.lib.mq5" - -// -// Definitions ... - -enum ENUM_X121SMC_CHARTOBJECTS -{ - X_121_NONE_OBJ -}; - -// -// Implementations ... diff --git a/X121SMCEA/Classes/x-121.smc.ea.panel.class.mq5 b/X121SMCEA/Classes/x-121.smc.ea.panel.class.mq5 deleted file mode 100644 index 47d16e08..00000000 --- a/X121SMCEA/Classes/x-121.smc.ea.panel.class.mq5 +++ /dev/null @@ -1,63 +0,0 @@ -/////////////////////////////////////////////////////// -// -// SaherElm IT Center MQL5 Class Library -// -------------------------------------- -// Name: XC121Panel -// Description: provides all based classes for use ... -// -// -// Maintainer: -// ------------ -// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) -// -////////////////////////////////////////////////////// -// -// Global Properties ... -#property library -#property copyright "Copyright 2023, SaherElm IT Center" -#property link "https://www.saherelm.ir" -#property version "1.00" -#property strict - -// -// Imports ... -#include "../../Classes/x-saherelm.x-app-dialog.class.mq5" - -// -// Implementation ... - -// -class X121CAppDialog : public XCAppDialog -{ - // - public: - // - // Constructor(s) ... - void X121CAppDialog() - { - } - - // - // Deconstructor ... - void ~X121CAppDialog() - { - } - - // - void Configure() - { - // - // Configure Dialog ... - BackgroundColor(clrBlack); - } - - // - protected: - // - - // - private: - // -}; - -// \ No newline at end of file diff --git a/X121SMCEA/Classes/x-121.smc.market.cycle.helper.class.mq5 b/X121SMCEA/Classes/x-121.smc.market.cycle.helper.class.mq5 deleted file mode 100644 index 0abcd78a..00000000 --- a/X121SMCEA/Classes/x-121.smc.market.cycle.helper.class.mq5 +++ /dev/null @@ -1,2009 +0,0 @@ -/////////////////////////////////////////////////////// -// -// SaherElm IT Center MQL5 Class Library -// -------------------------------------- -// Name: XC121SMCCycleHelper -// Description: provides all based classes for use ... -// -// -// Maintainer: -// ------------ -// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) -// -////////////////////////////////////////////////////// -// -// Global Properties ... -#property library -#property copyright "Copyright 2023, SaherElm IT Center" -#property link "https://www.saherelm.ir" -#property version "1.00" -#property strict - -// -// Imports ... -#include "../../Classes/x-saherelm.x-bar.analyser.class.mq5" -#include "../../Classes/x-saherelm.x-poi.class.mq5" -#include "../Libraries/x-121.smc.lib.mq5" - -// -// Definitions ... - -// -// Implementations ... - -// -// Cycles Enumeration ... -enum ENUM_X_CYCLES -{ - X_CYCLE_NONE, - X_CYCLE_TRIGGER, - X_CYCLE_DECISION, - X_CYCLE_ANALYSE, - X_CYCLE_VERIFICATION, - X_CYCLE_CONSOLIDATION, - X_CYCLE_VISION, -}; - -// -// String Representation of Cycles Enumeration ... -string ToString(ENUM_X_CYCLES value) -{ - // - string result = EnumToString(value); - - // - StringReplace(result, "X_CYCLE_", ""); - - // - return result; -} - -// -// Validate a Cycle ... -bool IsValid(ENUM_X_CYCLES value) -{ - // - bool result = false; - - // - result = - value != X_CYCLE_NONE; - - // - return result; -} - -// -// Cycle Events Enumeration ... -enum ENUM_X_CYCLE_EVENTS -{ - SAR_CHANGE_DETECTED, - NEW_PEAK_DETECTED, - NEW_VALE_DETECTED, - PIVOT_POINT_DETECTED, - VWAP_ORDER_CHANGE_ETECTED, - VWAP_STATE_CHANGE_DETCTED, - CONSOLIDATION_BREAKED_DETECTED, - PEAK_PIVOT_STARTED, - PEAK_PIVOT_ENDED, - VALE_PIVOT_STARTED, - VALE_PIVOT_ENDED, -}; - -// -// XPV Pivot ... - -// -enum ENUM_X_PV_PIVOT -{ - X_PV_NONE, // None - X_PV_PEAK, // Peak - X_PV_VALE, // Vale -}; - -// -bool IsValid(ENUM_X_PV_PIVOT value) -{ - // - bool result = false; - - // - result = value != X_PV_NONE; - - // - return result; -} - -// -string ToString(ENUM_X_PV_PIVOT value) -{ - // - string result = NULL; - - // - result = EnumToString(value); - - // - return result; -} - -// -struct XPVPivot -{ - // - // Props ... - datetime to; - double value; - double golden; - datetime from; - string symbol; - ENUM_X_PV_PIVOT type; - ENUM_TIMEFRAMES period; - - // - // Constructor ... - XPVPivot() - { - Clean(); - } - - // - // Tools ... - - /** - * Cleanup Model ... - */ - void Clean() - { - // - to = NULL; - value = 0; - from = NULL; - symbol = NULL; - period = NULL; - type = X_PV_NONE; - } - - /** - * Validate Model ... - * - * @return ( bool ) - */ - bool IsValid() - { - // - bool result = false; - - // - result = - // - from < to && - value > 0 && - IsValid(to) && - IsValid(type) && - IsValid(from) && - IsValid(symbol) && - IsValid(period) - // - ; - - // - return result; - } - - /** - * Retrieve Model Direction ... - * - * @return ( ENUM_X_DIRECTION ) - */ - ENUM_X_DIRECTION GetDirection() - { - // - ENUM_X_DIRECTION result = X_DIRECTION_NONE; - - // - if (!IsValid()) - { - return result; - } - - // - switch (type) - { - // - case X_PV_PEAK: - result = X_DIRECTION_BEARISH; - break; - - // - case X_PV_VALE: - result = X_DIRECTION_BULLISH; - break; - } - - // - return result; - } - - /** - * Check Direction is Bullish ... - * - * @return ( bool ) - */ - bool IsBullish() - { - // - bool result = false; - - // - result = IsValid(); - if (!result) - { - return result; - } - - // - ENUM_X_DIRECTION dir = GetDirection(); - result = IsBullish(dir); - - // - return result; - } - - /** - * Check Direction is Bearish ... - * - * @return ( bool ) - */ - bool IsBearish() - { - // - bool result = false; - - // - result = IsValid(); - if (!result) - { - return result; - } - - // - ENUM_X_DIRECTION dir = GetDirection(); - result = IsBearish(dir); - - // - return result; - } - - /** - * To Bar Index ... - * - * @return ( int ) - */ - int ToIndex( - ENUM_TIMEFRAMES forPeriod = NULL // - ) - { - // - int result = -1; - - // - if (!IsValid()) - { - return result; - } - - // - if (!IsValid(forPeriod)) - { - forPeriod = period; - } - - // - result = GetBarIndex( - symbol, - forPeriod, - to // - ); - - // - return result; - } - - /** - * From Bar Index ... - * - * @return ( int ) - */ - int FromIndex( - ENUM_TIMEFRAMES forPeriod = NULL // - ) - { - // - int result = -1; - - // - if (!IsValid()) - { - return result; - } - - // - if (!IsValid(forPeriod)) - { - forPeriod = period; - } - - // - result = GetBarIndex( - symbol, - forPeriod, - from // - ); - - // - return result; - } - - /** - * Check two Pivot is Same or Not ... - * - * @param item: XPVPivot instance Reference ... - * - * @return ( bool ) - */ - bool IsSameAs(XPVPivot &item) - { - // - bool result = false; - - // - result = IsValid() && - item.IsValid(); - if (!result) - { - return result; - } - - // - result = - // - to == item.to && - from == item.from && - type == item.type && - value == item.value && - golden == item.golden && - symbol == item.symbol && - period == item.period - // - ; - - // - return result; - } - - /** - * Conerts to XBoxZone ... - * - * @param box: XBoxZone instance Reference ... - * - * @return ( bool ) - */ - bool AsBox(XBoxZone &box) - { - // - bool result = false; - - // - box.Clean(); - - // - result = IsValid(); - if (!result) - { - return result; - } - - // - box.to = to; - box.from = from; - box.symbol = symbol; - box.period = period; - box.dir = GetDirection(); - box.type = ToString(type); - - // - if (IsBullish()) - { - // - box.lower = value; - box.upper = golden; - } - else if (IsBearish()) - { - // - box.upper = value; - box.lower = golden; - } - - // - result = box.IsValid(); - if (!result) - { - box.Clean(); - } - - // - return result; - } - - // -}; - -// -// Cycle Helper ... -class XC121SMCCycleHelper : public XCBase -{ - // - public: - // - // Props ... - - // - // X121 ... - XCX121Helper *mX121Helper; - - // - // POI Detector ... - XCPOIDrawer *mPOIDrawer; - XCPOIDetector *mPOIDetector; - - // - // Bar Analyser - XCBarAnalyser *mBarAnalyser; - - // - // Constructor(s) ... - XC121SMCCycleHelper() - { - Default(); - } - - // - // Deconstructor ... - ~XC121SMCCycleHelper() - { - DeInit(); - } - - // - // Getter/Setter(s) ... - - // - // Actions ... - - /** - * Initialize ... - * - * @param symbol: String ... - * @param period: ENUM_TIMEFRAMES member ... - * @param x121Inputs: X121Inputs instance ... - * - * @return ( bool ) - */ - bool Init( - string symbol, - ENUM_TIMEFRAMES period, - X121Inputs &x121Inputs, - int requiredPOIs = 50 // - ) - { - // - bool result = false; - - // - if (requiredPOIs < 0) - { - requiredPOIs = 0; - } - - // - result = IsValid(symbol) && - IsValid(period); - if (!result) - { - return result; - } - - // - mSymbol = symbol; - mPeriod = period; - - // - // X121 ... - mX121Helper = new XCX121Helper(); - result = mX121Helper.Init( - symbol, - period, - x121Inputs // - ); - if (!result) - { - return result; - } - - // - mPOIDetector = new XCPOIDetector( - symbol, - period // - ); - mPOIDetector.MaxRequiredPOIs(requiredPOIs); - - // - int maxLoopbackBars = mPOIDetector.MaxAllowedLoopbackForInit(); - int periodSeconds = PeriodSeconds(period); - if (periodSeconds > PeriodSeconds(PERIOD_M15)) - { - // - int multiplier = periodSeconds / PeriodSeconds(PERIOD_M15); - - // - if (multiplier >= 1) - { - maxLoopbackBars *= 2; - } - } - mPOIDetector.MaxAllowedLoopbackForInit(maxLoopbackBars); - mPOIDetector.Init(); - - // - // Initialize Bar Analyser Class Instance ... - mBarAnalyser = new XCBarAnalyser(); - - // - // Initial and Configure POI Drawer if Required ... - mPOIDrawer = new XCPOIDrawer(); - mPOIDrawer.ChartIdentification(0); - mPOIDrawer.SubWindowIdentification(0); - - // - mPOIDrawer.DemandZoneFill(false); - mPOIDrawer.SupplyZoneFill(false); - mPOIDrawer.BullishFVGFill(false); - mPOIDrawer.BearishFVGFill(false); - mPOIDrawer.SupportZoneFill(false); - mPOIDrawer.ResistanceZoneFill(false); - mPOIDrawer.BullishOrderBlockFill(false); - mPOIDrawer.BearishOrderBlockFill(false); - - // - // Set Chart Style ... - ApplyChartStyle(); - - // - return result; - } - - /** - * Retrieve Symbol ... - * - * @return ( string ) - */ - string GetSymbol() - { - return mSymbol; - } - - /** - * Retrieve TimeFrame (Period) ... - * - * @return ( ENUM_TIMEFRAMES ) - */ - ENUM_TIMEFRAMES GetPeriod() - { - return mPeriod; - } - - /** - * Get Specified Bar ... - * - * @param source: XOHCL instance, Source Bar ... - * @param bar: XOHCL instance, Dest Bar ... - * - * @return ( bool ) - */ - bool GetBar( - XOHCL &source, - XOHCL &bar // - ) - { - // - bool result = false; - - // - bar.Clean(); - - // - string symbol = GetSymbol(); - ENUM_TIMEFRAMES period = GetPeriod(); - - // - result = - IsValid(symbol) && - IsValid(period) && - source.IsValid(); - if (!result) - { - return result; - } - - // - int index = iBarShift( - symbol, - period, - source.time // - ); - result = bar.Init( - symbol, - period, - index // - ); - if (!result) - { - // - bar.Clean(); - return result; - } - - // - return result; - } - - /** - * Retrieve Specified Bar ... - * - * @param bar: XOHCL instance ... - * @param index: Integer ... - * - * @return ( bool ) - */ - bool GetBar( - XOHCL &bar, - int index = 0 // - ) - { - // - bool result = false; - - // - bar.Clean(); - - // - if (index < 0) - { - index = 0; - } - - // - string symbol = GetSymbol(); - ENUM_TIMEFRAMES period = GetPeriod(); - - // - result = bar.Init( - symbol, - period, - index // - ); - - // - return result; - } - - /** - * Retrieve Specified Bar ... - * - * @param bar: XOHCL instance ... - * @param time: Datetime ... - * - * @return ( bool ) - */ - bool GetBar( - XOHCL &bar, - datetime time = NULL // - ) - { - // - bool result = false; - - // - int index = GetBarIndex(time); - result = GetBar(bar, - index // - ); - - // - return result; - } - - /** - * Retrieve Specified Time Bar Index ... - * - * @param time: DateTime ... - * - * @return ( int ) - */ - int GetBarIndex(datetime time = NULL) - { - // - int result = -1; - - // - time = NormalizeTime(time); - - // - string symbol = GetSymbol(); - ENUM_TIMEFRAMES period = GetPeriod(); - - // - result = iBarShift( - symbol, - period, - time // - ); - - // - return result; - } - - /** - * Retrieve Cycle Conditions ... - * - * @param events: ENUM_X_CYCLE_EVENTS member, Array ... - * @param conditions: X121SMCCycleConditions instance ... - * @param barIndex: Integer ... - * @param loopback: Integer ... - * - * @return ( bool ) - */ - bool GetConditions( - ENUM_X_CYCLE_EVENTS &events[], - ENUM_XPOI_EVENTS &poiEvents[], - X121SMCCycleConditions &conditions, - int barIndex = 0, - int loopback = 7 // - ) - { - // - bool result = false; - - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - if (loopback < 5) - { - loopback = 5; - } - - // - Clean(events); - Clean(poiEvents); - conditions.Clean(); - - // - result = mX121Helper.GetConditions( - conditions.x121Conditions, - barIndex, - loopback // - ); - if (!result) - { - // - conditions.Clean(); - return result; - } - - // - mPOIDetector.Update(poiEvents); - mPOIDetector.GetState(conditions.state); - - // - conditions.symbol = GetSymbol(); - conditions.period = GetPeriod(); - conditions.time = TimeCurrent(); - - // - // Update(); - - // - result = conditions.IsValid(); - - // - return result; - } - - // - // Tools ... - - // - int DetectRejections( - XBoxZone &rejections[], - int barIndex = 0, - bool forceBarType = true, - bool forceFiboPressure = true, - bool forceUnUsedRejections = true, - int maxAllowedLoopback = 587 // - ) - { - // - int result = 0; - - // - // Normalize Args ... - Clean(rejections); - - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - int idx = -1; - bool has = false; - for (int i = barIndex + 1; i < barIndex + maxAllowedLoopback; i++) - { - // - // Init Indexed Bar ... - XOHCL iBar; - XOHCL iCBar; - XOHCL iPBar; - has = GetBar(iBar, i); - has = - has && - iBar.GetPreviousBar(iCBar); - has = - has && - iCBar.GetPreviousBar(iPBar); - if (!has) - { - // - iBar.Clean(); - iCBar.Clean(); - iPBar.Clean(); - break; - } - - // - // Check CBar Bullish Fibo Pressure ... - bool cBarHasBullishFiboPressure = - mBarAnalyser - .HasFiboPressure( - iCBar, - X_DIRECTION_BULLISH, - X_FIBO_LEVEL_382 // - ); - - // - // Check CBar Bearish Fibo Pressure ... - bool cBarHasBearishFiboPressure = - mBarAnalyser - .HasFiboPressure( - iCBar, - X_DIRECTION_BEARISH, - X_FIBO_LEVEL_382 // - ); - - // - // Check Bar is Bullish Rejection Swing ... - bool isBullishRejection = - // - iCBar.low < iBar.low && - iCBar.low < iPBar.low && - // - iCBar.low < iCBar.GetDown() && - iCBar.GetLowShadow() > iCBar.GetBody() && - iCBar.GetLowShadow() > iCBar.GetHighShadow() - // - ; - - // - // Check Bar is Bearish Rejection Swing ... - bool isBearishRejection = - // - iCBar.high > iBar.high && - iCBar.high > iPBar.high && - // - iCBar.high > iCBar.GetUp() && - iCBar.GetHighShadow() > iCBar.GetBody() && - iCBar.GetHighShadow() > iCBar.GetLowShadow() - // - ; - - // - // Apply Fibo Pressure ... - if (forceFiboPressure) - { - // - isBullishRejection = - isBullishRejection && - cBarHasBullishFiboPressure; - - // - isBearishRejection = - isBearishRejection && - cBarHasBearishFiboPressure; - } - - // - // Apply Force Bar Type ... - if (forceBarType) - { - // - isBullishRejection = - isBullishRejection && - iCBar.IsBullish(); - - // - isBearishRejection = - isBearishRejection && - iCBar.IsBearish(); - } - - // - // Summarize Result ... - has = isBullishRejection || - isBearishRejection; - if (has) - { - // - XBoxZone iBox; - - // - iBox.to = iBar.time; - iBox.from = iCBar.time; - iBox.period = iBar.period; - iBox.symbol = iBar.symbol; - - // - iBox.dir = - isBullishRejection - ? X_DIRECTION_BULLISH - : X_DIRECTION_BEARISH; - - // - iBox.upper = - isBullishRejection - ? iCBar.GetDown() - : iCBar.high; - - // - iBox.lower = - isBullishRejection - ? iCBar.low - : iCBar.GetUp(); - - // - iBox.type = - isBullishRejection - ? "XSwingLow" - : "XSwingHigh"; - - // - // Validate Box ... - has = iBox.IsValid(); - if (has) - { - // - // Apply Force Unused Rejections ... - if (forceUnUsedRejections) - { - // - has = !IsBoxBreaked( - iBox, - iCBar.Index() + 1, - barIndex // - ); - } - - // - if (has) - { - // - idx = FindIndex( - iBox, - rejections // - ); - has = !IsValidIndex(idx); - if (has) - { - // - AddRef( - iBox, - rejections // - ); - } - } - } - - // - iBox.Clean(); - } - - // - iBar.Clean(); - iCBar.Clean(); - iPBar.Clean(); - } - - // - result = ArraySize(rejections); - - // - return result; - } - - // - datetime DetectNearestCloseOverX3MAFast( - XOHCL &bar, - int maxAllowedBars = 20 // - ) - { - // - datetime result = NULL; - - // - if (!bar.IsValid()) - { - return result; - } - - // - bool has = false; - int idx = bar.Index(); - int start = idx; - int end = start + maxAllowedBars; - bool canContinue = true; - while (canContinue) - { - // - XOHCL iBar; - has = iBar.Init( - bar.symbol, - bar.period, - start // - ); - if (!has) - { - // - iBar.Clean(); - break; - } - - // - double iFast = mX121Helper - .x3maHelper - .GetX3MaFast(start); - - // - has = iBar.close > iFast && - iBar.open < iFast; - if (has) - { - result = iBar.time; - } - - // - canContinue = - start < end && - !IsValid(result); - - // - start++; - - // - iBar.Clean(); - } - - // - return result; - } - - // - datetime DetectNearestCloseUnderX3MAFast( - XOHCL &bar, - int maxAllowedBars = 20 // - ) - { - // - datetime result = NULL; - - // - if (!bar.IsValid()) - { - return result; - } - - // - bool has = false; - int idx = bar.Index(); - int start = idx; - int end = start + maxAllowedBars; - bool canContinue = true; - while (canContinue) - { - // - XOHCL iBar; - has = iBar.Init( - bar.symbol, - bar.period, - start // - ); - if (!has) - { - // - iBar.Clean(); - break; - } - - // - double iFast = mX121Helper - .x3maHelper - .GetX3MaFast(start); - - // - has = iBar.close < iFast && - iBar.open > iFast; - if (has) - { - result = iBar.time; - } - - // - canContinue = - start < end && - !IsValid(result); - - // - start++; - - // - iBar.Clean(); - } - - // - return result; - } - - // - bool DetectNearestStrSwitched( - XOHCL &bar, - ENUM_X_DIRECTION &dir, - int barIndex = 0, - int maxAllowedBars = 20 // - ) - { - // - bool result = false; - - // - bar.Clean(); - dir = X_DIRECTION_NONE; - barIndex = NormalizeInt(barIndex, 0); - maxAllowedBars = NormalizeInt(maxAllowedBars, 20); - - // - // Looping Through LoopBack Period ... - // for Detecting Result ... - for (int i = barIndex; i < barIndex + maxAllowedBars; i++) - { - // - XOHCL iBar; - result = iBar.Init( - GetSymbol(), - GetPeriod(), - i // - ); - if (!result) - { - // - iBar.Clean(); - break; - } - - // - double iStrState = mX121Helper.xstrHelper.GetSTRState(i); - double iStrStateP = mX121Helper.xstrHelper.GetSTRState(i + 1); - - // - bool isStrBullish = iStrState > 0; - bool isStrBullishP = iStrStateP > 0; - - // - bool isStrBearish = iStrState < 0; - bool isStrBearishP = iStrStateP < 0; - - // - bool isBullish = isStrBullish && - !isStrBullishP; - - // - bool isBearish = isStrBearish && - !isStrBearishP; - - // - result = isBullish || - isBearish; - if (result) - { - // - bar = iBar; - - // - dir = isBullish - ? X_DIRECTION_BULLISH - : X_DIRECTION_BEARISH; - - // - iBar.Clean(); - break; - } - - // - iBar.Clean(); - } - - // - return result; - } - - // - // Virtuals ... - - /** - * Set Default Properties Values ... - */ - virtual void Default() - { - } - - // - protected: - // - - // - private: - // - // Props ... - string mSymbol; - ENUM_TIMEFRAMES mPeriod; - - // - // Actions ... - - /** - * Release All Resources ... - */ - void DeInit() - { - // - ZeroMemory(mX121Helper); - ZeroMemory(mPOIDetector); - ZeroMemory(mBarAnalyser); - - // - delete mX121Helper; - delete mPOIDetector; - delete mBarAnalyser; - } - - /** - * Apply Chart Style ... - */ - void ApplyChartStyle() - { - // - // Retrieve Current Chart ID ... - long chartId = ChartID(); - - // - 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 - - // - ChartSetInteger(chartId, CHART_SHOW_BID_LINE, mShowBidLine); - ChartSetInteger(chartId, CHART_SHOW_ASK_LINE, mShowAskLine); - ChartSetInteger(chartId, CHART_SHOW_GRID, mShowGrid); - ChartSetInteger(chartId, CHART_SHOW_VOLUMES, mShowVolumes); - ChartSetInteger(chartId, CHART_SHOW_TRADE_LEVELS, mShowTradeLevels); - ChartSetInteger(chartId, CHART_AUTOSCROLL, mAutoScroll); - ChartSetInteger(chartId, CHART_QUICK_NAVIGATION, mQuickNavigation); - ChartSetInteger(chartId, CHART_COLOR_FOREGROUND, mForeGroundColor); - ChartSetInteger(chartId, CHART_COLOR_BACKGROUND, mBackGroundColor); - ChartSetInteger(chartId, CHART_COLOR_GRID, mGridColor); - ChartSetInteger(chartId, CHART_COLOR_BID, mBidLineColor); - ChartSetInteger(chartId, CHART_COLOR_ASK, mAskLineColor); - ChartSetInteger(chartId, CHART_COLOR_STOP_LEVEL, mStopColor); - ChartSetInteger(chartId, CHART_COLOR_VOLUME, mVolumesColor); - - // - // For Enabling XCC ... - // ChartSetInteger(chartId, CHART_MODE, mMode); - // ChartSetInteger(chartId, CHART_COLOR_CHART_UP, mUpColor); - // ChartSetInteger(chartId, CHART_COLOR_CHART_DOWN, mDownColor); - // ChartSetInteger(chartId, CHART_COLOR_CANDLE_BULL, mBullishColor); - // ChartSetInteger(chartId, CHART_COLOR_CANDLE_BEAR, mBearishColor); - // ChartSetInteger(chartId, CHART_COLOR_CHART_LINE, mLineColor); - } - - // -}; - -// -// Signal Provider Data ... -struct X121SMCStrategySignalProviderData -{ - // - // Props ... - - // - // Trigger ... - XPOIState triggerState; - double triggerBullishScore; - double triggerBearishScore; - X121Conditions triggerXConditions; - ENUM_XPOI_EVENTS triggerPoiEvents[]; - XC121SMCCycleHelper *triggerCycleHelper; - ENUM_X_CYCLE_EVENTS triggerCycleEvents[]; - X121SMCCycleConditions triggerConditions; - - // - // Decision ... - XPOIState decisionState; - double decisionBullishScore; - double decisionBearishScore; - X121Conditions decisionXConditions; - ENUM_XPOI_EVENTS decisionPoiEvents[]; - XC121SMCCycleHelper *decisionCycleHelper; - ENUM_X_CYCLE_EVENTS decisionCycleEvents[]; - X121SMCCycleConditions decisionConditions; - - // - // Analyse ... - XPOIState analyseState; - double analyseBullishScore; - double analyseBearishScore; - X121Conditions analyseXConditions; - ENUM_XPOI_EVENTS analysePoiEvents[]; - XC121SMCCycleHelper *analyseCycleHelper; - ENUM_X_CYCLE_EVENTS analyseCycleEvents[]; - X121SMCCycleConditions analyseConditions; - - // - // Verification ... - XPOIState verificationState; - double verificationBullishScore; - double verificationBearishScore; - X121Conditions verificationXConditions; - ENUM_XPOI_EVENTS verificationPoiEvents[]; - XC121SMCCycleHelper *verificationCycleHelper; - ENUM_X_CYCLE_EVENTS verificationCycleEvents[]; - X121SMCCycleConditions verificationConditions; - - // - // Consolidation ... - XPOIState consolidationState; - double consolidationBullishScore; - double consolidationBearishScore; - X121Conditions consolidationXConditions; - ENUM_XPOI_EVENTS consolidationPoiEvents[]; - XC121SMCCycleHelper *consolidationCycleHelper; - ENUM_X_CYCLE_EVENTS consolidationCycleEvents[]; - X121SMCCycleConditions consolidationConditions; - - // - // Vision ... - XPOIState visionState; - double visionBullishScore; - double visionBearishScore; - X121Conditions visionXConditions; - ENUM_XPOI_EVENTS visionPoiEvents[]; - XC121SMCCycleHelper *visionCycleHelper; - ENUM_X_CYCLE_EVENTS visionCycleEvents[]; - X121SMCCycleConditions visionConditions; - - // - // Constructor ... - X121SMCStrategySignalProviderData() - { - Clean(); - } - - // - // Tools ... - - // - // Cleanup ... - void Clean() - { - // - // Trigger ... - triggerState.Clean(); - triggerBullishScore = 0; - triggerBearishScore = 0; - Clean(triggerPoiEvents); - Clean(triggerCycleEvents); - triggerConditions.Clean(); - triggerXConditions.Clean(); - - // - // Decision ... - decisionState.Clean(); - decisionBullishScore = 0; - decisionBearishScore = 0; - Clean(decisionPoiEvents); - Clean(decisionCycleEvents); - decisionConditions.Clean(); - decisionXConditions.Clean(); - - // - // Analyse ... - analyseState.Clean(); - analyseBullishScore = 0; - analyseBearishScore = 0; - Clean(analysePoiEvents); - Clean(analyseCycleEvents); - analyseConditions.Clean(); - analyseXConditions.Clean(); - - // - // Verification ... - verificationState.Clean(); - verificationBullishScore = 0; - verificationBearishScore = 0; - Clean(verificationPoiEvents); - Clean(verificationCycleEvents); - verificationConditions.Clean(); - verificationXConditions.Clean(); - - // - // Consolidation ... - consolidationState.Clean(); - consolidationBullishScore = 0; - consolidationBearishScore = 0; - Clean(consolidationPoiEvents); - Clean(consolidationCycleEvents); - consolidationConditions.Clean(); - consolidationXConditions.Clean(); - - // - // Vision ... - visionState.Clean(); - visionBullishScore = 0; - visionBearishScore = 0; - Clean(visionPoiEvents); - Clean(visionCycleEvents); - visionConditions.Clean(); - visionXConditions.Clean(); - } - - // - void Destroy() - { - // - Clean(); - - // - ZeroMemory(visionCycleHelper); - ZeroMemory(triggerCycleHelper); - ZeroMemory(analyseCycleHelper); - ZeroMemory(decisionCycleHelper); - ZeroMemory(verificationCycleHelper); - ZeroMemory(consolidationCycleHelper); - - // - ZeroMemory(this); - } - - // - bool IsValid() - { - // - bool result = false; - - // - result = - visionCycleHelper != NULL && - triggerCycleHelper != NULL && - analyseCycleHelper != NULL && - decisionCycleHelper != NULL && - verificationCycleHelper != NULL && - consolidationCycleHelper != NULL; - - // - return result; - } - - // - // Initialize ... - bool Init( - XC121SMCCycleHelper *_triggerCycleHelper, - XC121SMCCycleHelper *_decisionCycleHelper, - XC121SMCCycleHelper *_analyseCycleHelper, - XC121SMCCycleHelper *_verificationCycleHelper, - XC121SMCCycleHelper *_consolidationCycleHelper, - XC121SMCCycleHelper *_visionCycleHelper // - ) - { - // - bool result = false; - - // - // Validate Cycle Helpers ... - result = - // - _visionCycleHelper != NULL && - _triggerCycleHelper != NULL && - _analyseCycleHelper != NULL && - _decisionCycleHelper != NULL && - _verificationCycleHelper != NULL && - _consolidationCycleHelper != NULL - // - ; - if (!result) - { - return result; - } - - // - visionCycleHelper = _visionCycleHelper; - triggerCycleHelper = _triggerCycleHelper; - analyseCycleHelper = _analyseCycleHelper; - decisionCycleHelper = _decisionCycleHelper; - verificationCycleHelper = _verificationCycleHelper; - consolidationCycleHelper = _consolidationCycleHelper; - - // - result = IsValid(); - - // - return result; - } - - // - // Prepare all ... - bool Prepare( - int barIndex = 0, - int loopback = 10, - bool trigger = false, - bool decision = true, - bool analyse = true, - bool verification = false, - bool consolidation = true, - bool vision = true // - ) - { - // - bool result = false; - - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - if (loopback < 7) - { - loopback = 7; - } - - // - result = IsValid(); - if (!result) - { - return result; - } - - // - // Trigger ... - if (trigger) - { - // - result = triggerCycleHelper.GetConditions( - triggerCycleEvents, - triggerPoiEvents, - triggerConditions, - barIndex, - loopback // - ); - if (!result) - { - // - Clean(triggerPoiEvents); - Clean(triggerCycleEvents); - - // - triggerConditions.Clean(); - - // - return result; - } - } - - // - // Decision ... - if (decision) - { - // - result = decisionCycleHelper.GetConditions( - decisionCycleEvents, - decisionPoiEvents, - decisionConditions, - barIndex, - loopback // - ); - if (!result) - { - // - Clean(triggerPoiEvents); - Clean(decisionPoiEvents); - Clean(triggerCycleEvents); - triggerConditions.Clean(); - Clean(decisionCycleEvents); - decisionConditions.Clean(); - - // - return result; - } - } - - // - // Analyse ... - if (analyse) - { - // - result = analyseCycleHelper.GetConditions( - analyseCycleEvents, - analysePoiEvents, - analyseConditions, - barIndex, - loopback // - ); - if (!result) - { - // - Clean(triggerPoiEvents); - Clean(analysePoiEvents); - Clean(decisionPoiEvents); - Clean(triggerCycleEvents); - Clean(analyseCycleEvents); - triggerConditions.Clean(); - analyseConditions.Clean(); - Clean(decisionCycleEvents); - decisionConditions.Clean(); - - // - return result; - } - } - - // - // Verification ... - if (verification) - { - // - result = verificationCycleHelper.GetConditions( - verificationCycleEvents, - verificationPoiEvents, - verificationConditions, - barIndex, - loopback // - ); - if (!result) - { - // - Clean(triggerPoiEvents); - Clean(analysePoiEvents); - Clean(decisionPoiEvents); - Clean(triggerCycleEvents); - Clean(analyseCycleEvents); - triggerConditions.Clean(); - analyseConditions.Clean(); - Clean(decisionCycleEvents); - decisionConditions.Clean(); - Clean(verificationPoiEvents); - Clean(verificationCycleEvents); - verificationConditions.Clean(); - - // - return result; - } - } - - // - // Consolidation ... - if (consolidation) - { - // - result = consolidationCycleHelper.GetConditions( - consolidationCycleEvents, - consolidationPoiEvents, - consolidationConditions, - barIndex, - loopback // - ); - if (!result) - { - // - Clean(triggerPoiEvents); - Clean(analysePoiEvents); - Clean(decisionPoiEvents); - Clean(triggerCycleEvents); - Clean(analyseCycleEvents); - triggerConditions.Clean(); - analyseConditions.Clean(); - Clean(decisionCycleEvents); - decisionConditions.Clean(); - Clean(verificationPoiEvents); - Clean(consolidationPoiEvents); - Clean(verificationCycleEvents); - verificationConditions.Clean(); - Clean(consolidationCycleEvents); - consolidationConditions.Clean(); - - // - return result; - } - } - - // - // Vision ... - if (vision) - { - result = visionCycleHelper.GetConditions( - visionCycleEvents, - visionPoiEvents, - visionConditions, - barIndex, - loopback // - ); - if (!result) - { - // - Clean(visionPoiEvents); - Clean(triggerPoiEvents); - Clean(analysePoiEvents); - Clean(visionCycleEvents); - visionConditions.Clean(); - Clean(decisionPoiEvents); - Clean(triggerCycleEvents); - Clean(analyseCycleEvents); - triggerConditions.Clean(); - analyseConditions.Clean(); - Clean(decisionCycleEvents); - decisionConditions.Clean(); - Clean(verificationPoiEvents); - Clean(consolidationPoiEvents); - Clean(verificationCycleEvents); - verificationConditions.Clean(); - Clean(consolidationCycleEvents); - consolidationConditions.Clean(); - - // - return result; - } - } - - // - // Cycles POI States ... - visionState = visionConditions.state; - triggerState = triggerConditions.state; - analyseState = analyseConditions.state; - decisionState = decisionConditions.state; - verificationState = verificationConditions.state; - consolidationState = consolidationConditions.state; - - // - // Cycle X121Conditions ... - visionXConditions = visionConditions.x121Conditions; - triggerXConditions = triggerConditions.x121Conditions; - analyseXConditions = analyseConditions.x121Conditions; - decisionXConditions = decisionConditions.x121Conditions; - verificationXConditions = verificationConditions.x121Conditions; - consolidationXConditions = consolidationConditions.x121Conditions; - - // - // Trigger ... - triggerXConditions.GenerateScore( - triggerBullishScore, - triggerBearishScore // - ); - - // - // Decision ... - decisionXConditions.GenerateScore( - decisionBullishScore, - decisionBearishScore // - ); - - // - // Analyse ... - analyseXConditions.GenerateScore( - analyseBullishScore, - analyseBearishScore // - ); - - // - // Verification ... - verificationXConditions.GenerateScore( - verificationBullishScore, - verificationBearishScore // - ); - - // - // Consolidation ... - consolidationXConditions.GenerateScore( - consolidationBullishScore, - consolidationBearishScore // - ); - - // - // Vision ... - visionXConditions.GenerateScore( - visionBullishScore, - visionBearishScore // - ); - - // - return result; - } - - // - bool SelectCycle( - ENUM_X_CYCLES cycle, - XPOIState &cState, - XPOIStateEvents &cStateEvents, - X121Conditions &cXConditions, - XC121SMCCycleHelper *&cHelper, - X121SMCCycleConditions &cConditions // - ) - { - // - bool result = false; - - // - cState.Clean(); - ZeroMemory(cHelper); - cConditions.Clean(); - cStateEvents.Clean(); - cXConditions.Clean(); - - // - result = cycle != X_CYCLE_NONE; - if (!result) - { - return result; - } - - // - if (cycle == X_CYCLE_TRIGGER) - { - // - cState = triggerState; - cHelper = triggerCycleHelper; - cConditions = triggerConditions; - cXConditions = triggerXConditions; - cStateEvents.Init(triggerPoiEvents); - } - else if (cycle == X_CYCLE_DECISION) - { - // - cState = decisionState; - cHelper = decisionCycleHelper; - cConditions = decisionConditions; - cXConditions = decisionXConditions; - cStateEvents.Init(decisionPoiEvents); - } - else if (cycle == X_CYCLE_ANALYSE) - { - // - cState = analyseState; - cHelper = analyseCycleHelper; - cConditions = analyseConditions; - cXConditions = analyseXConditions; - cStateEvents.Init(analysePoiEvents); - } - else if (cycle == X_CYCLE_VERIFICATION) - { - // - cState = verificationState; - cHelper = verificationCycleHelper; - cConditions = verificationConditions; - cXConditions = verificationXConditions; - cStateEvents.Init(verificationPoiEvents); - } - else if (cycle == X_CYCLE_CONSOLIDATION) - { - // - cState = consolidationState; - cHelper = consolidationCycleHelper; - cConditions = consolidationConditions; - cXConditions = consolidationXConditions; - cStateEvents.Init(consolidationPoiEvents); - } - else if (cycle == X_CYCLE_VISION) - { - // - cState = visionState; - cHelper = visionCycleHelper; - cConditions = visionConditions; - cXConditions = visionXConditions; - cStateEvents.Init(visionPoiEvents); - } - - // - result = cState.IsValid() && - cHelper != NULL; - - // - return result; - } - - // - void MaxRequiredPOIs(int value) - { - // - if (!IsValid()) - { - return; - } - - // - visionCycleHelper.mPOIDetector.MaxRequiredPOIs(value); - analyseCycleHelper.mPOIDetector.MaxRequiredPOIs(value); - decisionCycleHelper.mPOIDetector.MaxRequiredPOIs(value); - consolidationCycleHelper.mPOIDetector.MaxRequiredPOIs(value); - } - - // - void MaxAllowedLoopbackForInit(int value) - { - // - if (!IsValid()) - { - return; - } - - // - visionCycleHelper.mPOIDetector.MaxAllowedLoopbackForInit(value); - analyseCycleHelper.mPOIDetector.MaxAllowedLoopbackForInit(value); - decisionCycleHelper.mPOIDetector.MaxAllowedLoopbackForInit(value); - consolidationCycleHelper.mPOIDetector.MaxAllowedLoopbackForInit(value); - } - - // -}; - -// diff --git a/X121SMCEA/Classes/x-121.smc.x-tradehandler.class.mq5 b/X121SMCEA/Classes/x-121.smc.x-tradehandler.class.mq5 deleted file mode 100644 index ce4d65bb..00000000 --- a/X121SMCEA/Classes/x-121.smc.x-tradehandler.class.mq5 +++ /dev/null @@ -1,4403 +0,0 @@ -/////////////////////////////////////////////////////// -// -// SaherElm IT Center MQL5 Class Library -// -------------------------------------- -// Name: XCX121SMCTradeHandler -// Description: provides all based classes for use ... -// -// -// Maintainer: -// ------------ -// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) -// -////////////////////////////////////////////////////// -// -// Global Properties ... -#property library -#property copyright "Copyright 2023, SaherElm IT Center" -#property link "https://www.saherelm.ir" -#property version "1.00" -#property strict - -// -// Imports ... - -// -#include "../../Classes/x-saherelm.x-alert.class.mq5" -#include "../../Classes/x-saherelm.x-bar.analyser.class.mq5" -#include "../../Classes/x-saherelm.x-trade.class.mq5" -#include "../Libraries/x-121.smc.lib.mq5" - -// -// Definitions ... - -// -// Model a Trade Data ... -struct X121SMCTradeData -{ - // - double ask; // Ask Price on Start Time - double bid; // bid Price on Start Time - ulong ticket; // Position Ticket - double swap; // Swap - double profit; // Profit on Close - XSignal signal; // Signal Object - string message; // Message - datetime endTime; // End Time - datetime startTime; // Start Time - double commission; // Commission - string conditions; // Signal Conditions - double maxDrawdown; // Max Position Drawdown - double lastTarget; // Check Last Targetted - double lastTrailedTPLevel; // Hold Last Trailed TP Level - - // - // Constructor ... - X121SMCTradeData() - { - Clean(); - } - - /** - * Initialize Item ... - * - * @param _signal: XSignal instance Reference, Provides Source For Initializaion ... - * - * @return ( bool ) - */ - bool Init(XSignal &_signal) - { - // - bool result = false; - - // - Clean(); - - // - result = _signal.IsValid(); - if (!result) - { - return result; - } - - // - signal = _signal; - - // - result = IsValid(); - - // - return result; - } - - // - // Tools ... - - /** - * Cleaning Up Model ... - */ - void Clean() - { - // - ask = 0; - bid = 0; - swap = 0; - profit = 0; - ticket = 0; - commission = 0; - maxDrawdown = 0; - lastTrailedTPLevel = 0; - - // - endTime = NULL; - message = NULL; - startTime = NULL; - conditions = NULL; - - // - lastTarget = 0; - - // - signal.Clean(); - - // - ZeroMemory(this); - } - - /** - * Validate Model ... - * - * @return ( bool ) - */ - bool IsValid() - { - // - bool result = false; - - // - result = - // - signal.IsValid() - // - ; - - // - return result; - } - - /** - * Calculate Model Age ... - * - * @return ( int ) - */ - int GetAge() - { - // - int result = -1; - - // - if (!IsValid()) - { - return result; - } - - // - int startIndex = iBarShift( - GetSymbol(), - GetPeriod(), - startTime, - false // - ); - - // - datetime mEndTime = IsValid(endTime) - ? endTime - : TimeCurrent(); - int endIndex = iBarShift( - GetSymbol(), - GetPeriod(), - mEndTime, - false // - ); - - // - result = MathAbs(startIndex - endIndex); - - // - return result; - } - - // - // Owner Functions ... - - /** - * Check a Ticket is Own to Model or not ... - * - * @param _ticket: ULONG, Position Ticket ... - * - * @return ( bool ) - */ - bool IsOwn( - ulong _ticket // - ) - { - // - bool result = false; - - // - result = IsValid() && - _ticket == ticket; - - // - return result; - } - - /** - * Check Specified Conditions is Own to Model or not ... - * - * @param _symbol: String, Specified Symbol ... - * @param _provider: String, Specified Provider ... - * @param _period: ENUM_TIMEFRAMES member, Specified Signal Period ... - * @param _type: ENUM_X_POSITION_TYPES member, Specified Signal Type ... - * - * @return ( bool ) - */ - bool IsOwnSignalTime( - string _symbol, - string _provider, - ENUM_TIMEFRAMES _period, - ENUM_X_POSITION_TYPES _type, - datetime _time // - ) - { - // - bool result = false; - - // - result = - // - IsValid(_time) && - Time() == _time && - IsValid(_symbol) && - IsValid(_period) && - XType() == _type && - IsValid(_provider) && - GetPeriod() == _period && - GetSymbol() == _symbol && - Provider() == _provider && - XType() != X_POSITION_TYPE_ALL && - XType() != X_POSITION_TYPE_NONE - // - ; - - // - return result; - } - - /** - * Check Specified Conditions is Own to Model or not ... - * - * @param _symbol: String, Specified Symbol ... - * @param _provider: String, Specified Provider ... - * @param _period: ENUM_TIMEFRAMES member, Specified Signal Period ... - * @param _type: ENUM_X_POSITION_TYPES member, Specified Signal Type ... - * - * @return ( bool ) - */ - bool IsOwnStartTime( - string _symbol, - string _provider, - ENUM_TIMEFRAMES _period, - ENUM_X_POSITION_TYPES _type, - datetime _time // - ) - { - // - bool result = false; - - // - result = - // - IsValid(_time) && - IsValid(_symbol) && - IsValid(_period) && - XType() == _type && - IsValid(startTime) && - startTime == _time && - IsValid(_provider) && - GetPeriod() == _period && - GetSymbol() == _symbol && - Provider() == _provider && - XType() != X_POSITION_TYPE_ALL && - XType() != X_POSITION_TYPE_NONE - // - ; - - // - return result; - } - - /** - * Check Specified Signal is Own to Model or not ... - * - * @param _signal: XSignal instance Reference ... - * - * @return ( bool ) - */ - bool IsOwn(XSignal &_signal) - { - // - bool result = false; - - // - result = - // - IsValid() && - _signal.IsValid() && - IsOwnSignalTime( - _signal.symbol, - _signal.provider, - _signal.period, - ToPositionType(_signal.type), - _signal.time) - // - ; - - // - return result; - } - - /** - * Check Specified Position is Own to Model or not ... - * - * @param _position: XPosition instance Reference ... - * - * @return ( bool ) - */ - bool IsOwn(XPosition &_position) - { - // - bool result = false; - - // - result = - // - IsValid() && - _position.IsValid() && - IsOwnStartTime( - _position.symbol, - _position.provider, - _position.period, - ToPositionType(_position.type), - _position.openAt) - // - ; - - // - return result; - } - - /** - * Check Specified Position is Own to Model or not ... - * - * @param _position: XPosition instance Reference ... - * - * @return ( bool ) - */ - bool IsOwnPosition(XPosition &_position) - { - // - bool result = false; - - // - double tp = TP(); - double sl = SL(); - double entry = Entry(); - double volume = Volume(); - string symbol = GetSymbol(); - string provider = Provider(); - ENUM_POSITION_TYPE type = Type(); - ENUM_TIMEFRAMES period = GetPeriod(); - - // - double pVolume = _position.volume; - double pSL = NormalizePrice(_position.sl, _position.symbol); - double pTP = NormalizePrice(_position.tp, _position.symbol); - double pEntry = NormalizePrice(_position.entry, _position.symbol); - - // - result = - // - IsValid() && - (sl == pSL || - tp == pTP) && - entry == pEntry && - pVolume == volume && - _position.IsValid() && - type == _position.type && - symbol == _position.symbol && - period == _position.period && - provider == _position.provider - // - ; - - // - if (!result) - { - // - result = - // - IsValid() && - _position.IsValid() && - _position.ticket == signal.positionId; - } - - // - return result; - } - - /** - * Update Model Data by Providing Specified Signal ... - * - * @param _signal: XSignal instance Reference ... - * - * @return ( bool ) - */ - bool Update(XSignal &_signal) - { - // - bool result = false; - - // - result = - // - IsValid() && - _signal.IsValid() && - IsOwn(_signal) - // - ; - if (!result) - { - return result; - } - - // - signal = _signal; - - // - return result; - } - - /** - * Update Model Data by Providing Specified Position ... - * - * @param _position: XPosition instance Reference ... - * - * @return ( bool ) - */ - bool Update(XPosition &_position) - { - // - bool result = false; - - // - result = - // - IsValid() && - _position.IsValid() && - IsOwn(_position) - // - ; - if (!result) - { - return result; - } - - // - swap = _position.swap; - ticket = _position.ticket; - profit = _position.profit; - message = _position.comment; - startTime = _position.openAt; - - // - // Set Once ... - if (commission == 0 && - _position.commission != 0) - { - commission = _position.commission; - } - - // - // Set Once ... - if (ask == 0) - { - ask = GetAsk(_position.symbol); - } - - // - // Set Once ... - if (bid == 0) - { - bid = GetBid(_position.symbol); - } - - // - if (profit < 0 && profit < maxDrawdown) - { - maxDrawdown = profit; - } - - // - return result; - } - - /** - * Update Model Data by Providing Specified Position ... - * - * @param _position: XPosition instance Reference ... - * - * @return ( bool ) - */ - bool UpdatePosition(XPosition &_position) - { - // - bool result = false; - - // - result = - // - IsValid() && - _position.IsValid() && - IsOwnPosition(_position) - // - ; - if (!result) - { - return result; - } - - // - swap = _position.swap; - ticket = _position.ticket; - profit = _position.profit; - message = _position.comment; - startTime = _position.openAt; - - // - // Set Once ... - if (commission == 0 && - _position.commission != 0) - { - commission = _position.commission; - } - - // - // Set Once ... - if (ask == 0) - { - ask = GetAsk(_position.symbol); - } - - // - // Set Once ... - if (bid == 0) - { - bid = GetBid(_position.symbol); - } - - // - if (profit < 0 && profit < maxDrawdown) - { - maxDrawdown = profit; - } - - // - return result; - } - - // - // Tools Extensions ... - - /** - * Get Model Symbol ... - * - * @return ( string ) - */ - string GetSymbol() - { - return signal.symbol; - } - - /** - * Get Model Period ... - * - * @return ( ENUM_TIMEFRAMES ) - */ - ENUM_TIMEFRAMES GetPeriod() - { - return signal.period; - } - - /** - * Get Model Provider ... - * - * @return ( string ) - */ - string Provider() - { - return signal.provider; - } - - /** - * Get Model Entry ... - * - * @return ( double ) - */ - double Entry() - { - return signal.entry; - } - - /** - * Get Model Stop Loss ... - * - * @return ( double ) - */ - double SL() - { - return signal.sl; - } - - /** - * Get Model Take Profit ... - * - * @return ( double ) - */ - double TP() - { - return signal.tp; - } - - /** - * Get Model Target ... - * - * @return ( double ) - */ - int Targets(double &targets[]) - { - // - int result = 0; - - // - Copy( - signal.targets, - targets // - ); - - // - result = ArraySize(targets); - - // - return result; - } - - /** - * Get Position Spread on Open Time ... - * - * @return ( double ) - */ - double Spread() - { - return MathAbs(ask - bid); - } - - /** - * Get Model Volume ... - * - * @return ( double ) - */ - double Volume() - { - return signal.volume; - } - - /** - * Get Model Point Value ... - * - * @return ( double ) - */ - double Points() - { - return GetPoints(GetSymbol()); - } - - /** - * Get Model Type ... - * - * @return ( ENUM_POSITION_TYPE ) - */ - ENUM_POSITION_TYPE Type() - { - return signal.type; - } - - /** - * Get Model Type ... - * - * @return ( ENUM_X_POSITION_TYPES ) - */ - ENUM_X_POSITION_TYPES XType() - { - // - ENUM_X_POSITION_TYPES result = X_POSITION_TYPE_NONE; - - // - if (!IsValid()) - { - return result; - } - - // - result = - IsLong(Type()) - ? X_POSITION_TYPE_LONG - : X_POSITION_TYPE_SHORT; - - // - return result; - } - - /** - * Get Model Signal Mode ... - * - * @return ( ENUM_X_ORDER_MODES ) - */ - ENUM_X_ORDER_MODES Mode() - { - return signal.mode; - } - - /** - * Get Model Signal Time ... - * - * @return ( datetime ) - */ - datetime Time() - { - return signal.time; - } - - // - // Additional Helpers Extensions ... - - /** - * Get Signal Full TP Level ... - * - * @return ( double ) - */ - double FullTPLevel() - { - return signal.fullTPLevel; - } - - /** - * Check Can Partial Close Position or not ... - * - * @return ( bool ) - */ - bool CanPartialClose() - { - return signal.CanPartialClose(); - } - - /** - * Retrieve Partial Close Volume Multiplier ... - * - * @return ( double ) - */ - double PartialCloseMultiplier() - { - return signal.partialCloseMultiplier; - } - - /** - * Get Partial Close On TP Level ... - * - * @return ( double ) - */ - double PartialCloseOnTPLevel() - { - return signal.partialCloseOnTPLevel; - } - - /** - * Check Can Risk Free Position on Break Even Point or not ... - * - * @return ( bool ) - */ - bool CanRiskFreeOnBreakEvenPoint() - { - return signal.CanRiskFreeOnBreakEvenPoint(); - } - - /** - * Get Minimum Required Profit after Break Even Point for Risk Free ... - * - * @return ( double ) - */ - double TPLevelForBreakEven() - { - return signal.tpLevelForBreakEven; - } - - /** - * Calculate Break Even Point ... - * - * @return ( double ) - */ - double CalculateBreakEvenPoint() - { - // - double result = 0; - - // - bool isValid = - // - ask > 0 && - bid > 0 && - IsValid() && - ticket > 0 && - signal.IsValid() - // - ; - if (!isValid) - { - return result; - } - - // - // Calculate Spread ... - double spread = Spread(); - if (spread <= 0) - { - return result; - } - - // - // Calculate BEP ... - result = - // - spread + (-1 * swap) + MathAbs(commission) - // - ; - - // - return result; - } - - /** - * Check Can Trail Position Stop Loss or not ... - * - * @return ( bool ) - */ - bool CanTrailSL() - { - return signal.CanTrailSL(); - } - - /** - * Get Start Position SL Trailling on TP Level ... - * - * @return ( double ) - */ - double TrailSLStartOnReachTPLevel() - { - return signal.trailSLStartOnReachTPLevel; - } - - // - // Data Collector Extensions ... - - /** - * Get Data Collection File Name ... - * - * @return ( string ) - */ - string GetFileName() - { - // - string result = NULL; - - // - if (!IsValid()) - { - return result; - } - - // - result = - // - GetSymbol() + "\\" + - ToString(XType()) + "\\" + - (profit >= 0 ? "Profit" : "Loss") + "\\" + - ToString(ticket) + "_" + - ToString(GetPeriod()) + "_" + - ToFormatString(startTime) - // - ; - - // - return result; - } - - /** - * Get Signal Collectiong File Name ... - * - * @return ( string ) - */ - string GetSignalFileName() - { - // - string result = NULL; - - // - result = - // - GetSymbol() + "\\" + - ToString(XType()) + "\\" + - Provider() + "_" + - ToFormatString(startTime) - // - ; - - // - return result; - } - - /** - * Converts Model to String Representation ... - * - * @param onlySignals: Boolean, Specified Represent Only Signal or not ... - * - * @return ( string ) - */ - string ToString( - bool onlySignals = false // - ) - { - // - string result = NULL; - - // - int age = GetAge(); - - // - result = - // - (onlySignals ? "" : ToString("Ticket", ticket)) + - ToString("Symbol", GetSymbol()) + - ToString("Period", GetPeriod()) + - ToString("Entry", Entry()) + - ToString("Provider", Provider()) + - ToString("Type", ToString(XType())) + - ToString("Time", startTime) + - // - // Attach Trade Info ... - (onlySignals ? "" : - // - "-------------" + "\n" + - ToString("Volume", Volume()) + - ToString("Profit", profit) + - ToString("Commission", commission) + - ToString("Swap", swap) + - ToString("Max Drawdown", maxDrawdown) + - ToString("End Time", endTime) + - ToString("Age", age) + - ToString("Message", message) + - "" - // - ) + - // - // Attach Conditions to Signals ... - (!onlySignals ? "" : - // - "-------------" + "\n" + - ToString("Pushers", signal.pushers) + - "Conditions:" + "\n" + - "-------------" + "\n" + - conditions + - "" - // - ) + - // - "" - // - ; - - // - return result; - } - - // - // End Of X121SMCTradeData Model ... -}; - -// -// Model Specified Symbol's Positions States ... -struct X121SMCSymbolPositionInfo -{ - // - string symbol; - - // - datetime enableAt; - - // - int longSLs; - int longTPs; - - // - int shortSLs; - int shortTPs; - - // - int countedSLs; - - // - // Constructor ... - X121SMCSymbolPositionInfo() - { - Clean(); - } - - // - // Tools ... - - /** - * Cleanup ... - */ - void Clean() - { - // - longSLs = 0; - longTPs = 0; - - // - shortSLs = 0; - shortTPs = 0; - - // - countedSLs = 0; - - // - enableAt = NULL; - - // - ZeroMemory(this); - } - - /** - * Check is own Symbol Info ... - * - * @param _symbol: String ... - * - * @return ( bool ) - */ - bool IsOwn(string _symbol) - { - // - bool result = false; - - // - result = - // - IsValid(symbol) && - _symbol == symbol - // - ; - - // - return result; - } - - /** - * Check Symbol Trading is Enable or not ... - * - * @param time: DateTime ... - * - * @return ( bool ) - */ - bool IsEnable(datetime time = NULL) - { - // - bool result = false; - - // - time = NormalizeTime(time); - - // - bool isEnableAtValid = IsValid(enableAt); - - // - result = - !isEnableAtValid - ? true - : time > enableAt; - if (result && - isEnableAtValid) - { - Reset(); - } - - // - return result; - } - - /** - * Pause Symbol Trading ... - * - * @param seconds: Integer ... - */ - void Pause(int seconds) - { - // - if (seconds <= 0) - { - return; - } - - // - datetime _enableAt = ((datetime)((int)TimeCurrent() + seconds)); - enableAt = _enableAt; - } - - /** - * Handle Stop Loss ... - * - * @param _type: ENUM_POSITION_TYPE member ... - */ - void HandleSL(ENUM_POSITION_TYPE _type) - { - // - bool isLong = IsLong(_type); - if (isLong) - { - longSLs++; - } - else - { - shortSLs++; - } - - // - countedSLs++; - } - - /** - * Handle Take Profit ... - * - * @param _type: ENUM_POSITION_TYPE member ... - */ - void HandleTP(ENUM_POSITION_TYPE _type) - { - // - bool isLong = IsLong(_type); - if (isLong) - { - longTPs++; - } - else - { - shortTPs++; - } - - // - countedSLs--; - if (countedSLs < 0) - { - countedSLs = 0; - } - } - - /** - * Reset Counter ... - */ - void Reset() - { - // - countedSLs = 0; - enableAt = NULL; - } - - // - // End of X121SMCSymbolPositionInfo Model ... -}; - -// -// Implementations ... - -// -// a Class For Read and Write Trade Info Data in Files ... -class X121SMCTradeCollector -{ - // - // Public ... - public: - // - // Props ... - - // - // Constructor(s) ... - X121SMCTradeCollector( - string _path = NULL // Base Path - ) - { - // - mAccount = new XCAccount(); - - // - if (IsValid(_path)) - { - mPath = _path; - } - else - { - mPath = "X121SMCTradeData" + "\\" + mAccount.GetCompany(); - } - } - - // - // Deconstructor ... - ~X121SMCTradeCollector() - { - } - - /** - * Check Specified Model is Exists or not ... - * - * @param item: X121SMCTradeData instance Reference, Provides Source Model ... - * - * @return ( bool ) - */ - bool IsExists(X121SMCTradeData &item) - { - // - bool result = false; - - // - int mHandler = GetFileHandlerForRead(item); - result = mHandler != INVALID_HANDLE; - FileClose(mHandler); - - // - return result; - } - - /** - * Save Specified Model as Data ... - * - * @param item: X121SMCTradeData instance Reference, Provides Source Model ... - * - * @return ( bool ) - */ - bool Save(X121SMCTradeData &item) - { - // - bool result = false; - - // - // Check info is Valid ... - result = item.IsValid(); - if (!result) - { - return result; - } - - // - string content = item.ToString(); - content += "\n" + "-----------" + "\n" + "Signal: " + "\n" + "-----------" + "\n" + item.ToString(true); - - // - result = IsValid(content); - if (!result) - { - return result; - } - - // - int mHandler = GetFileHandlerForWrite(item); - result = mHandler != INVALID_HANDLE; - if (!result) - { - return result; - } - - // - FileWrite(mHandler, content); - FileFlush(mHandler); - FileClose(mHandler); - - // - return result; - } - - /** - * Save Specified Model as Signal ... - * - * @param item: X121SMCTradeData instance Reference, Provides Source Model ... - * - * @return ( bool ) - */ - bool SaveSignal(X121SMCTradeData &item) - { - // - bool result = false; - - // - string content = item.ToString(true); - result = IsValid(content); - if (!result) - { - return result; - } - - // - int mHandler = GetSignalFileHandlerForWrite(item); - result = mHandler != INVALID_HANDLE; - if (!result) - { - return result; - } - - // - FileWrite(mHandler, content); - FileFlush(mHandler); - FileClose(mHandler); - - // - return result; - } - - /** - * Save Specified Model Conditions ... - * Conditions only save for Loss Signals ... - * this means the profit must be Lower than Zero ... - * ans also message Contains SL ... - * - * @param item: X121SMCTradeData instance Reference, Provides Source Model ... - * - * @return ( bool ) - */ - bool SaveConditions(X121SMCTradeData &item) - { - // - bool result = false; - - // - // Validate Item ... - result = - // - item.profit < 0 && - Contains("SL", item.message) - // - ; - if (!result) - { - return result; - } - - // - string content = item.signal.conditions; - result = IsValid(content); - if (!result) - { - return result; - } - - // - int mHandler = GetConditionsFileHandlerForWrite(item); - result = mHandler != INVALID_HANDLE; - if (!result) - { - return result; - } - - // - FileSeek(mHandler, 0, SEEK_END); - FileWrite(mHandler, content); - FileFlush(mHandler); - FileClose(mHandler); - - // - return result; - } - - // - // Protected ... - protected: - // - // Private ... - private: - // - // Props ... - - // - string mPath; // Base Path ... - - // - XCAccount *mAccount; - - // - string GetFilePath(X121SMCTradeData &item) - { - // - string fileName = item.GetFileName(); - - // - return GetFilePath(fileName); - } - string GetFilePath(string fileName) - { - // - string result = ""; - - // - result = - // - mPath + "\\" + "Trades" + "\\" + fileName + ".x121.log" - // - ; - - // - return result; - } - - // - string GetSignalFilePath(X121SMCTradeData &item) - { - // - string fileName = item.GetSignalFileName(); - - // - return GetSignalFilePath(fileName); - } - string GetSignalFilePath(string fileName) - { - // - string result = ""; - - // - result = - // - mPath + "\\" + "Signals" + "\\" + fileName + ".x121.log" - // - ; - - // - return result; - } - - // - string GetConditionsFilePath(X121SMCTradeData &item) - { - // - bool isLong = IsLong(item.Type()); - - // - string fileName = - item.GetSymbol() + "\\" + - (isLong ? "Longs" : "Shorts"); - - // - return GetConditionsFilePath(fileName); - } - string GetConditionsFilePath(string fileName) - { - // - string result = ""; - - // - result = - // - mPath + "\\" + "Conditions" + "\\" + fileName + ".x121.log" - // - ; - - // - return result; - } - - // - int GetFileHandlerForRead(X121SMCTradeData &item) - { - // - int result = INVALID_HANDLE; - - // - string filePath = GetFilePath(item); - if (!IsValid(filePath)) - { - return result; - } - - // - result = FileOpen( - filePath, - FILE_READ | FILE_TXT // - ); - - // - return result; - } - int GetFileHandlerForWrite(X121SMCTradeData &item) - { - // - int result = INVALID_HANDLE; - - // - string filePath = GetFilePath(item); - if (!IsValid(filePath)) - { - return result; - } - - // - result = FileOpen( - filePath, - FILE_READ | FILE_WRITE | FILE_TXT // - ); - - // - return result; - } - - // - int GetSignalFileHandlerForRead(X121SMCTradeData &item) - { - // - int result = INVALID_HANDLE; - - // - string filePath = GetSignalFilePath(item); - if (!IsValid(filePath)) - { - return result; - } - - // - result = FileOpen( - filePath, - FILE_READ | FILE_TXT // - ); - - // - return result; - } - int GetSignalFileHandlerForWrite(X121SMCTradeData &item) - { - // - int result = INVALID_HANDLE; - - // - string filePath = GetSignalFilePath(item); - if (!IsValid(filePath)) - { - return result; - } - - // - result = FileOpen( - filePath, - FILE_READ | FILE_WRITE | FILE_TXT // - ); - - // - return result; - } - - // - int GetConditionsFileHandlerForRead(X121SMCTradeData &item) - { - // - int result = INVALID_HANDLE; - - // - string filePath = GetConditionsFilePath(item); - if (!IsValid(filePath)) - { - return result; - } - - // - result = FileOpen( - filePath, - FILE_READ | FILE_TXT // - ); - - // - return result; - } - int GetConditionsFileHandlerForWrite(X121SMCTradeData &item) - { - // - int result = INVALID_HANDLE; - - // - string filePath = GetConditionsFilePath(item); - if (!IsValid(filePath)) - { - return result; - } - - // - result = FileOpen( - filePath, - FILE_READ | FILE_WRITE | FILE_TXT // - ); - - // - return result; - } - - // - // End of X121SMCTradeCollector Class ... -}; - -// -// Trade Handler Class ... -// a Class For Handling All Trade Requirements ... -class XC121SMCTradeHandler : public XCBaseAlert -{ - // - // Public ... - public: - // - - // - // Constructor(s) ... - XC121SMCTradeHandler(XCTrade *trader) - { - // - mTrader = trader; - mAdditionalVolume = 0; - mCollector = new X121SMCTradeCollector(); - } - - // - // Deconstructor ... - ~XC121SMCTradeHandler() - { - // - Clean(mData); - Clean(mSymbolInfos); - Clean(mLastExecutedSignals); - - // - delete mTrader; - delete mCollector; - } - - // - // ReadOnly Props ... - - /** - * Get Max Same Time Trades ... - * - * @return ( double ) - */ - double GetMaxSameTimeTrades() - { - return maxSameTimeTrades; - } - - /** - * Get Max Drawdown Happens ... - * - * @return ( double ) - */ - double GetMaxDrawdown() - { - return maxDrawdown; - } - - /** - * Get Currently Drawdown of Account ... - * - * @return ( double ) - */ - double GetCurrentDrawdown() - { - return currentDrawdown; - } - - /** - * Get Account Current Drawdown Percent ... - * - * @return ( double ) - */ - double GetDrawdownPercent() - { - return drawdownPercent; - } - - // - // Properties Getter(s) / Setter(s) ... - - // - // Saving Properties ... - - /** - * Get Save Signals State ... - * - * @return ( bool ) - */ - bool SaveSignals() - { - return mSaveSignals; - } - - /** - * Set Save Signals State ... - * - * @param value: Boolean ... - */ - void SaveSignals(bool value) - { - mSaveSignals = value; - } - - /** - * Get Save Trades State ... - * - * @return ( bool ) - */ - bool SaveTrades() - { - return mSaveTrades; - } - - /** - * Set Save Trades State ... - * - * @param value: Boolean ... - */ - void SaveTrades(bool value) - { - mSaveTrades = value; - } - - /** - * Get Save Conditions State ... - * - * @return ( bool ) - */ - bool SaveConditions() - { - return mSaveConditions; - } - - /** - * Set Save Conditions State ... - * - * @param value: Boolean ... - */ - void SaveConditions(bool value) - { - mSaveConditions = value; - } - - // - // Signalling Props ... - - /** - * Get Allow Long Signals State ... - * - * @return ( bool ) - */ - bool AllowLong() - { - return mAllowLong; - } - - /** - * Set Allow Long Signals State ... - * - * @param value: Boolean ... - */ - void AllowLong(bool value) - { - mAllowLong = value; - } - - /** - * Get Allow Short Signals State ... - * - * @return ( bool ) - */ - bool AllowShort() - { - return mAllowShort; - } - - /** - * Set Allow Short Signals State ... - * - * @param value: Boolean ... - */ - void AllowShort(bool value) - { - mAllowShort = value; - } - - /** - * Get Max Allowed Long Signals ... - * 0 => Unlimited ... - * - * @return ( int ) - */ - int MaxAllowedLongs() - { - return mMaxAllowedLongs; - } - - /** - * Set Max Allowed Long Signals ... - * - * @param value: Integer ... - * 0 => Unlimited ... - */ - void MaxAllowedLongs(int value) - { - // - if (value < 0) - { - value = 0; - } - - // - mMaxAllowedLongs = value; - } - - /** - * Get Max Allowed Short Signals ... - * 0 => Unlimited ... - * - * @return ( int ) - */ - int MaxAllowedShorts() - { - return mMaxAllowedShorts; - } - - /** - * Set Max Allowed Short Signals ... - * - * @param value: Integer ... - * 0 => Unlimited ... - */ - void MaxAllowedShorts(int value) - { - // - if (value < 0) - { - value = 0; - } - - // - mMaxAllowedShorts = value; - } - - /** - * Get Use Max Allowed Signal Types Per Symbol State ... - * - * @return ( bool ) - */ - bool UseMaxAllowedSignalsPerSymbol() - { - return mUseMaxAllowedSignalsPerSymbol; - } - - /** - * Set Use Max Allowed Signal Types Per Symbol State ... - * - * @param value: Boolean ... - */ - void UseMaxAllowedSignalsPerSymbol(bool value) - { - mUseMaxAllowedSignalsPerSymbol = false; - } - - /** - * Get Last Position Profit In Points for Accept new Signal ... - * 0 => Accept All ... - * - * @return ( double ) - */ - double LastPositionProfitForAcceptNextInPoint() - { - return mLastPositionProfitForAcceptNextInPoint; - } - - /** - * Set Last Position Profit In Points for Accept new Signal ... - * - * @param value: Double ... - * 0 => Accept All ... - */ - void LastPositionProfitForAcceptNextInPoint(double value) - { - // - if (value < 0) - { - value = 0; - } - - // - mLastPositionProfitForAcceptNextInPoint = value; - } - - /** - * Get Delay between two Signals in Bars ... - * 0 => Accept All ... - * - * @return ( int ) - */ - int DelaysBetweenTwoSignalsInBar() - { - return mDelaysBetweenTwoSignalsInBar; - } - - /** - * Set Delay between two Signals in Bars ... - * - * @param value: Integer ... - * 0 => Accept All ... - */ - void DelaysBetweenTwoSignalsInBar(int value) - { - // - if (value < 0) - { - value = 0; - } - - // - mDelaysBetweenTwoSignalsInBar = value; - } - - /** - * Get Max Allowed Spread for Signalling ... - * 0 => Accept All ... - * - * @return ( double ) - */ - double MaxAllowedSpread() - { - return mMaxAllowedSpread; - } - - /** - * Set Max Allowed Spread for Signalling ... - * - * @param value: Double ... - * 0 => Accept All ... - */ - void MaxAllowedSpread(double value) - { - // - if (value < 0) - { - value = 0; - } - - // - mMaxAllowedSpread = value; - } - - /** - * Get Additional Signal Volume ... - * - * @return ( double ) - */ - double AdditionalVolume() - { - return mAdditionalVolume; - } - - /** - * Set Additional Signal Volume ... - * - * @param value: Double ... - * min = 0.01 - */ - void AdditionalVolume(double value) - { - // - if (value < 0) - { - value = 0; - } - - // - if (value > 0 && value < 0.01) - { - value = 0.01; - } - - // - mAdditionalVolume = value; - } - - // - // Risk Management Props ... - - /** - * Get Max Allowed Drawdown Percent for Open Trades ... - * 0 => Ignore ... - * min => 0 ... - * max => 100 ... - * - * @return ( double ) - */ - double MaxAllowedDrawdownToOpenTrades() - { - return mMaxAllowedDrawdownToOpenTrades; - } - - /** - * Set Max Allowed Drawdown Percent for Open Trades ... - * - * @param value: Double ... - * 0 => Ignore ... - * min => 0 ... - * max => 100 ... - */ - void MaxAllowedDrawdownToOpenTrades(double value) - { - // - if (value < 0) - { - value = 0; - } - - // - if (value > 50) - { - value = 50; - } - - // - mMaxAllowedDrawdownToOpenTrades = value; - } - - /** - * Get Max Allowed SL for Pause Signalling Per Symbol ... - * 0 => Unlimited ... - * - * @return ( int ) - */ - int MaxAllowedSLToPauseSignallingPerSymbol() - { - return mMaxAllowedSLToPauseSignallingPerSymbol; - } - - /** - * Set Max Allowed SL for Pause Signalling Per Symbol ... - * - * @param value: Integer ... - * 0 => Unlimited ... - */ - void MaxAllowedSLToPauseSignallingPerSymbol(int value) - { - // - if (value < 0) - { - value = 0; - } - - // - mMaxAllowedSLToPauseSignallingPerSymbol = value; - } - - /** - * Get Pause Signalling Per Symbol afte Max Allowed SL Reached In Seconds ... - * 0 => Ignore ... - * - * @return ( int ) - */ - int PauseSignallingAfterReachesMaxAllowedSLInSecconds() - { - return mPauseSignallingAfterReachesMaxAllowedSLInSecconds; - } - - /** - * Set Pause Signalling Per Symbol afte Max Allowed SL Reached In Seconds ... - * - * @param value: Integer ... - * 0 => Ignore ... - */ - void PauseSignallingAfterReachesMaxAllowedSLInSecconds(int value) - { - // - if (value < 0) - { - value = 0; - } - - // - mPauseSignallingAfterReachesMaxAllowedSLInSecconds = value; - } - - // - // Protection Props ... - - /** - * Get Allow Hedge Positions State ... - * - * @return ( bool ) - */ - bool AllowHedging() - { - return mAllowHedging; - } - - /** - * Set Allow Hedge Positions State ... - * - * @param value: Boolean ... - */ - void AllowHedging(bool value) - { - mAllowHedging = value; - } - - /** - * Get Minimum Open Positions for Hedging ... - * 0 => Ignore ... - * - * @return ( int ) - */ - int MinOpenTradesFroHedging() - { - return mMinOpenTradesFroHedging; - } - - /** - * Set Minimum Open Positions for Hedging ... - * - * @param value: Integer ... - * 0 => Ignore ... - */ - void MinOpenTradesFroHedging(int value) - { - // - if (value < 0) - { - value = 0; - } - - // - mMinOpenTradesFroHedging = value; - } - - /** - * Get Minimum Volume Step for Hedging ... - * 0 => Ignore ... - * - * @return ( double ) - */ - double HedgingMinVolumeStep() - { - return mHedgingMinVolumeStep; - } - - /** - * Set Minimum Volume Step for Hedging ... - * - * @param value: Double ... - * 0 => Ignore ... - */ - void HedgingMinVolumeStep(double value) - { - // - if (value < 0) - { - value = 0; - } - - // - if (value > 0 && value < 0.01) - { - value = 0.01; - } - - // - if (value > 0 && value > 0.1) - { - value = 0.1; - } - - // - mHedgingMinVolumeStep = value; - } - - /** - * Get Minimum Required Profit Per Volume Step for Hedging ... - * 0 => Ignore ... - * - * @return ( double ) - */ - double HedgeingMinRequiredProfitPerVolumeStep() - { - return mHedgeingMinRequiredProfitPerVolumeStep; - } - - /** - * Set Minimum Required Profit Per Volume Step for Hedging ... - * - * @param value: Double ... - * 0 => Ignore ... - */ - void HedgeingMinRequiredProfitPerVolumeStep(double value) - { - // - if (value < 0) - { - value = 0; - } - - // - mHedgeingMinRequiredProfitPerVolumeStep = value; - } - - // - // Actions ... - - // - // Data Collection Actions ... - - /** - * Add Executed Signal Data Model to Trade Datas ... - * - * @param signal: XSignal instance Reference, Issued Signal ... - */ - void Add(XSignal &signal) - { - // - // Check Signal is Valid and also not Exists - // in Datas ... - int idx = -1; - bool hasItem = HasItem( - signal, - idx // - ); - if (hasItem) - { - return; - } - - // - // Initialize Data Item and Add it to Collection of Datas - // if Everythings OK ... - X121SMCTradeData data; - bool isInited = data.Init(signal); - if (isInited) - { - // - Add(data); - SaveSignal(data); - } - } - - /** - * Update a Registered Data Model by Providing Specified Signal ... - * usually used When a signal Modified after Executed for Conditionally Signals ... - * - * @param signal: XSignal instance Reference, Issued Signal ... - */ - void Update(XSignal &signal) - { - // - // Validate Signal ... - if (!signal.IsValid()) - { - return; - } - - // - // Check Signal Registered Before ... - int idx = -1; - bool hasItem = HasItem( - signal, - idx // - ); - bool isUpdated = false; - if (!hasItem) - { - // - // Add New Item if not Exists ... - Add(signal); - isUpdated = true; - } - else - { - // - // Update Data Model in Datas Collection ... - isUpdated = mData[idx].Update(signal); - } - - // - if (isUpdated) - { - SaveSignal(mData[idx]); - } - } - - /** - * Update a Registered Data Model by Providing Specified Position ... - * used for Updating Positions Data or When a Conditional Order Executed as Position ... - * - * @param position: XPosition instance Referece ... - */ - void Update(XPosition &position) - { - // - // Validate Position ... - if (!position.IsValid()) - { - return; - } - - // - // Check Position Registered Before ... - int idx = -1; - bool hasItem = HasItem( - position, - idx // - ); - if (!hasItem) - { - return; - } - - // - // Update Data Model in Datas Collection ... - mData[idx].Update(position); - } - - /** - * Remove Specified Registered Signal from Data Collection ... - * - * @param signal: XSignal instance Reference ... - */ - void Remove(XSignal &signal) - { - // - // Validate Signal ... - if (!signal.IsValid()) - { - return; - } - - // - // Check Signal is Registered or not ... - int idx = -1; - bool hasItem = HasItem( - signal, - idx // - ); - if (!hasItem) - { - return; - } - - // - // Remove Data From Collection ... - ArrayRemove( - mData, - idx, - 1 // - ); - } - - /** - * Handle Position Execution Finished by Providing a Deal ... - * usually used when a Position TP/SL Triggered ... - * - * @param deal: XDeal instance Reference ... - */ - void Finish(const XDeal &deal) - { - // - // Validate Deal ... - // Check Specified Data Registered or not ... - int idx = -1; - bool hasItem = HasItem( - deal.positionId, - idx // - ); - if (!hasItem) - { - return; - } - - // - // Update Data Info ... - mData[idx].swap = deal.swap; - mData[idx].endTime = deal.time; - mData[idx].profit = deal.profit; - - // - // Check Deal Reason ... - bool isTP = deal.reason == DEAL_REASON_TP || - (deal.reason == DEAL_REASON_SL && deal.profit > 0); - bool isSL = deal.reason == DEAL_REASON_SL && deal.profit < 0; - - // - // Prepare Specified Message Based on Deal Reason ... - mData[idx].message = - isTP - ? "TP" - : isSL - ? "SL" - : ""; - - // - // Handle Symbol Positions TP or SL Actions ... - if (isTP || isSL) - { - // - // Check Symbol Position Info Model Exists ... - int symbolIDX = -1; - bool hasInfo = HasSymbol( - mData[idx].GetSymbol(), - symbolIDX // - ); - - // - // Try to Update or Add Symbol Position Info ... - X121SMCSymbolPositionInfo info; - if (!hasInfo) - { - // - // Add New One ... - info.symbol = mData[idx].GetSymbol(); - } - else - { - // - // Update Exists ... - info = mSymbolInfos[symbolIDX]; - - // - // Remove Exists ... - ArrayRemove( - mSymbolInfos, - symbolIDX, - 1 // - ); - } - - // - ENUM_POSITION_TYPE xType = IsLong(mData[idx].Type()) - ? POSITION_TYPE_BUY - : POSITION_TYPE_SELL; - - // - // Call Propper TP / SL Handlers on Symbol Position Info Model ... - if (isTP) - { - info.HandleTP(xType); - } - else if (isSL) - { - info.HandleSL(xType); - } - - // - // Add Model to Symbol Positions Collection ... - AddRef( - info, - mSymbolInfos // - ); - - // - // Try to Check Symbol Positions Info Collection for Pause Specified Symbol ... - HandlePauseSymbol(mData[idx].GetSymbol()); - } - - // - // Save Collector Calss Data Model ... - Save(idx); - } - - /** - * Handle Position Execution Finished by Providing some Data ... - * usually used when a Position Force Closed Triggered ... - * - * @param ticket: ULong, Position ticket ... - * @param position: XPosition instance Reference ... - * @param comment: String, Force Closing Comment ... - */ - void Finish( - const ulong ticket, - const XPosition &position, - const string comment // - ) - { - // - // Validate and Check Data Registered or not ... - int idx = -1; - bool hasItem = HasItem( - ticket, - idx // - ); - if (!hasItem) - { - return; - } - - // - // Update Data Info ... - mData[idx].swap = position.swap; - mData[idx].endTime = TimeCurrent(); - mData[idx].profit = position.profit; - - // - mData[idx].message = comment; - - // - // Handle Force Closes as TP/SL for Updating - // Symbol Info Positions ... - bool handleForceClose = true; - if (handleForceClose) - { - // - // Simulate TP/SL based on Closing Profit ... - bool isTP = position.profit > 0; - bool isSL = position.profit <= 0; - - // - if (isTP || isSL) - { - // - // Check Symbol Position Info Model Exists ... - int symbolIDX = -1; - bool hasInfo = HasSymbol( - mData[idx].GetSymbol(), - symbolIDX // - ); - - // - // Try to Update or Add Symbol Position Info ... - X121SMCSymbolPositionInfo info; - if (!hasInfo) - { - // - // Add New One ... - info.symbol = mData[idx].GetSymbol(); - } - else - { - // - // Update Exists ... - info = mSymbolInfos[symbolIDX]; - - // - // Remove Exists ... - ArrayRemove( - mSymbolInfos, - symbolIDX, - 1 // - ); - } - - // - ENUM_POSITION_TYPE xType = IsLong(mData[idx].Type()) - ? POSITION_TYPE_BUY - : POSITION_TYPE_SELL; - - // - // Call Propper TP / SL Handlers on Symbol Position Info Model ... - if (isTP) - { - info.HandleTP(xType); - } - else if (isSL) - { - info.HandleSL(xType); - } - - // - // Add Model to Symbol Positions Collection ... - AddRef( - info, - mSymbolInfos // - ); - - // - // Try to Check Symbol Positions Info Collection for Pause Specified Symbol ... - HandlePauseSymbol(mData[idx].GetSymbol()); - } - - // - // Save Collector Calss Data Model ... - Save(idx); - } - } - - /** - * Update New Open Positions Data on Collection ... - */ - void HandleNewPosition() - { - // - // Retrieve Last Open Position ... - ulong lastOpenPositionTicket = mTrader.GetLastOpenPositionTicket(); - if (lastOpenPositionTicket == 0) - { - return; - } - - // - XPosition position; - bool hasPosition = mTrader.GetPosition( - lastOpenPositionTicket, - position // - ); - if (!hasPosition) - { - return; - } - - // - // Calculate Position Commission ... - double commission = mTrader.GetPositionCommission(position.ticket); - position.commission = commission; - - // - // Apply Updates on Data Collection ... - int idx = -1; - bool hasItem = HasItemByPosition( - position, - idx // - ); - if (!hasItem) - { - return; - } - - // - mData[idx].UpdatePosition(position); - } - - // - // Symbol Position Info Actions ... - - /** - * Retrieve Specified Symbols Info ... - * - * @param symbol: String ... - * @param info: X121SMCSymbolPositionInfo instance ... - * - * @return ( bool ) - */ - bool GetSymbolInfo( - string symbol, - X121SMCSymbolPositionInfo &info // - ) - { - // - bool result = false; - - // - info.Clean(); - - // - int symbolIDX = -1; - result = HasSymbol( - symbol, - symbolIDX // - ); - if (!result) - { - return result; - } - - // - info = mSymbolInfos[symbolIDX]; - - // - return result; - } - - /** - * Pause Specified Symbol Trading ... - * - * @param symbol: String ... - */ - void HandlePauseSymbol(string symbol) - { - // - if (!IsValid(symbol)) - { - return; - } - - // - int idx = -1; - bool hasItem = HasSymbol( - symbol, - idx // - ); - if (!hasItem) - { - return; - } - - // - int maxAllowedSLToPause = MaxAllowedSLToPauseSignallingPerSymbol(); - int pauseDelay = PauseSignallingAfterReachesMaxAllowedSLInSecconds(); - if (maxAllowedSLToPause <= 0 || pauseDelay <= 0) - { - return; - } - - // - bool canPauseSymbol = - mSymbolInfos[idx].IsEnable() && - mSymbolInfos[idx].countedSLs >= maxAllowedSLToPause; - if (!canPauseSymbol) - { - return; - } - - // - mSymbolInfos[idx].Pause(pauseDelay); - - // - string message = "Pause (" + symbol + ") until: (" + ToString(mSymbolInfos[idx].enableAt) + ") ..."; - Alert(message); - - // - } - - /** - * Reset Specified Symbol Info ... - * - * @param symbol: String ... - */ - void ResetSymbolInfo(string symbol) - { - // - if (!IsValid(symbol)) - { - return; - } - - // - int symbolIDX = -1; - bool hasSymbol = HasSymbol( - symbol, - symbolIDX // - ); - if (!hasSymbol) - { - return; - } - - // - mSymbolInfos[symbolIDX].Reset(); - - // - string message = "Reset " + symbol + ", Pause State ..."; - Alert(message); - } - - /** - * Reset All Paused Symbols ... - */ - void ResumePausedSymbols() - { - // - int count = ArraySize(mSymbolInfos); - if (!IsValidSize(count)) - { - return; - } - - // - for (int i = 0; i < count; i++) - { - // - mSymbolInfos[i].Reset(); - } - - // - string message = "Force Resume Paused Symbols ..."; - Alert(message); - } - - // - // Signal Execution Actions ... - - /** - * Validate Signal For Execution ... - * - * @param signal: XSignal instance Reference ... - * @param state: ENUM_X_SIGNAL_EXECUTION_RESULT Reference for olding Signal Execution Result Reason ... - * - * @return ( bool ) - */ - bool CanExecute( - XSignal &signal, - ENUM_X_SIGNAL_EXECUTION_RESULT &state // Execution State - ) - { - // - bool result = false; - - // - state = X_SIGNAL_EXECUTION_UNKNOWN; - - // - // Validate Signal ... - result = signal.IsValid(); - if (!result) - { - // - state = X_SIGNAL_EXECUTION_FAILED_INVALID_PARAMS; - return result; - } - - // - int symbolIDX = -1; - bool hasSymbolInfo = HasSymbol( - signal.symbol, - symbolIDX // - ); - - // - // Check rading Not Paused ... - result = - !hasSymbolInfo || - mSymbolInfos[symbolIDX].IsEnable(); - if (!result) - { - // - state = X_SIGNAL_EXECUTION_FAILED_NOT_ALLOWED; - return result; - } - - // - bool isLong = IsLong(signal.type); - - // - // Chekc Signalling Enable or not ... - result = - isLong - ? mAllowLong - : mAllowShort; - if (!result) - { - // - state = X_SIGNAL_EXECUTION_FAILED_NOT_ALLOWED; - return result; - } - - // - // Check Signal is Support or not ... - bool isSupport = IsSupport(signal.comment); - result = !isSupport; - if (!result) - { - // - state = X_SIGNAL_EXECUTION_FAILED_NOT_ALLOWED; - return result; - } - - // - ENUM_X_POSITION_TYPES pType = ToPositionType(signal.type); - double requiredProfitForAcceptNext = LastPositionProfitForAcceptNextInPoint(); - - // - // Implement Same Signal Conditions ... - XPosition smaeSymbolPositions[]; - int sameSymbolPositionsCount = mTrader.GetPositions( - smaeSymbolPositions, - signal.symbol, - signal.provider, - signal.period, - pType, - true, // Filter By Magic ... - true // Force Clean ... - ); - XPosition youngestSame; - int youngestSameAge = GetYoungest( - youngestSame, - smaeSymbolPositions // - ); - - // - double youngestSameProfitInPoint = youngestSame.GetProfitInPoint(); - - // - result = - sameSymbolPositionsCount == 0 || - (sameSymbolPositionsCount <= 0 - ? true - : requiredProfitForAcceptNext <= 0 - ? true - : youngestSameAge >= 0 && - youngestSameProfitInPoint >= requiredProfitForAcceptNext); - if (!result) - { - // - state = X_SIGNAL_EXECUTION_FAILED_PREV_PROFIT_ERROR; - return result; - } - - // - // Retrieve Longs and Shorts ... - XPosition longs[]; - XPosition shorts[]; - bool useMaxAllowedPositionsPerSymbol = UseMaxAllowedSignalsPerSymbol(); - - // - // Retrieve Positions ... - if (useMaxAllowedPositionsPerSymbol) - { - // - mTrader.GetPositions( - longs, - shorts, - signal.symbol, - signal.provider // - ); - } - else - { - // - mTrader.GetPositions( - longs, - shorts, - NULL, // All Symbols ... - signal.provider // - ); - } - - // - // Counting ... - int longsCount = ArraySize(longs); - int shortsCount = ArraySize(shorts); - - // - int maxAllowedLongs = MaxAllowedLongs(); - int maxAllowedShorts = MaxAllowedShorts(); - - // - // Check Max Allowed Positions ... - if (maxAllowedLongs > 0 || - maxAllowedShorts > 0) - { - // - if (isLong && maxAllowedLongs > 0 && longsCount > 0) - { - result = longsCount < maxAllowedLongs; - } - else if (!isLong && maxAllowedShorts > 0 && shortsCount > 0) - { - result = shortsCount < maxAllowedShorts; - } - if (!result) - { - // - state = X_SIGNAL_EXECUTION_FAILED_MAX_REACHED; - return result; - } - } - - // - // Check Delays Bar if Provided ... - int delaysBarBetweenTwoSignal = DelaysBetweenTwoSignalsInBar(); - if (delaysBarBetweenTwoSignal > 0) - { - // - // Try To Detect Youngest Position ... - int youngestAge = 0; - XPosition youngestPosition; - - // - // Long Positions when there are Longs ... - if (isLong && longsCount > 0) - { - // - youngestAge = GetYoungest( - youngestPosition, - longs // - ); - } - // - // Short Positions when there are Shorts ... - else if (!isLong && shortsCount > 0) - { - // - youngestAge = GetYoungest( - youngestPosition, - shorts // - ); - } - - // - // Check Delays When Youngest Position Exists ... - if (youngestAge > 0 && youngestPosition.IsValid()) - { - // - result = youngestAge >= delaysBarBetweenTwoSignal; - if (!result) - { - // - state = X_SIGNAL_EXECUTION_FAILED_DELAY_NOT_PASSED; - return result; - } - } - - // - // Check Delays When Youngest Position is not Exists ... - if (!youngestPosition.IsValid()) - { - // - // Try to Detect Last Issued Signal in Model Collections ... - int symbolIDX = FindLastExecutedSignalItem(signal); - if (IsValidIndex(symbolIDX)) - { - // - // Calculate Requirements ... - datetime cTime = TimeCurrent(); - int signalPeriodSeconds = PeriodSeconds(signal.period); - datetime lastExecutedTime = mLastExecutedSignals[symbolIDX].time; - datetime passedTime = ((datetime)lastExecutedTime + - ((delaysBarBetweenTwoSignal * signalPeriodSeconds))); - - // - // Check Conditions ... - result = cTime >= passedTime; - if (!result) - { - // - state = X_SIGNAL_EXECUTION_FAILED_DELAY_NOT_PASSED; - return result; - } - } - } - } - - // - // Check Max Drawdown Percent for Open Trades ... - double maxAllowedDrawdownPercent = MaxAllowedDrawdownToOpenTrades(); - if (maxAllowedDrawdownPercent > 0) - { - // - // Calculate and Update Drawdown Percent ... - double cdPercent = CalculateMaxDrawdownPercent(); - - // - result = cdPercent < maxAllowedDrawdownPercent; - if (!result) - { - // - state = X_SIGNAL_EXECUTION_FAILED_NO_EQUITY; - return result; - } - } - - // - // Check Spread ... - double spread = GetSpread(signal.symbol); - double maxAllowedSpread = MaxAllowedSpread(); - if (maxAllowedSpread > 0) - { - // - result = spread <= maxAllowedSpread; - if (!result) - { - // - state = X_SIGNAL_EXECUTION_FAILED_SPREAD; - return result; - } - } - - // - return result; - } - - /** - * Execute Specific Signal using Trade Handler ... - * - * @param signal: XSignal instance Reference ... - * @param state: ENUM_X_SIGNAL_EXECUTION_RESULT Reference for olding Signal Execution Result Reason ... - * @param ignorePolicies: Boolean ... - * - * @return ( bool ) - */ - bool ExecuteSignal( - XSignal &signal, // Signal for Execution - ENUM_X_SIGNAL_EXECUTION_RESULT &state, // Execution State - bool ignorePolicies = false // Ignore Execution Policies - ) - { - // - bool result = false; - - // - // Check Signal Validation ... - result = signal.IsValid(); - if (!result) - { - return result; - } - - // - // Check Policies ... - if (!ignorePolicies) - { - // - // Filter Signals if Necessary ... - result = CanExecute( - signal, - state // - ); - if (!result) - { - // - AlertSignalExecutionFailed( - signal, - state // - ); - - // - return result; - } - } - - // - // Apply Additional Volume to Signal if Provided ... - double additionalVolume = AdditionalVolume(); - if (additionalVolume > 0) - { - signal.volume += mAdditionalVolume; - } - - // - // Execute Signal ... - result = mTrader.ExecuteSignal( - signal, - state // - ); - if (result) - { - // - // Add XTradeHandler Data ... - Add(signal); - - // - // Handle Last Executed Signal ... - HandleSignalExecuted(signal); - - // - // Alert Executed Signal ... - string msg = (signal.type == POSITION_TYPE_BUY ? "Long" : "Short") + - " Signal Provided by: " + signal.provider + - (signal.pushers > 1 ? " Pushers: " + ToString(signal.pushers) : "") + - " on: " + signal.symbol + - " in: " + ToString(signal.period) + - " Executed Successfully ..."; - Alert(msg); - } - - // - if (!result) - { - // - AlertSignalExecutionFailed( - signal, - state // - ); - } - - // - return result; - } - - /** - * Execute Specific Signal using Trade Handler ... - * - * @param signal: XSignal instance Reference ... - * @param state: ENUM_X_SIGNAL_EXECUTION_RESULT Reference for olding Signal Execution Result Reason ... - * @param ignorePolicies: Boolean ... - * - * @return ( bool ) - */ - bool ExecuteSignal( - XSignal &signal, // Signal for Execution - X121SMCStrategyConditions &conditions, // Signal Conditions - ENUM_X_SIGNAL_EXECUTION_RESULT &state, // Execution State - bool ignorePolicies = false // Ignore Execution Policies - ) - { - // - bool result = false; - - // - // Check Signal Validation ... - result = signal.IsValid() && - conditions.IsValid(); - if (!result) - { - return result; - } - - // - // Check Policies ... - if (!ignorePolicies) - { - // - // Filter Signals if Necessary ... - result = CanExecute( - signal, - state // - ); - if (!result) - { - // - AlertSignalExecutionFailed( - signal, - state // - ); - - // - return result; - } - } - - // - // Apply Additional Volume to Signal if Provided ... - double additionalVolume = AdditionalVolume(); - if (additionalVolume > 0) - { - signal.volume += mAdditionalVolume; - } - - // - // Execute Signal ... - result = mTrader.ExecuteSignal( - signal, - state // - ); - if (result) - { - // - // Add XTradeHandler Data ... - Add(signal); - - // - // Handle Last Executed Signal ... - HandleSignalExecuted(signal); - - // - // Alert Executed Signal ... - string msg = (signal.type == POSITION_TYPE_BUY ? "Long" : "Short") + - " Signal Provided by: " + signal.provider + - (signal.pushers > 1 ? " Pushers: " + ToString(signal.pushers) : "") + - " on: " + signal.symbol + - " in: " + ToString(signal.period) + - " Executed Successfully ..."; - Alert(msg); - } - - // - if (!result) - { - // - AlertSignalExecutionFailed( - signal, - state // - ); - } - - // - return result; - } - - /** - * Force Close Specified Positions ... - * - * @param symbol: String ... - * @param provider: String ... - * @param period: ENUM_TIMEFRAMES member ... - * @param type: ENUM_X_POSITION_TYPES member ... - * - * @return ( bool ) - */ - bool ForceClose( - string symbol = NULL, - string provider = NULL, - ENUM_TIMEFRAMES period = NULL, - ENUM_X_POSITION_TYPES type = NULL // - ) - { - // - bool result = false; - - // - XPosition positions[]; - int count = mTrader.GetPositions( - positions, - symbol, - provider, - period, - type // - ); - result = IsValidSize(count); - if (!result) - { - return result; - } - - // - datetime cTime = TimeCurrent(); - - // - string comment = "Force Close (" + ToString(count) + ") Positions At: " + ToFormatString(cTime) + "..."; - int closedPositionsCount = mTrader.Close( - positions, - comment // - ); - result = IsValidSize(closedPositionsCount); - if (result) - { - // - // Finish Positions and Clear Data ... - for (int i = 0; i < ArraySize(positions); i++) - { - // - XPosition iPosition = positions[i]; - Finish( - iPosition.ticket, - iPosition, - comment // - ); - } - - // - ResetProtections(); - - // - string message = "Force Close (" + ToString(count) + ") Positions At: " + - ToFormatString(cTime) + " Successfully ..."; - Alert(message); - } - - // - return result; - } - - /** - * Force Close Positions ... - * - * @return ( bool ) - */ - bool ForceClose( - XPosition &positions[], - string comment, - string notificationMessage // - ) - { - // - bool result = false; - - // - int count = ArraySize(positions); - result = IsValidSize(count); - if (!result) - { - return result; - } - - // - int closedPositionsCount = mTrader.Close( - positions, - comment // - ); - result = IsValidSize(closedPositionsCount); - if (result) - { - // - // Finish Positions and Clear Data ... - for (int i = 0; i < ArraySize(positions); i++) - { - // - XPosition iPosition = positions[i]; - Finish( - iPosition.ticket, - iPosition, - comment // - ); - } - - // - ResetProtections(); - - // - if (IsValid(notificationMessage)) - { - Alert(notificationMessage); - } - } - - // - return result; - - // - return result; - } - - // - // Timing Actions ... - - /** - * Update Currently Open Positions Info on Data Collection ... - */ - void UpdateData() - { - // - // Retrieve Positions ... - XPosition positions[]; - int count = mTrader.GetPositions(positions); - if (!IsValidSize(count)) - { - return; - } - - // - // Loop Through Positions ... - for (int i = 0; i < count; i++) - { - // - XPosition iPosition = positions[i]; - - // - // Check Position Registered as Data or not ... - int idx = -1; - bool isExists = HasItem( - iPosition.ticket, - idx // - ); - if (isExists) - { - // - // Update Position Data ... - mData[idx].Update(iPosition); - } - } - } - - /** - * Handle Positiona Protections - */ - void HandleProtection() - { - // - string prefix = "Protector: "; - - // - int targetDistance = 5; - - // - // Implement Protection Senario Here ... - int count = Count(); - if (!IsValidSize(count)) - { - // - currentDrawdown = 0; - return; - } - - // - // Calculate Max Same Time Trades ... - maxSameTimeTrades = - maxSameTimeTrades == 0 || - maxSameTimeTrades < count - ? count - : maxSameTimeTrades; - - // - double bepSummary = 0; - double volumeSummary = 0; - double profitSummary = 0; - XPosition positions[]; - bool isProtected = false; - - // - // Loop through Open Positions ... - for (int i = 0; i < count; i++) - { - // - X121SMCTradeData iData = mData[i]; - - // - XPosition iPosition; - bool hasPosition = mTrader.GetPosition( - iData.ticket, - iPosition // - ); - if (!hasPosition) - { - continue; - } - AddRef( - iPosition, - positions // - ); - - // - // Calculate Break Even Point ... - double entry = iPosition.entry; - double points = iData.Points(); - double volume = iPosition.volume; - bool isLong = IsLong(iData.Type()); - double spread = GetSpread(iData.GetSymbol()); - double bep = iData.CalculateBreakEvenPoint(); - double exitPrice = GetExit( - iPosition.symbol, - iPosition.type // - ); - - // - double tps[]; - int reachedTPIndex = -1; - double reachedTPPrice = 0; - double reachedTPLevel = -1; - int tpLevelsCount = iPosition.CalculateTPLevels(tps); - iPosition.CalculateReahedTP( - reachedTPLevel, - reachedTPPrice // - ); - if (reachedTPLevel > 0) - { - // - reachedTPIndex = FindIndex( - reachedTPPrice, - tps // - ); - } - - // - bepSummary += bep; - volumeSummary += volume; - profitSummary += iPosition.profit; - - // - // All Protections Done for InProfit Positions ... - if (iData.profit > 0) - { - // - // Check Break Even ... - bool canRFOnBEP = iData.CanRiskFreeOnBreakEvenPoint(); - if (canRFOnBEP && reachedTPLevel > 0) - { - // - double tpLevel = iData.TPLevelForBreakEven(); - int tpIDX = (int)tpLevel - 1; - double rfTPPrice = tps[tpIDX]; - bool isSLReady = isLong - ? iPosition.sl < rfTPPrice - : iPosition.sl > rfTPPrice; - if (isSLReady && tpLevel == reachedTPLevel - 1) - { - // - double sl = rfTPPrice; - double tp = iPosition.tp; - string comment = "RF on BEP ..."; - bool isModified = mTrader.Modify( - iData.ticket, - sl, - tp, - comment // - ); - if (isModified) - { - // - isProtected = true; - - // - string message = prefix + - ToString(iData.Type()) + - " Position: " + - ToString(iData.ticket) + - " RF On BEP Successfully ..."; - Alert(message); - } - } - } - - // - // Check Partial Close ... - bool canPartialClose = iData.CanPartialClose(); - if (canPartialClose && reachedTPLevel > 0) - { - // - double mainVolume = iData.Volume(); - double currentVolume = iPosition.volume; - double partialCloseOnTP = iData.PartialCloseOnTPLevel(); - double partialCloseVolumeMultiplier = iData.PartialCloseMultiplier(); - double closeVolume = currentVolume * partialCloseVolumeMultiplier; - closeVolume = NormalizeVolume(closeVolume, iPosition.symbol); - canPartialClose = - currentVolume == mainVolume && - reachedTPLevel == partialCloseOnTP; - if (canPartialClose) - { - // - string comment = "PC On TP Level: " + ToString(partialCloseOnTP) + " ..."; - bool isModified = mTrader.ClosePartial( - iData.ticket, - closeVolume, - comment // - ); - if (isModified) - { - // - isProtected = true; - - // - string message = prefix + - ToString(iData.Type()) + - " Position: " + - ToString(iData.ticket) + - " PC (" + ToString(closeVolume) + ") On TP Level: " + - ToString(partialCloseOnTP) + " Successfully ..."; - Alert(message); - - // - // Finish Position ... - if (closeVolume == mainVolume) - { - // - Finish( - iPosition.ticket, - iPosition, - comment // - ); - - // - break; - } - } - } - } - - // - // Check for SL Trail ... - bool canTrailSL = iData.CanTrailSL(); - if (canTrailSL && reachedTPLevel > 0) - { - // - double tSLTPPrice = 0; - - // - double startTrailTPLevel = iData.TrailSLStartOnReachTPLevel(); - if (iData.lastTrailedTPLevel > 0) - { - startTrailTPLevel = iData.lastTrailedTPLevel + 1; - } - - // - canTrailSL = IsValidIndex(reachedTPIndex) && - reachedTPLevel >= startTrailTPLevel; - if (canTrailSL) - { - // - tSLTPPrice = - reachedTPIndex == 0 - ? tps[reachedTPIndex] - : tps[reachedTPIndex - 1]; - - // - canTrailSL = - tSLTPPrice > 0 && - iPosition.sl == 0 - ? (isLong - ? tSLTPPrice > iPosition.entry && - tSLTPPrice < iPosition.price - : tSLTPPrice < iPosition.entry && - tSLTPPrice > iPosition.price) - : (isLong - ? tSLTPPrice > iPosition.sl && - tSLTPPrice > iPosition.entry && - tSLTPPrice < iPosition.price - : tSLTPPrice < iPosition.sl && - tSLTPPrice < iPosition.entry && - tSLTPPrice > iPosition.price); - } - - // - if (canTrailSL) - { - // - string comment = "Trail SL on Reached TP: " + ToString(reachedTPLevel) + " ..."; - double sl = tSLTPPrice; - double tp = iPosition.tp; - bool isModified = mTrader.Modify( - iData.ticket, - sl, - tp, - comment // - ); - if (isModified) - { - // - isProtected = true; - - // - // Update Last Trailed TP Level ... - mData[i].lastTrailedTPLevel = reachedTPLevel; - - // - string message = prefix + - ToString(iData.Type()) + - " Position: " + - ToString(iData.ticket) + - " Trailed SL On Reached TP: " + ToString(reachedTPLevel) + - " Successfully ..."; - Alert(message); - } - } - } - - // - // Handle RF On Target ... - double targets[]; - int targetsCount = iData.Targets(targets); - bool hasTargets = IsValidSize(targetsCount); - if (hasTargets) - { - // - for (int k = 0; k < targetsCount; k++) - { - // - double target = targets[k]; - bool isValidTarget = - iData.lastTarget == 0 - ? true - : isLong - ? target > iData.lastTarget - : target < iData.lastTarget; - if (!isValidTarget) - { - continue; - } - - // - double targetDelta = isLong - ? target + (targetDistance * points) - : target - (targetDistance * points); - bool canRF = - target > 0 && - (isLong ? target > entry - : target < entry) && - (isLong - ? iPosition.sl < target - : iPosition.sl > target) && - (isLong - ? iPosition.price > targetDelta - : iPosition.price < targetDelta); - if (canRF) - { - // - double sl = target; - double tp = iPosition.tp; - string comment = "RF On Target ..."; - bool isModified = mTrader.Modify( - iData.ticket, - sl, - tp, - comment // - ); - if (isModified) - { - // - isProtected = true; - - // - // Update mData ... - mData[i].lastTarget = target; - - // - string message = prefix + - ToString(iData.Type()) + - " Position: " + - ToString(iData.ticket) + - " RF On Traget: " + ToString(target) + - " Successfully ..."; - Alert(message); - } - } - } - } - } - } - - // - // Calculate Max Draw Down ... - maxDrawdown = - profitSummary < 0 && - (maxDrawdown == 0 || - maxDrawdown < profitSummary) - ? profitSummary - : maxDrawdown; - - // - // Calculate Current Drawdown ... - currentDrawdown = - profitSummary < 0 - ? profitSummary - : 0; - - // - // Checking Hedge ... - bool allowHedge = AllowHedging() && - !isProtected; - if (allowHedge) - { - // - double minHedgeVolumeStep = HedgingMinVolumeStep(); - int minRequiredPositionsForHedge = MinOpenTradesFroHedging(); - double minRequiredProfitPerVolumeStepForHedge = HedgeingMinRequiredProfitPerVolumeStep(); - - // - double minRequiredAdditionalProfit = - bepSummary + - ((volumeSummary / minHedgeVolumeStep) * minRequiredProfitPerVolumeStepForHedge); - - // - bool canHedge = AllowHedging() && - profitSummary > 0 && - minHedgeVolumeStep > 0 && - minRequiredProfitPerVolumeStepForHedge > 0 && - profitSummary >= minRequiredAdditionalProfit && - (minRequiredPositionsForHedge <= 0 - ? true - : count >= minRequiredPositionsForHedge); - if (canHedge) - { - // - string comment = "Hedge (" + ToString(ArraySize(positions)) + ") Positions By: " + ToString(profitSummary) + "..."; - int closedPositionsCount = mTrader.Close( - positions, - comment // - ); - if (IsValidSize(closedPositionsCount)) - { - // - // Finish Positions and Clear Data ... - for (int i = 0; i < ArraySize(positions); i++) - { - // - XPosition iPosition = positions[i]; - Finish( - iPosition.ticket, - iPosition, - comment // - ); - } - - // - ResetProtections(); - - // - string message = "Hedge (" + ToString(ArraySize(positions)) + ") Positions By: " + - ToString(profitSummary) + " Successfully ..."; - Alert(message); - } - } - } - } - - // - // Protected ... - protected: - // - XCTrade *mTrader; // Instance of Trader Class - X121SMCTradeCollector *mCollector; // Instance of Trade Collector Class - - // - X121SMCTradeData mData[]; // Hold Trade Data - X121SMCSymbolPositionInfo mSymbolInfos[]; // Symbol Positions Info - XSymbolLastPosition mLastExecutedSignals[]; // Last Executed Signals - - // - void AlertSignalExecutionFailed( - XSignal &signal, - ENUM_X_SIGNAL_EXECUTION_RESULT state // - ) - { - // - // Alert Signal Execution Failed ... - string msg = "Failed To Execute " + - (signal.type == POSITION_TYPE_BUY ? "Long" : "Short") + - " Signal Provided by: " + signal.provider + - (signal.pushers > 1 ? " Pushers: " + ToString(signal.pushers) : "") + - " on: " + signal.symbol + - " in: " + ToString(signal.period) + - " due Reason: " + ToString(state) + " ..."; - Alert(msg); - } - - // - // Private ... - private: - // - // Props ... - - // - // Read Only ... - int maxSameTimeTrades; // Holds Max Same Time Trades - double maxDrawdown; // Max Drawdown - double currentDrawdown; // Current Drawdown - double drawdownPercent; // Drawdown Percent - double staticBalanceForCalculateDrawdown; // Static Balance for Max Drawdown Calculation - - // - bool mSaveSignals; // Save Signals - bool mSaveTrades; // Save Trades - bool mSaveConditions; // Save SL Conditions - - // - // Signalling Props ... - bool mAllowLong; // Allow Long Signals ... - bool mAllowShort; // Allow Short Signals ... - int mMaxAllowedLongs; // Max Allowed Long Signals ... - int mMaxAllowedShorts; // Max Allowed Short Signals ... - bool mUseMaxAllowedSignalsPerSymbol; // Use Max Allowed Signal Types Per Symbol ... - double mLastPositionProfitForAcceptNextInPoint; // Last Position Profit In Points for Accept new Signal ... - int mDelaysBetweenTwoSignalsInBar; // Delay between two Signals in Bars ... - double mMaxAllowedSpread; // Max Allowed Spread for Signalling ... - double mAdditionalVolume; // Volume Additional ... - - // - // Risk Management Props ... - double mMaxAllowedDrawdownToOpenTrades; // Max Allowed Drawdown for Open Trades ... - int mMaxAllowedSLToPauseSignallingPerSymbol; // Max Allowed SL for Pause Signalling Per Symbol ... - int mPauseSignallingAfterReachesMaxAllowedSLInSecconds; // Pause Signalling Per Symbol afte Max Allowed SL Reached In Seconds ... - - // - // Protection Props ... - bool mAllowHedging; // Allow Hedge Positions ... - int mMinOpenTradesFroHedging; // Minimum Open Positions for Hedging ... - double mHedgingMinVolumeStep; // Minimum Volume Step for Hedging ... - double mHedgeingMinRequiredProfitPerVolumeStep; // Minimum Required Profit Per Volume Step for Hedging ... - - // - // Common Functions ... - - // - // Count Data ... - int Count() - { - return ArraySize(mData); - } - - // - // Add Item ... - bool Add(X121SMCTradeData &item) - { - // - bool result = false; - - // - result = item.IsValid(); - if (!result) - { - return result; - } - - // - int index = -1; - if (item.ticket > 0) - { - // - result = !HasItem( - item.ticket, - index // - ); - } - else - { - // - result = !HasItem( - item.signal, - index // - ); - } - if (!result || IsValidIndex(index)) - { - // - result = false; - return result; - } - - // - AddRef( - item, - mData // - ); - - // - return result; - } - - // - // Find Item Index ... - bool HasItem( - ulong ticket, - int &index // - ) - { - // - bool result = false; - - // - index = -1; - - // - int count = Count(); - result = IsValidSize(count); - if (!result) - { - return result; - } - - // - for (int i = 0; i < count; i++) - { - // - result = mData[i].IsOwn(ticket); - if (result) - { - // - index = i; - break; - } - } - - // - return result; - } - - // - bool HasItem( - XSignal &signal, - int &index // - ) - { - // - bool result = false; - - // - index = -1; - - // - int count = Count(); - result = signal.IsValid() && - IsValidSize(count); - if (!result) - { - return result; - } - - // - for (int i = 0; i < count; i++) - { - // - bool isOwn = mData[i].IsOwn(signal); - if (isOwn) - { - // - index = i; - break; - } - } - - // - result = IsValidIndex(index); - - // - return result; - } - - // - bool HasItem( - XPosition &position, - int &index // - ) - { - // - bool result = false; - - // - index = -1; - - // - int count = Count(); - result = position.IsValid() && - IsValidSize(count); - if (!result) - { - return result; - } - - // - for (int i = 0; i < count; i++) - { - // - bool isOwn = mData[i].IsOwn(position); - if (isOwn) - { - // - index = i; - break; - } - } - - // - result = IsValidIndex(index); - - // - return result; - } - - // - bool HasItemByPosition( - XPosition &position, - int &index // - ) - { - // - bool result = false; - - // - index = -1; - - // - int count = Count(); - result = position.IsValid() && - IsValidSize(count); - if (!result) - { - return result; - } - - // - for (int i = 0; i < count; i++) - { - // - bool isOwn = mData[i].IsOwnPosition(position); - if (isOwn) - { - // - index = i; - break; - } - } - - // - result = IsValidIndex(index); - - // - return result; - } - - /** - * Find Specific Symbo Indo Item index ... - * - * @param symbol: String ... - * @param index: Integer ... - * - * @return ( bool ) - */ - bool HasSymbol( - string symbol, - int &index // - ) - { - // - bool result = false; - - // - index = -1; - - // - result = IsValid(symbol); - if (!result) - { - return result; - } - - // - int count = ArraySize(mSymbolInfos); - result = IsValidSize(count); - if (!result) - { - return result; - } - - // - for (int i = 0; i < count; i++) - { - // - bool isOwn = mSymbolInfos[i] - .IsOwn(symbol); - if (isOwn) - { - // - index = i; - break; - } - } - - // - result = IsValidIndex(index); - - // - return result; - } - - // - void Save(int index) - { - // - int count = Count(); - if (!IsValidIndex(index) || index > count - 1) - { - return; - } - - // - // Save Trade ... - if (mSaveTrades) - { - mCollector.Save(mData[index]); - } - - // - if (mSaveConditions) - { - mCollector.SaveConditions(mData[index]); - } - - // - // Remove Item From List ... - ArrayRemove( - mData, - index, - 1 // - ); - } - - // - void SaveSignal(X121SMCTradeData &item) - { - // - if (!mSaveSignals) - { - return; - } - - // - // Save Signal ... - mCollector.SaveSignal(item); - } - - // - // Find Last Signal Execution ... - int FindLastExecutedSignalItem(XSignal &signal) - { - // - int result = -1; - - // - if (!signal.IsValid()) - { - return result; - } - - // - int count = ArraySize(mLastExecutedSignals); - if (!IsValidSize(count)) - { - return result; - } - - // - for (int i = 0; i < count; i++) - { - // - XSymbolLastPosition iLast = mLastExecutedSignals[i]; - if (iLast.symbol == signal.symbol && - iLast.provider == signal.provider) - { - // - result = i; - break; - } - } - - // - return result; - } - - // - // Handle Last Signal Execution ... - void HandleSignalExecuted(XSignal &signal) - { - // - if (!signal.IsValid()) - { - return; - } - - // - datetime cTime = TimeCurrent(); - int symbolIDX = FindLastExecutedSignalItem(signal); - bool hasItem = IsValidIndex(symbolIDX); - if (hasItem) - { - mLastExecutedSignals[symbolIDX].time = cTime; - } - else - { - // - XSymbolLastPosition item; - - // - item.time = cTime; - item.symbol = signal.symbol; - item.provider = signal.provider; - - // - AddRef( - item, - mLastExecutedSignals // - ); - } - } - - // - double CalculateMaxDrawdownPercent() - { - // - double result = 0; - - // - double mEquity = mTrader.mAccount.GetEquity(); - if (mEquity > currentDrawdown) - { - currentDrawdown = mEquity; - } - - // - if (currentDrawdown >= 0) - { - // - drawdownPercent = 0; - return result; - } - - // - drawdownPercent = (currentDrawdown - mEquity) / - (staticBalanceForCalculateDrawdown > 0 - ? staticBalanceForCalculateDrawdown - : currentDrawdown) * - 100; - drawdownPercent = NormalizeDouble(drawdownPercent, 3); - result = drawdownPercent; - - // - return result; - } - - // - void ResetProtections() - { - // - ResumePausedSymbols(); - Clean(mLastExecutedSignals); - } - - // - // End of XC121SMCTradeHandler Class ... -}; - -// \ No newline at end of file diff --git a/X121SMCEA/Experts/x-121.smc.expert.class.mq5 b/X121SMCEA/Experts/x-121.smc.expert.class.mq5 deleted file mode 100644 index 78b1769e..00000000 --- a/X121SMCEA/Experts/x-121.smc.expert.class.mq5 +++ /dev/null @@ -1,2446 +0,0 @@ -/////////////////////////////////////////////////////// -// -// SaherElm IT Center MQL5 Class Library -// -------------------------------------- -// Name: XC121SMCExpert -// Description: provides all based classes for use ... -// -// -// Maintainer: -// ------------ -// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) -// -////////////////////////////////////////////////////// -// -// Global Properties ... -#property library -#property copyright "Copyright 2023, SaherElm IT Center" -#property link "https://www.saherelm.ir" -#property version "1.00" -#property strict - -// -// Imports ... -#include "../../Classes/x-saherelm.x-expert.class.mq5" -#include "../../Helpers/x-saherelm.x121.xcc.helper.mq5" -#include "../../Helpers/x-saherelm.x121.xct.helper.mq5" -#include "../Classes/x-121.smc.x-tradehandler.class.mq5" -#include "../Libraries/x-121.smc.lib.mq5" -#include "../Strategy/x-121.smc.strategy.class.mq5" - -// -// Definitions ... -string XC121SMCExpertToken = "XC121SMCEA"; - -// -// Implementation ... - -class XC121SMCExpert : public XCBaseExpert -{ - // - public: - // - XCX121XCCHelper *xccHelper; - XCX121XCTHelper *xctHelper; - - // - // Signal Event Listener ... - TOnStopLoss OnPositionSLEventListener; - TOnTakeProfit OnPositionTPEventListener; - TOnPartialClose OnPositionPartialCloseEventListener; - TOnModify OnPositionModifiedEventListener; - TOnForceClose OnPositionForceCloseEventListener; - - // - TOnDealsChanged OnDealsChangedEventListener; - TOnOrdersChanged OnOrdersChangedEventListener; - TOnPositionsChanged OnPositionsChangedEventListener; - - // - TOnX121SMCSignal OnSignalEventListener; - - // - // Constructor(s) ... - XC121SMCExpert() - { - mShowCandles = true; - } - - // - // Deconstructor(s) ... - ~XC121SMCExpert() - { - Clean(mStrategies); - } - - // - // Getter(s) / Setter(s) ... - - // - // Signalling Props ... - - /** - * Get Allow Long Signals State ... - * - * @return ( bool ) - */ - bool AllowLong() - { - return mAllowLong; - } - - /** - * Set Allow Long Signals State ... - * - * @param value: Boolean ... - */ - void AllowLong(bool value) - { - // - mAllowLong = value; - ReConfigure(); - } - - /** - * Get Allow Short Signals State ... - * - * @return ( bool ) - */ - bool AllowShort() - { - return mAllowShort; - } - - /** - * Set Allow Short Signals State ... - * - * @param value: Boolean ... - */ - void AllowShort(bool value) - { - // - mAllowShort = value; - ReConfigure(); - } - - /** - * Get Max Allowed Long Signals ... - * 0 => Unlimited ... - * - * @return ( int ) - */ - int MaxAllowedLongs() - { - return mMaxAllowedLongs; - } - - /** - * Set Max Allowed Long Signals ... - * - * @param value: Integer ... - * 0 => Unlimited ... - */ - void MaxAllowedLongs(int value) - { - // - if (value < 0) - { - value = 0; - } - - // - mMaxAllowedLongs = value; - ReConfigure(); - } - - /** - * Get Max Allowed Short Signals ... - * 0 => Unlimited ... - * - * @return ( int ) - */ - int MaxAllowedShorts() - { - return mMaxAllowedShorts; - } - - /** - * Set Max Allowed Short Signals ... - * - * @param value: Integer ... - * 0 => Unlimited ... - */ - void MaxAllowedShorts(int value) - { - // - if (value < 0) - { - value = 0; - } - - // - mMaxAllowedShorts = value; - ReConfigure(); - } - - /** - * Get Use Max Allowed Signal Types Per Symbol State ... - * - * @return ( bool ) - */ - bool UseMaxAllowedSignalsPerSymbol() - { - return mUseMaxAllowedSignalsPerSymbol; - } - - /** - * Set Use Max Allowed Signal Types Per Symbol State ... - * - * @param value: Boolean ... - */ - void UseMaxAllowedSignalsPerSymbol(bool value) - { - // - mUseMaxAllowedSignalsPerSymbol = false; - ReConfigure(); - } - - /** - * Get Last Position Profit In Points for Accept new Signal ... - * 0 => Accept All ... - * - * @return ( double ) - */ - double LastPositionProfitForAcceptNextInPoint() - { - return mLastPositionProfitForAcceptNextInPoint; - } - - /** - * Set Last Position Profit In Points for Accept new Signal ... - * - * @param value: Double ... - * 0 => Accept All ... - */ - void LastPositionProfitForAcceptNextInPoint(double value) - { - // - if (value < 0) - { - value = 0; - } - - // - mLastPositionProfitForAcceptNextInPoint = value; - ReConfigure(); - } - - /** - * Get Delay between two Signals in Bars ... - * 0 => Accept All ... - * - * @return ( int ) - */ - int DelaysBetweenTwoSignalsInBar() - { - return mDelaysBetweenTwoSignalsInBar; - } - - /** - * Set Delay between two Signals in Bars ... - * - * @param value: Integer ... - * 0 => Accept All ... - */ - void DelaysBetweenTwoSignalsInBar(int value) - { - // - if (value < 0) - { - value = 0; - } - - // - mDelaysBetweenTwoSignalsInBar = value; - ReConfigure(); - } - - /** - * Get Max Allowed Spread for Signalling ... - * 0 => Accept All ... - * - * @return ( double ) - */ - double MaxAllowedSpread() - { - return mMaxAllowedSpread; - } - - /** - * Set Max Allowed Spread for Signalling ... - * - * @param value: Double ... - * 0 => Accept All ... - */ - void MaxAllowedSpread(double value) - { - // - if (value < 0) - { - value = 0; - } - - // - mMaxAllowedSpread = value; - ReConfigure(); - } - - // - // Trade ... - - /** - * Get Allow Open Trade On Signals State ... - * - * @return ( bool ) - */ - bool AllowTrade() - { - return mAllowTrade; - } - - /** - * Set Allow Open Trade On Signals State ... - * - * @param value: Boolean ... - */ - void AllowTrade(bool value) - { - mAllowTrade = value; - } - - /** - * Get Enable Trade on Signals on Time ... - * - * @return ( string ) - */ - string StartTradeAt() - { - return mStartTradeAt; - } - - /** - * Set Enable Trade on Signals on Time ... - * - * @param value: String ... - */ - void StartTradeAt(string value) - { - mStartTradeAt = value; - } - - /** - * Get Enable Trade on Signals on Time ... - * - * @return ( string ) - */ - string StopTradeAt() - { - return mStopTradeAt; - } - - /** - * Set Enable Trade on Signals on Time ... - * - * @param value: String ... - */ - void StopTradeAt(string value) - { - mStopTradeAt = value; - } - - /** - * Get Enable Close All Trades on Signals on Time ... - * - * @return ( string ) - */ - string CloseAllTradesAt() - { - return mCloseAllTradesAt; - } - - /** - * Set Enable Close All Trades on Signals on Time ... - * - * @param value: String ... - */ - void CloseAllTradesAt(string value) - { - mCloseAllTradesAt = value; - } - - // - // Risk Management Props ... - - /** - * Get Risk to Reward Ratio ... - * - * @return ( double ) - */ - double R2R() - { - return mR2R; - } - - /** - * Set Risk to Reward Ratio ... - * - * @param value: Double ... - */ - void R2R(double value) - { - // - if (value < 1) - { - value = 1; - } - - // - mR2R = value; - ReConfigure(); - } - - /** - * Get Static Volume ... - * - * @return ( double ) - */ - double Volume() - { - return mVolume; - } - - /** - * Set Static Volume ... - * - * @param value: Double ... - */ - void Volume(double value) - { - // - if (value < 0.01) - { - value = 0.01; - } - - // - mVolume = value; - ReConfigure(); - } - - /** - * Get Static Balance for Calculate Trade Volume ... - * - * @return ( double ) - */ - double StaticBalance() - { - return mStaticBalance; - } - - /** - * Set Static Balance for Calculate Trade Volume ... - * - * @param value: Argument 1 - */ - void StaticBalance(double value) - { - // - if (value < 0) - { - value = 0; - } - - // - mStaticBalance = value; - } - - /** - * Get Balance Used In Each Trade ... - * - * @return ( double ) - */ - double BalancePerTrade() - { - return mBalancePerTrade; - } - - /** - * Set Balance Used In Each Trade ... - * - * @param value: Argument 1 - */ - void BalancePerTrade(double value) - { - // - if (value < 0) - { - value = 0; - } - - // - mBalancePerTrade = value; - } - - /** - * Get Risk Percent Per Balance in Each Trade ... - * - * @return ( double ) - */ - double RiskPercentPerBalance() - { - return mRiskPercentPerBalance; - } - - /** - * Set Risk Percent Per Balance in Each Trade ... - * - * @param value: Double - */ - void RiskPercentPerBalance(double value) - { - // - if (value < 0) - { - value = 0; - } - - // - mRiskPercentPerBalance = value; - ReConfigure(); - } - - /** - * Get Dynamic Risk Management State ... - * - * @return ( bool ) - */ - bool DynamicRiskManagement() - { - return mDynamicRiskManagement; - } - - /** - * Set Dynamic Risk Management State ... - * - * @param value: Boolean ... - */ - void DynamicRiskManagement(bool value) - { - // - mDynamicRiskManagement = value; - ReConfigure(); - } - - /** - * Get Use Dynamic Volume State ... - * - * @return ( bool ) - */ - bool UseDynamicVolume() - { - return mUseDynamicVolume; - } - - /** - * Set Use Dynamic Volume State ... - * - * @param value: Boolean ... - */ - void UseDynamicVolume(bool value) - { - // - mUseDynamicVolume = value; - ReConfigure(); - } - - /** - * Get Increase Volume Step ... - * - * @return ( double ) - */ - double DynamicVolumeStep() - { - return mDynamicVolumeStep; - } - - /** - * Set Increase Volume Step ... - * - * @param value: Double ... - */ - void DynamicVolumeStep(double value) - { - // - if (value < 0.01) - { - value = 0.01; - } - - // - mDynamicVolumeStep = value; - ReConfigure(); - } - - /** - * Get Balance Factor for Generate Dynamic Volume ... - * - * @return ( double ) - */ - double DynamicVolumeBalanceFactor() - { - return mDynamicVolumeBalanceFactor; - } - - /** - * Set Balance Factor for Generate Dynamic Volume ... - * - * @param value: Double ... - */ - void DynamicVolumeBalanceFactor(double value) - { - // - if (value < 0) - { - value = 0; - } - - // - mDynamicVolumeBalanceFactor = value; - ReConfigure(); - } - - /** - * Get Max Allowed Drawdown Percent for Open Trades ... - * 0 => Ignore ... - * min => 0 ... - * max => 100 ... - * - * @return ( double ) - */ - double MaxAllowedDrawdownToOpenTrades() - { - return mMaxAllowedDrawdownToOpenTrades; - } - - /** - * Set Max Allowed Drawdown Percent for Open Trades ... - * - * @param value: Double ... - * 0 => Ignore ... - * min => 0 ... - * max => 100 ... - */ - void MaxAllowedDrawdownToOpenTrades(double value) - { - // - if (value < 0) - { - value = 0; - } - - // - if (value > 50) - { - value = 50; - } - - // - mMaxAllowedDrawdownToOpenTrades = value; - ReConfigure(); - } - - /** - * Get Max Allowed SL for Pause Signalling Per Symbol ... - * 0 => Unlimited ... - * - * @return ( int ) - */ - int MaxAllowedSLToPauseSignallingPerSymbol() - { - return mMaxAllowedSLToPauseSignallingPerSymbol; - } - - /** - * Set Max Allowed SL for Pause Signalling Per Symbol ... - * - * @param value: Integer ... - * 0 => Unlimited ... - */ - void MaxAllowedSLToPauseSignallingPerSymbol(int value) - { - // - if (value < 0) - { - value = 0; - } - - // - mMaxAllowedSLToPauseSignallingPerSymbol = value; - ReConfigure(); - } - - /** - * Get Pause Signalling Per Symbol afte Max Allowed SL Reached In Seconds ... - * 0 => Ignore ... - * - * @return ( int ) - */ - int PauseSignallingAfterReachesMaxAllowedSLInSecconds() - { - return mPauseSignallingAfterReachesMaxAllowedSLInSecconds; - } - - /** - * Set Pause Signalling Per Symbol afte Max Allowed SL Reached In Seconds ... - * - * @param value: Integer ... - * 0 => Ignore ... - */ - void PauseSignallingAfterReachesMaxAllowedSLInSecconds(int value) - { - // - if (value < 0) - { - value = 0; - } - - // - mPauseSignallingAfterReachesMaxAllowedSLInSecconds = value; - ReConfigure(); - } - - // - // Protection Props ... - - /** - * Get Allow Hedge Positions State ... - * - * @return ( bool ) - */ - bool AllowHedging() - { - return mAllowHedging; - } - - /** - * Set Allow Hedge Positions State ... - * - * @param value: Boolean ... - */ - void AllowHedging(bool value) - { - // - mAllowHedging = value; - ReConfigure(); - } - - /** - * Get Minimum Open Positions for Hedging ... - * 0 => Ignore ... - * - * @return ( int ) - */ - int MinOpenTradesFroHedging() - { - return mMinOpenTradesFroHedging; - } - - /** - * Set Minimum Open Positions for Hedging ... - * - * @param value: Integer ... - * 0 => Ignore ... - */ - void MinOpenTradesFroHedging(int value) - { - // - if (value < 0) - { - value = 0; - } - - // - mMinOpenTradesFroHedging = value; - ReConfigure(); - } - - /** - * Get Minimum Volume Step for Hedging ... - * 0 => Ignore ... - * - * @return ( double ) - */ - double HedgingMinVolumeStep() - { - return mHedgingMinVolumeStep; - } - - /** - * Set Minimum Volume Step for Hedging ... - * - * @param value: Double ... - * 0 => Ignore ... - */ - void HedgingMinVolumeStep(double value) - { - // - if (value < 0) - { - value = 0; - } - - // - if (value > 0 && value < 0.01) - { - value = 0.01; - } - - // - if (value > 0 && value > 0.1) - { - value = 0.1; - } - - // - mHedgingMinVolumeStep = value; - ReConfigure(); - } - - /** - * Get Minimum Required Profit Per Volume Step for Hedging ... - * 0 => Ignore ... - * - * @return ( double ) - */ - double HedgeingMinRequiredProfitPerVolumeStep() - { - return mHedgeingMinRequiredProfitPerVolumeStep; - } - - /** - * Set Minimum Required Profit Per Volume Step for Hedging ... - * - * @param value: Double ... - * 0 => Ignore ... - */ - void HedgeingMinRequiredProfitPerVolumeStep(double value) - { - // - if (value < 0) - { - value = 0; - } - - // - mHedgeingMinRequiredProfitPerVolumeStep = value; - ReConfigure(); - } - - // - // Actions ... - - /** - * Handle OnSignalRecieved Event ... - * - * @param signal: XSignal instance ... - * @param conditions: X121SMCStrategyConditions instance ... - */ - void HandleOnSignalRecieved( - XSignal &signal, - X121SMCStrategyConditions &conditions // - ) - { - // - // Check Signal and Conditions Validations ... - - // - if (!signal.IsValid()) - { - return; - } - - // - if (!conditions.IsValid()) - { - return; - } - - // - bool isLong = IsLong(signal.type); - - // - // Notify When a Raw (Unfiltered) Signal Recieved - // if it's Provided ... - bool mAlertRawSignals = false; - if (mAlertRawSignals) - { - // - string msg = "Raw " + (IsLong(signal.type) ? "Long" : "Short") + - " Signal Recieved: (" + signal.provider + "," + - signal.symbol + "," + - ToString(signal.period) + - ") ..."; - - // - Alert(msg); - } - - // - // Apply Volume On Signal ... - ApplyVolumeOnSignal(signal); - - // - // Chekc Signalling Enable or not ... - bool canContinue = - isLong - ? AllowLong() - : AllowShort(); - if (!canContinue) - { - return; - } - - // - // TODO: Apply Filtering On Signal ... - bool isFiltered = false; - if (isFiltered) - { - // - mTradeHandler.Remove(signal); - return; - } - - // - // Attach Conditions Summary to Signal ... - string conditionsSummary = conditions.GenerateSummary( - false, - false, - true, - false // - ); - - // - // TODO: Retrieve Conditions Summary based on Filter ... - signal.conditions = conditionsSummary; - - // - datetime currentTime = TimeCurrent(); - - // - // Chack Allow Trades ... - bool allowTrade = AllowTrade(); - if (allowTrade) - { - // - string startTime = StartTradeAt(); - string endTime = StopTradeAt(); - bool isTimePassed = IsTimeInRange( - TimeCurrent(), - startTime, - endTime // - ); - - // - if (isTimePassed) - { - // - // Execute Signal Using Trade Handler ... - ENUM_X_SIGNAL_EXECUTION_RESULT state; - bool isExecuted = mTradeHandler.ExecuteSignal( - signal, - conditions, - state, - false // ignore Policies ... - ); - } - else - { - // - string msg = "Failed To Execute " + - (IsLong(signal.type) - ? "Long" - : "Short") + - " Signal Recieved: (" + - signal.provider + "," + - signal.symbol + "," + - ToString(signal.period) + - ") due Trading offTime ..."; - - // - Alert(msg); - } - } - else - { - // - // Only Alert Signals ... - string msg = (IsLong(signal.type) - ? "Long" - : "Short") + - " Signal Recieved: (" + - signal.provider + "," + - signal.symbol + "," + - ToString(signal.period) + - ") ..."; - - // - Alert(msg); - } - - // - signal.Clean(); - conditions.Clean(); - } - - // - // Override Actions ... - - /** - * Apply Default Configurations ... - */ - void DefaultConfigure() override - { - // - // Commons ... - Slippage(10); - TagPrefix(""); - MagicNumber(1694056); - - // - // Symbol ... - SetSymbol(_Symbol); - SetPeriod(_Period); - MultiSymbol(false); - Symbols("EURUSDb,GBPUSDb,USDJPYb,USDCHFb,DowJones30,XAUUSDb"); - - // - // Signalling ... - Disabled(false); - AllowLong(true); - AllowShort(true); - - // - string tag = GetTag(); - - // - // Alert ... - SetAlertPrefix(tag); - SetAlertLogAlerts(true); - SetAlertPushAlerts(true); - SetAlertMailAlerts(false); - SetAlertEnableAlerts(true); - SetAlertTerminalAlerts(false); - - // - // Reports ... - ReportNewDays(true); - ReportNewWeeks(false); - ReportNewHours(false); - ReportNewMonths(false); - - // - R2R(1); - - // - // Volume Default Configurations ... - Volume(0.01); - UseDynamicVolume(false); - DynamicVolumeStep(0.01); - DynamicVolumeBalanceFactor(200); - - // - RiskPercentPerBalance(0); - DynamicRiskManagement(false); - } - - /** - * Vaslidate Inputs ... - * - * @return ( bool ) - */ - bool ValidateInputs() override - { - // - bool result = false; - - // - string errMessage = ""; - - // - bool isCommonValid = ( - // - Slippage() > 0 && - MagicNumber() > 0 - // - ); - if (!isCommonValid) - { - // - errMessage += "common configurations error;" + "\n"; - } - - // - // Checking Volume ... - bool isVolumeValid = true; - if (UseDynamicVolume()) - { - // - isVolumeValid = - DynamicVolumeStep() > 0 && - DynamicVolumeBalanceFactor() > 0; - if (!isVolumeValid) - { - errMessage += "Dynamic Volume configurations error;" + "\n"; - } - } - isVolumeValid = isVolumeValid && - Volume() > 0; - if (!isVolumeValid) - { - errMessage += "Static Volume configurations error;" + "\n"; - } - - // - result = - // - // Common ... - isCommonValid && - // - // Volume Coniguration ... - isVolumeValid && - // - // Otere ... - true - // - ; - - // - if (!result) - { - // - // Since here Logger not Initiallized, we Use Raw Print Command ... - errMessage = " Errors: \n" + errMessage; - Alert(errMessage); - } - - // - return result; - } - - // - // Initializers and DeInitializers ... - - /** - * Initial EA Requirements ... - * - * @return ( bool ) - */ - bool InitEA() override - { - // - bool result = true; - - // - // Initialize Indicator Helpers ... - - // - X121XCCInputs xccInputs; - xccInputs.Default(); - xccInputs.showCandles = mShowCandles; - xccHelper = new XCX121XCCHelper(); - result = xccHelper.Init( - _Symbol, - _Period, - xccInputs // - ); - if (!result) - { - return result; - } - - // - X121XCTInputs xctInputs; - xctInputs.Default(); - xctHelper = new XCX121XCTHelper(); - result = xctHelper.Init( - _Symbol, - _Period, - xctInputs // - ); - if (!result) - { - return result; - } - - // - // Configure Alerts ... - SetAlertPrefix(GetTag()); - SetAlertEnableAlerts(GetAlertEnableAlerts()); - SetAlertLogAlerts(GetAlertLogAlerts()); - SetAlertMailAlerts(GetAlertMailAlerts()); - SetAlertPushAlerts(GetAlertPushAlerts()); - SetAlertTerminalAlerts(GetAlertTerminalAlerts()); - - // - // Create Trader Instance and Configure it ... - mTrader = new XCTrade( - Slippage(), - MagicNumber() // - ); - mTrader.AddOnStopLossEventHandler(OnPositionSLEventListener); - mTrader.AddOnTakeProfitEventHandler(OnPositionTPEventListener); - mTrader.AddOnDealsChangedEventHandler(OnDealsChangedEventListener); - mTrader.AddOnOrdersChangedEventHandler(OnOrdersChangedEventListener); - mTrader.AddOnModifyPositionEventHandler(OnPositionModifiedEventListener); - mTrader.AddOnPositionsChangedEventHandler(OnPositionsChangedEventListener); - mTrader.AddOnForceClosePositionEventHandler(OnPositionForceCloseEventListener); - mTrader.AddOnPartialClosePositionEventHandler(OnPositionPartialCloseEventListener); - - // - // Initialize Trade Handler ... - mTradeHandler = new XC121SMCTradeHandler(mTrader); - mTradeHandler.SaveTrades(false); - mTradeHandler.SaveSignals(false); - mTradeHandler.SaveConditions(false); - mTradeHandler.MaxAllowedSpread(MaxAllowedSpread()); - - // - ReConfigureTradeHandler(); - - // - // Parsers ... - XSymbolParser _symbolParser; - - // - // Single Symbol ... - if (!MultiSymbol()) - { - // - // Register Strategy ... - - // - // Create Class Instance ... - XCX121SMCBaseStrategy *iX121SMCStrategy; - iX121SMCStrategy = new XCX121SMCStrategy( - _Symbol, - _Period // - ); - - // - iX121SMCStrategy.AddXSignalEventHandler(OnSignalEventListener); - - // - ConfigureStrategy(iX121SMCStrategy); - RegisterStrategy(iX121SMCStrategy); - } - // - // Multi Symbol ... - else - { - // - // Parse Symbols ... - string symbols[]; - int symbolsCount = SplitContent( - symbols, - Symbols() // - ); - result = IsValidSize(symbolsCount); - if (!result) - { - return result; - } - - // - for (int i = 0; i < symbolsCount; i++) - { - // - // Select Symbol ... - string iSymbol = symbols[i]; - - // - // Register Strategy Based On Symbol ... - - // - // Parse Symbol ... - bool isEURUSD = _symbolParser.IsEURUSD(_Symbol); - bool isGBPUSD = _symbolParser.IsGBPUSD(_Symbol); - bool isEURGBP = _symbolParser.IsEURGBP(_Symbol); - bool isUSDCHF = _symbolParser.IsUSDCHF(_Symbol); - bool isEURCHF = _symbolParser.IsEURCHF(_Symbol); - bool isUSDJPY = _symbolParser.IsUSDJPY(_Symbol); - bool isEURJPY = _symbolParser.IsEURJPY(_Symbol); - bool isUSDCAD = _symbolParser.IsUSDCAD(_Symbol); - bool isEURCAD = _symbolParser.IsEURCAD(_Symbol); - bool isAUDUSD = _symbolParser.IsAUDUSD(_Symbol); - bool isEURAUD = _symbolParser.IsEURAUD(_Symbol); - bool isNZDUSD = _symbolParser.IsNZDUSD(_Symbol); - bool isEURNZD = _symbolParser.IsEURNZD(_Symbol); - - // - // Check Symbol Can Register or not ... - bool canRegisterStrategy = true; - - // - if (canRegisterStrategy) - { - // - // Create Class Instance ... - XCX121SMCBaseStrategy *iX121SMCStrategy; - iX121SMCStrategy = new XCX121SMCStrategy( - iSymbol, - _Period // - ); - - // - iX121SMCStrategy.AddXSignalEventHandler(OnSignalEventListener); - - // - // Register Strategy ... - ConfigureStrategy(iX121SMCStrategy); - RegisterStrategy(iX121SMCStrategy); - } - } - - // - Clean(symbols); - } - - // - return result; - } - - /** - * Destroy all Initialized EA Requirements ... - */ - void DestroyEA() override - { - // - ZeroMemory(xccHelper); - ZeroMemory(xctHelper); - ZeroMemory(mTradeHandler); - - // - delete xccHelper; - delete xctHelper; - delete mTradeHandler; - - // - Clean(mStrategies); - } - - /** - * Call all Registered Strategies On Tick ... - */ - void HandleStrategiesOnTick() override - { - // - // Check Force Close ... - string forceCloseTimeStr = CloseAllTradesAt(); - if (IsValid(forceCloseTimeStr)) - { - // - datetime forceCloseTime = ParseDateTimeFromTimeString(forceCloseTimeStr); - bool canForceClose = IsTimeInRange( - TimeCurrent(), - forceCloseTime // - ) && - !mIsForceCloseAtTime; - if (canForceClose) - { - mIsForceCloseAtTime = mTradeHandler.ForceClose(); - } - } - - // - // Update Positions Data ... - mTradeHandler.UpdateData(); - - // - // Protect Positions ... - mTradeHandler.HandleProtection(); - - // - int count = ArraySize(mStrategies); - if (!IsValidSize(count)) - { - return; - } - - // - for (int i = 0; i < count; i++) - { - // - // Call Tick Handler Function ... - mStrategies[i].HandleTick(); - } - } - - /** - * Handle Strategies Guards ... - */ - void HandleStrategiesGuard() override - { - // - int count = ArraySize(mStrategies); - if (!IsValidSize(count)) - { - return; - } - - // - XPosition positions[]; - int positionsCount = mTrader.GetPositions( - positions, // Result ... - NULL, // Symbol ... - NULL, // Provider ... - NULL, // Period ... - X_POSITION_TYPE_ALL // All Types ... - ); - if (!IsValidSize(positionsCount)) - { - return; - } - - // - for (int i = 0; i < count; i++) - { - // - // Call Tick Handler Function ... - X121SMCGuard iGuards[]; - bool hasGuards = mStrategies[i].HandleGuard( - iGuards, - positions // - ); - if (hasGuards) - { - HandleGuards(iGuards); - } - } - - // - Clean(positions); - } - - // - // Event Handlers ... - - /** - * Calls When a Deals Changed Triggered ... - * - * @param count: Integer, Number of Changes ... - */ - void HandleOnDealsChanged(int count) override - { - } - - /** - * Calls When a Order Changed Triggered ... - * - * @param count: Integer, Number of Changes ... - */ - void HandleOnOrdersChanged(int count) override - { - } - - /** - * Calls When a Positions Changed Triggered ... - * - * @param count: Integer, Number of Changes ... - */ - void HandleOnPositionsChanged(int count) override - { - // - if (IsValidSize(count)) - { - mTradeHandler.HandleNewPosition(); - } - } - - /** - * Calls When a Position's SL Triggered ... - * - * @param deal: XDeal instance ... - */ - void HandleOnStopLossTriggered(const XDeal &deal) override - { - // - // Finish ... - mTradeHandler.Finish(deal); - - // - HandleReportBalance(); - } - - /** - * Calls When a Position's TP Triggered ... - * - * @param deal: XDeal instance ... - */ - void HandleOnTakeProfitTriggered(const XDeal &deal) override - { - // - // Finish ... - mTradeHandler.Finish(deal); - - // - bool useDynamicRiskManagement = DynamicRiskManagement(); - if (useDynamicRiskManagement) - { - mTradeHandler.ResetSymbolInfo(deal.symbol); - } - - // - HandleReportBalance(); - } - - /** - * Handle Force Close a Position ... - * - * @param ticket: Position Ticket ... - * @param position: XPosition ... - * @param comment: Closing Comment ... - */ - void HandleOnPositionForceClosed( - const ulong ticket, - const XPosition &position, - const string comment // - ) override - { - // - // Finish ... - mTradeHandler.Finish( - ticket, - position, - comment // - ); - - // - HandleReportBalance(); - } - - /** - * Reset All Paused Symbols on Each New Days ... - */ - void HandleOnNewDay() override - { - // - mIsForceCloseAtTime = false; - mTradeHandler.ResumePausedSymbols(); - } - - /** - * Re Configure Materials on Properties Changed ... - */ - void ReConfigure() override - { - // - ReConfigureTradeHandler(); - ReConfigureAllStrategies(); - } - - /** - * Generate Identifier Tag ... - * - * @return ( string ) - */ - string GetTag() override - { - // - string result = NULL; - - // - string tagPrefix = TagPrefix(); - if (IsValid(tagPrefix)) - { - result = tagPrefix; - } - else - { - result = ""; - } - - // - result = - XC121SMCExpertToken + result; - - // - return result; - } - - // - protected: - // - - // - // Props ... - - // - XC121SMCTradeHandler *mTradeHandler; // Trade Handler ... - XCX121SMCBaseStrategy *mStrategies[]; // Registere Strategies in EA ... - - // - // Actions ... - - /** - * Apply Volume Based On Configurations on Signal ... - * - * @param signal: XSignal instance - */ - void ApplyVolumeOnSignal(XSignal &signal) - { - // - if (signal.ignoreEAVolume) - { - return; - } - - // - double staticVolume = Volume(); - double fVolume = staticVolume > 0 - ? staticVolume - : 0.01; - - // - double staticBalance = StaticBalance(); - double accountBalance = mTrader.mAccount.GetBalance(); - double balance = staticBalance > 0 - ? staticBalance - : accountBalance; - - // - bool useDynamicVolume = UseDynamicVolume(); - double balancePerTrade = BalancePerTrade(); - double dynamicVolumeStep = DynamicVolumeStep(); - double riskPercentPerBalance = RiskPercentPerBalance(); - bool allowDynamicRiskManagement = DynamicRiskManagement(); - double dynamicVolumeBalanceFactor = DynamicVolumeBalanceFactor(); - - // - // Apply Static Volume ... - bool allowStaticVolume = staticVolume > 0; - - // - // Apply Dynamic Volume ... - bool aloowApplyDynamicVolume = useDynamicVolume && - dynamicVolumeStep && - dynamicVolumeBalanceFactor; - - // - // Apply Risk Per Trade Volume ... - bool allowApplyRiskPerTradeVolume = - !aloowApplyDynamicVolume && - riskPercentPerBalance > 0; - - // - // Apply Balance Per Trade Volume ... - bool allowApplyBalacePerTradeVolume = - !aloowApplyDynamicVolume && - !allowApplyRiskPerTradeVolume && - balancePerTrade > 0; - - // - // First Check Dynamic Volume ... - if (aloowApplyDynamicVolume) - { - // - // Dynamic Volume ... - double dVolume = mTrader.GetDynamicVolume( - signal.symbol, - dynamicVolumeBalanceFactor, - dynamicVolumeStep // - ); - if (dVolume < fVolume) - { - dVolume = fVolume; - } - - // - signal.volume = dVolume; - } - else if (allowApplyRiskPerTradeVolume) - { - // - double riskAmountPerBalance = (riskPercentPerBalance * balance) / 100; - - // - double risk = signal.GetRisk(); - double points = GetPoints(signal.symbol); - double riskInPoints = risk / points; - - // - double volume = mTrader.mAccount.CalculateVolume( - signal.symbol, - riskAmountPerBalance, - riskInPoints // - ); - if (volume <= 0) - { - volume = fVolume; - } - - // - // Check Dynamic Risk Management ... - bool allowDynamicRiskManagement = DynamicRiskManagement(); - if (allowDynamicRiskManagement) - { - // - // Calculate Dynamic Additional Risk Management Volume Multiplier ... - double mAdditionalRiskMultiplier = CalculateAdditionalVolumeMultiplier(signal); - if (mAdditionalRiskMultiplier < 1) - { - mAdditionalRiskMultiplier = 1; - } - - // - volume *= mAdditionalRiskMultiplier; - } - - // - signal.volume = volume; - } - else if (allowApplyBalacePerTradeVolume) - { - // - double risk = signal.GetRisk(); - double points = GetPoints(signal.symbol); - double riskInPoints = risk / points; - - // - double volume = mTrader.mAccount.CalculateVolume( - signal.symbol, - balancePerTrade, - riskInPoints // - ); - if (volume <= 0) - { - volume = fVolume; - } - - // - signal.volume = volume; - } - else if (allowStaticVolume) - { - signal.volume = staticVolume; - } - else - { - signal.volume = fVolume; - } - - // - // Normalize Signal Volume ... - signal.volume = NormalizeVolume( - signal.volume, - signal.symbol // - ); - } - - /** - * Configure Startegy ... - */ - void ConfigureStrategy(XCX121SMCBaseStrategy *&strategy) - { - // - if (strategy == NULL) - { - return; - } - - // - // Configure Alerts ... - strategy.SetAlertPrefix(GetTag()); - strategy.SetAlertLogAlerts(GetAlertLogAlerts()); - strategy.SetAlertMailAlerts(GetAlertMailAlerts()); - strategy.SetAlertPushAlerts(GetAlertPushAlerts()); - strategy.SetAlertEnableAlerts(GetAlertEnableAlerts()); - strategy.SetAlertTerminalAlerts(GetAlertTerminalAlerts()); - - // - // Confiugre Signalling ... - - // - strategy.R2R(R2R()); - strategy.AllowLong(AllowLong()); - strategy.AllowShort(AllowShort()); - - // - if (Disabled()) - { - strategy.Disable(); - } - else - { - strategy.Enable(); - } - - // - } - - /** - * Register an Strategy in EA ... - * - * @param strategy: XCX121SMCBaseStrategy instance ... - */ - void RegisterStrategy(XCX121SMCBaseStrategy *strategy) - { - // - if (strategy == NULL) - { - return; - } - - // - ArrayResize( - mStrategies, - ArraySize(mStrategies) + 1 // - ); - - // - mStrategies[ArraySize(mStrategies) - 1] = strategy; - } - - /** - * Re Configure All Registered Strategies ... - */ - void ReConfigureAllStrategies() - { - // - int count = ArraySize(mStrategies); - if (!IsValidSize(count)) - { - return; - } - - // - for (int i = 0; i < count; i++) - { - // - ConfigureStrategy(mStrategies[i]); - } - } - - /** - * Re Configure Trade Handler ... - */ - void ReConfigureTradeHandler() - { - // - if (mTradeHandler == NULL) - { - return; - } - - // - // Configure Alerts ... - mTradeHandler.SetAlertPrefix(GetTag()); - mTradeHandler.SetAlertEnableAlerts(GetAlertEnableAlerts()); - mTradeHandler.SetAlertLogAlerts(GetAlertLogAlerts()); - mTradeHandler.SetAlertMailAlerts(GetAlertMailAlerts()); - mTradeHandler.SetAlertPushAlerts(GetAlertPushAlerts()); - mTradeHandler.SetAlertTerminalAlerts(GetAlertTerminalAlerts()); - - // - mTradeHandler.AllowLong(AllowLong()); - mTradeHandler.AllowShort(AllowShort()); - mTradeHandler.MaxAllowedLongs(MaxAllowedLongs()); - mTradeHandler.MaxAllowedShorts(MaxAllowedShorts()); - mTradeHandler.UseMaxAllowedSignalsPerSymbol(UseMaxAllowedSignalsPerSymbol()); - mTradeHandler.LastPositionProfitForAcceptNextInPoint(LastPositionProfitForAcceptNextInPoint()); - mTradeHandler.DelaysBetweenTwoSignalsInBar(DelaysBetweenTwoSignalsInBar()); - mTradeHandler.MaxAllowedSpread(MaxAllowedSpread()); - mTradeHandler.MaxAllowedDrawdownToOpenTrades(MaxAllowedDrawdownToOpenTrades()); - mTradeHandler.MaxAllowedSLToPauseSignallingPerSymbol(MaxAllowedSLToPauseSignallingPerSymbol()); - mTradeHandler.PauseSignallingAfterReachesMaxAllowedSLInSecconds(PauseSignallingAfterReachesMaxAllowedSLInSecconds()); - mTradeHandler.AllowHedging(AllowHedging()); - mTradeHandler.MinOpenTradesFroHedging(MinOpenTradesFroHedging()); - mTradeHandler.HedgingMinVolumeStep(HedgingMinVolumeStep()); - mTradeHandler.HedgeingMinRequiredProfitPerVolumeStep(HedgeingMinRequiredProfitPerVolumeStep()); - } - - // - private: - // - - // - // Props ... - - // - bool mShowCandles; // Show Candles ... - - // - // Signalling Props ... - bool mAllowLong; // Allow Long Signals ... - bool mAllowShort; // Allow Short Signals ... - int mMaxAllowedLongs; // Max Allowed Long Signals ... - int mMaxAllowedShorts; // Max Allowed Short Signals ... - bool mUseMaxAllowedSignalsPerSymbol; // Use Max Allowed Signal Types Per Symbol ... - double mLastPositionProfitForAcceptNextInPoint; // Last Position Profit In Points for Accept new Signal ... - int mDelaysBetweenTwoSignalsInBar; // Delay between two Signals in Bars ... - double mMaxAllowedSpread; // Max Allowed Spread for Signalling ... - - // - // Trade ... - bool mAllowTrade; // Allow Open Trade On Signals ... - string mStartTradeAt; // Enable Trade on Signals on Time ... - string mStopTradeAt; // Enable Trade on Signals on Time ... - string mCloseAllTradesAt; // Enable Close All Trades on Signals on Time ... - - // - bool mIsForceCloseAtTime; - - // - // Risk Management Props ... - double mR2R; // Signallers Risk to Reward Ratio ... - double mVolume; // Static Volume ... - double mStaticBalance; // Static Balance for Calculate Trade Volume ... - double mBalancePerTrade; // Balance Used in Each Trade ... - double mRiskPercentPerBalance; // Risk Percent Per Balance in Each Trade ... - bool mDynamicRiskManagement; // Dynamic Risk Management ... - bool mUseDynamicVolume; // Use Dynamic Volume ... - double mDynamicVolumeStep; // Increase Volume Step ... - double mDynamicVolumeBalanceFactor; // Balance Factor for Generate Dynamic Volume ... - double mMaxAllowedDrawdownToOpenTrades; // Max Allowed Drawdown for Open Trades ... - int mMaxAllowedSLToPauseSignallingPerSymbol; // Max Allowed SL for Pause Signalling Per Symbol ... - int mPauseSignallingAfterReachesMaxAllowedSLInSecconds; // Pause Signalling Per Symbol afte Max Allowed SL Reached In Seconds ... - - // - // Protection Props ... - bool mAllowHedging; // Allow Hedge Positions ... - int mMinOpenTradesFroHedging; // Minimum Open Positions for Hedging ... - double mHedgingMinVolumeStep; // Minimum Volume Step for Hedging ... - double mHedgeingMinRequiredProfitPerVolumeStep; // Minimum Required Profit Per Volume Step for Hedging ... - - // - double CalculateAdditionalVolumeMultiplier(XSignal &signal) - { - // - double result = 0; - - // - if (!signal.IsValid()) - { - return result; - } - - // - X121SMCSymbolPositionInfo info; - bool hasInfo = mTradeHandler.GetSymbolInfo( - signal.symbol, - info // - ); - if (!hasInfo) - { - return result; - } - - // - if (info.countedSLs >= 2) - { - result = (info.countedSLs / 2) + 1; - } - - // - return result; - } - - /** - * Handle Guard Actions ... - * - * @param guards: X121SMCGuard instance Collection ... - */ - void HandleGuards(X121SMCGuard &guards[]) - { - // - int count = ArraySize(guards); - if (!HasChild(guards)) - { - return; - } - - // - for (int i = 0; i < count; i++) - { - // - X121SMCGuard iGuard = guards[i]; - - // - if (!iGuard.IsValid()) - { - continue; - } - - // - // Here we Have to Handle Guard Actions ... - - // - // Close ... - bool canClose = - NotEmpty(iGuard.ticket) && - iGuard.action == X_121_SMC_GUARD_ACTION_CLOSE; - - // - // Close All ... - bool canCloseAll = iGuard.action == X_121_SMC_GUARD_ACTION_CLOSE_ALL; - - // - // Close Longs ... - bool canCloseLongs = iGuard.action == X_121_SMC_GUARD_ACTION_CLOSE_LONGS; - - // - // Close Shorts ... - bool canCloseShorts = iGuard.action == X_121_SMC_GUARD_ACTION_CLOSE_SHORTS; - - // - // Partial Close ... - bool canPartialClose = - NotEmpty(iGuard.ticket) && - iGuard.volumeMultiplier > 0 && - iGuard.action == X_121_SMC_GUARD_ACTION_PARTIAL_CLOSE; - - // - // Trail Stop ... - bool canTrailStop = - iGuard.sl > 0 && - NotEmpty(iGuard.ticket) && - iGuard.action == X_121_SMC_GUARD_ACTION_TRAIL_STOP; - - // - // Trail Target ... - bool canTrailTarget = - iGuard.tp > 0 && - NotEmpty(iGuard.ticket) && - iGuard.action == X_121_SMC_GUARD_ACTION_TRAIL_TARGET; - - // - // Hedge ... - bool canHedge = iGuard.action == X_121_SMC_GUARD_ACTION_HEDGE; - - // - // Check is Guard Valid ... - bool isValidGuardAction = - canHedge || - canClose || - canCloseAll || - canTrailStop || - canCloseLongs || - canTrailTarget || - canCloseShorts || - canPartialClose; - if (!isValidGuardAction) - { - continue; - } - - // - // Now we Sure to Have a Valid Guard ... - // Start to o Guard Actions ... - - // - // Close All ... - if (canCloseAll) - { - // - XPosition positions[]; - int positionsCount = - mTrader - .GetPositions( - positions, // Result ... - iGuard.symbol, - iGuard.provider, - NULL, // Period ... - X_POSITION_TYPE_ALL, // All Types ... - true // Filter by Magic ... - ); - if (IsValidSize(positionsCount)) - { - // - string comment = "Guard Close All ..."; - string message = "Guard Close All (" + ToString(positionsCount) + ") Positions Successfully ..."; - int forceClosed = mTradeHandler.ForceClose( - positions, - comment, - message // - ); - - // - if (forceClosed) - { - RestEA(120 * 60); - } - } - } - - // - // Close Longs ... - if (canCloseLongs) - { - // - XPosition longPositions[]; - XPosition shortPositions[]; - mTrader - .GetPositions( - longPositions, // Result ... - shortPositions, // Result ... - iGuard.symbol, - iGuard.provider, - NULL, // Period ... - true // Filter by Magic ... - ); - - // - int longPositionsCount = ArraySize(longPositions); - bool hasLongPositions = IsValidSize(longPositionsCount); - - // - int shortPositionsCount = ArraySize(shortPositions); - bool hasShortPositions = IsValidSize(shortPositionsCount); - - // - if (hasLongPositions) - { - // - string comment = "Guard Close Longs ..."; - string message = "Guard Close (" + ToString(longPositionsCount) + ") Long Positions Successfully ..."; - bool isClosed = mTradeHandler.ForceClose( - longPositions, - comment, - message // - ); - - // - if (isClosed) - { - RestEA(120 * 60); - } - } - } - - // - // Close Shorts ... - if (canCloseShorts) - { - // - XPosition longPositions[]; - XPosition shortPositions[]; - mTrader - .GetPositions( - longPositions, // Result ... - shortPositions, // Result ... - iGuard.symbol, - iGuard.provider, - NULL, // Period ... - true // Filter by Magic ... - ); - - // - int longPositionsCount = ArraySize(longPositions); - bool hasLongPositions = IsValidSize(longPositionsCount); - - // - int shortPositionsCount = ArraySize(shortPositions); - bool hasShortPositions = IsValidSize(shortPositionsCount); - - // - if (hasShortPositions) - { - // - string comment = "Guard Close Shorts ..."; - string message = "Guard Close (" + ToString(shortPositionsCount) + ") Short Positions Successfully ..."; - bool isClosed = mTradeHandler.ForceClose( - shortPositions, - comment, - message // - ); - - // - if (isClosed) - { - RestEA(120 * 60); - } - } - } - - // - // Close ... - if (canClose) - { - // - XPosition iPosition; - bool hasPosition = mTrader.GetPosition( - iGuard.ticket, - iPosition // - ); - - // - bool isLong = IsLong(iPosition.type); - - // - if (hasPosition) - { - // - XPosition positions[]; - AddRef( - iPosition, - positions // - ); - - // - string comment = "Guard Close ..."; - string message = "Guard Close " + (isLong ? "Long" : "Short") + " Position: (" + ToString(iGuard.ticket) + ") Successfully ..."; - bool isClosed = mTradeHandler.ForceClose( - positions, - comment, - message // - ); - - // - if (isClosed) - { - RestEA(120 * 60); - } - } - } - - // - // Partial Close ... - if (canPartialClose) - { - // - XPosition iPosition; - bool hasPosition = mTrader.GetPosition( - iGuard.ticket, - iPosition // - ); - - // - bool isLong = IsLong(iPosition.type); - - // - if (hasPosition) - { - // - // Normalize Volume Multiplier ... - double vMult = iGuard.volumeMultiplier; - if (vMult > 0.5) - { - vMult = 0.5; - } - if (vMult < 0) - { - vMult = 0.5; - } - - // - // Calculate and Normalize Volume ... - double volume = iPosition.volume * iGuard.volumeMultiplier; - volume = NormalizeVolume( - volume, - iPosition.symbol // - ); - - // - string comment = "Guard Partially Closed: " + ToString(volume) + " ..."; - string message = "Guard Partially Closed " + (isLong ? "Long" : "Short") + ": " + ToString(volume) + " Successfully ..."; - bool isModified = mTrader.ClosePartial( - iPosition.ticket, - volume, - comment // - ); - if (isModified) - { - // - mTradeHandler.Alert(message); - - // - if (volume == iPosition.volume) - { - // - mTradeHandler.Finish( - iPosition.ticket, - iPosition, - comment // - ); - - // - RestEA(120 * 60); - } - } - } - } - - // - // Hedge ... - if (canHedge) - { - // - XPosition positions[]; - int positionsCount = - mTrader - .GetPositions( - positions, // Result ... - iGuard.symbol, - iGuard.provider, - NULL, // Period ... - X_POSITION_TYPE_ALL, // All Types ... - true // Filter by Magic ... - ); - if (IsValidSize(positionsCount)) - { - // - int longs = 0; - double longProfits = 0; - double longVolumes = 0; - - // - int shorts = 0; - double shortProfits = 0; - double shortVolumes = 0; - CountPositions( - positions, - longs, - longProfits, - longVolumes, - shorts, - shortProfits, - shortVolumes // - ); - - // - int count = longs + shorts; - double profits = longProfits + shortProfits; - double volumes = longVolumes + shortVolumes; - - // - bool canDoHedge = - count > 0 && - profits > 0 && - volumes > 0; - if (canDoHedge) - { - // - string comment = "Guard Hedge ..."; - string message = "Guard Hedge (" + ToString(count) + ") Positions by: (" + ToString(profits) + ") Successfully ..."; - bool isClosed = mTradeHandler.ForceClose( - positions, - comment, - message // - ); - - // - if (isClosed) - { - RestEA(120 * 60); - } - } - } - } - - // - // Trail Stop ... - if (canTrailStop) - { - // - XPosition iPosition; - bool hasPosition = mTrader.GetPosition( - iGuard.ticket, - iPosition // - ); - - // - bool isLong = IsLong(iPosition.type); - - // - bool canDoTrail = - hasPosition && - iPosition.profit > 0 && - isLong - ? iPosition.price > iGuard.sl && - (iPosition.sl == 0 || - iPosition.sl < iGuard.sl) - : iPosition.price < iGuard.sl && - (iPosition.sl == 0 || - iPosition.sl > iGuard.sl); - if (canDoTrail) - { - // - string comment = "Guard Trail Stop ..."; - string message = "Guard Trail " + (isLong ? "Long" : "Short") + " Position: (" + ToString(iGuard.ticket) + ") Stop Successfully ..."; - bool isModified = mTrader.Modify( - iPosition.ticket, - iGuard.sl, - iPosition.tp, - comment // - ); - if (isModified) - { - mTradeHandler.Alert(message); - } - } - } - - // - // Trail Target ... - if (canTrailTarget) - { - // - XPosition iPosition; - bool hasPosition = mTrader.GetPosition( - iGuard.ticket, - iPosition // - ); - - // - bool isLong = IsLong(iPosition.type); - - // - bool canDoTrail = - hasPosition && - iGuard.tp != iPosition.tp && - isLong - ? iGuard.tp > iPosition.price - : iGuard.tp < iPosition.price; - if (canDoTrail) - { - // - string comment = "Guard Trail Target ..."; - string message = "Guard Trail " + (isLong ? "Long" : "Short") + " Position: (" + ToString(iGuard.ticket) + ") Target Successfully ..."; - bool isModified = mTrader.Modify( - iPosition.ticket, - iPosition.sl, - iGuard.tp, - comment // - ); - if (isModified) - { - mTradeHandler.Alert(message); - } - } - } - } - - // - Clean(guards); - Clean(guards); - } - - // - void RestEA(int seconds) - { - // - } - - // -}; - -// \ No newline at end of file diff --git a/X121SMCEA/Libraries/x-121.smc.guard.lib.mq5 b/X121SMCEA/Libraries/x-121.smc.guard.lib.mq5 deleted file mode 100644 index 864501d6..00000000 --- a/X121SMCEA/Libraries/x-121.smc.guard.lib.mq5 +++ /dev/null @@ -1,970 +0,0 @@ -/////////////////////////////////////////////////////// -// -// SaherElm IT Center MQL5 X121 SMC Signal Class -// ------------------------------------------------- -// Name: -// Description: provide all Global Guarding 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 - -// -// Imports ... -#include "../Classes/x-121.smc.market.cycle.helper.class.mq5" -#include "../Libraries/x-121.smc.lib.mq5" - -// -bool DetectX121SMCGuards( - // - string signalProvider, // Provider ... - X121SMCGuard &guards[], - const XPosition &positions[], - X121SMCStrategySignalProviderData &provider, - // - // Guard Types ... - ENUM_X_121_SMC_GUARD_ACTIONS &ignoreGuards[], - // - // Required Configurations ... - double breakEvenTPLevel = 2.0 - // -) -{ - // - bool result = false; - - // // - // bool isCycleHelpersValid = - // // - // visionCycleHelper != NULL && - // analyseCycleHelper != NULL && - // decisionCycleHelper != NULL && - // consolidationCycleHelper != NULL - // // - // ; - - // // - // // Ignore Guards ... - // bool hasIgnoreGuards = HasChild(ignoreGuards); - // bool isColseIgnored = - // hasIgnoreGuards && - // Contains( - // X_121_SMC_GUARD_ACTION_CLOSE, - // ignoreGuards // - // ); - // bool isColseAllIgnored = - // hasIgnoreGuards && - // Contains( - // X_121_SMC_GUARD_ACTION_CLOSE_ALL, - // ignoreGuards // - // ); - // bool isColseLongsIgnored = - // hasIgnoreGuards && - // Contains( - // X_121_SMC_GUARD_ACTION_CLOSE_LONGS, - // ignoreGuards // - // ); - // bool isColseShortsIgnored = - // hasIgnoreGuards && - // Contains( - // X_121_SMC_GUARD_ACTION_CLOSE_SHORTS, - // ignoreGuards // - // ); - // bool isPartialColseIgnored = - // hasIgnoreGuards && - // Contains( - // X_121_SMC_GUARD_ACTION_PARTIAL_CLOSE, - // ignoreGuards // - // ); - // bool isTrailStopIgnored = - // hasIgnoreGuards && - // Contains( - // X_121_SMC_GUARD_ACTION_TRAIL_STOP, - // ignoreGuards // - // ); - // bool isTrailTargetIgnored = - // hasIgnoreGuards && - // Contains( - // X_121_SMC_GUARD_ACTION_TRAIL_TARGET, - // ignoreGuards // - // ); - // bool isHedgeIgnored = - // hasIgnoreGuards && - // Contains( - // X_121_SMC_GUARD_ACTION_HEDGE, - // ignoreGuards // - // ); - - // // - // bool isAllIgnores = - // // - // isColseIgnored && - // isHedgeIgnored && - // isColseAllIgnored && - // isTrailStopIgnored && - // isColseLongsIgnored && - // isColseShortsIgnored && - // isTrailTargetIgnored && - // isPartialColseIgnored - // // - // ; - // result = !isAllIgnores && - // isCycleHelpersValid; - // if (!result) - // { - // return result; - // } - - // // - // int count = ArraySize(positions); - // result = IsValidSize(count); - // if (!result) - // { - // return result; - // } - - // // - // string symbol = decisionCycleHelper.GetSymbol(); - // ENUM_TIMEFRAMES period = decisionCycleHelper.GetPeriod(); - - // // - // XPosition ownPositions[]; - // XPosition ownLongPositions[]; - // XPosition ownShortPositions[]; - // for (int i = 0; i < count; i++) - // { - // // - // XPosition iPosition = positions[i]; - // bool isOwn = iPosition - // .IsFiltersPassed( - // symbol, - // provider, - // NULL, - // X_POSITION_TYPE_ALL, - // iPosition.magic // - // ); - // if (isOwn) - // { - // // - // AddRef( - // iPosition, - // ownPositions // - // ); - - // // - // bool isLong = IsLong(positions[i].type); - // if (isLong) - // { - // // - // AddRef( - // iPosition, - // ownLongPositions // - // ); - // } - // else - // { - // // - // AddRef( - // iPosition, - // ownShortPositions // - // ); - // } - // } - // } - - // // - // count = ArraySize(ownPositions); - - // // - // int longsCount = ArraySize(ownLongPositions); - // bool hasLongs = IsValidSize(longsCount); - - // // - // int shortsCount = ArraySize(ownShortPositions); - // bool hasShorts = IsValidSize(shortsCount); - - // // - // result = IsValidSize(count); - // if (!result) - // { - // // - // Clean(ownPositions); - // Clean(ownLongPositions); - // Clean(ownShortPositions); - - // // - // return result; - // } - - // // - // // Here we Are Sure there is Positions to Guard ... - // // based on Current Provider ... - - // // - // // Detect Required Data for Analyse Market to Guard Positions ... - - // // - // int zIndex = 0; - // int cIndex = zIndex + 1; - // int pIndex = cIndex + 1; - // int ppIndex = pIndex + 1; - - // // - // int loopback = 10; - - // // - // XOHCL zBar; - // result = zBar.Init( - // symbol, - // period, - // zIndex // - // ); - // if (!result) - // { - // // - // zBar.Clean(); - // result = HasChild(guards); - // return result; - // } - - // // - // XOHCL cBar; - // result = cBar.Init( - // symbol, - // period, - // cIndex // - // ); - // if (!result) - // { - // // - // zBar.Clean(); - // cBar.Clean(); - // result = HasChild(guards); - // return result; - // } - - // // - // XOHCL pBar; - // result = pBar.Init( - // symbol, - // period, - // pIndex // - // ); - // if (!result) - // { - // // - // zBar.Clean(); - // cBar.Clean(); - // pBar.Clean(); - // result = HasChild(guards); - // return result; - // } - - // // - // XOHCL ppBar; - // result = ppBar.Init( - // symbol, - // period, - // ppIndex // - // ); - // if (!result) - // { - // // - // zBar.Clean(); - // cBar.Clean(); - // pBar.Clean(); - // ppBar.Clean(); - // result = HasChild(guards); - // return result; - // } - - // // - // double ask = GetAsk(symbol); - // double bid = GetBid(symbol); - // datetime cTime = TimeCurrent(); - // double points = GetPoints(symbol); - - // // - - // // - // // Cycles Conditions ... - - // // - // // Decision ... - // ENUM_XPOI_EVENTS decisionPoiEvents[]; - // ENUM_X_CYCLE_EVENTS decisionCycleEvents[]; - // X121SMCCycleConditions decisionConditions; - // result = decisionCycleHelper.GetConditions( - // decisionCycleEvents, - // decisionPoiEvents, - // decisionConditions, - // zIndex, - // loopback // - // ); - // if (!result) - // { - // // - // zBar.Clean(); - // cBar.Clean(); - // pBar.Clean(); - // ppBar.Clean(); - // result = HasChild(guards); - - // // - // Clean(decisionPoiEvents); - // Clean(decisionCycleEvents); - - // // - // decisionConditions.Clean(); - // return result; - // } - - // // - // // Analyse ... - // ENUM_XPOI_EVENTS analysePoiEvents[]; - // ENUM_X_CYCLE_EVENTS analyseCycleEvents[]; - // X121SMCCycleConditions analyseConditions; - // result = analyseCycleHelper.GetConditions( - // analyseCycleEvents, - // analysePoiEvents, - // analyseConditions, - // zIndex, - // loopback // - // ); - // if (!result) - // { - // // - // zBar.Clean(); - // cBar.Clean(); - // pBar.Clean(); - // ppBar.Clean(); - - // // - // Clean(decisionPoiEvents); - // Clean(decisionCycleEvents); - - // // - // decisionConditions.Clean(); - - // // - // Clean(analysePoiEvents); - // Clean(analyseCycleEvents); - - // // - // analyseConditions.Clean(); - - // // - // result = HasChild(guards); - // return result; - // } - - // // - // // Consolidation ... - // ENUM_XPOI_EVENTS consolidationPoiEvents[]; - // ENUM_X_CYCLE_EVENTS consolidationCycleEvents[]; - // X121SMCCycleConditions consolidationConditions; - // result = consolidationCycleHelper.GetConditions( - // consolidationCycleEvents, - // consolidationPoiEvents, - // consolidationConditions, - // zIndex, - // loopback // - // ); - // if (!result) - // { - // // - // zBar.Clean(); - // cBar.Clean(); - // pBar.Clean(); - // ppBar.Clean(); - - // // - // Clean(decisionPoiEvents); - // Clean(decisionCycleEvents); - - // // - // decisionConditions.Clean(); - - // // - // Clean(analysePoiEvents); - // Clean(analyseCycleEvents); - - // // - // analyseConditions.Clean(); - - // // - // Clean(consolidationPoiEvents); - // Clean(consolidationCycleEvents); - - // // - // consolidationConditions.Clean(); - - // // - // result = HasChild(guards); - // return result; - // } - - // // - // // Vision ... - // ENUM_XPOI_EVENTS visionPoiEvents[]; - // ENUM_X_CYCLE_EVENTS visionCycleEvents[]; - // X121SMCCycleConditions visionConditions; - // result = visionCycleHelper.GetConditions( - // visionCycleEvents, - // visionPoiEvents, - // visionConditions, - // zIndex, - // loopback // - // ); - // if (!result) - // { - // // - // zBar.Clean(); - // cBar.Clean(); - // pBar.Clean(); - // ppBar.Clean(); - - // // - // Clean(decisionPoiEvents); - // Clean(decisionCycleEvents); - - // // - // decisionConditions.Clean(); - - // // - // Clean(analysePoiEvents); - // Clean(analyseCycleEvents); - - // // - // analyseConditions.Clean(); - - // // - // Clean(consolidationPoiEvents); - // Clean(consolidationCycleEvents); - - // // - // consolidationConditions.Clean(); - - // // - // Clean(visionPoiEvents); - // Clean(visionCycleEvents); - - // // - // visionConditions.Clean(); - - // // - // result = HasChild(guards); - // return result; - // } - - // // - // // Cycles POI States ... - // XPOIState decisionState = decisionConditions.state; - // XPOIState analyseState = analyseConditions.state; - // XPOIState consolidationState = consolidationConditions.state; - // XPOIState visionState = visionConditions.state; - - // // - // // Cycle X121Conditions ... - // X121Conditions decisionXConditions = decisionConditions.x121Conditions; - // X121Conditions analyseXConditions = analyseConditions.x121Conditions; - // X121Conditions consolidationXConditions = consolidationConditions.x121Conditions; - // X121Conditions visionXConditions = visionConditions.x121Conditions; - - // // - // // - // // - - // // // - // // // Detect Consolidation Zone ... - - // // // - // // // Detect Consolidation Zones ... - - // // // - // // XBoxZone lastBullishBox; - // // XBoxZone prevLastBullishBox; - // // bool hasLastBullishBox = false; - // // bool hasPrevLastBullishBox = false; - // // XConsolidationZone lastBullishZone; - // // bool isLastBullishAbovePrev = false; - // // bool isLastBullishBelowPrev = false; - // // XConsolidationZone prevLastBullishZone; - - // // // - // // XBoxZone lastBearishBox; - // // XBoxZone prevLastBearishBox; - // // bool hasLastBearishBox = false; - // // bool hasPrevLastBearishBox = false; - // // XConsolidationZone lastBearishZone; - // // bool isLastBearishAbovePrev = false; - // // bool isLastBearishBelowPrev = false; - // // XConsolidationZone prevLastBearishZone; - - // // // - // // int bullishConsolidationZonesCount = 0; - // // int bearishConsolidationZonesCount = 0; - // // bool hasBullishConsolidationZones = false; - // // bool hasBearishConsolidationZones = false; - // // XConsolidationZone bullishConsolidationZones[]; - // // XConsolidationZone bearishConsolidationZones[]; - // // bool hasConsolidationZones = decisionCycleHelper.HasConsolidationZones(); - // // int consolidationZonesCount = decisionCycleHelper.CountConsolidationZones(); - // // if (hasConsolidationZones) - // // { - // // // - // // bullishConsolidationZonesCount = decisionCycleHelper - // // .FillConsolidationZones( - // // X_DIRECTION_BULLISH, - // // bullishConsolidationZones // - // // ); - // // hasBullishConsolidationZones = IsValidSize(bullishConsolidationZonesCount); - - // // // - // // bearishConsolidationZonesCount = decisionCycleHelper - // // .FillConsolidationZones( - // // X_DIRECTION_BEARISH, - // // bearishConsolidationZones // - // // ); - // // hasBearishConsolidationZones = IsValidSize(bearishConsolidationZonesCount); - - // // // - // // // - // // // - - // // // - // // if (hasBullishConsolidationZones && - // // bullishConsolidationZonesCount >= 2) - // // { - // // // - // // lastBullishZone = bullishConsolidationZones[bullishConsolidationZonesCount - 1]; - // // prevLastBullishZone = bullishConsolidationZones[bullishConsolidationZonesCount - 2]; - - // // // - // // hasLastBullishBox = ToBox( - // // lastBullishBox, - // // lastBullishZone // - // // ); - // // hasPrevLastBullishBox = ToBox( - // // prevLastBullishBox, - // // prevLastBullishZone // - // // ); - - // // // - // // isLastBullishAbovePrev = hasLastBullishBox && - // // hasPrevLastBullishBox && - // // IsBoxAbove( - // // lastBullishBox, - // // prevLastBullishBox // - // // ); - - // // // - // // isLastBullishBelowPrev = hasLastBullishBox && - // // hasPrevLastBullishBox && - // // IsBoxBelow( - // // lastBullishBox, - // // prevLastBullishBox // - // // ); - // // } - - // // // - // // if (hasBearishConsolidationZones && - // // bearishConsolidationZonesCount >= 2) - // // { - // // // - // // lastBearishZone = bearishConsolidationZones[bearishConsolidationZonesCount - 1]; - // // prevLastBearishZone = bearishConsolidationZones[bearishConsolidationZonesCount - 2]; - - // // // - // // hasLastBearishBox = ToBox( - // // lastBearishBox, - // // lastBearishZone // - // // ); - // // hasPrevLastBearishBox = ToBox( - // // prevLastBearishBox, - // // prevLastBearishZone // - // // ); - - // // // - // // isLastBearishAbovePrev = hasLastBearishBox && - // // hasPrevLastBearishBox && - // // IsBoxAbove( - // // lastBearishBox, - // // prevLastBearishBox // - // // ); - - // // // - // // isLastBearishBelowPrev = hasLastBearishBox && - // // hasPrevLastBearishBox && - // // IsBoxBelow( - // // lastBearishBox, - // // prevLastBearishBox // - // // ); - // // } - - // // // - // // } - - // // - // // Detect High Probability Swings ... - // // bool isSwingLow = - // // // - // // cBar.low > pBar.low && - // // ppBar.low > pBar.low && - // // // - // // zBar.low > pBar.low - // // // - // // ; - // // bool isSwingHigh = - // // // - // // cBar.high < pBar.high && - // // ppBar.high < pBar.high && - // // // - // // zBar.high < pBar.high - // // // - // // ; - // // bool isStrongSwingLow = - // // pBar.IsBullish() && - // // pBar.GetLowShadow() >= pBar.GetBody() * 2; - // // bool isStrongSwingHigh = - // // pBar.IsBearish() && - // // pBar.GetHighShadow() >= pBar.GetBody() * 2; - - // // // - // // bool isStrongSwingLowAboveLastBullishBox = - // // isStrongSwingLow && - // // hasLastBullishBox && - // // pBar.low > lastBullishBox.upper; - - // // // - // // bool isStrongSwingHighBelowLastBearishBox = - // // isStrongSwingHigh && - // // hasLastBearishBox && - // // pBar.high < lastBearishBox.lower; - - // // - // // Here We Have all Requirements for Guarding Positions ... - - // // - // // Available Guards: - // // X_121_SMC_GUARD_ACTION_NONE - // // X_121_SMC_GUARD_ACTION_CLOSE - // // X_121_SMC_GUARD_ACTION_CLOSE_ALL - // // X_121_SMC_GUARD_ACTION_CLOSE_LONGS - // // X_121_SMC_GUARD_ACTION_CLOSE_SHORTS - // // X_121_SMC_GUARD_ACTION_PARTIAL_CLOSE - // // X_121_SMC_GUARD_ACTION_TRAIL_STOP - // // X_121_SMC_GUARD_ACTION_TRAIL_TARGET - // // X_121_SMC_GUARD_ACTION_HEDGE - - // // - // // X_121_SMC_GUARD_ACTION_CLOSE: - // // Close Specified Position on Specified Conditions ... - // if (!isColseIgnored) - // { - // // - // // TODO: - // // - [] Implement Close on Nearest on TP ... - // } - - // // - // // X_121_SMC_GUARD_ACTION_CLOSE_ALL: - // // Close All Positions on Specified Conditions ... - // if (!isColseAllIgnored) - // { - // // - // // TODO: - // // - [] Implement Close All Positions on Weekend ... - // } - - // // - // // X_121_SMC_GUARD_ACTION_CLOSE_LONGS: - // // Close All Long Positions on Specified Conditions ... - // if (!isColseLongsIgnored) - // { - // // - // } - - // // - // // X_121_SMC_GUARD_ACTION_CLOSE_SHORTS: - // // Close All Short Positions on Specified Conditions ... - // if (!isColseShortsIgnored) - // { - // // - // } - - // // - // // X_121_SMC_GUARD_ACTION_PARTIAL_CLOSE: - // // Partial Close Specified Position on Specified Conditions ... - // if (!isPartialColseIgnored) - // { - // // - // // Breake Even ... - // // Usually Break Even Works on TP2 Reached ... - // // when tp reached to required Level, we Close 50% of Entered Volume ... - // bool canBreakEven = breakEvenTPLevel >= 0; - - // // - // for (int i = 0; i < count; i++) - // { - // // - // XPosition iPosition = ownPositions[i]; - - // // - // bool isInProfit = iPosition.profit > 0; - - // // - // double reachedTPLevel = 0; - // double reachedTPPrice = 0; - // if (isInProfit) - // { - // // - // iPosition.CalculateReahedTP( - // reachedTPLevel, - // reachedTPPrice // - // ); - // } - - // // - // // Break Event ... - // if (canBreakEven) - // { - // // - // // Position Must be In Profit ... - // if (!isInProfit) - // { - // continue; - // } - - // // - // bool canDoBreakEven = reachedTPLevel == breakEvenTPLevel && - // reachedTPPrice > 0; - // if (canDoBreakEven) - // { - // // - // X121SMCGuard iGuard; - - // // - // iGuard.time = cTime; - // iGuard.symbol = symbol; - // iGuard.provider = provider; - // iGuard.action = X_121_SMC_GUARD_ACTION_PARTIAL_CLOSE; - - // // - // iGuard.ticket = iPosition.ticket; - - // // - // iGuard.volumeMultiplier = 0.5; - - // // - // AddGuard( - // iGuard, - // guards // - // ); - // } - // } - // } - // } - - // // - // // X_121_SMC_GUARD_ACTION_TRAIL_STOP: - // // Trail Stop Specified Position on Specified Conditions ... - // if (!isTrailStopIgnored) - // { - // // - // for (int i = 0; i < count; i++) - // { - // // - // XPosition iPosition = ownPositions[i]; - - // // - // bool isLong = IsLong(iPosition.type); - // bool isInProfit = iPosition.profit > 0; - - // // - // double reachedTPLevel = 0; - // double reachedTPPrice = 0; - // if (isInProfit) - // { - // // - // iPosition.CalculateReahedTP( - // reachedTPLevel, - // reachedTPPrice // - // ); - // } - - // // - // // Trai Stop ... - // if (!isInProfit) - // { - // continue; - // } - - // // - // double trailedStop = 0; - - // // - // // Trail Stop Senarios ... - // // - occures two same type consolidation zones in order of positions type; - // // - occures a swing in order of consolidation zones ... - - // // // - // // bool canTrailBasedOnTwoZone = - // // isLong - // // ? isLastBullishAbovePrev - // // : isLastBearishBelowPrev; - // // if (canTrailBasedOnTwoZone) - // // { - // // // - // // trailedStop = - // // isLong - // // ? prevLastBullishBox.lower - // // : prevLastBearishBox.upper; - // // } - - // // // - // // bool canTrailBasedOnZoneSwing = - // // trailedStop <= 0 && - // // (isLong - // // ? isStrongSwingLowAboveLastBullishBox - // // : isStrongSwingHighBelowLastBearishBox); - // // if (canTrailBasedOnZoneSwing) - // // { - // // // - // // trailedStop = - // // isLong - // // ? pBar.low - // // : pBar.high; - // // } - - // // // - // // bool canDoTrailStop = - // // trailedStop > 0 && - // // ( - // // // - // // iPosition.sl == 0 - // // ? (isLong - // // ? trailedStop > iPosition.entry && - // // trailedStop < iPosition.price - // // : trailedStop < iPosition.entry && - // // trailedStop > iPosition.price) - // // : (isLong - // // ? trailedStop > iPosition.sl && - // // trailedStop > iPosition.entry && - // // trailedStop < iPosition.price - // // : trailedStop < iPosition.sl && - // // trailedStop < iPosition.entry && - // // trailedStop > iPosition.price) - // // // - // // ) - // // // - // // ; - - // // // - // // if (canDoTrailStop) - // // { - // // // - // // X121SMCGuard iGuard; - - // // // - // // iGuard.time = cTime; - // // iGuard.symbol = symbol; - // // iGuard.provider = provider; - // // iGuard.action = X_121_SMC_GUARD_ACTION_TRAIL_STOP; - - // // // - // // iGuard.ticket = iPosition.ticket; - - // // // - // // iGuard.sl = trailedStop; - - // // // - // // AddGuard( - // // iGuard, - // // guards // - // // ); - // // } - // } - // } - - // // - // // X_121_SMC_GUARD_ACTION_TRAIL_TARGET: - // // Trail Target Specified Position on Specified Conditions ... - // if (!isTrailTargetIgnored) - // { - // // - // } - - // // - // // X_121_SMC_GUARD_ACTION_HEDGE: - // // Hedge all Positions on Specified Conditions ... - // if (!isHedgeIgnored) - // { - // // - // } - - // // - // // Cleanup Collections ... - - // // - // Clean(ownPositions); - // Clean(ownLongPositions); - // Clean(ownShortPositions); - - // // - // zBar.Clean(); - // cBar.Clean(); - // pBar.Clean(); - // ppBar.Clean(); - - // // - // Clean(visionPoiEvents); - // Clean(analysePoiEvents); - // Clean(visionCycleEvents); - // Clean(decisionPoiEvents); - // Clean(analyseCycleEvents); - // Clean(decisionCycleEvents); - // Clean(consolidationPoiEvents); - // Clean(consolidationCycleEvents); - - // // - // visionState.Clean(); - // analyseState.Clean(); - // decisionState.Clean(); - // visionConditions.Clean(); - // analyseConditions.Clean(); - // visionXConditions.Clean(); - // decisionConditions.Clean(); - // consolidationState.Clean(); - // analyseXConditions.Clean(); - // decisionXConditions.Clean(); - // consolidationConditions.Clean(); - // consolidationXConditions.Clean(); - - // // - // // lastBullishBox.Clean(); - // // lastBearishBox.Clean(); - // // lastBullishZone.Clean(); - // // lastBearishZone.Clean(); - // // prevLastBullishBox.Clean(); - // // prevLastBearishBox.Clean(); - // // prevLastBullishZone.Clean(); - // // prevLastBearishZone.Clean(); - - // // - // count = ArraySize(guards); - // result = IsValidSize(count); - - // - return result; -} diff --git a/X121SMCEA/Libraries/x-121.smc.lib.mq5 b/X121SMCEA/Libraries/x-121.smc.lib.mq5 deleted file mode 100644 index ec449b4e..00000000 --- a/X121SMCEA/Libraries/x-121.smc.lib.mq5 +++ /dev/null @@ -1,748 +0,0 @@ -/////////////////////////////////////////////////////// -// -// SaherElm IT Center MQL5 Common Library -// -------------------------------------- -// Name: X121SMCLib -// 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 - -// -// Imports ... -#include "../../Classes/x-saherelm.base.class.mq5" -#include "../../Classes/x-saherelm.x-poi.drawer.class.mq5" -#include "../../Helpers/x-saherelm.x121.helper.mq5" -#include "../../Libraries/x-saherelm.common.lib.mq5" -#include "../../Libraries/x-saherelm.x-poi.extensions.lib.mq5" -#include "../../Libraries/x-saherelm.x-poi.lib.mq5" -#include "../../Libraries/x-saherelm.x-trade.lib.mq5" - -// -// Definitions ... - -// -const string X121SMCStrategyToken = "X121SMC"; - -// -const string X121SMCXWZToken = "X121XWZ"; -const string X121SMCXICHToken = "X121XICH"; - -// -// X121 SMC Providers ... -enum ENUM_X_121_SMC_PROVIDERS -{ - // - X_121_SMC_PROVIDER_NONE, - X_121_SMC_PROVIDER_XWZ, - X_121_SMC_PROVIDER_XICH, -}; - -// -// Guard Actions ... -enum ENUM_X_121_SMC_GUARD_ACTIONS -{ - X_121_SMC_GUARD_ACTION_NONE, // Nothing to Do - X_121_SMC_GUARD_ACTION_CLOSE, // Close Specified Position - X_121_SMC_GUARD_ACTION_CLOSE_ALL, // Close All Positions - X_121_SMC_GUARD_ACTION_CLOSE_LONGS, // Close All Long Positions - X_121_SMC_GUARD_ACTION_CLOSE_SHORTS, // Close All Short Position - X_121_SMC_GUARD_ACTION_PARTIAL_CLOSE, // Partial Close Specified Position - X_121_SMC_GUARD_ACTION_TRAIL_STOP, // Trail Stop of Specified Position - X_121_SMC_GUARD_ACTION_TRAIL_TARGET, // Trail Target of Specified Position - X_121_SMC_GUARD_ACTION_HEDGE, // Hedge Specified Positions -}; - -// -// Each Market Cycle (Time Frame) Conditions -// Model as this Structure ... -struct X121SMCCycleConditions -{ - // - string symbol; - ENUM_TIMEFRAMES period; - datetime time; - - // - XPOIState state; - X121Conditions x121Conditions; - - // - void X121SMCStrategyConditions() - { - Clean(); - } - - // - // Tools ... - - /** - * Cleanup ... - */ - void Clean() - { - // - symbol = NULL; - period = NULL; - time = NULL; - - // - state.Clean(); - x121Conditions.Clean(); - - // - ZeroMemory(this); - } - - /** - * Validate ... - * - * @return ( bool ) - */ - bool IsValid() - { - // - bool result = false; - - // - result = IsSpecifiedValid(symbol) && - IsSpecifiedValid(period) && - IsSpecifiedValid(time); - // - ; - - // - return result; - } - - // - // Reporter Functions ... - - /** - * Generate Provided Scores ... - * - * @param bullishScore: Integer, reference ... - * @param bearishScore: Integer, referenceF ... - */ - void GenerateScore( - double &bullishScore, - double &bearishScore // - ) - { - // - bullishScore = 0; - bearishScore = 0; - - // - if (!IsValid()) - { - return; - } - - // - double bullScore = 0; - double bearScore = 0; - } - - /** - * Generate Summary ... - * - * @param onlyCommons: Boolean ... - * @param onlyConditions: Boolean ... - * @param includeScores: Boolean ... - * @param ignoreFalseConditions: Boolean ... - * @param separator: String ... - * - * @return ( string ) - */ - string GenerateSummary( - bool onlyCommons = false, - bool onlyConditions = false, - bool includeScores = true, - bool ignoreFalseConditions = true, - string separator = "\n" // - ) - { - // - string result = NULL; - - // - double bullishScore = 0; - double bearishScore = 0; - GenerateScore( - bullishScore, - bearishScore // - ); - - // - string commonStr = GenerateSpecifiedCommonSummary( - this, - separator, - includeScores, - true // - ); - - // - string conditionsStr = - // - "" - // - ; - - // - result = - // - "[" + GetTag() + "]" + separator + - "----------" + separator + - (onlyConditions - ? "" - : commonStr) + - " " + separator + - (onlyCommons - ? "" - : conditionsStr) + - "" - // - ; - - // - return result; - } - - /** - * Get Unique Identifier ... - * - * @param forObject: Boolean ... - * - * @return ( string ) - */ - string GetTag( - bool forObject = false // - ) - { - // - string result = NULL; - - // - string typeName = GetTypeName(this); - - // - if (!forObject) - { - result = typeName; - } - else - { - // - result = typeName + "_" + - symbol + "_" + ToString(period) + "_" + - ToMD5(time); - } - - // - return result; - } - - // -}; - -// -// Model Signalling Conditions ... -struct X121SMCStrategyConditions -{ - // - string symbol; - ENUM_TIMEFRAMES period; - datetime time; - - // - double sl; - double tp; - string provider; - double targets[]; - ENUM_X_DIRECTION signalDir; - - // - void X121SMCStrategyConditions() - { - Clean(); - } - - // - // Tools ... - - /** - * Cleanup ... - */ - void Clean() - { - // - time = NULL; - symbol = NULL; - period = NULL; - - // - sl = 0; - tp = 0; - provider = NULL; - signalDir = X_DIRECTION_NONE; - - // - Clean(targets); - - // - ZeroMemory(this); - } - - /** - * Validate ... - * - * @return ( bool ) - */ - bool IsValid() - { - // - bool result = false; - - // - result = IsSpecifiedValid(symbol) && - IsSpecifiedValid(period) && - IsSpecifiedValid(time); - - // - return result; - } - - /** - * Check Conditions Has Valid Bullish Signal ... - * - * @return ( bool ) - */ - bool HasBullishSignal() - { - // - bool result = false; - - // - result = - (sl > 0 || - tp > 0) && - IsValid() && - HasDirection(signalDir); - if (!result) - { - return result; - } - - // - result = - IsBullish(signalDir); - - // - return result; - } - - /** - * Check Conditions Has Valid Bearish Signal ... - * - * @return ( bool ) - */ - bool HasBearishSignal() - { - // - bool result = false; - - // - result = - (sl > 0 || - tp > 0) && - IsValid() && - HasDirection(signalDir); - if (!result) - { - return result; - } - - // - result = - IsBearish(signalDir); - - // - return result; - } - - // - // Reporter Functions ... - - /** - * Generate Provided Scores ... - * - * @param bullishScore: Integer, reference ... - * @param bearishScore: Integer, referenceF ... - */ - void GenerateScore( - double &bullishScore, - double &bearishScore // - ) - { - // - bullishScore = 0; - bearishScore = 0; - - // - if (!IsValid()) - { - return; - } - - // - double bullScore = 0; - double bearScore = 0; - } - - /** - * Generate Summary ... - * - * @param onlyCommons: Boolean ... - * @param onlyConditions: Boolean ... - * @param includeScores: Boolean ... - * @param ignoreFalseConditions: Boolean ... - * @param separator: String ... - * - * @return ( string ) - */ - string GenerateSummary( - bool onlyCommons = false, - bool onlyConditions = false, - bool includeScores = true, - bool ignoreFalseConditions = true, - string separator = "\n" // - ) - { - // - string result = NULL; - - // - double bullishScore = 0; - double bearishScore = 0; - GenerateScore( - bullishScore, - bearishScore // - ); - - // - string commonStr = GenerateSpecifiedCommonSummary( - this, - separator, - includeScores, - true // - ); - - // - string conditionsStr = - // - "" - // - ; - - // - result = - // - "[" + GetTag() + "]" + separator + - "----------" + separator + - (onlyConditions - ? "" - : commonStr) + - " " + separator + - (onlyCommons - ? "" - : conditionsStr) + - "" - // - ; - - // - return result; - } - - /** - * Get Unique Identifier ... - * - * @param forObject: Boolean ... - * - * @return ( string ) - */ - string GetTag( - bool forObject = false // - ) - { - // - string result = NULL; - - // - string typeName = GetTypeName(this); - - // - if (!forObject) - { - result = typeName; - } - else - { - // - result = typeName + "_" + - symbol + "_" + ToString(period) + "_" + - ToMD5(time); - } - - // - return result; - } - - // -}; - -// -// Model a Guard Action ... -struct X121SMCGuard -{ - // - // Props ... - ENUM_X_121_SMC_GUARD_ACTIONS action; - datetime time; - - // - string symbol; - string provider; - - // - // Specified Position ... - ulong ticket; - - // - // Partial Close ... - double volumeMultiplier; - - // - // SL Trial ... - double sl; - - // - // TP Trial ... - double tp; - - // - // Constructor ... - X121SMCGuard() - { - Clean(); - } - - // - // Tools ... - - /** - * Cleanup ... - */ - void Clean() - { - // - time = NULL; - action = X_121_SMC_GUARD_ACTION_NONE; - - // - symbol = NULL; - provider = NULL; - - // - ticket = 0; - - // - volumeMultiplier = 0; - - // - sl = 0; - tp = 0; - - // - ZeroMemory(this); - } - - /** - * Validate ... - * - * @return ( bool ) - */ - bool IsValid() - { - // - bool result = false; - - // - result = - // - IsValid(time) && - IsValid(symbol) && - IsValid(provider) && - action != X_121_SMC_GUARD_ACTION_NONE - // - ; - if (!result) - { - return result; - } - - // - // Validate Model Based On Specified Guard Actions ... - - // - return result; - } -}; - -/** - * Add Guard to Collection ... - * - * @param guard: X121SMCGuard instance ... - * @param guards: X121SMCGuard instance Collection ... - * - * @return ( int ) - */ -int AddGuard( - X121SMCGuard &guard, - X121SMCGuard &guards[] // -) -{ - // - int result = 0; - - // - if (!guard.IsValid()) - { - return result; - } - - // - AddRef( - guard, - guards // - ); - - // - result = ArraySize(guards); - - // - return result; -} - -// -// -// - -typedef void (*TOnX121SMCSignal)( - XSignal &signal, - X121SMCStrategyConditions &conditions // -); - -// -// Extentions ... - -/** - * Validate a Signal Provider ... - * - * @param value: ENUM_X_121_SMC_PROVIDERS member ... - * - * @return ( bool ) - */ -bool IsValid(ENUM_X_121_SMC_PROVIDERS value) -{ - // - bool result = false; - - // - result = value != X_121_SMC_PROVIDER_NONE; - - // - return result; -} - -/** - * Converts a Signal Provider to String ... - * - * @param value: ENUM_X_121_SMC_PROVIDERS member ... - * - * @return ( string ) - */ -string ToString(ENUM_X_121_SMC_PROVIDERS value) -{ - // - string result = NULL; - - // - if (!IsValid(value)) - { - return result; - } - - // - switch (value) - { - // - case X_121_SMC_PROVIDER_XWZ: - result = X121SMCXWZToken; - break; - - // - case X_121_SMC_PROVIDER_XICH: - result = X121SMCXICHToken; - break; - } - - // - return result; -} - -/** - * Parse Specified String as a Signal Provider ... - * - * @param value: String ... - * - * @return ( ENUM_X_121_SMC_PROVIDERS ) - */ -ENUM_X_121_SMC_PROVIDERS ParseProvider(string value) -{ - // - ENUM_X_121_SMC_PROVIDERS result = X_121_SMC_PROVIDER_NONE; - - // - if (!IsValid(value)) - { - return result; - } - - // - if (Contains(X121SMCXWZToken, value)) - { - result = X_121_SMC_PROVIDER_XWZ; - } - else if (Contains(X121SMCXICHToken, value)) - { - result = X_121_SMC_PROVIDER_XICH; - } - - // - return result; -} - -// diff --git a/X121SMCEA/Signals/x-121.smc.xind.signal.class.mq5 b/X121SMCEA/Signals/x-121.smc.xind.signal.class.mq5 deleted file mode 100644 index 2b3efc4b..00000000 --- a/X121SMCEA/Signals/x-121.smc.xind.signal.class.mq5 +++ /dev/null @@ -1,2025 +0,0 @@ -/////////////////////////////////////////////////////// -// -// SaherElm IT Center MQL5 X121 SMC Signal Class -// ------------------------------------------------- -// Name: XICH -// Description: provide all Signalling 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 - -// -// Imports ... -#include "../Classes/x-121.smc.market.cycle.helper.class.mq5" -#include "../Libraries/x-121.smc.guard.lib.mq5" -#include "../Libraries/x-121.smc.lib.mq5" -#include "./x-121.smc.xind.signal.lib.mq5" - -// -// Definition ... -class XCX121SMCXINDSignalDetector : public XCBase -{ - // - public: - // - // Props ... - bool useGuards; - double rfReward; - bool isPassedBoxes; - XBoxZone mWaitingBoxes[]; - XBoxZone mBreakedBoxes[]; - XBoxZone mActivatedBoxes[]; - bool continuesRFTillTarget; - XBoxZone mUnAvailableBoxes[]; - X121SMCStrategyXINDSignalConditions mConditions; - X121SMCStrategyXINDSignalConditions mConditionsCollection[]; - - // - // Constructor(s) ... - XCX121SMCXINDSignalDetector( - string _symbol, - ENUM_TIMEFRAMES _period // - ) - { - // - symbol = _symbol; - period = _period; - Init(); - } - - // - // Deconstructor ... - ~XCX121SMCXINDSignalDetector() - { - DeInit(); - } - - // - // - // - - /** - * Detect Setup Conditions based on Signalling ... - * - * @param provider: X121SMCStrategySignalProviderData instance Reference, Specified Data for Cycles ... - * @param maxAllowedSLDistanceInPoint: int, Max Allowed SL Distance in Points (if Bigger thn Zero Provided) ... - * - * @return ( bool ) - */ - bool DetectSignalSetup( - X121SMCStrategySignalProviderData &provider, - double tpReward = 3, - double maxAllowedSLDistanceInPoint = 300 // - ) - { - // - bool result = false; - - // - tpReward = NormalizeDouble(tpReward, 2); - - // - // Validate Cycle Helpers ... - result = provider.IsValid(); - if (!result) - { - // - mConditions.Clean(); - - // - return result; - } - - // - bool isBullish = false; - bool isBearish = false; - - // - int zIndex = 0; - int cIndex = zIndex + 1; - int pIndex = cIndex + 1; - int ppIndex = pIndex + 1; - - // - int loopback = 10; - - // - mConditions.symbol = symbol; - mConditions.period = period; - - // - double ask = GetAsk(symbol); - double bid = GetBid(symbol); - datetime cTime = TimeCurrent(); - double points = GetPoints(symbol); - - // - // Cycles Conditions ... - result = provider.Prepare( - zIndex, - loopback, - true, // Trigger ... - true, // Decision ... - true, // Analyse ... - true, // Verification ... - true, // Consolidation ... - true // Vision ... - ); - if (!result) - { - // - mConditions.Clean(); - return result; - } - - // - // Select Drawer Class ... - XCPOIDrawer *drawer = provider.visionCycleHelper.mPOIDrawer; - - // - // Detecting Bars based on Decision Cycle ... - XOHCL zBar; - XOHCL cBar; - XOHCL pBar; - XOHCL pPBar; - XOHCL consolidationZBar; - result = zBar.Init( - provider.decisionXConditions.symbol, - provider.decisionXConditions.period, - zIndex // - ); - result = - result && - zBar.GetPreviousBar(cBar); - result = - result && - cBar.GetPreviousBar(pBar); - result = - result && - pBar.GetPreviousBar(pPBar); - result = - result && - provider.consolidationCycleHelper.GetBar( - consolidationZBar, - zIndex // - ); - if (!result) - { - // - zBar.Clean(); - cBar.Clean(); - pBar.Clean(); - pPBar.Clean(); - consolidationZBar.Clean(); - - // - return result; - } - - // - bool drawBar = false; - if (drawBar) - { - // - DrawBar( - consolidationZBar, - drawer // - ); - } - - // - // - // - - // - // Setup Conditions ... - double sls[]; - double sl = 0; - double pivot = 0; - double point = 0; - double targets[]; - XBoxZone signalBox; - XBoxZone signalZone; - bool hasSignalBox = false; - ENUM_X_DIRECTION signalBoxDir = X_DIRECTION_NONE; - ENUM_X121SMC_XIND_PROVIDERS signalProvider = X121SMC_XIND_PROVIDER_NONE; - - // - // - // - - // - int waitingBoxesCount = UpdateWaitingBoxes( - X_CYCLE_ANALYSE, - X_CYCLE_DECISION, - provider // - ); - bool hasWaitingBoxes = IsValidSize(waitingBoxesCount); - - // - DrawBoxes(drawer); - - // - // Detect Signal Boxes ... - hasSignalBox = HasXINDConditions( - mWaitingBoxes, - mActivatedBoxes, - mBreakedBoxes, - X_CYCLE_DECISION, - signalBox, - signalZone, - signalBoxDir, - provider, - zIndex // - ); - if (hasSignalBox) - { - // - signalProvider = X121SMC_XIND_PROVIDER_XIND; - - // - MakeSignalBoxUnAvailable(signalBox); - MakeSignalBoxUnAvailable(signalZone); - } - - // - // - // - - // - // Cleanup Signal if UnApproved ... - if (!hasSignalBox) - { - // - signalBox.Clean(); - isBullish = false; - isBearish = false; - signalBoxDir = X_DIRECTION_NONE; - } - - // - // Summarize Results ... - result = hasSignalBox; - - // - if (result) - { - // - int idx = -1; - bool has = false; - - // - // Draw Signal Box ... - XCBoxObject *object; - has = drawer.DrawBox( - signalBox, - object // - ); - if (has) - { - mObjects.Add(object); - } - - // - // Detect Signal Direction ... - isBullish = IsBullish(signalBoxDir); - isBearish = IsBearish(signalBoxDir); - - // - pivot = isBullish - ? signalBox.lower - : signalBox.upper; - - // - point = isBullish - ? signalBox.upper - : signalBox.lower; - - // - double entry = GetEntry( - signalBox.symbol, - signalBoxDir // - ); - - // - // Selecting SL(s) ... - - // - double iSL = 0; - - // - // Default SL ... - iSL = pivot; - - // - Add( - iSL, - sls // - ); - - // - // Select and Provide SL Based on ... - double iAtr = 0; - if (signalProvider == X121SMC_XIND_PROVIDER_XIND) - { - // - iAtr = provider.decisionXConditions.atrBuffer[1]; - iAtr *= 0; - - // - // Fix rf Reward ... - rfReward = 2; - } - - // - // Select Condition SL ... - - // - double slsMin = GetMin(sls); - double slsMax = GetMax(sls); - - // - double longSL = slsMax - iAtr; - double shortSL = slsMin + iAtr; - - // - sl = isBullish - ? longSL - : shortSL; - - // - // Targets ... - - // - double risk = MathAbs(entry - sl); - - // - // Checking risk ... - if (risk >= maxAllowedSLDistanceInPoint) - { - // Print("Max Aloowed Risk Point Reached ..."); - } - - // - // Reward to RF ... - if (rfReward > 0) - { - // - double iRFReward = rfReward * risk; - double iRFTP = isBullish - ? entry + iRFReward - : entry - iRFReward; - - // - Add( - iRFTP, - targets // - ); - - // - if (continuesRFTillTarget && - rfReward < tpReward) - { - // - double iReward = rfReward + 1; - while (iReward < tpReward - 1) - { - // - iRFReward = iReward * risk; - iRFTP = isBullish - ? entry + iRFReward - : entry - iRFReward; - - // - Add( - iRFTP, - targets // - ); - - // - iReward++; - } - } - } - - // - Copy( - sls, - mConditions.sls // - ); - Copy( - targets, - mConditions.targets // - ); - - // - mConditions.sl = sl; - mConditions.pivot = pivot; - mConditions.point = point; - mConditions.setupTime = cTime; - mConditions.dir = signalBoxDir; - mConditions.signalBox = signalBox; - mConditions.provider = signalProvider; - } - - // - // - // - - // - // Cleanup Resources ... - - // - Clean(sls); - Clean(targets); - - // - provider.Clean(); - - // - zBar.Clean(); - cBar.Clean(); - pBar.Clean(); - pPBar.Clean(); - signalBox.Clean(); - ZeroMemory(drawer); - consolidationZBar.Clean(); - - // - return result; - } - - /** - * Detect Trigger Conditions for Specified Signal ... - * - * @param conditions: X121SMCStrategyXINDSignalConditions instance Reference, Specified Signal Conditions ... - * @param provider: X121SMCStrategySignalProviderData instance Reference, Specified Data for Cycles ... - * @param maxAllowedSetupAge: specified Setup Age for Expiration (if bigger than Zero) ... - * - * @return ( bool ) - */ - bool DetectSignalTrigger( - X121SMCStrategyXINDSignalConditions &conditions, - X121SMCStrategySignalProviderData &provider, - int maxAllowedSetupAge = 60 // - ) - { - // - bool result = false; - - // - result = - // - provider.IsValid() - // - ; - if (!result) - { - return result; - } - - // - result = conditions.IsSetuped(); - if (!result) - { - return result; - } - - // - datetime setupTime = conditions.setupTime; - ENUM_X_DIRECTION setupDir = conditions.dir; - - // - bool isBullish = IsBullish(setupDir); - bool isBearish = IsBearish(setupDir); - - // - int zIndex = 0; - int cIndex = zIndex + 1; - int pIndex = cIndex + 1; - int ppIndex = pIndex + 1; - - // - int loopback = 10; - - // - double ask = GetAsk(symbol); - double bid = GetBid(symbol); - datetime cTime = TimeCurrent(); - double points = GetPoints(symbol); - - // - // Cycles Conditions ... - result = provider.Prepare( - zIndex, - loopback // - ); - if (!result) - { - return result; - } - - // - double iAtr = provider.decisionXConditions.atrBuffer[1]; - iAtr *= 1.5; - - // - // Check Signal Validation ... - // IMPORTANT: since all Validations done in SetUp Process ... - // here we only Execute Signal ... - - // - result = isBullish || - isBearish; - - // - if (result) - { - // - conditions.triggerTime = cTime; - conditions.type = isBullish - ? X_POSITION_TYPE_LONG - : X_POSITION_TYPE_SHORT; - - // - } - - // - // Cleanup ... - - // - provider.Clean(); - - // - return result; - } - - /** - * Detect Guards bsed on Signalling Class ... - * - * @param guards: X121SMCGuard instance Collection, Holds Provided Guards ... - * @param positions: XPosition instance Collection, Provides Signalling Based Positions for Apply Guards on them ... - * @param provider: X121SMCStrategySignalProviderData instance Reference, Specified Data for Cycles ... - * - * @return ( bool ) - */ - bool DetectGuards( - X121SMCGuard &guards[], - const XPosition &positions[], - X121SMCStrategySignalProviderData &provider) - { - // - bool result = false; - - // - if (!useGuards) - { - return result; - } - - // - Clean(guards); - - // - // Set Provider for Common Guards ... - string signalProvider = ToString(X121SMC_XIND_PROVIDER_XTKKUMO); - - // - int zIndex = 0; - int cIndex = zIndex + 1; - int pIndex = cIndex + 1; - int ppIndex = pIndex + 1; - - // - XOHCL cBar; - - // - int loopback = 10; - - // - double ask = GetAsk(symbol); - double bid = GetBid(symbol); - datetime cTime = TimeCurrent(); - double points = GetPoints(symbol); - - // - // Cycles Conditions ... - result = provider.IsValid(); - result = - result && - provider.Prepare( - zIndex, - loopback // - ); - if (!result) - { - // - provider.Clean(); - return result; - } - - // - // Select Own Positions ... - int count = ArraySize(positions); - result = IsValidSize(count); - if (!result) - { - return result; - } - - // - XPosition ownPositions[]; - XPosition ownLongPositions[]; - XPosition ownShortPositions[]; - for (int i = 0; i < count; i++) - { - // - XPosition iPosition = positions[i]; - bool isOwn = iPosition - .IsFiltersPassed( - symbol, - signalProvider, - NULL, - X_POSITION_TYPE_ALL, - iPosition.magic // - ); - if (isOwn) - { - // - AddRef( - iPosition, - ownPositions // - ); - - // - bool isLong = IsLong(positions[i].type); - if (isLong) - { - // - AddRef( - iPosition, - ownLongPositions // - ); - } - else - { - // - AddRef( - iPosition, - ownShortPositions // - ); - } - } - } - - // - // Check Extracted Positions ... - - // - count = ArraySize(ownPositions); - - // - int longsCount = ArraySize(ownLongPositions); - bool hasLongs = IsValidSize(longsCount); - - // - int shortsCount = ArraySize(ownShortPositions); - bool hasShorts = IsValidSize(shortsCount); - - // - // Validate Own Positions ... - result = IsValidSize(count); - if (!result) - { - // - Clean(ownPositions); - Clean(ownLongPositions); - Clean(ownShortPositions); - - // - return result; - } - - // - // - // - - // - // Get Global and Common Guards ... - - // - // ENUM_X_121_SMC_GUARD_ACTIONS ignoreGuards[1] = { - // X_121_SMC_GUARD_ACTION_TRAIL_STOP // - // }; - // result = DetectX121SMCGuards( - // signalProvider, - // guards, - // positions, - // provider, - // // - // ignoreGuards - // // - // ); - - // - // - // - - // - // Implement Custom Implemented Guards ... - - // - // Here we Are Sure there is Positions to Guard ... - // based on Current Provider ... - - // - // Selected Consolidation Zones ... - - // - int idx = -1; - bool has = false; - - // - bool hasBullishConsolidationZone = false; - XConsolidationZone bullishConsolidationZone; - has = provider.decisionState.HasBullishConsolidationZones(); - if (has) - { - // - idx = GetYoungest(provider.decisionState.bullishConsolidationZones); - hasBullishConsolidationZone = IsValidIndex(idx); - if (hasBullishConsolidationZone) - { - bullishConsolidationZone = provider.decisionState.bullishConsolidationZones[idx]; - } - } - - // - bool hasBearishConsolidationZone = false; - XConsolidationZone bearishConsolidationZone; - has = provider.decisionState.HasBearishConsolidationZones(); - if (has) - { - // - idx = GetYoungest(provider.decisionState.bearishConsolidationZones); - hasBearishConsolidationZone = IsValidIndex(idx); - if (hasBearishConsolidationZone) - { - bearishConsolidationZone = provider.decisionState.bearishConsolidationZones[idx]; - } - } - - // - XBoxZone bullishBox; - bool hasBullishBox = false; - bool isBullishBoxBreaked = false; - if (!hasBullishBox) - { - // - XCOrderBlock *ob = NULL; - idx = GetYoungest(provider.analyseState.bullishOrderBlocks); - has = IsValidIndex(idx); - if (has) - { - // - ob = provider.analyseState.bullishOrderBlocks[idx]; - - // - hasBullishBox = ToBox( - bullishBox, - ob // - ); - } - - // - if (!hasBullishBox) - { - bullishBox.Clean(); - } - - // - ZeroMemory(ob); - } - - // - XBoxZone bearishBox; - bool hasBearishBox = false; - bool isBearishBoxBreaked = false; - if (!hasBearishBox) - { - // - XCOrderBlock *ob = NULL; - idx = GetYoungest(provider.analyseState.bearishOrderBlocks); - has = IsValidIndex(idx); - if (has) - { - // - ob = provider.analyseState.bearishOrderBlocks[idx]; - - // - hasBearishBox = ToBox( - bearishBox, - ob // - ); - } - - // - if (!hasBearishBox) - { - bearishBox.Clean(); - } - - // - ZeroMemory(ob); - } - - // - // Here We Have all Requirements for Guarding Positions ... - - // - // Available Guards: - // X_121_SMC_GUARD_ACTION_NONE - // X_121_SMC_GUARD_ACTION_CLOSE - // X_121_SMC_GUARD_ACTION_CLOSE_ALL - // X_121_SMC_GUARD_ACTION_CLOSE_LONGS - // X_121_SMC_GUARD_ACTION_CLOSE_SHORTS - // X_121_SMC_GUARD_ACTION_PARTIAL_CLOSE - // X_121_SMC_GUARD_ACTION_TRAIL_STOP - // X_121_SMC_GUARD_ACTION_TRAIL_TARGET - // X_121_SMC_GUARD_ACTION_HEDGE - - // - // X_121_SMC_GUARD_ACTION_CLOSE: - // Close Specified Position on Specified Conditions ... - - // - // X_121_SMC_GUARD_ACTION_CLOSE_ALL: - // Close All Positions on Specified Conditions ... - - // - // X_121_SMC_GUARD_ACTION_CLOSE_LONGS: - // Close All Long Positions on Specified Conditions ... - - // - // X_121_SMC_GUARD_ACTION_CLOSE_SHORTS: - // Close All Short Positions on Specified Conditions ... - - // - // X_121_SMC_GUARD_ACTION_PARTIAL_CLOSE: - // Partial Close Specified Position on Specified Conditions ... - - // - // X_121_SMC_GUARD_ACTION_TRAIL_STOP: - // Trail Stop Specified Position on Specified Conditions ... - bool handleStoptrailingBasedOnBoxes = true; - bool handleStoptrailingBasedOnConsolidationZones = true; - for (int i = 0; i < count; i++) - { - // - XPosition iPosition = ownPositions[i]; - - // - bool isInited = cBar.Init( - iPosition.symbol, - iPosition.period, - cIndex // - ); - - // - isBullishBoxBreaked = - isInited && - hasBullishBox && - cBar.high < bullishBox.lower; - - // - isBearishBoxBreaked = - isInited && - hasBearishBox && - cBar.low > bearishBox.upper; - - // - bool isLong = IsLong(iPosition.type); - bool isInProfit = iPosition.profit > 0; - - // - double sl = iPosition.sl; - double tp = iPosition.tp; - - // - // Trail Stops Using Consolidation Zones ... - - // - bool canTraiLonglUsingCZone = - // - handleStoptrailingBasedOnConsolidationZones && - // - (isLong && - isInProfit && - hasBullishConsolidationZone && - bullishConsolidationZone.lower > iPosition.sl && - bullishConsolidationZone.lower > iPosition.entry) - // - ; - if (canTraiLonglUsingCZone) - { - sl = bullishConsolidationZone.lower; - } - - // - bool canTraiShortlUsingCZone = - // - handleStoptrailingBasedOnConsolidationZones && - // - (!isLong && - isInProfit && - hasBearishConsolidationZone && - bearishConsolidationZone.upper < iPosition.sl && - bearishConsolidationZone.upper < iPosition.entry) - // - ; - if (canTraiShortlUsingCZone) - { - sl = bearishConsolidationZone.upper; - } - - // - bool canTrailUsingCZone = - canTraiLonglUsingCZone || - canTraiShortlUsingCZone; - - // - // Trail Stop Using Boxes ... - - // - bool canTraiLonglUsingBox = - // - handleStoptrailingBasedOnBoxes && - // - (isLong && - isInProfit && - hasBullishBox && - bullishBox.lower > iPosition.sl && - bullishBox.lower > iPosition.entry) - // - ; - if (canTraiLonglUsingBox) - { - sl = bullishBox.lower; - } - - // - bool canTraiShortlUsingBox = - // - handleStoptrailingBasedOnBoxes && - // - (!isLong && - isInProfit && - hasBearishBox && - bearishBox.upper < iPosition.sl && - bearishBox.upper < iPosition.entry) - // - ; - if (canTraiShortlUsingBox) - { - sl = bearishBox.upper; - } - - // - bool canTrailUsingBox = - canTraiLonglUsingBox || - canTraiShortlUsingBox; - - // - bool canTraiLonglUsingBreakedBox = - // - handleStoptrailingBasedOnBoxes && - // - (isLong && - isInProfit && - isBearishBoxBreaked && - bearishBox.upper > iPosition.sl && - bearishBox.upper > iPosition.entry) - // - ; - if (canTraiLonglUsingBreakedBox) - { - sl = bearishBox.upper; - } - - // - bool canTraiShortlUsingBreakedBox = - // - handleStoptrailingBasedOnBoxes && - // - (!isLong && - isInProfit && - isBullishBoxBreaked && - bullishBox.lower < iPosition.sl && - bullishBox.lower < iPosition.entry) - // - ; - if (canTraiShortlUsingBreakedBox) - { - sl = bullishBox.lower; - } - - // - bool canTrailUsingBreakedBox = - canTraiLonglUsingBreakedBox || - canTraiShortlUsingBreakedBox; - - // - // Summarize SL ... - - // - bool isSLPassed = - sl > 0 && - (isLong - ? iPosition.price - sl >= points * 15 - : sl - iPosition.price >= points * 15); - - // - bool canTrail = - isSLPassed && - (canTrailUsingBox || - canTrailUsingCZone || - canTrailUsingBreakedBox); - if (canTrail) - { - // - X121SMCGuard iGuard; - - // - iGuard.time = cTime; - iGuard.symbol = symbol; - iGuard.provider = signalProvider; - iGuard.action = X_121_SMC_GUARD_ACTION_TRAIL_STOP; - - // - iGuard.ticket = iPosition.ticket; - - // - iGuard.sl = sl; - - // - AddGuard( - iGuard, - guards // - ); - } - } - - // - // X_121_SMC_GUARD_ACTION_TRAIL_TARGET: - // Trail Target Specified Position on Specified Conditions ... - - // - // X_121_SMC_GUARD_ACTION_HEDGE: - // Hedge all Positions on Specified Conditions ... - - // - // Cleanup Collections ... - - // - cBar.Clean(); - - // - provider.Clean(); - - // - bullishBox.Clean(); - bearishBox.Clean(); - - // - bullishConsolidationZone.Clean(); - bearishConsolidationZone.Clean(); - - // - count = ArraySize(guards); - result = IsValidSize(count); - - // - return result; - } - - /** - * Detect and Manage Important Zones and Categorized them for Signalling Clss ... - * - * @param cycle: ENUM_X_CYCLES member, Specified Source Cycle for Detecting ... - * @param provider: X121SMCStrategySignalProviderData instance Reference, Specified Data for Cycles ... - * - * @return ( int ) - */ - int UpdateWaitingBoxes( - ENUM_X_CYCLES cycle, - ENUM_X_CYCLES vCycle, - X121SMCStrategySignalProviderData &provider, - int maxAllowedAge = 0 // - ) - { - // - int result = ArraySize(mWaitingBoxes) + ArraySize(mActivatedBoxes); - - // - int count = 0; - bool has = false; - - // - // Fil Selected Data ... - XPOIState cState; - X121Conditions cXConditions; - XPOIStateEvents cStateEvents; - XC121SMCCycleHelper *cHelper; - X121SMCCycleConditions cConditions; - has = provider.SelectCycle( - cycle, - cState, - cStateEvents, - cXConditions, - cHelper, - cConditions // - ); - if (!has) - { - // - cState.Clean(); - ZeroMemory(cHelper); - cConditions.Clean(); - cXConditions.Clean(); - cStateEvents.Clean(); - - // - return result; - } - - // - // Detecting New Boxes ... - - // - // At First Try Check All Exists FVGs - // then Only Check Youngest FVG ... - if (!isPassedBoxes) - { - // - XBoxZone tmpBoxes[]; - count = cState.FairValueGapsAsBox(tmpBoxes); - has = IsValidSize(count); - if (has) - { - // - for (int i = 0; i < count; i++) - { - // - XBoxZone iBox = tmpBoxes[i]; - - // - // Regular Validation of Boxes ... - bool isValid = IsBoxValid( - iBox, - 0, - iBox.period // - ); - if (!isValid) - { - // - iBox.Clean(); - continue; - } - - // - // Conditional Validation of FVG Boxes ... - isValid = IsFVGBoxValid( - iBox, - vCycle, - provider // - ); - if (!isValid) - { - // - iBox.Clean(); - continue; - } - - // - has = IsBoxExists(iBox); - if (!has) - { - // - AddRef( - iBox, - mWaitingBoxes // - ); - } - - // - iBox.Clean(); - } - } - Clean(tmpBoxes); - - // - isPassedBoxes = true; - } - else - { - // - XBoxZone iBox; - has = cStateEvents.hasNewFairValueGap; - if (has) - { - // - int idx = GetYoungest(cState.fairValueGaps); - has = IsValidIndex(idx); - if (has) - { - // - has = ToBox( - iBox, - cState.fairValueGaps[idx] // - ); - if (has) - { - // - // Regular Validation of Boxes ... - bool isValid = IsBoxValid( - iBox, - 0, - iBox.period // - ); - if (isValid) - { - // - // Conditional Validation of FVG Boxes ... - isValid = IsFVGBoxValid( - iBox, - vCycle, - provider // - ); - if (isValid) - { - // - has = IsBoxExists(iBox); - if (!has) - { - // - AddRef( - iBox, - mWaitingBoxes // - ); - } - } - } - } - } - } - - // - iBox.Clean(); - } - - // - // Update Times ... - datetime requireTime = GetBarTime( - cState.symbol, - cState.period, - 1 // - ); - - // - count = ArraySize(mWaitingBoxes); - has = IsValidSize(count); - if (has) - { - // - for (int i = 0; i < count; i++) - { - mWaitingBoxes[i].to = requireTime; - } - } - - // - count = ArraySize(mActivatedBoxes); - has = IsValidSize(count); - if (has) - { - // - for (int i = 0; i < count; i++) - { - mActivatedBoxes[i].to = requireTime; - } - } - - // - // Validate Exists Boxes ... - - // - // Waiting Boxes ... - count = ArraySize(mWaitingBoxes); - has = IsValidSize(count); - if (has) - { - // - int mustRemove[]; - for (int i = 0; i < count; i++) - { - // - XBoxZone iBox = mWaitingBoxes[i]; - - // - // Check Box Validation ... - bool isValid = IsBoxValid( - iBox, - 0, - iBox.period // - ); - - // - // Check Box Breaked ... - bool isBreaked = IsBoxBreaked( - iBox, - 0, - iBox.period // - ); - - // - // Checking Box Age ... - int age = iBox.GetAge(); - bool isAgeBreaked = - maxAllowedAge > 0 && - age > maxAllowedAge; - if (isAgeBreaked) - { - // - Add( - i, - mustRemove // - ); - - // - AddRef( - iBox, - mUnAvailableBoxes // - ); - - // - iBox.Clean(); - continue; - } - - // - // Box Waiting ... - if (isValid) - { - // - iBox.Clean(); - continue; - } - - // - // Box Breaked ... - if (isBreaked) - { - // - Add( - i, - mustRemove // - ); - - // - AddRef( - iBox, - mBreakedBoxes // - ); - - // - iBox.Clean(); - continue; - } - - // - // Box Activated ... - if (!isValid) - { - // - Add( - i, - mustRemove // - ); - - // - AddRef( - iBox, - mActivatedBoxes // - ); - - // - iBox.Clean(); - continue; - } - - // - iBox.Clean(); - } - - // - CleanupArray( - mustRemove, - mWaitingBoxes // - ); - } - - // - // Activated Boxes ... - count = ArraySize(mActivatedBoxes); - has = IsValidSize(count); - if (has) - { - // - int mustRemove[]; - for (int i = 0; i < count; i++) - { - // - XBoxZone iBox = mActivatedBoxes[i]; - - // - // Checking Box Age ... - int age = iBox.GetAge(); - bool isAgeBreaked = - maxAllowedAge > 0 && - age > maxAllowedAge; - if (isAgeBreaked) - { - // - Add( - i, - mustRemove // - ); - - // - AddRef( - iBox, - mUnAvailableBoxes // - ); - - // - iBox.Clean(); - continue; - } - - // - // Check Breaked ... - bool isBreaked = IsBoxBreaked( - iBox, - 0, - iBox.period // - ); - if (isBreaked) - { - // - Add( - i, - mustRemove // - ); - - // - AddRef( - iBox, - mBreakedBoxes // - ); - - // - iBox.Clean(); - continue; - } - - // - iBox.Clean(); - } - - // - CleanupArray( - mustRemove, - mActivatedBoxes // - ); - } - - // - // Cleanup Resources ... - - // - cState.Clean(); - ZeroMemory(cHelper); - cConditions.Clean(); - cXConditions.Clean(); - cStateEvents.Clean(); - - // - result = ArraySize(mWaitingBoxes) + ArraySize(mActivatedBoxes); - - // - return result; - } - - /** - * Make a Detected Signal Box UnAvailable for Prevent of Double Executing ... - * - * @param box: XBoxZone instance Reference, Specified Signal Box ... - */ - void MakeSignalBoxUnAvailable( - XBoxZone &box // - ) - { - // - int idx = -1; - int count = 0; - bool has = false; - - // - // Validate Box ... - has = box.IsValid(); - if (!has) - { - return; - } - - // - // Check Waiting Boxes ... - count = ArraySize(mWaitingBoxes); - has = IsValidSize(count); - if (has) - { - // - has = FindBoxIndex( - idx, - box, - mWaitingBoxes // - ); - if (has) - { - // - // Remove Signal Box From Collection ... - ArrayRemove( - mWaitingBoxes, - idx, - 1 // - ); - - // - // Add Signal Box to UnAvailable Boxes ... - AddRef( - box, - mUnAvailableBoxes // - ); - - // - return; - } - } - - // - // Check Activated Boxes ... - count = ArraySize(mActivatedBoxes); - has = IsValidSize(count); - if (has) - { - // - has = FindBoxIndex( - idx, - box, - mActivatedBoxes // - ); - if (has) - { - // - // Remove Signal Box From Collection ... - ArrayRemove( - mActivatedBoxes, - idx, - 1 // - ); - - // - // Add Signal Box to UnAvailable Boxes ... - AddRef( - box, - mUnAvailableBoxes // - ); - - // - return; - } - } - - // - // Check Breaked Boxes ... - count = ArraySize(mBreakedBoxes); - has = IsValidSize(count); - if (has) - { - // - has = FindBoxIndex( - idx, - box, - mBreakedBoxes // - ); - if (has) - { - // - // Remove Signal Box From Collection ... - ArrayRemove( - mBreakedBoxes, - idx, - 1 // - ); - - // - // Add Signal Box to UnAvailable Boxes ... - AddRef( - box, - mUnAvailableBoxes // - ); - - // - return; - } - } - } - - /** - * Check a Box is Exists in Box Collections of Signalling Collections ... - * - * @param box: XBoxZone instance Reference, Specified Box to Check ... - * - * @return ( bool ) - */ - bool IsBoxExists(XBoxZone &box) - { - // - bool result = false; - - // - int idx = -1; - int count = 0; - bool has = false; - - // - // Witing Boxes ... - count = ArraySize(mWaitingBoxes); - has = IsValidSize(count); - if (has) - { - // - has = FindBoxIndex( - idx, - box, - mWaitingBoxes // - ); - result = has; - if (result) - { - return result; - } - } - - // - // Activated Boxes ... - count = ArraySize(mActivatedBoxes); - has = IsValidSize(count); - if (has) - { - // - has = FindBoxIndex( - idx, - box, - mActivatedBoxes // - ); - result = has; - if (result) - { - return result; - } - } - - // - // Breaked Boxes ... - count = ArraySize(mBreakedBoxes); - has = IsValidSize(count); - if (has) - { - // - has = FindBoxIndex( - idx, - box, - mBreakedBoxes // - ); - result = has; - if (result) - { - return result; - } - } - - // - // UnAvailable Boxes ... - count = ArraySize(mUnAvailableBoxes); - has = IsValidSize(count); - if (has) - { - // - has = FindBoxIndex( - idx, - box, - mUnAvailableBoxes // - ); - result = has; - if (result) - { - return result; - } - } - - // - return result; - } - - /** - * Add Conditions to Conditions Collection if not Exists ... - * - * @param maxAllowed: int, Specified Max Allowed Holding Conditions ... - * - * @return ( int ) - */ - int AddConditionsIfNotExists( - int maxAllowed = 10 // - ) - { - // - int result = 0; - - // - bool isSetuped = IsValid(mConditions.setupTime) && - HasDirection(mConditions.dir); - if (!isSetuped) - { - return result; - } - - // - int count = ArraySize(mConditionsCollection); - if (IsValidSize(count)) - { - // - // Copy Original Items ... - X121SMCStrategyXINDSignalConditions tmpItems[]; - Copy( - mConditionsCollection, - tmpItems // - ); - - // - // Prese Item Data ... - bool isBullish = IsBullish(mConditions.dir); - - // - for (int i = 0; i < count; i++) - { - // - X121SMCStrategyXINDSignalConditions iItem = tmpItems[i]; - - // - bool canRemove = mConditions.dir == iItem.dir && - mConditions.pivot == iItem.pivot; - if (canRemove) - { - // - ArrayRemove( - mConditionsCollection, - i, - 1 // - ); - } - } - - // - Clean(tmpItems); - } - - // - AddRef( - mConditions, - mConditionsCollection // - ); - - // - // Remove Olds ... - CleanupArray( - mConditionsCollection, - maxAllowed // - ); - - // - result = ArraySize(mConditionsCollection); - - // - return result; - } - - // - // Draw Functions ... - - /** - * Draw Specified Bar on Chart ... - * - * @param bar: XOHCL instance Reference, Specified Bar ... - * @param forceClean: force Clean Drawn Objects ... - */ - void DrawBar( - XOHCL &bar, - XCPOIDrawer *drawer, - bool forceClean = true // - ) - { - // - if (forceClean) - { - mBarObjects.Clear(); - } - - // - if (drawer == NULL || - !bar.IsValid()) - { - return; - } - - // - bool isBullish = bar.IsBullish(); - - // - int widthBar = 2; - bool fillShadowsBar = true; - ENUM_LINE_STYLE styleBar = STYLE_SOLID; - color clrBar = - isBullish - ? clrAqua - : clrMagenta; - - // - datetime to = bar.NextAt(); - - // - XCOHCLObject *iObj; - bool isCreated = drawer - .CreateBar( - bar, - iObj, - to // - ); - if (isCreated) - { - // - iObj.BarSpes( - widthBar, - clrBar, - styleBar // - ); - - // - iObj.LowShadowFill(fillShadowsBar); - iObj.HighShadowFill(fillShadowsBar); - - // - mBarObjects.Add(iObj); - } - } - - /** - * Draw Boxes of Signallings on Chart ... - * - * @param forceClean: force Clean Drawn Objects ... - */ - void DrawBoxes( - XCPOIDrawer *drawer, - bool forceClean = false // - ) - { - // - if (forceClean) - { - mObjects.Clear(); - } - - // - int count = 0; - bool has = false; - - // - // Waiting Boxes ... - count = ArraySize(mWaitingBoxes); - has = IsValidSize(count); - if (has) - { - // - for (int i = 0; i < count; i++) - { - // - XCBoxObject *iObj; - has = drawer.DrawBox( - mWaitingBoxes[i], - iObj // - ); - if (has) - { - mObjects.Add(iObj); - } - } - } - - // - // Activated Boxes ... - count = ArraySize(mActivatedBoxes); - has = IsValidSize(count); - if (has) - { - // - for (int i = 0; i < count; i++) - { - // - XCBoxObject *iObj; - has = drawer.DrawBox( - mActivatedBoxes[i], - iObj // - ); - if (has) - { - // - if (mActivatedBoxes[i].IsBullish()) - { - iObj.BoxColor(clrYellow); - } - else - { - iObj.BoxColor(clrOrange); - } - - // - mObjects.Add(iObj); - } - } - } - } - - // - protected: - // - - // - private: - // - // Props ... - string symbol; - ENUM_TIMEFRAMES period; - CArrayObj mObjects; - CArrayObj mBarObjects; - - /** - * Initialize ... - */ - void Init() - { - // - rfReward = 2; - useGuards = false; - isPassedBoxes = false; - continuesRFTillTarget = true; - } - - /** - * DeInitialize ... - */ - void DeInit() - { - // - mConditions.Clean(); - Clean(mConditionsCollection); - - // - mObjects.Clear(); - mBarObjects.Clear(); - } - - // -}; - -// \ No newline at end of file diff --git a/X121SMCEA/Signals/x-121.smc.xind.signal.lib.mq5 b/X121SMCEA/Signals/x-121.smc.xind.signal.lib.mq5 deleted file mode 100644 index d439c15e..00000000 --- a/X121SMCEA/Signals/x-121.smc.xind.signal.lib.mq5 +++ /dev/null @@ -1,1735 +0,0 @@ -/////////////////////////////////////////////////////// -// -// SaherElm IT Center MQL5 X121 SMC Signal Class -// ------------------------------------------------- -// Name: XICH -// Description: provide all Signalling 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 - -// -// Imports ... -// #include "../../Libraries/x-trade.lib" -#include "../Classes/x-121.smc.market.cycle.helper.class.mq5" -#include "../Libraries/x-121.smc.guard.lib.mq5" -#include "../Libraries/x-121.smc.lib.mq5" - -// -// Provided Signals Enumeration ... -enum ENUM_X121SMC_XIND_PROVIDERS -{ - X121SMC_XIND_PROVIDER_NONE, - X121SMC_XIND_PROVIDER_XIND, - X121SMC_XIND_PROVIDER_XTKKUMO, -}; - -// -// Definitions ... - -// -// XIND Signal Conditions ... -struct X121SMCStrategyXINDSignalConditions -{ - // - // Props ... - - // - string symbol; - ENUM_TIMEFRAMES period; - - // - double sl; - ENUM_X_DIRECTION dir; - ENUM_X_POSITION_TYPES type; - - // - // Setup Props ... - - // - datetime setupTime; - datetime triggerTime; - - // - double pivot; - double point; - double sls[]; - double targets[]; - - // - XBoxZone signalBox; - - // - ENUM_X121SMC_XIND_PROVIDERS provider; - - // - // Constructor ... - X121SMCStrategyXINDSignalConditions() - { - Clean(); - } - - // - // Tools ... - - /** - * Cleaning Up ... - */ - void Clean() - { - // - sl = 0; - - // - dir = X_DIRECTION_NONE; - type = X_POSITION_TYPE_NONE; - - // - symbol = NULL; - period = NULL; - setupTime = NULL; - triggerTime = NULL; - - // - ExtensionClean(); - - // - ZeroMemory(this); - } - - /** - * Check Condition is Setting Up ... - * - * @param dir: ENUM_X_DIRECTION member, Setting Up Direction ... - * - * @return ( bool ) - */ - bool IsSetuped() - { - // - bool result = false; - - // - result = IsValid(setupTime) && - HasDirection(dir); - if (!result) - { - return result; - } - - // - return result; - } - - /** - * Calculate Setup Age ... - * - * @return ( int ) - */ - int GetSetupAge() - { - // - int result = 0; - - // - if (!IsSetuped()) - { - return result; - } - - // - result = (int)(TimeCurrent() - setupTime) / PeriodSeconds(period); - - // - return result; - } - - /** - * Detect How we Can Trigger Signal ... - * - * @return ( bool ) - */ - bool CanTrigger() - { - // - bool result = false; - - // - result = - // - sl > 0 && - IsValid(symbol) && - IsValid(period) && - IsValid(triggerTime) && - type != X_POSITION_TYPE_ALL && - type != X_POSITION_TYPE_NONE - // - ; - - // - return result; - } - - // - // Extensions ... - - /** - * Clean Additional Properties ... - */ - void ExtensionClean() - { - // - pivot = 0; - point = 0; - - // - Clean(sls); - Clean(targets); - signalBox.Clean(); - - // - provider = X121SMC_XIND_PROVIDER_NONE; - } - - // - // - // - - // - void UpdateTo(datetime value = NULL) - { - // - value = NormalizeTime(value); - - // - int count = 0; - bool has = false; - } - - // -}; - -// -// Extension Functions ... - -// -// Validate FVG BOXes ... - -// -bool IsFVGBoxValid( - XBoxZone &box, - ENUM_X_CYCLES cycle, - X121SMCStrategySignalProviderData &provider // -) -{ - // - bool result = false; - - // - result = box.IsValid(); - if (!result) - { - return result; - } - - // - // Fil Selected Data ... - XPOIState cState; - X121Conditions cXConditions; - XPOIStateEvents cStateEvents; - XC121SMCCycleHelper *cHelper; - X121SMCCycleConditions cConditions; - result = provider.SelectCycle( - cycle, - cState, - cStateEvents, - cXConditions, - cHelper, - cConditions // - ); - if (!result) - { - // - cState.Clean(); - ZeroMemory(cHelper); - cConditions.Clean(); - cXConditions.Clean(); - cStateEvents.Clean(); - - // - return result; - } - - // - bool isBoxBullish = box.IsBullish(); - - // - int count = 0; - bool has = false; - - // - XBoxZone tmpBoxes[]; - count = cState.FairValueGapsAsBox(tmpBoxes); - has = IsValidSize(count); - - // - // Check Must Contains Inner Cycle FVG ... - XBoxZone selectedBox; - bool hasSelectedBox = false; - if (has) - { - // - for (int i = 0; i < count; i++) - { - // - XBoxZone iBox = tmpBoxes[i]; - - // - // Regular Validation of Boxes ... - bool isValid = IsBoxValid( - iBox, - 0, - iBox.period // - ); - bool isTypePassed = iBox.dir == box.dir; - bool isFromPssed = iBox.from >= box.from; - bool isPlacePassed = - IsBoxInsideOr( - iBox, - box // - ) && - (isBoxBullish - ? iBox.lower >= box.lower - : iBox.upper <= box.upper); - has = - isValid && - isFromPssed && - isTypePassed && - isPlacePassed; - if (!has) - { - // - iBox.Clean(); - continue; - } - - // - has = - !hasSelectedBox - ? true - : isBoxBullish - ? selectedBox.upper > iBox.upper - : selectedBox.lower < iBox.lower; - if (has) - { - // - selectedBox = iBox; - hasSelectedBox = selectedBox.IsValid(); - } - - // - iBox.Clean(); - } - } - - // - result = hasSelectedBox; - - // - cState.Clean(); - Clean(tmpBoxes); - selectedBox.Clean(); - ZeroMemory(cHelper); - cConditions.Clean(); - cXConditions.Clean(); - cStateEvents.Clean(); - - // - return result; -} - -// -bool CheckConsolidationPassedBox( - XBoxZone &consolidationBox, - XBoxZone &box, - XPOIState &state // -) -{ - // - bool result = false; - - // - result = box.IsValid(); - if (!result) - { - return result; - } - - // - int idx = -1; - int count = 0; - bool has = false; - - // - XBoxZone selectedBox; - has = state.HasConsolidationZones(); - if (has) - { - // - count = state.CountConsolidationZones(); - for (int i = 0; i < count; i++) - { - // - XConsolidationZone iZone = state.consolidationZones[i]; - has = ToBox( - selectedBox, - iZone // - ); - if (!has) - { - // - iZone.Clean(); - selectedBox.Clean(); - continue; - }; - - // - // Check Selected Box is Related to BOX or not ... - bool isValid = - // - // Direction Passed ... - selectedBox.dir == box.dir && - // - // Time Passe ... - selectedBox.to > box.from && - selectedBox.from < box.from && - // - // Place Passed ... - ( - // - // Upper Inside ... - (selectedBox.upper >= box.lower && - selectedBox.upper <= box.upper) - // - || - // - // Lower Inside ... - (selectedBox.lower <= box.upper && - selectedBox.lower >= box.lower) - // - || - // - // Fully Inside ... - (selectedBox.upper <= box.upper && - selectedBox.lower >= box.lower) - // - ); - if (isValid) - { - // - iZone.Clean(); - break; - } - - // - iZone.Clean(); - selectedBox.Clean(); - } - } - - // - result = selectedBox.IsValid(); - if (result) - { - consolidationBox = selectedBox; - } - selectedBox.Clean(); - - // - return result; -} - -// -// Signalling Conditions Parsers ... - -// -// Detect Signals Based On XPV Indicator Golden Zones ... -bool HasXINDConditions( - XBoxZone &waitingBoxes[], - XBoxZone &activatedBoxes[], - XBoxZone &breakedBoxes[], - ENUM_X_CYCLES cycle, - XBoxZone &box, - XBoxZone &zone, - ENUM_X_DIRECTION &dir, - X121SMCStrategySignalProviderData &provider, - int barIndex = 0 // -) -{ - // - bool result = false; - - // - box.Clean(); - zone.Clean(); - dir = X_DIRECTION_NONE; - - // - // Checking Required Zone Boxes for Signalling ... - int waitingBoxesCount = ArraySize(waitingBoxes); - int breakedBoxesCount = ArraySize(breakedBoxes); - int activatedBoxesCount = ArraySize(activatedBoxes); - - // - // Fil Selected Data ... - XPOIState cState; - X121Conditions cXConditions; - XPOIStateEvents cStateEvents; - XC121SMCCycleHelper *cHelper; - X121SMCCycleConditions cConditions; - result = provider.SelectCycle( - cycle, - cState, - cStateEvents, - cXConditions, - cHelper, - cConditions // - ); - if (!result) - { - // - cState.Clean(); - ZeroMemory(cHelper); - cConditions.Clean(); - cXConditions.Clean(); - cStateEvents.Clean(); - - // - return result; - } - - // - // Normalize Args ... - - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - int idx = -1; - int count = 0; - bool has = false; - - // - int zIDX = barIndex; - int cIDX = zIDX + 1; - int pIDX = cIDX + 1; - int ppIDX = pIDX + 1; - - // - bool isBullish = false; - bool isBearish = false; - - // - XOHCL zBar; - XOHCL cBar; - XOHCL pBar; - XOHCL pPBar; - - // - // Initial Bars ... - result = zBar.Init( - cState.symbol, - cState.period, - barIndex // - ); - result = - result && - zBar.GetPreviousBar(cBar); - result = - result && - cBar.GetPreviousBar(pBar); - result = - result && - pBar.GetPreviousBar(pPBar); - if (!result) - { - // - zBar.Clean(); - cBar.Clean(); - pBar.Clean(); - cState.Clean(); - ZeroMemory(cHelper); - cConditions.Clean(); - cXConditions.Clean(); - - // - return result; - } - - // - XCPOIDrawer *drawer = provider.visionCycleHelper.mPOIDrawer; - - // - // Select Waiting Box ... - XBoxZone selectedBox; - bool hasSelectedBox = false; - bool useWaitingBoxes = true; - bool useActivtedBoxes = true; - bool useBreakedBoxes = false; - XBoxZone selectedConsolidationBox; - bool hasSelectedConsolidationBox = false; - if (useWaitingBoxes && IsValidSize(waitingBoxesCount)) - { - // - for (int i = 0; i < waitingBoxesCount; i++) - { - // - XBoxZone iBox = waitingBoxes[i]; - - // - // Check PV Passed Box ... - has = IsBoxPVPassed( - iBox, - cXConditions // - ); - if (has) - { - // - selectedBox = iBox; - iBox.Clean(); - - // - break; - } - - // - // Check Consolidation Passed Box ... - has = CheckConsolidationPassedBox( - selectedConsolidationBox, - iBox, - cState // - ); - if (has) - { - // - selectedBox = iBox; - iBox.Clean(); - - // - break; - } - - // - iBox.Clean(); - } - - // - hasSelectedBox = selectedBox.IsValid(); - if (!hasSelectedBox) - { - selectedBox.Clean(); - } - - // - hasSelectedConsolidationBox = selectedConsolidationBox.IsValid(); - if (!hasSelectedConsolidationBox) - { - selectedConsolidationBox.Clean(); - } - } - if (useActivtedBoxes && !hasSelectedBox && IsValidSize(activatedBoxesCount)) - { - // - for (int i = 0; i < activatedBoxesCount; i++) - { - // - XBoxZone iBox = activatedBoxes[i]; - - // - // Check PV Passed Box ... - has = IsBoxPVPassed( - iBox, - cXConditions // - ); - if (has) - { - // - selectedBox = iBox; - iBox.Clean(); - - // - break; - } - - // - // Check Consolidation Passed Box ... - has = CheckConsolidationPassedBox( - selectedConsolidationBox, - iBox, - cState // - ); - if (has) - { - // - selectedBox = iBox; - iBox.Clean(); - - // - break; - } - - // - iBox.Clean(); - } - - // - hasSelectedBox = selectedBox.IsValid(); - if (!hasSelectedBox) - { - selectedBox.Clean(); - } - - // - hasSelectedConsolidationBox = selectedConsolidationBox.IsValid(); - if (!hasSelectedConsolidationBox) - { - selectedConsolidationBox.Clean(); - } - } - if (useBreakedBoxes && !hasSelectedBox && IsValidSize(breakedBoxesCount)) - { - // - for (int i = 0; i < breakedBoxesCount; i++) - { - // - XBoxZone iBox = breakedBoxes[i]; - - // - iBox.Clean(); - } - - // - hasSelectedBox = selectedBox.IsValid(); - if (!hasSelectedBox) - { - selectedBox.Clean(); - } - } - - // - double selectedBoxMid = 0; - double selectedBoxStr = 0; - if (hasSelectedBox) - { - // - selectedBoxMid = (selectedBox.lower + ((selectedBox.upper - selectedBox.lower) / 2)); - - // - selectedBox.to = zBar.time; - CheckBoxStr( - cHelper, - selectedBox, - selectedBoxStr // - ); - - // - if (selectedBoxStr != 0) - { - // - long chartId = drawer.ChartIdentification(); - int subWindow = drawer.SubWindowIdentification(); - string name = selectedBox.GetTag() + "_SUPRES"; - - // - CChartObjectTrend *iObj; - iObj = new CChartObjectTrend(); - has = iObj.Create( - chartId, - name, - subWindow, - selectedBox.from, - selectedBoxStr, - selectedBox.to, - selectedBoxStr // - ); - if (has) - { - // - color lineColor = - selectedBox.IsBullish() - ? clrLime - : clrRed; - iObj.Color(lineColor); - iObj.Width(2); - } - } - - // - XCBoxObject *iObj; - has = drawer.DrawBox( - selectedBox, - iObj // - ); - if (has) - { - // - iObj.BoxColor(clrCornflowerBlue); - iObj.BoxStyle(STYLE_SOLID); - iObj.BoxWidth(2); - - // - Print("Selected Box ..."); - } - } - - // - if (hasSelectedConsolidationBox) - { - // - XCBoxObject *iObj; - has = drawer.DrawBox( - selectedConsolidationBox, - iObj // - ); - if (has) - { - // - iObj.BoxWidth(2); - iObj.BoxStyle(STYLE_SOLID); - } - } - - // - // Detect Bullish and Bearish Consolidation Zones ... - XBoxZone consolidationBox; - bool hasConsolidationBox = false; - if (!hasConsolidationBox) - { - // - hasConsolidationBox = cStateEvents.hasNewConsolidationZone; - if (hasConsolidationBox) - { - // - idx = GetYoungest(cState.consolidationZones); - has = IsValidIndex(idx); - if (has) - { - // - XConsolidationZone cZone = cState.consolidationZones[idx]; - - // - ToBox( - consolidationBox, - cZone // - ); - } - } - - // - hasConsolidationBox = consolidationBox.IsValid(); - // if (hasConsolidationBox) - // { - // // - // XCBoxObject *iObj; - // has = drawer.DrawBox( - // consolidationBox, - // iObj // - // ); - // if (has) - // { - // // - // color crlBox = consolidationBox.IsBullish() - // ? clrBlue - // : clrDarkRed; - - // // - // iObj.BoxWidth(2); - // iObj.BoxColor(crlBox); - // iObj.BoxStyle(STYLE_SOLID); - // } - // } - } - - // - // - // - - // - // Reading Resources ... - - // - double sarZ = cXConditions.sarBuffer[zIDX]; - double sarC = cXConditions.sarBuffer[cIDX]; - double sarP = cXConditions.sarBuffer[pIDX]; - double sarPP = cXConditions.sarBuffer[ppIDX]; - - // - double peakZ = cXConditions.peaksBuffer[zIDX]; - double peakC = cXConditions.peaksBuffer[cIDX]; - double peakP = cXConditions.peaksBuffer[pIDX]; - double peakPP = cXConditions.peaksBuffer[ppIDX]; - - // - double valeZ = cXConditions.valesBuffer[zIDX]; - double valeC = cXConditions.valesBuffer[cIDX]; - double valeP = cXConditions.valesBuffer[pIDX]; - double valePP = cXConditions.valesBuffer[ppIDX]; - - // - double strZ = cXConditions.strBuffer[zIDX]; - double strC = cXConditions.strBuffer[cIDX]; - double strP = cXConditions.strBuffer[pIDX]; - double strPP = cXConditions.strBuffer[ppIDX]; - - // - double priceChangeZ = cXConditions.priceChangeBuffer[zIDX]; - double priceChangeC = cXConditions.priceChangeBuffer[cIDX]; - double priceChangeP = cXConditions.priceChangeBuffer[pIDX]; - double priceChangePP = cXConditions.priceChangeBuffer[ppIDX]; - - // - double peaksGoldenZ = cXConditions.peaksGoldenBuffer[zIDX]; - double peaksGoldenC = cXConditions.peaksGoldenBuffer[cIDX]; - double peaksGoldenP = cXConditions.peaksGoldenBuffer[pIDX]; - double peaksGoldenPP = cXConditions.peaksGoldenBuffer[ppIDX]; - - // - double valesGoldenZ = cXConditions.valesGoldenBuffer[zIDX]; - double valesGoldenC = cXConditions.valesGoldenBuffer[cIDX]; - double valesGoldenP = cXConditions.valesGoldenBuffer[pIDX]; - double valesGoldenPP = cXConditions.valesGoldenBuffer[ppIDX]; - - // - // Generate Conditions ... - - // - bool isPBarBullishPriceChangeVPattern = - priceChangeP > priceChangePP && - priceChangeP > priceChangeC; - - // - bool isPBarBearishPriceChangeVPattern = - priceChangeP < priceChangePP && - priceChangeP < priceChangeC; - - // - bool isCBarBullishPriceChangeVPattern = - priceChangeC > priceChangeP && - priceChangeC > priceChangeZ; - - // - bool isCBarBearishPriceChangeVPattern = - priceChangeC < priceChangeP && - priceChangeC < priceChangeZ; - - // - bool isCPriceChangeUnderSelectedBoxMid = - selectedBoxMid > 0 && - priceChangeC < selectedBoxMid; - - // - bool isCPriceChangeOverSelectedBoxMid = - selectedBoxMid > 0 && - priceChangeC > selectedBoxMid; - - // - bool isPPriceChangeUnderSelectedBoxMid = - selectedBoxMid > 0 && - priceChangeP < selectedBoxMid; - - // - bool isPPriceChangeOverSelectedBoxMid = - selectedBoxMid > 0 && - priceChangeP > selectedBoxMid; - - // - bool isPriceChangeUnderSelectedBoxMid = - isCPriceChangeUnderSelectedBoxMid || - isPPriceChangeUnderSelectedBoxMid; - - // - bool isPriceChangeOverSelectedBoxMid = - isCPriceChangeOverSelectedBoxMid || - isPPriceChangeOverSelectedBoxMid; - - // - bool isBarBullishPriceChangeVPattern = - isPBarBullishPriceChangeVPattern || - isCBarBullishPriceChangeVPattern; - - // - bool isBarBearishPriceChangeVPattern = - isPBarBearishPriceChangeVPattern || - isCBarBearishPriceChangeVPattern; - - // - bool isPriceChangeBullishRejectedStr = - // - cXConditions.strStateBuffer[zIDX] > 0 && - cXConditions.strStateBuffer[cIDX] > 0 && - cXConditions.strStateBuffer[pIDX] > 0 && - // - cXConditions.strBuffer[zIDX] == cXConditions.strBuffer[cIDX] && - cXConditions.strBuffer[zIDX] == cXConditions.strBuffer[pIDX] && - // - ((priceChangeP < strC && - priceChangeC > strC) || - (priceChangeC < strC && - priceChangeZ > strC)) - // - ; - - // - bool isPriceChangeBearishRejectedStr = - // - cXConditions.strStateBuffer[zIDX] < 0 && - cXConditions.strStateBuffer[cIDX] < 0 && - cXConditions.strStateBuffer[pIDX] < 0 && - // - cXConditions.strBuffer[zIDX] == cXConditions.strBuffer[cIDX] && - cXConditions.strBuffer[zIDX] == cXConditions.strBuffer[pIDX] && - // - ((priceChangeP > strC && - priceChangeC < strC) || - (priceChangeC > strC && - priceChangeZ > strC)) - // - ; - - // - bool isCBarBullishRejectedStr = - cBar.low < strC && - cBar.GetDown() > strC; - - // - bool isPBarBullishRejectedStr = - pBar.low < strP && - pBar.GetDown() > strP; - - // - bool isBarBullishRejectedStr = - isCBarBullishRejectedStr || - isPBarBullishRejectedStr; - - // - bool isCBarBearishRejectedStr = - cBar.high > strC && - cBar.GetUp() < strC; - - // - bool isPBarBearishRejectedStr = - pBar.high > strP && - pBar.GetUp() < strP; - - // - bool isBarBearishRejectedStr = - isCBarBearishRejectedStr || - isPBarBearishRejectedStr; - - // - bool isCPVsPeakSame = - provider.decisionXConditions.peaksBuffer[cIDX] == provider.analyseXConditions.peaksBuffer[cIDX] && - provider.analyseXConditions.peaksBuffer[cIDX] == provider.consolidationXConditions.peaksBuffer[cIDX]; - - bool isPPVsPeakSame = - provider.decisionXConditions.peaksBuffer[pIDX] == provider.analyseXConditions.peaksBuffer[pIDX] && - provider.analyseXConditions.peaksBuffer[pIDX] == provider.consolidationXConditions.peaksBuffer[pIDX]; - - // - bool isCPVsValeSame = - provider.decisionXConditions.valesBuffer[cIDX] == provider.analyseXConditions.valesBuffer[cIDX] && - provider.analyseXConditions.valesBuffer[cIDX] == provider.consolidationXConditions.valesBuffer[cIDX]; - - bool isPPVsValeSame = - provider.decisionXConditions.valesBuffer[pIDX] == provider.analyseXConditions.valesBuffer[pIDX] && - provider.analyseXConditions.valesBuffer[pIDX] == provider.consolidationXConditions.valesBuffer[pIDX]; - - // - bool isPeaksSame = isCPVsPeakSame && isPPVsPeakSame; - bool isValesSame = isCPVsValeSame && isPPVsValeSame; - - // - // Bars Conditions ... - - // - ENUM_X_DIRECTION cBarDir; - - // - // Hammer ... - bool isCBarHammer = cHelper - .mBarAnalyser - .IsHammer( - cBar, - cBarDir // - ); - bool isCBarBullishHammer = - isCBarHammer && - IsBullish(cBarDir); - bool isCBarBearishHammer = - isCBarHammer && - IsBearish(cBarDir); - - // - // Rejected ... - bool isCBarRejected = cHelper - .mBarAnalyser - .IsRejected( - cBar, - cBarDir, - false, // Force Type ... - true // Force Fibo Pressure ... - ); - bool isCBarBullishRejected = - isCBarRejected && - IsBullish(cBarDir); - bool isCBarBearishRejected = - isCBarRejected && - IsBearish(cBarDir); - - // - // Engulfed ... - bool isCBarEngulfed = cHelper - .mBarAnalyser - .IsEngulfed( - cBar, - cBarDir // - ); - bool isCBarBullishEngulfed = - isCBarEngulfed && - IsBullish(cBarDir); - bool isCBarBearishEngulfed = - isCBarEngulfed && - IsBearish(cBarDir); - - // - // Momentum ... - bool isCBarMomentum = cHelper - .mBarAnalyser - .IsMomentum( - cBar, - cBarDir, - 1 // - ); - bool isCBarBullishMomentum = - isCBarMomentum && - IsBullish(cBarDir); - bool isCBarBearishMomentum = - isCBarMomentum && - IsBearish(cBarDir); - - // - // Bar Sumarise ... - - // - bool isCBarValidForBullish = - (isCBarBullishHammer || - isCBarBullishRejected || - isCBarBullishMomentum || - isCBarBullishEngulfed); - - // - bool isCBarValidForBearish = - (isCBarBearishHammer || - isCBarBearishRejected || - isCBarBearishMomentum || - isCBarBearishEngulfed); - - // - bool isCBarBreakUpLastPeak = - cBar.IsBullish() && - cBar.GetUp() > peakP && - cBar.GetDown() < peakP; - - // - bool isCBarBreakDownLastPeak = - cBar.IsBearish() && - cBar.GetUp() > peakP && - cBar.GetDown() < peakP; - - // - bool isCBarBreakUpLastVale = - cBar.IsBullish() && - cBar.GetUp() > valeP && - cBar.GetDown() < valeP; - - // - bool isCBarBreakDownLastVale = - cBar.IsBearish() && - cBar.GetUp() > valeP && - cBar.GetDown() < valeP; - - // - bool isCBarBreakUpPeakGolden = - cBar.IsBullish() && - cBar.GetUp() > peaksGoldenC && - cBar.GetDown() < peaksGoldenC; - - // - bool isCBarBreakDownPeakGolden = - cBar.IsBearish() && - cBar.GetUp() > peaksGoldenC && - cBar.GetDown() < peaksGoldenC; - - // - bool isCBarBreakUpValeGolden = - cBar.IsBullish() && - cBar.GetUp() > valesGoldenC && - cBar.GetDown() < valesGoldenC; - - // - bool isCBarBreakDownValeGolden = - cBar.IsBearish() && - cBar.GetUp() > valesGoldenC && - cBar.GetDown() < valesGoldenC; - - // - // Summarize Conditions ... - - // - bool isBoxSignalBullish = - // - hasSelectedBox && - selectedBox.IsBullish() - // - ; - - // - bool isBoxSignalBearish = - // - hasSelectedBox && - selectedBox.IsBearish() - // - ; - - // - bool isConsolidationBoxSignalBullish = - isBoxSignalBullish && - hasSelectedConsolidationBox && - selectedConsolidationBox.IsBullish(); - - // - bool isConsolidationBoxSignalBearish = - isBoxSignalBearish && - hasSelectedConsolidationBox && - selectedConsolidationBox.IsBearish(); - - // - // - // - - // - bool isCond1Bullish = - // - isBoxSignalBullish && - selectedBoxStr > 0 && - isCBarValidForBullish && - (cXConditions.isStrBullish - ? isBarBullishRejectedStr - : true) && - !hasSelectedConsolidationBox && - isBarBullishPriceChangeVPattern - // - ; - - // - bool isCond1Bearish = - // - isBoxSignalBearish && - selectedBoxStr > 0 && - isCBarValidForBearish && - (cXConditions.isStrBearish - ? isBarBearishRejectedStr - : true) && - !hasSelectedConsolidationBox && - isBarBearishPriceChangeVPattern - // - ; - - // - bool isCond2Bullish = - // - isCBarValidForBullish && - isBarBullishPriceChangeVPattern && - isConsolidationBoxSignalBullish && - (isPriceChangeBullishRejectedStr || - isPriceChangeUnderSelectedBoxMid) - // - ; - - bool isCond2Bearish = - // - isCBarValidForBearish && - isBarBearishPriceChangeVPattern && - isConsolidationBoxSignalBearish && - (isPriceChangeBearishRejectedStr || - isPriceChangeOverSelectedBoxMid) - // - ; - - // - bool isCond3Bullish = - // - false - // - ; - - bool isCond3Bearish = - // - false - // - ; - - // - // - // - - // - isBullish = - // - isCond1Bullish || - isCond2Bullish || - isCond3Bullish - // - ; - - // - isBearish = - // - isCond1Bearish || - isCond2Bearish || - isCond3Bearish - // - ; - - // // - // if (isBoxSignalBullish || isBoxSignalBearish) - // { - // Print("Box Has Signal ..."); - // } - - // - // if (isPeaksSame || - // isValesSame) - // { - // // - // long chartId = drawer.ChartIdentification(); - // int subWindow = drawer.SubWindowIdentification(); - - // // - // string name1 = "decision_"; - // string name2 = "analyse_"; - // string name3 = "consolidation_"; - - // // - // CChartObjectTrend *t1Obj; - // t1Obj = new CChartObjectTrend(); - - // // - // CChartObjectTrend *t2Obj; - // t2Obj = new CChartObjectTrend(); - - // // - // CChartObjectTrend *t3Obj; - // t3Obj = new CChartObjectTrend(); - - // // - // color tValeColor = clrAqua; - // color tPeakColor = clrMagenta; - - // // - // datetime from = pBar.time; - // datetime to = zBar.time; - - // // - // if (isPeaksSame) - // { - // // - // // Prepare Names ... - // name1 = name1 + "_Vale"; - // name2 = name2 + "_Vale"; - // name3 = name3 + "_Vale"; - - // // - // // T1 ... - // has = t1Obj.Create( - // chartId, - // name1, - // subWindow, - // from, - // provider.decisionXConditions.valesBuffer[cIDX], - // to, - // provider.decisionXConditions.valesBuffer[cIDX] // - // ); - // if (has) - // { - // t1Obj.Color(tValeColor); - // } - - // // - // // T2 ... - // has = t2Obj.Create( - // chartId, - // name2, - // subWindow, - // from, - // provider.analyseXConditions.valesBuffer[cIDX], - // to, - // provider.analyseXConditions.valesBuffer[cIDX] // - // ); - // if (has) - // { - // t2Obj.Color(tValeColor); - // } - - // // - // // T3 ... - // has = t3Obj.Create( - // chartId, - // name1, - // subWindow, - // from, - // provider.consolidationXConditions.valesBuffer[cIDX], - // to, - // provider.consolidationXConditions.valesBuffer[cIDX] // - // ); - // if (has) - // { - // t3Obj.Color(tValeColor); - // } - // } - - // // - // if (isValesSame) - // { - // // - // // Prepare Names ... - // name1 = name1 + "_Peak"; - // name2 = name2 + "_Peak"; - // name3 = name3 + "_Peak"; - - // // - // // T1 ... - // has = t1Obj.Create( - // chartId, - // name1, - // subWindow, - // from, - // provider.decisionXConditions.peaksBuffer[cIDX], - // to, - // provider.decisionXConditions.peaksBuffer[cIDX] // - // ); - // if (has) - // { - // t1Obj.Color(tPeakColor); - // } - - // // - // // T2 ... - // has = t2Obj.Create( - // chartId, - // name2, - // subWindow, - // from, - // provider.analyseXConditions.peaksBuffer[cIDX], - // to, - // provider.analyseXConditions.peaksBuffer[cIDX] // - // ); - // if (has) - // { - // t2Obj.Color(tPeakColor); - // } - - // // - // // T3 ... - // has = t3Obj.Create( - // chartId, - // name1, - // subWindow, - // from, - // provider.consolidationXConditions.peaksBuffer[cIDX], - // to, - // provider.consolidationXConditions.peaksBuffer[cIDX] // - // ); - // if (has) - // { - // t3Obj.Color(tPeakColor); - // } - // } - - // // - // Print("PVS Same ..."); - // } - - // - if (isConsolidationBoxSignalBullish || - isConsolidationBoxSignalBearish) - { - Print("Has Consolidation Selected Box ..."); - } - - // - // Filling Requirements ... - result = - isBullish || - isBearish; - if (result) - { - // - dir = - isBullish - ? X_DIRECTION_BULLISH - : X_DIRECTION_BEARISH; - - // - box.dir = dir; - box.from = pPBar.time; - box.to = TimeCurrent(); - box.symbol = cBar.symbol; - box.period = cBar.period; - - // - double points = GetPoints(box.symbol); - - // - // Usually is Preffered SL ... - double pivot = 0; - if (isBullish) - { - // - if (isCond1Bullish) - { - pivot = selectedBoxStr; - } - else if (isCond2Bullish) - { - pivot = selectedBoxMid; - } - else if (hasSelectedBox) - { - // - // Default Box SL ... - pivot = selectedBox.lower; - } - else - { - // - // Default Non Box SL ... - pivot = cBar.low; - } - } - else if (isBearish) - { - // - if (isCond1Bearish) - { - pivot = selectedBoxStr; - } - else if (isCond2Bearish) - { - pivot = selectedBoxMid; - } - else if (hasSelectedBox) - { - // - // Default Box SL ... - pivot = selectedBox.upper; - } - else - { - // - // Default Non Box SL ... - pivot = cBar.high; - } - } - - // - // Usually is Current Price or Entry Price ... - double point = GetEntry( - cBar.symbol, - dir // - ); - - // - box.upper = - isBullish - ? point - : pivot; - - // - box.lower = - isBullish - ? pivot - : point; - - // - zone = selectedBox; - } - - // - // Check All Conditions ... - result = - box.IsValid() && - HasDirection(dir) && - (isBullish || - isBearish); - - // - // Cleanup Resources ... - zBar.Clean(); - cBar.Clean(); - pBar.Clean(); - pPBar.Clean(); - cState.Clean(); - cConditions.Clean(); - cConditions.Clean(); - ZeroMemory(cHelper); - selectedBox.Clean(); - cStateEvents.Clean(); - cXConditions.Clean(); - - // - ZeroMemory(drawer); - - // - return result; -} - -// -// -// - -// -bool IsBoxPVPassed( - XBoxZone &box, - X121Conditions &conditions // -) -{ - // - bool result = false; - - // - result = box.IsValid(); - if (!result) - { - return result; - } - - // - // double boxValue = box.lower + ((box.upper - box.lower) / 2); - - // - bool isBullishPassed = - box.IsBullish() && - conditions.valesBuffer[0] < box.upper && - conditions.valesBuffer[0] > box.lower; - - // - bool isBearishPassed = - box.IsBearish() && - conditions.peaksBuffer[0] > box.lower && - conditions.peaksBuffer[0] < box.upper; - - // - result = isBullishPassed || - isBearishPassed; - - // - return result; -} - -// -void CheckBoxStr( - XC121SMCCycleHelper *helper, - XBoxZone &box, - double &value // -) -{ - // - value = 0; - - // - if (!box.IsValid()) - { - return; - } - - // - ENUM_TIMEFRAMES _period = helper.GetPeriod(); - - // - int toIDX = box.ToIndex(_period); - int fromIDX = box.FromIndex(_period); - if (!IsValidIndex(toIDX) || - !IsValidIndex(fromIDX)) - { - return; - } - - // - bool isBullish = box.IsBullish(); - XCX121XSTRHelper *strHelper = helper.mX121Helper.xstrHelper; - for (int i = fromIDX; i >= toIDX; i--) - { - // - double iStr = strHelper.GetSTR(i); - double iPStr = strHelper.GetSTR(i); - double iStrState = strHelper.GetSTRState(i); - - // - bool isSame = iStr == iPStr; - bool isStrBullish = iStrState > 0; - bool isStrBearish = iStrState < 0; - bool isStrInBox = - iStr <= box.upper && - iStr >= box.lower; - - // - if (isSame && isStrInBox) - { - // - if (isBullish && isStrBullish) - { - // - // Min Bullish Str as Support ... - value = - value <= 0 - ? iStr - : value > iStr - ? iStr - : value; - } - else if (!isBullish && isStrBearish) - { - // - // Max Bearish Str as Resistance ... - value = - value <= 0 - ? iStr - : value < iStr - ? iStr - : value; - } - } - } - - // - ZeroMemory(strHelper); - - // -} - -// \ No newline at end of file diff --git a/X121SMCEA/Signals/x-121.smc.xwz.signal.class.mq5 b/X121SMCEA/Signals/x-121.smc.xwz.signal.class.mq5 deleted file mode 100644 index 19900f9a..00000000 --- a/X121SMCEA/Signals/x-121.smc.xwz.signal.class.mq5 +++ /dev/null @@ -1,1844 +0,0 @@ -/////////////////////////////////////////////////////// -// -// SaherElm IT Center MQL5 X121 SMC Signal Class -// ------------------------------------------------- -// Name: XWZ -// Description: provide all Signalling 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 - -// -// Imports ... -#include "../Classes/x-121.smc.market.cycle.helper.class.mq5" -#include "../Libraries/x-121.smc.guard.lib.mq5" -#include "../Libraries/x-121.smc.lib.mq5" -#include "./x-121.smc.xwz.signal.lib.mq5" - -// -// Definition ... -class XCX121SMCXWZSignalDetector : public XCBase -{ - // - public: - // - // Props ... - bool useGuards; - double rfRewar; - bool useQuarterTargets; - X121SMCStrategyXWZWorkingZone workingZone; - X121SMCStrategyXWZSignalConditions mConditions; - X121SMCStrategyXWZSignalConditions mConditionsCollection[]; - - // - // Constructor(s) ... - XCX121SMCXWZSignalDetector( - string _symbol, - ENUM_TIMEFRAMES _period // - ) - { - // - symbol = _symbol; - period = _period; - Init(); - } - - // - // Deconstructor ... - ~XCX121SMCXWZSignalDetector() - { - DeInit(); - } - - // - // - // - - // - // Detect Setup Conditions ... - bool DetectSignalSetup( - // - X121SMCStrategySignalProviderData &provider, - // - double maxAllowedSLDistanceInPoint = 300 - // - ) - { - // - bool result = false; - - // - // Validate Cycle Helpers ... - result = provider.IsValid(); - if (!result) - { - // - mConditions.Clean(); - - // - return result; - } - - // - bool isBullish = false; - bool isBearish = false; - - // - int zIndex = 0; - int cIndex = zIndex + 1; - int pIndex = cIndex + 1; - int ppIndex = pIndex + 1; - - // - int loopback = 10; - - // - mConditions.symbol = symbol; - mConditions.period = period; - - // - double ask = GetAsk(symbol); - double bid = GetBid(symbol); - datetime cTime = TimeCurrent(); - double points = GetPoints(symbol); - - // - // Cycles Conditions ... - result = provider.Prepare( - zIndex, - loopback, - true, // Trigger ... - true, // Decision ... - true, // Analyse ... - true, // Verification ... - true, // Consolidation ... - true // Vision ... - ); - if (!result) - { - // - mConditions.Clean(); - return result; - } - - // - // Select Drawer Class ... - XCPOIDrawer *drawer = provider.visionCycleHelper.mPOIDrawer; - - // - XOHCL consolidationZBar; - result = provider.consolidationCycleHelper.GetBar( - consolidationZBar, - zIndex // - ); - if (!result) - { - // - consolidationZBar.Clean(); - return result; - } - - // - bool drawBar = false; - if (drawBar) - { - // - DrawBar( - consolidationZBar, - drawer // - ); - } - - // - // - // - - // - // Setup Conditions ... - double sls[]; - double sl = 0; - double pivot = 0; - double point = 0; - double targets[]; - double reward = 0; - XSignalBox signalBox; - bool hasTrend = false; - bool hasPriority = false; - double amountPercent = -1; - bool hasSignalBox = false; - bool hasWaitingBoxes = false; - bool hasRewardAmount = false; - ENUM_X_DIRECTION trend = X_DIRECTION_NONE; - ENUM_X_DIRECTION signalBoxDir = X_DIRECTION_NONE; - ENUM_X121SMC_XWZ_PRIORITY priority = X121SMC_XWZ_PRIORITY_NONE; - ENUM_X121SMC_XWZ_PROVIDERS signalProvider = X121SMC_XWZ_PROVIDER_NONE; - - // - // - // - - // - // First We Have to Has Working Zone ... - // bool hasWorkingZone = workingZone.IsValid(); - // if (!hasWorkingZone) - // { - // // - // hasWorkingZone = workingZone.Init( - // symbol, - // period, - // zIndex, - // provider // - // ); - // } - - // // - // // Update Working Zone ... - // if (hasWorkingZone) - // { - // // - // // Reset POI Detector Required POI(s) ... - // provider.MaxRequiredPOIs(50); - - // // - // // Reset POI Detector Allowed Loopback ... - // provider.MaxAllowedLoopbackForInit(578); - - // // - // // Check Working Zone Has Trend ... - // hasTrend = workingZone.DetectTreand( - // X_CYCLE_CONSOLIDATION, - // trend, - // provider, - // zIndex // - // ); - - // // - // // Detectiong Signal Boxes ... - // // hasWaitingBoxes = workingZone - // // .DetectWaitingBoxes( - // // X_CYCLE_ANALYSE, - // // X_CYCLE_DECISION, - // // provider, - // // zIndex // - // // ); - // if (hasWaitingBoxes) - // { - // // - // // Validate Working Zone Waiting Boxes ... - // workingZone.ValidateWaitingBoxes(zIndex); - - // // - // // Double Check Has Waiting Boxes or not ... - // hasWaitingBoxes = workingZone.HasWaitingBoxes(); - // } - - // // - // // Checking Working Zone Destory or not ... - // bool isWorkingZoneDestroyed = workingZone.IsDestroyed( - // zIndex, - // period // - // ); - - // // - // // Cleanup WorkingZone and ignore all conditions ... - // if (isWorkingZoneDestroyed) - // { - // // - // result = false; - // workingZone.Clean(); - // hasWorkingZone = false; - - // // - // // Cleanup Resources ... - // provider.Clean(); - - // // - // mConditions.Clean(); - // consolidationZBar.Clean(); - - // // - // return result; - // } - // } - - // - // Update Models To Time ... - UpdateTo(cTime); - - // - // Draw Working Zone ... - workingZone.Draw( - drawer, - // - false, // Draw Supply Zone ... - false, // Draw Demand Zone ... - true, // Draw Waiting Zones ... - false // Draw Trend ... - ); - - // - // Detect Signal Box ... - hasSignalBox = - // hasWorkingZone && - workingZone.DetectSignalConditions( - signalBox, - signalBoxDir, - signalProvider, - provider, - zIndex // - ); - - // - // Remove Signal Box form - // Waiting Boxes and Breaked Boxes - // if Exists on them, then add it to - // UnAvailable Boxes ... - if (hasSignalBox) - { - // - // Remove Signal Box from UnAvailable Box ... - // if Exists ... - bool hasBreakedBoxes = workingZone - .HasBreakedBoxes(); - if (hasBreakedBoxes) - { - // - int idx = -1; - bool has = FindIndex( - idx, - signalBox, - workingZone.breakedBoxes // - ); - if (has) - { - // - ArrayRemove( - workingZone.breakedBoxes, - idx, - 1 // - ); - } - } - - // - // Add Signal Box to UnAvailable Boxes ... - // if Exists in Waiting Boxes ... - if (hasWaitingBoxes) - { - // - int idx = -1; - bool has = FindIndex( - idx, - signalBox, - workingZone.waitingBoxes // - ); - if (has) - { - // - ArrayRemove( - workingZone.waitingBoxes, - idx, - 1 // - ); - } - } - - // - // Adding to UnAvailable Box ... - AddRef( - signalBox, - workingZone.unavailableBoxes // - ); - } - - // - // - // - - // - // Cleanup Signal if UnApproved ... - if (!hasSignalBox) - { - // - signalBox.Clean(); - signalBoxDir = X_DIRECTION_NONE; - } - - // - // Check Priority Exists ... - // hasPriority = - // hasWorkingZone && - // workingZone - // .DetectPriority( - // priority, - // signalBoxDir, - // zIndex, - // period // - // ); - - // - // Check Price Reward and Amount Exists ... - // hasRewardAmount = - // hasWorkingZone && - // CalculateRiskReward( - // priority, - // reward, - // amountPercent // - // ); - - // - // Check Signal Conditions ... - if (hasSignalBox) - { - // - int idx = -1; - bool has = false; - - // - // Draw Signal Box ... - XCBaseObject *objects[]; - has = drawer.DrawSignalBox( - signalBox, - objects, - clrYellow // - ); - if (has) - { - // - int count = ArraySize(objects); - for (int i = 0; i < count; i++) - { - workingZone.mDrawnObjects.Add(objects[i]); - } - } - Clean(objects); - - // - // Detect Signal Direction ... - isBullish = IsBullish(signalBoxDir); - isBearish = IsBearish(signalBoxDir); - - // - pivot = isBullish - ? signalBox.ob.lower - : signalBox.ob.upper; - - // - point = isBullish - ? signalBox.ob.upper - : signalBox.ob.lower; - - // - double entry = GetEntry( - signalBox.ob.symbol, - signalBoxDir // - ); - - // - // Selecting SL(s) ... - - // - double iSL = 0; - - // - // Default SL ... - iSL = pivot; - - // - Add( - iSL, - sls // - ); - - // - // Select and Provide SL Based on ... - double iAtr = 0; - if (signalProvider == X121SMC_XWZ_PROVIDER_XREJECTED_BOX) - { - // - iAtr = provider.decisionXConditions.atrBuffer[1]; - iAtr *= 0; - - // - // Fix rf Reward ... - rfRewar = 2; - } - else if (signalProvider == X121SMC_XWZ_PROVIDER_XACTIVATED_BOX) - { - // - iAtr = provider.decisionXConditions.atrBuffer[1]; - iAtr *= 0; - - // - Clean(sls); - - // - // Prepare Box fro SL ... - iSL = signalBox.sl; - Add( - iSL, - sls // - ); - - // - // Fix rf Reward ... - rfRewar = 1.5; - } - else if (signalProvider == X121SMC_XWZ_PROVIDER_XBREAKED_BOX) - { - // - iAtr = provider.decisionXConditions.atrBuffer[1]; - iAtr *= 0; - - // - Clean(sls); - - // - // Prepare Box fro SL ... - iSL = pivot; - Add( - iSL, - sls // - ); - - // - // Fix rf Reward ... - rfRewar = 2; - } - else if (signalProvider == X121SMC_XWZ_PROVIDER_XWPVZ) - { - // - iAtr = provider.decisionXConditions.atrBuffer[1]; - iAtr *= 0; - - // - Clean(sls); - - // - // Prepare Box fro SL ... - double risk = pivot - point; - - iSL = risk <= (100 * points) - ? pivot - : isBullish - ? NormalizePrice(entry - (50 * points), signalBox.ob.symbol) - : NormalizePrice(entry + (50 * points), signalBox.ob.symbol); - Add( - iSL, - sls // - ); - - // - // Fix rf Reward ... - rfRewar = 2; - } - - // - Print("XWZ ", ToString(signalBoxDir), " Signal Provided: ", EnumToString(signalProvider)); - - // - // Select Condition SL ... - - // - double slsMin = GetMin(sls); - double slsMax = GetMax(sls); - - // - double longSL = slsMax - iAtr; - double shortSL = slsMin + iAtr; - - // - sl = isBullish - ? longSL - : shortSL; - - // - // Targets ... - - // - double risk = MathAbs(entry - sl); - - // - // Checking risk ... - if (risk >= maxAllowedSLDistanceInPoint) - { - // Print("Max Aloowed Risk Point Reached ..."); - } - - // - // Reward to RF ... - if (rfRewar > 0) - { - // - double iRFReward = rfRewar * risk; - double iRFTP = isBullish - ? entry + iRFReward - : entry - iRFReward; - - // - Add( - iRFTP, - targets // - ); - } - - // - // Based On Priority ... - useQuarterTargets = false; - if (useQuarterTargets) - { - // - has = priority != X121SMC_XWZ_PRIORITY_NONE; - if (has) - { - // - switch (priority) - { - // - case X121SMC_XWZ_PRIORITY_WEAK: - // - if (isBullish) - { - // - // Weak ... - Add( - workingZone.supplyZone.Lower(), - targets // - ); - } - else - { - // - // Weak ... - Add( - workingZone.demandZone.Upper(), - targets // - ); - } - break; - - // - case X121SMC_XWZ_PRIORITY_LOW: - // - if (isBullish) - { - // - // Weak ... - Add( - workingZone.supplyZone.Lower(), - targets // - ); - - // - // Low ... - Add( - workingZone.quarter1, - targets // - ); - } - else - { - // - // Weak ... - Add( - workingZone.demandZone.Upper(), - targets // - ); - - // - // Low ... - Add( - workingZone.quarter3, - targets // - ); - } - break; - - // - case X121SMC_XWZ_PRIORITY_REGULAR: - // - if (isBullish) - { - // - // Weak ... - Add( - workingZone.supplyZone.Lower(), - targets // - ); - - // - // Low ... - Add( - workingZone.quarter1, - targets // - ); - - // - // Regular ... - Add( - workingZone.quarter2, - targets // - ); - } - else - { - // - // Weak ... - Add( - workingZone.demandZone.Upper(), - targets // - ); - - // - // Low ... - Add( - workingZone.quarter3, - targets // - ); - - // - // Regular ... - Add( - workingZone.quarter2, - targets // - ); - } - break; - - // - case X121SMC_XWZ_PRIORITY_HIGH: - // - if (isBullish) - { - // - // Weak ... - Add( - workingZone.supplyZone.Lower(), - targets // - ); - - // - // Low ... - Add( - workingZone.quarter1, - targets // - ); - - // - // Regular ... - Add( - workingZone.quarter2, - targets // - ); - - // - // High ... - Add( - workingZone.quarter3, - targets // - ); - } - else - { - // - // Weak ... - Add( - workingZone.demandZone.Upper(), - targets // - ); - - // - // Low ... - Add( - workingZone.quarter3, - targets // - ); - - // - // Regular ... - Add( - workingZone.quarter2, - targets // - ); - - // - // High ... - Add( - workingZone.quarter1, - targets // - ); - } - break; - - // - case X121SMC_XWZ_PRIORITY_STRONG_HIGH: - // - if (isBullish) - { - // - // Weak ... - Add( - workingZone.supplyZone.Lower(), - targets // - ); - - // - // Low ... - Add( - workingZone.quarter1, - targets // - ); - - // - // Regular ... - Add( - workingZone.quarter2, - targets // - ); - - // - // High ... - Add( - workingZone.quarter3, - targets // - ); - - // - // Strong High ... - Add( - workingZone.demandZone.Upper(), - targets // - ); - } - else - { - // - // Weak ... - Add( - workingZone.demandZone.Upper(), - targets // - ); - - // - // Low ... - Add( - workingZone.quarter3, - targets // - ); - - // - // Regular ... - Add( - workingZone.quarter2, - targets // - ); - - // - // High ... - Add( - workingZone.quarter1, - targets // - ); - - // - // Strong High ... - Add( - workingZone.supplyZone.Lower(), - targets // - ); - } - break; - } - } - } - } - - // - // Summarize Results ... - // result = hasPriority && - // hasSignalBox && - // hasRewardAmount; - result = hasSignalBox; - - // - if (result) - { - // - Copy( - sls, - mConditions.sls // - ); - Copy( - targets, - mConditions.targets // - ); - - // - mConditions.sl = sl; - mConditions.pivot = pivot; - mConditions.point = point; - mConditions.reward = reward; - mConditions.setupTime = cTime; - mConditions.dir = signalBoxDir; - mConditions.priority = priority; - mConditions.signalBox = signalBox.ob; - mConditions.provider = signalProvider; - mConditions.amountPercent = amountPercent; - } - - // - // - // - - // - // Cleanup Resources ... - - // - Clean(sls); - Clean(targets); - - // - provider.Clean(); - - // - signalBox.Clean(); - consolidationZBar.Clean(); - - // - return result; - } - - // - // Detect Trigger Conditions ... - bool DetectSignalTrigger( - // - X121SMCStrategyXWZSignalConditions &conditions, - // - X121SMCStrategySignalProviderData &provider, - // - int maxAllowedSetupAge = 60 - // - ) - { - // - bool result = false; - - // - result = - // - provider.IsValid() - // - ; - if (!result) - { - return result; - } - - // - result = conditions.IsSetuped(); - if (!result) - { - return result; - } - - // - datetime setupTime = conditions.setupTime; - ENUM_X_DIRECTION setupDir = conditions.dir; - - // - bool isBullish = IsBullish(setupDir); - bool isBearish = IsBearish(setupDir); - - // - int zIndex = 0; - int cIndex = zIndex + 1; - int pIndex = cIndex + 1; - int ppIndex = pIndex + 1; - - // - int loopback = 10; - - // - double ask = GetAsk(symbol); - double bid = GetBid(symbol); - datetime cTime = TimeCurrent(); - double points = GetPoints(symbol); - - // - // Cycles Conditions ... - result = provider.Prepare( - zIndex, - loopback // - ); - if (!result) - { - return result; - } - - // - double iAtr = provider.decisionXConditions.atrBuffer[1]; - iAtr *= 1.5; - - // - // Check Signal Validation ... - // IMPORTANT: since all Validations done in SetUp Process ... - // here we only Execute Signal ... - - // - result = isBullish || - isBearish; - - // - if (result) - { - // - conditions.triggerTime = cTime; - conditions.type = isBullish - ? X_POSITION_TYPE_LONG - : X_POSITION_TYPE_SHORT; - - // - } - - // - // Cleanup ... - - // - provider.Clean(); - - // - return result; - } - - // - // Detect Guards ... - bool DetectGuards( - // - X121SMCGuard &guards[], - const XPosition &positions[], - // - X121SMCStrategySignalProviderData &provider - // - ) - { - // - bool result = false; - - // - if (!useGuards) - { - return result; - } - - // - Clean(guards); - - // - // Set Provider for Common Guards ... - string signalProvider = ToString(X_121_SMC_PROVIDER_XWZ); - - // - int zIndex = 0; - int cIndex = zIndex + 1; - int pIndex = cIndex + 1; - int ppIndex = pIndex + 1; - - // - XOHCL cBar; - - // - int loopback = 10; - - // - double ask = GetAsk(symbol); - double bid = GetBid(symbol); - datetime cTime = TimeCurrent(); - double points = GetPoints(symbol); - - // - // Cycles Conditions ... - result = provider.IsValid(); - result = - result && - provider.Prepare( - zIndex, - loopback // - ); - if (!result) - { - // - provider.Clean(); - return result; - } - - // - // Select Own Positions ... - int count = ArraySize(positions); - result = IsValidSize(count); - if (!result) - { - return result; - } - - // - XPosition ownPositions[]; - XPosition ownLongPositions[]; - XPosition ownShortPositions[]; - for (int i = 0; i < count; i++) - { - // - XPosition iPosition = positions[i]; - bool isOwn = iPosition - .IsFiltersPassed( - symbol, - signalProvider, - NULL, - X_POSITION_TYPE_ALL, - iPosition.magic // - ); - if (isOwn) - { - // - AddRef( - iPosition, - ownPositions // - ); - - // - bool isLong = IsLong(positions[i].type); - if (isLong) - { - // - AddRef( - iPosition, - ownLongPositions // - ); - } - else - { - // - AddRef( - iPosition, - ownShortPositions // - ); - } - } - } - - // - // Check Extracted Positions ... - - // - count = ArraySize(ownPositions); - - // - int longsCount = ArraySize(ownLongPositions); - bool hasLongs = IsValidSize(longsCount); - - // - int shortsCount = ArraySize(ownShortPositions); - bool hasShorts = IsValidSize(shortsCount); - - // - // Validate Own Positions ... - result = IsValidSize(count); - if (!result) - { - // - Clean(ownPositions); - Clean(ownLongPositions); - Clean(ownShortPositions); - - // - return result; - } - - // - // - // - - // - // Get Global and Common Guards ... - - // - // ENUM_X_121_SMC_GUARD_ACTIONS ignoreGuards[1] = { - // X_121_SMC_GUARD_ACTION_TRAIL_STOP // - // }; - // result = DetectX121SMCGuards( - // signalProvider, - // guards, - // positions, - // provider, - // // - // ignoreGuards - // // - // ); - - // - // - // - - // - // Implement Custom Implemented Guards ... - - // - // Here we Are Sure there is Positions to Guard ... - // based on Current Provider ... - - // - // Selected Consolidation Zones ... - - // - int idx = -1; - bool has = false; - - // - bool hasBullishConsolidationZone = false; - XConsolidationZone bullishConsolidationZone; - has = provider.decisionState.HasBullishConsolidationZones(); - if (has) - { - // - idx = GetYoungest(provider.decisionState.bullishConsolidationZones); - hasBullishConsolidationZone = IsValidIndex(idx); - if (hasBullishConsolidationZone) - { - bullishConsolidationZone = provider.decisionState.bullishConsolidationZones[idx]; - } - } - - // - bool hasBearishConsolidationZone = false; - XConsolidationZone bearishConsolidationZone; - has = provider.decisionState.HasBearishConsolidationZones(); - if (has) - { - // - idx = GetYoungest(provider.decisionState.bearishConsolidationZones); - hasBearishConsolidationZone = IsValidIndex(idx); - if (hasBearishConsolidationZone) - { - bearishConsolidationZone = provider.decisionState.bearishConsolidationZones[idx]; - } - } - - // - XBoxZone bullishBox; - bool hasBullishBox = false; - bool isBullishBoxBreaked = false; - if (!hasBullishBox) - { - // - XCOrderBlock *ob = NULL; - idx = GetYoungest(provider.analyseState.bullishOrderBlocks); - has = IsValidIndex(idx); - if (has) - { - // - ob = provider.analyseState.bullishOrderBlocks[idx]; - - // - hasBullishBox = ToBox( - bullishBox, - ob // - ); - } - - // - if (!hasBullishBox) - { - bullishBox.Clean(); - } - - // - ZeroMemory(ob); - } - - // - XBoxZone bearishBox; - bool hasBearishBox = false; - bool isBearishBoxBreaked = false; - if (!hasBearishBox) - { - // - XCOrderBlock *ob = NULL; - idx = GetYoungest(provider.analyseState.bearishOrderBlocks); - has = IsValidIndex(idx); - if (has) - { - // - ob = provider.analyseState.bearishOrderBlocks[idx]; - - // - hasBearishBox = ToBox( - bearishBox, - ob // - ); - } - - // - if (!hasBearishBox) - { - bearishBox.Clean(); - } - - // - ZeroMemory(ob); - } - - // - // Here We Have all Requirements for Guarding Positions ... - - // - // Available Guards: - // X_121_SMC_GUARD_ACTION_NONE - // X_121_SMC_GUARD_ACTION_CLOSE - // X_121_SMC_GUARD_ACTION_CLOSE_ALL - // X_121_SMC_GUARD_ACTION_CLOSE_LONGS - // X_121_SMC_GUARD_ACTION_CLOSE_SHORTS - // X_121_SMC_GUARD_ACTION_PARTIAL_CLOSE - // X_121_SMC_GUARD_ACTION_TRAIL_STOP - // X_121_SMC_GUARD_ACTION_TRAIL_TARGET - // X_121_SMC_GUARD_ACTION_HEDGE - - // - // X_121_SMC_GUARD_ACTION_CLOSE: - // Close Specified Position on Specified Conditions ... - - // - // X_121_SMC_GUARD_ACTION_CLOSE_ALL: - // Close All Positions on Specified Conditions ... - - // - // X_121_SMC_GUARD_ACTION_CLOSE_LONGS: - // Close All Long Positions on Specified Conditions ... - - // - // X_121_SMC_GUARD_ACTION_CLOSE_SHORTS: - // Close All Short Positions on Specified Conditions ... - - // - // X_121_SMC_GUARD_ACTION_PARTIAL_CLOSE: - // Partial Close Specified Position on Specified Conditions ... - - // - // X_121_SMC_GUARD_ACTION_TRAIL_STOP: - // Trail Stop Specified Position on Specified Conditions ... - bool handleStoptrailingBasedOnBoxes = true; - bool handleStoptrailingBasedOnConsolidationZones = true; - for (int i = 0; i < count; i++) - { - // - XPosition iPosition = ownPositions[i]; - - // - bool isInited = cBar.Init( - iPosition.symbol, - iPosition.period, - cIndex // - ); - - // - isBullishBoxBreaked = - isInited && - hasBullishBox && - cBar.high < bullishBox.lower; - - // - isBearishBoxBreaked = - isInited && - hasBearishBox && - cBar.low > bearishBox.upper; - - // - bool isLong = IsLong(iPosition.type); - bool isInProfit = iPosition.profit > 0; - - // - double sl = iPosition.sl; - double tp = iPosition.tp; - - // - // Trail Stops Using Consolidation Zones ... - - // - bool canTraiLonglUsingCZone = - // - handleStoptrailingBasedOnConsolidationZones && - // - (isLong && - isInProfit && - hasBullishConsolidationZone && - bullishConsolidationZone.lower > iPosition.sl && - bullishConsolidationZone.lower > iPosition.entry) - // - ; - if (canTraiLonglUsingCZone) - { - sl = bullishConsolidationZone.lower; - } - - // - bool canTraiShortlUsingCZone = - // - handleStoptrailingBasedOnConsolidationZones && - // - (!isLong && - isInProfit && - hasBearishConsolidationZone && - bearishConsolidationZone.upper < iPosition.sl && - bearishConsolidationZone.upper < iPosition.entry) - // - ; - if (canTraiShortlUsingCZone) - { - sl = bearishConsolidationZone.upper; - } - - // - bool canTrailUsingCZone = - canTraiLonglUsingCZone || - canTraiShortlUsingCZone; - - // - // Trail Stop Using Boxes ... - - // - bool canTraiLonglUsingBox = - // - handleStoptrailingBasedOnBoxes && - // - (isLong && - isInProfit && - hasBullishBox && - bullishBox.lower > iPosition.sl && - bullishBox.lower > iPosition.entry) - // - ; - if (canTraiLonglUsingBox) - { - sl = bullishBox.lower; - } - - // - bool canTraiShortlUsingBox = - // - handleStoptrailingBasedOnBoxes && - // - (!isLong && - isInProfit && - hasBearishBox && - bearishBox.upper < iPosition.sl && - bearishBox.upper < iPosition.entry) - // - ; - if (canTraiShortlUsingBox) - { - sl = bearishBox.upper; - } - - // - bool canTrailUsingBox = - canTraiLonglUsingBox || - canTraiShortlUsingBox; - - // - bool canTraiLonglUsingBreakedBox = - // - handleStoptrailingBasedOnBoxes && - // - (isLong && - isInProfit && - isBearishBoxBreaked && - bearishBox.upper > iPosition.sl && - bearishBox.upper > iPosition.entry) - // - ; - if (canTraiLonglUsingBreakedBox) - { - sl = bearishBox.upper; - } - - // - bool canTraiShortlUsingBreakedBox = - // - handleStoptrailingBasedOnBoxes && - // - (!isLong && - isInProfit && - isBullishBoxBreaked && - bullishBox.lower < iPosition.sl && - bullishBox.lower < iPosition.entry) - // - ; - if (canTraiShortlUsingBreakedBox) - { - sl = bullishBox.lower; - } - - // - bool canTrailUsingBreakedBox = - canTraiLonglUsingBreakedBox || - canTraiShortlUsingBreakedBox; - - // - // Summarize SL ... - - // - bool isSLPassed = - sl > 0 && - (isLong - ? iPosition.price - sl >= points * 15 - : sl - iPosition.price >= points * 15); - - // - bool canTrail = - isSLPassed && - (canTrailUsingBox || - canTrailUsingCZone || - canTrailUsingBreakedBox); - if (canTrail) - { - // - X121SMCGuard iGuard; - - // - iGuard.time = cTime; - iGuard.symbol = symbol; - iGuard.provider = signalProvider; - iGuard.action = X_121_SMC_GUARD_ACTION_TRAIL_STOP; - - // - iGuard.ticket = iPosition.ticket; - - // - iGuard.sl = sl; - - // - AddGuard( - iGuard, - guards // - ); - } - } - - // - // X_121_SMC_GUARD_ACTION_TRAIL_TARGET: - // Trail Target Specified Position on Specified Conditions ... - - // - // X_121_SMC_GUARD_ACTION_HEDGE: - // Hedge all Positions on Specified Conditions ... - - // - // Cleanup Collections ... - - // - cBar.Clean(); - - // - provider.Clean(); - - // - bullishBox.Clean(); - bearishBox.Clean(); - - // - bullishConsolidationZone.Clean(); - bearishConsolidationZone.Clean(); - - // - count = ArraySize(guards); - result = IsValidSize(count); - - // - return result; - } - - // - // Add Conditions to Conditions Collection ... - int AddConditionsIfNotExists( - int maxAllowed = 10 // - ) - { - // - int result = 0; - - // - bool isSetuped = IsValid(mConditions.setupTime) && - HasDirection(mConditions.dir); - if (!isSetuped) - { - return result; - } - - // - int count = ArraySize(mConditionsCollection); - if (IsValidSize(count)) - { - // - // Copy Original Items ... - X121SMCStrategyXWZSignalConditions tmpItems[]; - Copy( - mConditionsCollection, - tmpItems // - ); - - // - // Prese Item Data ... - bool isBullish = IsBullish(mConditions.dir); - - // - for (int i = 0; i < count; i++) - { - // - X121SMCStrategyXWZSignalConditions iItem = tmpItems[i]; - - // - bool canRemove = mConditions.dir == iItem.dir && - mConditions.pivot == iItem.pivot; - if (canRemove) - { - // - ArrayRemove( - mConditionsCollection, - i, - 1 // - ); - } - } - - // - Clean(tmpItems); - } - - // - AddRef( - mConditions, - mConditionsCollection // - ); - - // - // Remove Olds ... - CleanupArray( - mConditionsCollection, - maxAllowed // - ); - - // - result = ArraySize(mConditionsCollection); - - // - return result; - } - - // - // Draw Functions ... - // - - // - void DrawBar( - XOHCL &bar, - XCPOIDrawer *drawer, - bool forceClean = true // - ) - { - // - if (forceClean) - { - mBarObjects.Clear(); - } - - // - if (drawer == NULL || - !bar.IsValid()) - { - return; - } - - // - bool isBullish = bar.IsBullish(); - - // - int widthBar = 2; - bool fillShadowsBar = true; - ENUM_LINE_STYLE styleBar = STYLE_SOLID; - color clrBar = - isBullish - ? clrAqua - : clrMagenta; - - // - datetime to = bar.NextAt(); - - // - XCOHCLObject *iObj; - bool isCreated = drawer - .CreateBar( - bar, - iObj, - to // - ); - if (isCreated) - { - // - iObj.BarSpes( - widthBar, - clrBar, - styleBar // - ); - - // - iObj.LowShadowFill(fillShadowsBar); - iObj.HighShadowFill(fillShadowsBar); - - // - mBarObjects.Add(iObj); - } - } - - // - protected: - // - - // - private: - // - // Props ... - string symbol; - ENUM_TIMEFRAMES period; - CArrayObj mObjects; - CArrayObj mBarObjects; - CArrayObj mWorkingZoneObjects; - - /** - * Initialize ... - */ - void Init() - { - // - rfRewar = 2; - useGuards = false; - useQuarterTargets = false; - } - - /** - * DeInitialize ... - */ - void DeInit() - { - // - mConditions.Clean(); - workingZone.Clean(); - Clean(mConditionsCollection); - - // - mBarObjects.Clear(); - } - - /** - * Update To Time of Exists Components ... - * - * @param value: updated time ... - */ - void UpdateTo( - datetime value = NULL // - ) - { - // - value = NormalizeTime(value); - - // - workingZone.UpdateTo(value); - } - - // - // Helpers ... - - // - bool CalculateRiskReward( - ENUM_X121SMC_XWZ_PRIORITY priority, - double &reward, - double &amountPercent // - ) - { - // - bool result = false; - - // - reward = 0; - amountPercent = 0; - - // - result = priority != X121SMC_XWZ_PRIORITY_NONE; - if (!result) - { - return result; - } - - // - switch (priority) - { - // - case X121SMC_XWZ_PRIORITY_STRONG_HIGH: - // - reward = 6; - amountPercent = 2; - break; - - // - case X121SMC_XWZ_PRIORITY_HIGH: - // - reward = 4; - amountPercent = 2; - break; - - // - case X121SMC_XWZ_PRIORITY_REGULAR: - // - reward = 3; - amountPercent = 1.5; - break; - - // - case X121SMC_XWZ_PRIORITY_LOW: - // - reward = 2; - amountPercent = 1; - break; - - // - case X121SMC_XWZ_PRIORITY_WEAK: - // - reward = 1; - amountPercent = 0.5; - break; - } - - // - result = - // - reward > 0 && - amountPercent > 0 - // - ; - - // - return result; - } - - // -}; - -// \ No newline at end of file diff --git a/X121SMCEA/Signals/x-121.smc.xwz.signal.lib.mq5 b/X121SMCEA/Signals/x-121.smc.xwz.signal.lib.mq5 deleted file mode 100644 index 8f43bce6..00000000 --- a/X121SMCEA/Signals/x-121.smc.xwz.signal.lib.mq5 +++ /dev/null @@ -1,2784 +0,0 @@ -/////////////////////////////////////////////////////// -// -// SaherElm IT Center MQL5 X121 SMC Signal Class -// ------------------------------------------------- -// Name: XWZ -// Description: provide all Signalling 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 - -// -// Imports ... -// #include "../../Libraries/x-trade.lib" -#include "../Classes/x-121.smc.market.cycle.helper.class.mq5" -#include "../Libraries/x-121.smc.guard.lib.mq5" -#include "../Libraries/x-121.smc.lib.mq5" - -// -// Provided Signals Enumeration ... -enum ENUM_X121SMC_XWZ_PROVIDERS -{ - X121SMC_XWZ_PROVIDER_NONE, - X121SMC_XWZ_PROVIDER_XWPVZ, - X121SMC_XWZ_PROVIDER_XFVGMA, - X121SMC_XWZ_PROVIDER_XBREAKED_BOX, - X121SMC_XWZ_PROVIDER_XREJECTED_BOX, - X121SMC_XWZ_PROVIDER_XACTIVATED_BOX, -}; - -// -// Provided Priority based on Working Zone and -// Quarter Places ... -enum ENUM_X121SMC_XWZ_PRIORITY -{ - X121SMC_XWZ_PRIORITY_NONE, - X121SMC_XWZ_PRIORITY_WEAK, - X121SMC_XWZ_PRIORITY_LOW, - X121SMC_XWZ_PRIORITY_REGULAR, - X121SMC_XWZ_PRIORITY_HIGH, - X121SMC_XWZ_PRIORITY_STRONG_HIGH, -}; - -// -// Definitions ... - -// -// XWZ Working Zone Model ... -struct X121SMCStrategyXWZWorkingZone -{ - // - // Props ... - - // - string symbol; - ENUM_TIMEFRAMES period; - - // - double quarter1; - double quarter2; - double quarter3; - - // - XCSupplyZone *supplyZone; - XCDemandZone *demandZone; - - // - XBoxZone support; - XBoxZone resistance; - ENUM_X_DIRECTION trend; - - // - XSignalBox waitingBoxes[]; - XSignalBox breakedBoxes[]; - XSignalBox unavailableBoxes[]; - - // - CArrayObj mDrawnObjects; - CArrayObj mWorkingZoneObjects; - - // - // Constructor ... - X121SMCStrategyXWZWorkingZone() - { - Clean(); - } - - // - // Properties ... - - /** - * Check Working Zone has Supply Zone as Upper Boundary ... - * - * @return ( bool ) - */ - bool HasSupplyZone() - { - return supplyZone != NULL && - supplyZone.IsValid(); - } - - /** - * Check Working Zone has Demand Zone as Lower Boundary ... - * - * @return ( bool ) - */ - bool HasDemandZone() - { - return demandZone != NULL && - demandZone.IsValid(); - } - - /** - * Check Working Zone has Waiting Boxes or not ... - * - * @return ( bool ) - */ - bool HasWaitingBoxes() - { - return HasChild(waitingBoxes); - } - - /** - * Count Working Zone's Waiting Boxes ... - * - * @return ( int ) - */ - int CountWaitingBoxes() - { - return ArraySize(waitingBoxes); - } - - /** - * Check Working Zone has Breaked Boxes or not ... - * - * @return ( bool ) - */ - bool HasBreakedBoxes() - { - return HasChild(breakedBoxes); - } - - /** - * Count Working Zone's Breaked Boxes ... - * - * @return ( int ) - */ - int CountBreakedBoxes() - { - return ArraySize(breakedBoxes); - } - - /** - * Check Working Zone has Unavailable Boxes or not ... - * - * @return ( bool ) - */ - bool HasUnavailableBoxes() - { - return HasChild(unavailableBoxes); - } - - /** - * Count Working Zone's Unavailable Boxes ... - * - * @return ( int ) - */ - int CountUnavailableBoxes() - { - return ArraySize(unavailableBoxes); - } - - // - // Tools ... - - /** - * Cleanup Model ... - */ - void Clean() - { - // - quarter1 = 0; - quarter2 = 0; - quarter3 = 0; - - // - symbol = NULL; - period = NULL; - - // - Clean(waitingBoxes); - Clean(breakedBoxes); - Clean(unavailableBoxes); - - // - ZeroMemory(supplyZone); - ZeroMemory(demandZone); - - // - mDrawnObjects.Clear(); - mWorkingZoneObjects.Clear(); - } - - /** - * Validate Model ... - * - * @return ( bool ) - */ - bool IsValid() - { - // - bool result = false; - - // - result = - // - quarter1 > 0 && - quarter2 > 0 && - quarter3 > 0 && - HasSupplyZone() && - HasDemandZone() && - quarter1 > quarter2 && - quarter2 > quarter3 - // - ; - - // - return result; - } - - /** - * Checking a Box Exists in Collections or not ... - * - * @param box: XBoxZone instance reference ... - * - * @return ( bool ) - */ - bool IsExists(XSignalBox &box) - { - // - bool result = false; - - // - // Check Validation ... - result = box.IsValid() && - (HasWaitingBoxes() || - HasBreakedBoxes() || - HasUnavailableBoxes()); - if (!result) - { - return result; - } - - // - int idx = -1; - bool has = false; - - // - // Check Index in Waiting Boxes ... - has = HasWaitingBoxes(); - if (has) - { - // - result = FindIndex( - idx, - box, - waitingBoxes // - ); - if (result) - { - return result; - } - } - - // - // Check Index in Breaked Boxes ... - has = HasBreakedBoxes(); - if (has) - { - // - result = FindIndex( - idx, - box, - breakedBoxes // - ); - if (result) - { - return result; - } - } - - // - // Check Index in Unavailable Boxes ... - has = HasUnavailableBoxes(); - if (has) - { - // - result = FindIndex( - idx, - box, - unavailableBoxes // - ); - if (result) - { - return result; - } - } - - // - return result; - } - - /** - * Initialize Working Zone ... - * - * @param _symbol: String ... - * @param _period: ENUM_TIMEFRAMES member ... - * @param barIndex: int ... - * @param provider: X121SMCStrategySignalProviderData instance reference ... - * - * @return ( bool ) - */ - bool Init( - string _symbol, - ENUM_TIMEFRAMES _period, - int barIndex, - X121SMCStrategySignalProviderData &provider // - ) - { - // - bool result = false; - - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - result = - // - IsValid(_symbol) && - IsValid(_period) && - // - provider.IsValid() - // - ; - if (!result) - { - return result; - } - - // - symbol = _symbol; - period = _period; - - // - int idx = -1; - int count = 0; - bool has = false; - - // - XOHCL zBar; - has = zBar.Init( - symbol, - period, - barIndex // - ); - result = has; - if (!result) - { - zBar.Clean(); - return result; - } - double ll5 = zBar.FindLowest(5, MODE_LOW); - double hh5 = zBar.FindHighest(5, MODE_HIGH); - zBar.Clean(); - - // - // Supply Zone ... - has = HasSupplyZone(); - if (!has) - { - // - idx = GetHighest(provider - .consolidationState - .supplyZones // - ); - has = IsValidIndex(idx); - if (has) - { - // - supplyZone = provider - .consolidationState - .supplyZones[idx]; - has = hh5 < supplyZone.Lower(); - if (!has) - { - supplyZone = NULL; - } - } - } - - // - // Demand Zone ... - has = HasDemandZone(); - if (!has) - { - // - idx = GetLowest(provider - .consolidationState - .demandZones // - ); - has = IsValidIndex(idx); - if (has) - { - // - demandZone = provider - .consolidationState - .demandZones[idx]; - has = ll5 > demandZone.Upper(); - if (!has) - { - demandZone = NULL; - } - } - } - - // - if (supplyZone != NULL && - demandZone != NULL && - supplyZone.IsValid() && - demandZone.IsValid()) - { - // - double upper = supplyZone.Lower(); - double lower = demandZone.Upper(); - - // - double delta = ((upper - lower) / 100) * 25; - - // - quarter1 = upper - (1 * delta); - quarter2 = upper - (2 * delta); - quarter3 = upper - (3 * delta); - } - - // - result = IsValid(); - if (!result) - { - Clean(); - } - - // - return result; - } - - /** - * Detect Signal Boxes ... - * - * @param cycle: ENUM_X_CYCLES member ... - * @param provider: X121SMCStrategySignalProviderData instance reference ... - * @param barIndex: int ... - * - * @return ( bool ) - */ - bool DetectWaitingBoxes( - ENUM_X_CYCLES obCycle, - ENUM_X_CYCLES fvgCycle, - X121SMCStrategySignalProviderData &provider, - int barIndex = 0 // - ) - { - // - bool result = false; - - // - int idx = -1; - int count = 0; - bool has = false; - datetime cTime = TimeCurrent(); - - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - // Select OB Cycle ... - XPOIState obState; - XPOIStateEvents obStateEvents; - X121Conditions obXConditions; - XC121SMCCycleHelper *obHelper; - X121SMCCycleConditions obConditions; - result = provider.SelectCycle( - obCycle, - obState, - obStateEvents, - obXConditions, - obHelper, - obConditions // - ); - if (!result) - { - // - obState.Clean(); - ZeroMemory(obHelper); - obConditions.Clean(); - obStateEvents.Clean(); - obXConditions.Clean(); - - // - return result; - } - - // - // Select FVG Cycle ... - XPOIState fvgState; - XPOIStateEvents fvgStateEvents; - X121Conditions fvgXConditions; - XC121SMCCycleHelper *fvgHelper; - X121SMCCycleConditions fvgConditions; - result = provider.SelectCycle( - fvgCycle, - fvgState, - fvgStateEvents, - fvgXConditions, - fvgHelper, - fvgConditions // - ); - if (!result) - { - // - obState.Clean(); - ZeroMemory(obHelper); - obConditions.Clean(); - obStateEvents.Clean(); - obXConditions.Clean(); - - // - fvgState.Clean(); - ZeroMemory(fvgHelper); - fvgConditions.Clean(); - fvgStateEvents.Clean(); - fvgXConditions.Clean(); - - // - return result; - } - - // - // Detect a Sharp Zone Which Contains - // an Order Block and Also an FVG ... - if (obStateEvents.hasNewSharp) - { - // - XBoxZone ob; - XBoxZone fvg; - XBoxZone currSharp; - XBoxZone prevSharp; - XBoxZone sharpConsolidation; - - // - // Retrieve Current Sharp ... - XBoxZone tmpBoxes[]; - Copy( - obState.sharps, - tmpBoxes // - ); - idx = GetYoungest(tmpBoxes); - has = IsValidIndex(idx); - if (has) - { - // - currSharp = tmpBoxes[idx]; - bool isBullish = currSharp.IsBullish(); - - // - ArrayRemove( - tmpBoxes, - idx, - 1 // - ); - - // - while (HasChild(tmpBoxes)) - { - // - idx = GetYoungest(tmpBoxes); - has = IsValidIndex(idx); - - // - if (!has) - { - break; - } - - // - XBoxZone iBox = tmpBoxes[idx]; - ArrayRemove( - tmpBoxes, - idx, - 1 // - ); - - // - if (iBox.dir == currSharp.dir) - { - // - prevSharp = iBox; - iBox.Clean(); - break; - } - - // - iBox.Clean(); - } - - // - Clean(tmpBoxes); - } - Clean(tmpBoxes); - - // - // Preparing Sharp Consolidation Box ... - has = currSharp.IsValid() && - prevSharp.IsValid() && - prevSharp.lower < currSharp.upper; - if (has) - { - // - sharpConsolidation.type = "XSHCNZ"; - sharpConsolidation.dir = currSharp.dir; - sharpConsolidation.symbol = currSharp.symbol; - sharpConsolidation.period = currSharp.period; - - // - sharpConsolidation.from = prevSharp.to; - sharpConsolidation.to = currSharp.from; - - // - int toIDX = GetBarIndex( - currSharp.symbol, - currSharp.period, - sharpConsolidation.to // - ); - int fromIDX = GetBarIndex( - currSharp.symbol, - currSharp.period, - sharpConsolidation.from // - ); - int length = fromIDX - toIDX; - - // - XOHCL toBar; - has = toBar.Init( - sharpConsolidation.symbol, - sharpConsolidation.period, - toIDX // - ); - - // - if (has) - { - // - double upper = toBar.FindHighest( - length, - MODE_HIGH // - ); - - // - double lower = toBar.FindLowest( - length, - MODE_LOW // - ); - - // - sharpConsolidation.upper = upper; - sharpConsolidation.lower = lower; - } - - // - // Detect Order Block / FVG ... - has = sharpConsolidation.IsValid(); - if (has) - { - // - // Check Direction ... - bool isBullish = sharpConsolidation.IsBullish(); - - // - // Find Inside Order Block ... - Clean(tmpBoxes); - if (isBullish) - { - // - ToBox( - obState.bullishOrderBlocks, - tmpBoxes // - ); - } - else - { - // - ToBox( - obState.bearishOrderBlocks, - tmpBoxes // - ); - } - - // - // Select Order Block ... - has = HasChild(tmpBoxes); - if (has) - { - // - while (HasChild(tmpBoxes)) - { - // - idx = GetYoungest(tmpBoxes); - has = IsValidIndex(idx); - if (!has) - { - break; - } - - // - XBoxZone iBox = tmpBoxes[idx]; - ArrayRemove( - tmpBoxes, - idx, - 1 // - ); - - // - // Validate Selected Box ... - bool isDirPassed = iBox.dir == sharpConsolidation.dir; - bool isFromPassed = iBox.from > sharpConsolidation.from; - bool isInsidePassed = IsBoxInside( - iBox, - sharpConsolidation // - ); - bool isValidationPassed = IsBoxValid( - iBox, - barIndex // - ); - - // - has = isDirPassed && - isFromPassed && - isInsidePassed && - isValidationPassed; - if (has) - { - ob = iBox; - } - - // - iBox.Clean(); - - // - if (ob.IsValid()) - { - break; - } - } - } - Clean(tmpBoxes); - - // - // Find Inside FVG ... - has = ob.IsValid(); - if (has) - { - // - Clean(tmpBoxes); - if (isBullish) - { - // - ToBox( - fvgState.bullishFairValueGaps, - tmpBoxes // - ); - } - else - { - // - ToBox( - fvgState.bearishFairValueGaps, - tmpBoxes // - ); - } - - // - // Select FVG ... - has = HasChild(tmpBoxes); - if (has) - { - // - while (HasChild(tmpBoxes)) - { - // - idx = isBullish - ? GetLowest(tmpBoxes) - : GetHighest(tmpBoxes); - has = IsValidIndex(idx); - if (!has) - { - break; - } - - // - XBoxZone iBox = tmpBoxes[idx]; - ArrayRemove( - tmpBoxes, - idx, - 1 // - ); - - // - // Validate Selected Box ... - bool isDirPassed = iBox.dir == ob.dir; - bool isFromPassed = iBox.from > ob.from; - bool isInsidePassed = IsBoxInside( - iBox, - ob // - ); - - // - has = isDirPassed && - isFromPassed && - isInsidePassed; - if (has) - { - fvg = iBox; - } - - // - iBox.Clean(); - - // - if (fvg.IsValid()) - { - break; - } - } - } - Clean(tmpBoxes); - } - } - - // - // Checking Validation of Boxes ... - has = ob.IsValid() && - fvg.IsValid() && - sharpConsolidation.IsValid(); - if (has) - { - // - // Update Time ... - ob.to = cTime; - fvg.to = cTime; - sharpConsolidation.to = cTime; - - // - XSignalBox iSBox; - - // - iSBox.ob = ob; - iSBox.fvg = fvg; - iSBox.sharp = sharpConsolidation; - - // - has = iSBox.IsValid(); - if (has) - { - // - AddRef( - iSBox, - waitingBoxes // - ); - } - - // - iSBox.Clean(); - } - - // - ob.Clean(); - fvg.Clean(); - toBar.Clean(); - currSharp.Clean(); - prevSharp.Clean(); - sharpConsolidation.Clean(); - } - - // - Clean(tmpBoxes); - currSharp.Clean(); - prevSharp.Clean(); - sharpConsolidation.Clean(); - } - - // - // Preparing Waiting Box based on FVG State ... - if (fvgStateEvents.hasNewSharp) - { - // - // Select Newest Sharp Change ... - XBoxZone sharp; - idx = GetYoungest(fvgState.sharps); - has = IsValidIndex(idx); - if (has) - { - // - XOHCL endBar; - XOHCL startBar; - int totalBars = 0; - int orderBlocksIDX[]; - int bullBarsCount = 0; - int bearBarsCount = 0; - int validPercent = 75; - - // - sharp = fvgState.sharps[idx]; - sharp.type = "XSHPOBX"; - bool isSharpBullish = sharp.IsBullish(); - - // - // Validate End Bar ... - if (sharp.IsValid()) - { - // - // Validate End Bar Direction ... - int endBarIDX = GetBarIndex( - sharp.symbol, - sharp.period, - sharp.to // - ); - - // - has = endBar.Init( - sharp.symbol, - sharp.period, - endBarIDX + 1 // - ); - - // - if (has) - { - // - has = sharp.dir == endBar.GetDirection(); - if (!has) - { - sharp.Clean(); - } - } - } - - // - // Validate Start Bar ... - if (sharp.IsValid()) - { - // - // Validate Start Bar Direction ... - int startBarIDX = GetBarIndex( - sharp.symbol, - sharp.period, - sharp.from // - ); - - // - has = startBar.Init( - sharp.symbol, - sharp.period, - startBarIDX + 1 // - ); - - // - if (has) - { - // - has = sharp.dir == Opposit(startBar.GetDirection()); - if (!has) - { - sharp.Clean(); - } - } - } - - // - // Validate OrderBlocks ... - if (sharp.IsValid()) - { - // - int end = endBar.Index(); - int start = startBar.Index(); - for (int i = start; i >= end; i--) - { - // - XOHCL iBar; - has = iBar.Init( - sharp.symbol, - sharp.period, - i // - ); - if (!has) - { - // - iBar.Clean(); - continue; - } - - // - totalBars++; - - // - bool isBullish = iBar.IsBullish(); - if (isBullish) - { - // - bullBarsCount++; - - // - if (!isSharpBullish) - { - // - Add( - i, - orderBlocksIDX // - ); - } - } - else - { - // - bearBarsCount++; - - // - if (isSharpBullish) - { - // - Add( - i, - orderBlocksIDX // - ); - } - } - - // - iBar.Clean(); - } - - // - // Follow Order Blocks ... - has = HasChild(orderBlocksIDX); - if (has) - { - // - int bullBarsPercent = (bullBarsCount * 100) / totalBars; - int bearBarsPercent = (bearBarsCount * 100) / totalBars; - - // - has = isSharpBullish - ? bullBarsPercent >= validPercent - : bearBarsPercent >= validPercent; - if (has) - { - // - // Prepare Waiting Boxes ... - count = ArraySize(orderBlocksIDX); - for (int i = 0; i < count; i++) - { - // - XOHCL iBar; - has = iBar.Init( - sharp.symbol, - sharp.period, - orderBlocksIDX[i] // - ); - if (!has) - { - // - iBar.Clean(); - continue; - } - - // - XBoxZone iOB; - XBoxZone iFVG; - - // - iOB.to = sharp.to; - iOB.type = "XOBX"; - iOB.dir = sharp.dir; - iOB.from = iBar.time; - iOB.lower = iBar.low; - iOB.upper = iBar.high; - iOB.period = iBar.period; - iOB.symbol = iBar.symbol; - - // - // Select FVG ... - has = iOB.IsValid(); - if (has) - { - // - // Select FVG ... - has = HasChild(fvgState.fairValueGaps); - if (has) - { - // - XBoxZone tmpBoxes[]; - if (isSharpBullish) - { - // - ToBox( - fvgState.bullishFairValueGaps, - tmpBoxes // - ); - } - else - { - // - ToBox( - fvgState.bearishFairValueGaps, - tmpBoxes // - ); - } - has = HasChild(tmpBoxes); - if (has) - { - // - while (HasChild(tmpBoxes)) - { - // - idx = GetYoungest(tmpBoxes); - has = IsValidIndex(idx); - if (!has) - { - break; - } - - // - XBoxZone iBox = tmpBoxes[idx]; - ArrayRemove( - tmpBoxes, - idx, - 1 // - ); - - // - // Validate FVG ... - bool isDirPassed = iBox.dir == sharp.dir; - bool isFromPassed = iBox.from >= iOB.from; - bool isPricePassed = IsBoxInsideOr(iBox, iOB); - - // - has = isDirPassed && - isFromPassed && - isPricePassed; - if (has) - { - // - iFVG = iBox; - iBox.Clean(); - break; - } - - // - iBox.Clean(); - } - } - Clean(tmpBoxes); - } - } - - // - has = - sharp.IsValid() && - iOB.IsValid() && - iFVG.IsValid(); - if (has) - { - // - XSignalBox iSBox; - - // - iSBox.ob = iOB; - iSBox.fvg = iFVG; - iSBox.sharp = sharp; - - // - AddRef( - iSBox, - waitingBoxes // - ); - - // - iSBox.Clean(); - } - - // - iOB.Clean(); - iFVG.Clean(); - iBar.Clean(); - } - } - } - else - { - // - // Follow Non Order Block ... - // First Found FVGs ... - XBoxZone iOB; - XBoxZone iFVG; - XBoxZone tmpBoxes[]; - if (isSharpBullish) - { - // - ToBox( - fvgState.bullishFairValueGaps, - tmpBoxes // - ); - } - else - { - // - ToBox( - fvgState.bearishFairValueGaps, - tmpBoxes // - ); - } - has = HasChild(tmpBoxes); - if (has) - { - // - while (HasChild(tmpBoxes)) - { - // - idx = GetYoungest(tmpBoxes); - has = IsValidIndex(idx); - if (!has) - { - break; - } - - // - XBoxZone iBox = tmpBoxes[idx]; - ArrayRemove( - tmpBoxes, - idx, - 1 // - ); - - // - // Validate FVG ... - bool isDirPassed = iBox.dir == sharp.dir; - bool isFromPassed = iBox.from >= sharp.from; - bool isPricePassed = IsBoxInside(iBox, sharp); - - // - has = isDirPassed && - isFromPassed && - isPricePassed; - if (has) - { - // - iFVG = iBox; - - // - // Now we Have to Create an Order Block ... - - // - XOHCL iToBar; - XOHCL iFromBar; - - // - int fromIDX = GetBarIndex( - iBox.symbol, - iBox.period, - iBox.from // - ); - int toIDX = GetBarIndex( - iBox.symbol, - iBox.period, - iBox.to // - ); - has = iToBar.Init( - iBox.symbol, - iBox.period, - toIDX // - ); - has = - has && - iFromBar.Init( - iBox.symbol, - iBox.period, - fromIDX // - ); - if (!has) - { - // - iBox.Clean(); - iToBar.Clean(); - iFromBar.Clean(); - - // - break; - } - - // - iOB.to = iBox.to; - iOB.type = "XOBX"; - iOB.dir = iBox.dir; - iOB.from = iBox.from; - iOB.symbol = iBox.symbol; - iOB.period = iBox.period; - iOB.lower = MathMin(iToBar.low, iFromBar.low); - iOB.upper = MathMax(iToBar.high, iFromBar.high); - - // - iBox.Clean(); - iToBar.Clean(); - iFromBar.Clean(); - break; - } - - // - iBox.Clean(); - } - } - Clean(tmpBoxes); - - // - has = iOB.IsValid() && - iFVG.IsValid() && - sharp.IsValid(); - if (has) - { - // - XSignalBox iSBox; - - // - iSBox.ob = iOB; - iSBox.fvg = iFVG; - iSBox.sharp = sharp; - - // - AddRef( - iSBox, - waitingBoxes // - ); - - // - iSBox.Clean(); - } - - // - iOB.Clean(); - iFVG.Clean(); - } - } - - // - endBar.Clean(); - startBar.Clean(); - Clean(orderBlocksIDX); - } - } - - // - count = CountWaitingBoxes(); - result = IsValidSize(count); - - // - // Cleanup Resources ... - - // - obState.Clean(); - ZeroMemory(obHelper); - obConditions.Clean(); - obStateEvents.Clean(); - obXConditions.Clean(); - - // - fvgState.Clean(); - ZeroMemory(fvgHelper); - fvgConditions.Clean(); - fvgStateEvents.Clean(); - fvgXConditions.Clean(); - - // - return result; - } - - /** - * Validating Waiting Boxes and Detect Breaked Boxes ... - * - * @param barIndex: int ... - * - * @return ( int ) - */ - int ValidateWaitingBoxes( - int barIndex = 0 // - ) - { - // - int result = 0; - - // - bool has = false; - - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - if (barIndex == 0) - { - barIndex = 1; - } - - // - has = HasWaitingBoxes(); - if (!has) - { - return result; - } - - // - int removeIDX[]; - result = CountWaitingBoxes(); - for (int i = 0; i < result; i++) - { - // - XOHCL iBar; - XSignalBox iBox = waitingBoxes[i]; - bool isInite = iBar.Init( - iBox.ob.symbol, - iBox.ob.period, - iBox.ob.from // - ); - - // - has = isInite && - ( - // - IsBoxBreaked( - iBox.ob, - iBar.Index() - 1, - barIndex, - period // - ) - // - ); - if (has) - { - // - Add( - i, - removeIDX // - ); - - // - AddRef( - iBox, - breakedBoxes // - ); - } - - // - // iBox.Clean(); - iBar.Clean(); - } - - // - has = HasChild(removeIDX); - if (has) - { - // - CleanupArray( - removeIDX, - waitingBoxes // - ); - } - Clean(removeIDX); - - // - result = CountWaitingBoxes(); - - // - return result; - } - - /** - * Detect Trend Based On Boxes ... - * - * @param dir: ENUM_X_DIRECTION ember ... - * - * @return ( bool ) - */ - bool DetectTreand( - ENUM_X_CYCLES cycle, - ENUM_X_DIRECTION &dir, - X121SMCStrategySignalProviderData &provider, - int barIndex = 0 // - ) - { - // - bool result = false; - - // - support.Clean(); - resistance.Clean(); - dir = X_DIRECTION_NONE; - trend = X_DIRECTION_NONE; - - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - result = IsValid(cycle); - if (!result) - { - return result; - } - - // - // Select Cycle ... - XPOIState cState; - XPOIStateEvents cStateEvents; - X121Conditions cXConditions; - XC121SMCCycleHelper *cHelper; - X121SMCCycleConditions cConditions; - result = provider.SelectCycle( - cycle, - cState, - cStateEvents, - cXConditions, - cHelper, - cConditions // - ); - if (!result) - { - // - cState.Clean(); - ZeroMemory(cHelper); - cConditions.Clean(); - cStateEvents.Clean(); - cXConditions.Clean(); - - // - return result; - } - - // - // Detect Trend ... - - // - int idx = -1; - bool has = false; - - // - XBoxZone tmp[]; - XBoxZone tmpBoxes[]; - - // - // Select Supports ... - ToBox( - cState.supportZones, - tmp // - ); - Copy( - tmp, - tmpBoxes, - false // - ); - Clean(tmp); - - // - // Select Resistances ... - ToBox( - cState.resistanceZones, - tmp // - ); - Copy( - tmp, - tmpBoxes, - false // - ); - Clean(tmp); - - // - result = HasChild(tmpBoxes); - if (!result) - { - // - Clean(tmpBoxes); - - // - cState.Clean(); - ZeroMemory(cHelper); - cConditions.Clean(); - cStateEvents.Clean(); - cXConditions.Clean(); - - // - return result; - } - - // - // Select Youngest Valid Zone ... - while (HasChild(tmpBoxes) || - !(support.IsValid() && - resistance.IsValid())) - { - // - // Check Yongest Zone ... - idx = GetYoungest(tmpBoxes); - has = IsValidIndex(idx); - if (!has) - { - break; - } - - // - // Remove Extracted Box ... - XBoxZone iBox = tmpBoxes[idx]; - ArrayRemove( - tmpBoxes, - idx, - 1 // - ); - - // - // Check Validation of Box ... - has = IsBoxValid( - iBox, - barIndex, - period // - ); - if (!has) - { - // - iBox.Clean(); - continue; - } - - // - // Assign Support or Resistance ... - bool isBullish = iBox.IsBullish(); - if (isBullish && - !support.IsValid()) - { - support = iBox; - } - else if (!isBullish && - !resistance.IsValid()) - { - resistance = iBox; - } - - // - // Validate Support and Resistance ... - has = - support.IsValid() && - resistance.IsValid(); - if (!has) - { - // - iBox.Clean(); - continue; - } - - // - iBox.Clean(); - } - - // - // Checking Result ... - bool isBullish = - support.from > resistance.from; - bool isBearish = - support.from < resistance.from; - result = isBullish || - isBearish; - if (result) - { - // - dir = - isBullish - ? X_DIRECTION_BULLISH - : X_DIRECTION_BEARISH; - trend = dir; - - // - support.to = TimeCurrent(); - resistance.to = TimeCurrent(); - } - - // - // Cleanup Resources ... - - // - Clean(tmp); - cState.Clean(); - Clean(tmpBoxes); - ZeroMemory(cHelper); - cConditions.Clean(); - cStateEvents.Clean(); - cXConditions.Clean(); - - // - return result; - } - - /** - * Update all Collections Members To Time ... - * - * @param value: datetime, Specified To Time ... - */ - void UpdateTo(datetime value = NULL) - { - // - value = NormalizeTime(value); - - // - int count = 0; - bool has = false; - - // - has = HasSupplyZone(); - if (has) - { - supplyZone.To(value); - } - - // - has = HasDemandZone(); - if (has) - { - demandZone.To(value); - } - - // - has = HasWaitingBoxes(); - if (has) - { - // - count = CountWaitingBoxes(); - for (int i = 0; i < count; i++) - { - waitingBoxes[i].UpdateTo(value); - } - } - - // - } - - /** - * Check Working Zone is Destroyed or not ... - * - * @param barIndex: int, bar index ... - * @param forPeriod: ENUM_TIMEFRAMES member ... - * - * @return ( bool ) - */ - bool IsDestroyed( - int barIndex = 0, - ENUM_TIMEFRAMES forPeriod = NULL // - ) - { - // - bool result = false; - - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - if (!IsValid(forPeriod)) - { - forPeriod = period; - } - - // - result = IsValid(); - if (!result) - { - return result; - } - - // - XOHCL bar; - result = bar.Init( - symbol, - period, - barIndex // - ); - if (!result) - { - // - bar.Clean(); - return result; - } - - // - XOHCL cBar; - result = bar.GetPreviousBar(cBar); - if (!result) - { - // - bar.Clean(); - cBar.Clean(); - - // - return result; - } - - // - bool isSupplyZoneBreaked = - // - bar.low > supplyZone.Upper() && - cBar.low > supplyZone.Upper() - // - ; - - // - bool isDemandZoneBreaked = - // - bar.high < demandZone.Lower() && - cBar.high < demandZone.Lower() - // - ; - - // - bar.Clean(); - cBar.Clean(); - - // - result = isSupplyZoneBreaked || - isDemandZoneBreaked; - - // - return result; - } - - /** - * Detect Signal Box Conditions ... - * - * @param box: XBoxZone instance reference, Signalled Box ... - * @param dir: ENUM_X_DIRECTION member, Specified Signal Direction ... - * @param signalProvider: ENUM_X121SMC_XWZ_PROVIDERS member, Specified Signal Type ... - * @param provider: X121SMCStrategySignalProviderData instance reference ... - * @param barIndex: int ... - * - * @return ( bool ) - */ - bool DetectSignalConditions( - XSignalBox &box, - ENUM_X_DIRECTION &dir, - ENUM_X121SMC_XWZ_PROVIDERS &signalProvider, - X121SMCStrategySignalProviderData &provider, - int barIndex = 0 // - ) - { - // - bool result = false; - - // - // Normalize Bars ... - - // - box.Clean(); - dir = X_DIRECTION_NONE; - signalProvider = X121SMC_XWZ_PROVIDER_NONE; - - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - // TODO: Ignor Working Zone Validation ... - // result = IsValid(); - // if (!result) - // { - // return result; - // } - - // - int idx = -1; - int count = 0; - bool has = false; - - // - int zIDX = barIndex; - int cIDX = zIDX + 1; - int pIDX = cIDX + 1; - - // - bool isBullish = false; - bool isBearish = false; - - // - // Senario 1: - // --------------------------------------------- - // Rejected Box ... - // --------------------------------------------- - bool useSenario1 = false; - bool isSenario1Happend = false; - bool isSenario1Bullish = false; - bool isSenario1Bearish = false; - if (useSenario1) - { - // - isSenario1Happend = false; - - // - isSenario1Bullish = - isSenario1Happend && - IsBullish(dir); - - // - isSenario1Bearish = - isSenario1Happend && - IsBearish(dir); - - // - if (isSenario1Happend) - { - signalProvider = X121SMC_XWZ_PROVIDER_XREJECTED_BOX; - } - } - - // - // Senario 2: - // --------------------------------------------------- - // Activated Box ... - // --------------------------------------------------- - bool useSenario2 = false; - bool isSenario2Happend = false; - bool isSenario2Bullish = false; - bool isSenario2Bearish = false; - if (!isSenario1Happend && - useSenario2) - { - // - isSenario2Happend = false; - - // - isSenario2Bullish = - isSenario2Happend && - IsBullish(dir); - - // - isSenario2Bearish = - isSenario2Happend && - IsBearish(dir); - - // - if (isSenario2Happend) - { - signalProvider = X121SMC_XWZ_PROVIDER_XACTIVATED_BOX; - } - } - - // - // Senario 3: - // --------------------------------------------------- - // Breaked Box ... - // --------------------------------------------------- - bool useSenario3 = false; - bool isSenario3Happend = false; - bool isSenario3Bullish = false; - bool isSenario3Bearish = false; - if (!isSenario1Happend && - !isSenario2Happend && - useSenario3) - { - // - isSenario3Happend = false; - - // - isSenario3Bullish = - isSenario3Happend && - IsBullish(dir); - - // - isSenario3Bearish = - isSenario3Happend && - IsBearish(dir); - - // - if (isSenario3Happend) - { - signalProvider = X121SMC_XWZ_PROVIDER_XACTIVATED_BOX; - } - } - - // - // Senario 4: - // ----------------------------------------------- - // Detect Signal Box Based On FVG Conditions ... - // ----------------------------------------------- - bool useSenario4 = false; - bool isSenario4Happend = false; - bool isSenario4Bullish = false; - bool isSenario4Bearish = false; - if (!isSenario1Happend && - !isSenario2Happend && - !isSenario3Happend && - useSenario4) - { - // - isSenario4Happend = false; - - // - isSenario4Bullish = - isSenario4Happend && - IsBullish(dir); - - // - isSenario4Bearish = - isSenario4Happend && - IsBearish(dir); - - // - if (isSenario4Happend) - { - signalProvider = X121SMC_XWZ_PROVIDER_XFVGMA; - } - } - - // - // Senario 5: - // --------------------------------------------- - // XWPVZ ... - // --------------------------------------------- - bool useSenario5 = true; - bool isSenario5Happend = false; - bool isSenario5Bullish = false; - bool isSenario5Bearish = false; - if (!isSenario1Happend && - !isSenario2Happend && - !isSenario3Happend && - !isSenario4Happend && - useSenario5) - { - // - isSenario5Happend = false; - - // - isSenario5Bullish = - isSenario5Happend && - IsBullish(dir); - - // - isSenario5Bearish = - isSenario5Happend && - IsBearish(dir); - - // - if (isSenario5Happend) - { - signalProvider = X121SMC_XWZ_PROVIDER_XWPVZ; - } - } - - // - // Senario 6: - // --------------------------------------------- - // --------------------------------------------- - bool useSenario6 = false; - bool isSenario6Happend = false; - bool isSenario6Bullish = false; - bool isSenario6Bearish = false; - if (!isSenario1Happend && - !isSenario2Happend && - !isSenario3Happend && - !isSenario4Happend && - !isSenario5Happend && - useSenario6) - { - } - - // - // Summarize All Senario(s) Conditions ... - - // - isBullish = - // - isSenario1Bullish || - isSenario2Bullish || - isSenario3Bullish || - isSenario4Bullish || - isSenario5Bullish || - isSenario6Bullish - // - ; - - // - isBearish = - // - isSenario1Bearish || - isSenario2Bearish || - isSenario3Bearish || - isSenario4Bearish || - isSenario5Bearish || - isSenario6Bearish - // - ; - - // - // Check All Conditions ... - result = - box.IsValid() && - HasDirection(dir) && - (isBullish || - isBearish); - - // - if (!result) - { - box.Clean(); - } - - // - return result; - } - - /** - * Detect a Signal Priority forDynamic Risk Reward ratio ... - * - * @param priority: ENUM_X121SMC_XWZ_PRIORITY member, holds Specified position Priority ... - * @param forDir: ENUM_X_DIRECTION member, Specified Position Direction for Priority ... - * @param barIndex: int ... - * @param forPeriod: ENUM_TIMEFRAMES member ... - * - * @return ( bool ) - */ - bool DetectPriority( - ENUM_X121SMC_XWZ_PRIORITY &priority, - ENUM_X_DIRECTION forDir, - int barIndex = 0, - ENUM_TIMEFRAMES forPeriod = NULL // - ) - { - // - bool result = false; - - // - priority = X121SMC_XWZ_PRIORITY_NONE; - - // - if (barIndex < 0) - { - barIndex = 0; - } - - // - if (!IsValid(forPeriod)) - { - forPeriod = period; - } - - // - result = IsValid() && - HasDirection(forDir); - if (!result) - { - return result; - } - - // - bool isBullish = IsBullish(forDir); - - // - XOHCL bar; - result = bar.Init( - symbol, - forPeriod, - barIndex // - ); - if (!result) - { - // - bar.Clean(); - return result; - } - - // - if (bar.high < supplyZone.Upper() && - bar.low > supplyZone.Lower()) - { - // - priority = - isBullish - ? X121SMC_XWZ_PRIORITY_NONE - : X121SMC_XWZ_PRIORITY_STRONG_HIGH; - } - else if (bar.high < supplyZone.Lower() && - bar.low > quarter1) - { - // - priority = - isBullish - ? X121SMC_XWZ_PRIORITY_WEAK - : X121SMC_XWZ_PRIORITY_HIGH; - } - else if (bar.high < quarter1 && - bar.low > quarter2) - { - // - priority = - isBullish - ? X121SMC_XWZ_PRIORITY_LOW - : X121SMC_XWZ_PRIORITY_REGULAR; - } - else if (bar.high < quarter2 && - bar.low > quarter3) - { - // - priority = - isBullish - ? X121SMC_XWZ_PRIORITY_REGULAR - : X121SMC_XWZ_PRIORITY_LOW; - } - else if (bar.high < quarter3 && - bar.low > demandZone.Upper()) - { - // - priority = - isBullish - ? X121SMC_XWZ_PRIORITY_HIGH - : X121SMC_XWZ_PRIORITY_WEAK; - } - else if (bar.high < demandZone.Upper() && - bar.low > demandZone.Lower()) - { - // - priority = - isBullish - ? X121SMC_XWZ_PRIORITY_STRONG_HIGH - : X121SMC_XWZ_PRIORITY_NONE; - } - - // - result = priority != X121SMC_XWZ_PRIORITY_NONE && - priority != X121SMC_XWZ_PRIORITY_WEAK; - - // - bar.Clean(); - - // - return result; - } - - /** - * Draw Working Zne and all of - * it's Collections and Conditions ... - * - * @param drawSupplyZone: boolean ... - * @param drawDemandZone: boolean ... - * @param drawWaitingBoxes: boolean ... - */ - void Draw( - XCPOIDrawer *drawer, - bool drawSupplyZone = false, - bool drawDemandZone = false, - bool drawWaitingBoxes = false, - bool drawTrend = false // - ) - { - // - if (drawer == NULL) - { - return; - } - - // - int count = 0; - bool has = false; - bool isCreated = false; - - // - ulong chartID = drawer.ChartIdentification(); - int subWindow = drawer.SubWindowIdentification(); - color bullishColor = drawer.BarBullishColor(); - color bearishColor = drawer.BarBearishColor(); - - // - // Supply Zone ... - if (drawSupplyZone) - { - // - has = HasSupplyZone(); - if (has) - { - // - XCSupplyZoneObject *iObj; - isCreated = drawer.CreateSupplyZone( - supplyZone, - iObj // - ); - - // - if (isCreated) - { - mWorkingZoneObjects.Add(iObj); - } - } - } - - // - // Demand Zone ... - if (drawDemandZone) - { - // - has = HasDemandZone(); - if (has) - { - // - XCDemandZoneObject *iObj; - isCreated = drawer.CreateDemandZone( - demandZone, - iObj // - ); - - // - if (isCreated) - { - mWorkingZoneObjects.Add(iObj); - } - } - } - - // - // - // - - // - // Quarters ... - has = IsValid(); - if (has) - { - // - double zoneUpper = supplyZone.Upper(); - double upper = supplyZone.Lower(); - - // - double lower = demandZone.Upper(); - double zoneLower = demandZone.Lower(); - - // - string prefix = "X121WZone_" + symbol + "_" + ToString(period); - - // - // Zone Upper ... - CChartObjectHLine *zoneUpperLine; - zoneUpperLine = new CChartObjectHLine(); - isCreated = zoneUpperLine.Create( - chartID, - prefix + "_ZoneTop", - subWindow, - zoneUpper // - ); - if (isCreated) - { - // - zoneUpperLine.Color(clrRed); - - // - mWorkingZoneObjects.Add(zoneUpperLine); - } - - // - // Zone Lower ... - CChartObjectHLine *zoneLowerLine; - zoneLowerLine = new CChartObjectHLine(); - isCreated = zoneLowerLine.Create( - chartID, - prefix + "_ZoneDown", - subWindow, - zoneLower // - ); - if (isCreated) - { - // - zoneLowerLine.Color(clrRed); - - // - mWorkingZoneObjects.Add(zoneLowerLine); - } - - // - // Upper ... - CChartObjectHLine *upperLine; - upperLine = new CChartObjectHLine(); - isCreated = upperLine.Create( - chartID, - prefix + "_Upper", - subWindow, - upper // - ); - if (isCreated) - { - // - upperLine.Color(clrLime); - - // - mWorkingZoneObjects.Add(upperLine); - } - - // - // Lower ... - CChartObjectHLine *lowerLine; - lowerLine = new CChartObjectHLine(); - isCreated = lowerLine.Create( - chartID, - prefix + "_Lower", - subWindow, - lower // - ); - if (isCreated) - { - // - lowerLine.Color(clrLime); - - // - mWorkingZoneObjects.Add(lowerLine); - } - - // - // Quarters ... - - // - // Quarter 1 ... - CChartObjectHLine *q1Line; - q1Line = new CChartObjectHLine(); - isCreated = q1Line.Create( - chartID, - prefix + "_Q1", - subWindow, - quarter1 // - ); - if (isCreated) - { - // - q1Line.Color(clrYellow); - - // - mWorkingZoneObjects.Add(q1Line); - } - - // - // Quarter 2 ... - CChartObjectHLine *q2Line; - q2Line = new CChartObjectHLine(); - isCreated = q2Line.Create( - chartID, - prefix + "_Q2", - subWindow, - quarter2 // - ); - if (isCreated) - { - // - q2Line.Color(clrYellow); - - // - mWorkingZoneObjects.Add(q2Line); - } - - // - // Quarter 3 ... - CChartObjectHLine *q3Line; - q3Line = new CChartObjectHLine(); - isCreated = q3Line.Create( - chartID, - prefix + "_Q3", - subWindow, - quarter3 // - ); - if (isCreated) - { - // - q3Line.Color(clrYellow); - - // - mWorkingZoneObjects.Add(q3Line); - } - } - - // - // Waiting Zones ... - if (drawWaitingBoxes) - { - // - has = HasWaitingBoxes(); - if (has) - { - // - count = CountWaitingBoxes(); - for (int i = 0; i < count; i++) - { - // - XCBaseObject *objects[]; - has = drawer.DrawSignalBox( - waitingBoxes[i], - objects // - ); - if (has) - { - // - int objectsCount = ArraySize(objects); - for (int i = 0; i < objectsCount; i++) - { - mWorkingZoneObjects.Add(objects[i]); - } - } - Clean(objects); - } - } - } - - // - // Draw Trend if Exists ... - if (drawTrend) - { - // - // Check Trend Exists ... - has = - support.IsValid() && - HasDirection(trend) && - resistance.IsValid(); - if (has) - { - // - // Draw Support ... - XCBoxObject *supportObject; - has = drawer.DrawBox( - support, - supportObject // - ); - if (has) - { - mWorkingZoneObjects.Add(supportObject); - } - - // - // Draw Resistance ... - XCBoxObject *resistanceObject; - has = drawer.DrawBox( - resistance, - resistanceObject // - ); - if (has) - { - mWorkingZoneObjects.Add(resistanceObject); - } - } - } - - // - } - - // -}; - -// -// XWZ Signal Conditions ... -struct X121SMCStrategyXWZSignalConditions -{ - // - // Props ... - - // - string symbol; - ENUM_TIMEFRAMES period; - - // - double sl; - double reward; - double amountPercent; - ENUM_X_DIRECTION dir; - ENUM_X_POSITION_TYPES type; - - // - // Setup Props ... - - // - datetime setupTime; - datetime triggerTime; - - // - double pivot; - double point; - double sls[]; - double targets[]; - - // - XBoxZone signalBox; - - // - ENUM_X121SMC_XWZ_PRIORITY priority; - ENUM_X121SMC_XWZ_PROVIDERS provider; - - // - // Constructor ... - X121SMCStrategyXWZSignalConditions() - { - Clean(); - } - - // - // Tools ... - - /** - * Cleaning Up ... - */ - void Clean() - { - // - sl = 0; - - // - dir = X_DIRECTION_NONE; - type = X_POSITION_TYPE_NONE; - - // - symbol = NULL; - period = NULL; - setupTime = NULL; - triggerTime = NULL; - - // - ExtensionClean(); - - // - ZeroMemory(this); - } - - /** - * Check Condition is Setting Up ... - * - * @param dir: ENUM_X_DIRECTION member, Setting Up Direction ... - * - * @return ( bool ) - */ - bool IsSetuped() - { - // - bool result = false; - - // - result = IsValid(setupTime) && - HasDirection(dir); - if (!result) - { - return result; - } - - // - return result; - } - - /** - * Calculate Setup Age ... - * - * @return ( int ) - */ - int GetSetupAge() - { - // - int result = 0; - - // - if (!IsSetuped()) - { - return result; - } - - // - result = (int)(TimeCurrent() - setupTime) / PeriodSeconds(period); - - // - return result; - } - - /** - * Detect How we Can Trigger Signal ... - * - * @return ( bool ) - */ - bool CanTrigger() - { - // - bool result = false; - - // - result = - // - sl > 0 && - IsValid(symbol) && - IsValid(period) && - IsValid(triggerTime) && - type != X_POSITION_TYPE_ALL && - type != X_POSITION_TYPE_NONE - // - ; - - // - return result; - } - - // - // Extensions ... - - /** - * Clean Additional Properties ... - */ - void ExtensionClean() - { - // - pivot = 0; - point = 0; - - // - reward = 0; - amountPercent = 0; - - // - Clean(sls); - Clean(targets); - signalBox.Clean(); - - // - provider = X121SMC_XWZ_PROVIDER_NONE; - } - - // - // - // - - // - void UpdateTo(datetime value = NULL) - { - // - value = NormalizeTime(value); - - // - int count = 0; - bool has = false; - } - - // -}; - -// -// Extension Functions ... - -// \ No newline at end of file diff --git a/X121SMCEA/Strategy/x-121.smc.strategy.class.mq5 b/X121SMCEA/Strategy/x-121.smc.strategy.class.mq5 deleted file mode 100644 index 7d1ce163..00000000 --- a/X121SMCEA/Strategy/x-121.smc.strategy.class.mq5 +++ /dev/null @@ -1,1497 +0,0 @@ -/////////////////////////////////////////////////////// -// -// SaherElm IT Center MQL5 Class Library -// -------------------------------------- -// Name: XCX121SMCStrategy -// Description: provides all based classes for use ... -// -// -// Maintainer: -// ------------ -// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) -// -////////////////////////////////////////////////////// -// -// Global Properties ... -#property library -#property copyright "Copyright 2023, SaherElm IT Center" -#property link "https://www.saherelm.ir" -#property version "1.00" -#property strict - -// -// Imports ... - -// -#include "../Classes/x-121.smc.base.strategy.class.mq5" -#include "../Classes/x-121.smc.market.cycle.helper.class.mq5" - -// -#include "../Signals/x-121.smc.xind.signal.class.mq5" -#include "../Signals/x-121.smc.xwz.signal.class.mq5" - -// -// Definitions ... - -// -// XStrategy Class Implementation(s) ... -class XCX121SMCStrategy : public XCX121SMCBaseStrategy -{ - // - // Public ... - public: - // - // Props ... - bool useXWZSignal; - bool useXINDSignal; - bool useXWZSignalGuard; - bool useXINDSignalGuard; - XCX121SMCXWZSignalDetector *mXWZSignalDetector; - XCX121SMCXINDSignalDetector *mXINDSignalDetector; - X121SMCStrategySignalProviderData cycleProvider; - - // - // Constructor(s) ... - void XCX121SMCStrategy( - // - // Base ... - string _symbol, // Trading Symbol - ENUM_TIMEFRAMES _period // Trading TimeFrame - ) - : XCX121SMCBaseStrategy(_symbol, _period) - { - // - InitialHelpers(); - - // - mXWZSignalDetector = new XCX121SMCXWZSignalDetector( - _symbol, - _period // - ); - - // - mXINDSignalDetector = new XCX121SMCXINDSignalDetector( - _symbol, - _period // - ); - } - - // - // Deconstructur ... - void ~XCX121SMCStrategy() - { - Destroy(); - } - - // - // Getter(s) / Setter(s) ... - - /** - * Get Max Allowed Required POI(s) to Find ... - * - * @return ( int ) - */ - int MaxAllowedRequiredPOIs() - { - return mMaxAllowedRequiredPOIs; - } - - /** - * Set Max Allowed Required POI(s) to Find ... - * - * @param value: number of Required POIs - */ - void MaxAllowedRequiredPOIs(int value) - { - // - if (value < 0) - { - value = 0; - } - - // - mMaxAllowedRequiredPOIs = value; - } - - // - // Overrides Actions ... - - /** - * Destroy All Class Implementations ... - */ - void Destroy() override - { - // - ZeroMemory(mTriggerCycleHelper); - ZeroMemory(mDecisionCycleHelper); - ZeroMemory(mAnalyseCycleHelper); - ZeroMemory(mVerificationCycleHelper); - ZeroMemory(mConsolidationCycleHelper); - ZeroMemory(mVisionCycleHelper); - - // - ZeroMemory(mXWZSignalDetector); - ZeroMemory(mXINDSignalDetector); - - // - cycleProvider.Destroy(); - } - - /** - * Check Conditions For Signal ... - */ - bool HasSignal( - XSignal &signal, - X121SMCStrategyConditions &conditions // - ) override - { - // - bool result = false; - - // - signal.Clean(); - conditions.Clean(); - - // - int pushers = 0; - - // - double sl = 0; - double tp = 0; - double risk = 0; - double entry = 0; - double reward = 0; - double r2r = R2R(); - string provider = ""; - double volume = Volume(); - ENUM_POSITION_TYPE type = POSITION_TYPE_BUY; - ENUM_X_ORDER_MODES mode = X_ORDER_MODE_MARKET; - - // - bool hasLong = false; - bool hasShort = false; - - // - double selectedSL = 0; - - // - // Start Calculations ... - - // - // Retrieve Common Data ... - string symbol = GetSymbol(); - ENUM_TIMEFRAMES period = GetPeriod(); - - // - datetime cTime = TimeCurrent(); - - // - // Required Value For SL/TP Calculations ... - double points = GetPoints(symbol); - double pip = GetPipPrice(symbol); - double pip2 = 2 * pip; - - // - conditions.time = cTime; - conditions.symbol = symbol; - conditions.period = period; - - // - // Check Spread for Signalling Conditions ... - // TODO: Uncomment this ... - // bool isSpreadPassed = IsSpreadPass(); - // result = isSpreadPassed; - // if (!result) - // { - // // - // conditions.Clean(); - // return result; - // } - - // - // Detect Signal Conditions ... - bool hasSignal = false; - - // - bool hasXWZSignal = false; - bool hasXINDSignal = false; - - // - X121SMCStrategyXWZSignalConditions mXWZConditions; - if (useXWZSignal && !hasSignal) - { - // - hasXWZSignal = DetectXWZSignal( - conditions, - mXWZConditions // - ); - hasSignal = hasXWZSignal; - } - - // - X121SMCStrategyXINDSignalConditions mXICHConditions; - if (useXINDSignal && !hasSignal) - { - // - hasXINDSignal = DetectXINDSignal( - conditions, - mXICHConditions // - ); - hasSignal = hasXINDSignal; - } - - // - result = hasSignal; - if (!result) - { - // - conditions.Clean(); - return result; - } - - // - // Combine all Signals Conditions ... - selectedSL = conditions.sl; - provider = conditions.provider; - - // - hasLong = - // - IsBullish(conditions.signalDir) - // - ; - - // - hasShort = - // - IsBearish(conditions.signalDir) - // - ; - - // - result = hasLong || - hasShort; - - // - // Rmove Signal Condition ... - if (result) - { - // - // TYPE ... - type = - hasLong - ? POSITION_TYPE_BUY - : POSITION_TYPE_SELL; - ENUM_X_POSITION_TYPES xType = - hasLong - ? X_POSITION_TYPE_LONG - : X_POSITION_TYPE_SHORT; - - // - entry = GetEntry( - conditions.symbol, - type // - ); - - // - double spread = GetSpread(conditions.symbol); - - // - double slAddition = 0; - sl = - hasLong - ? selectedSL - slAddition - : selectedSL + slAddition; - - // - // RISK Reward ... - risk = - hasLong - ? entry - sl - : sl - entry; - reward = risk * r2r; - tp = - hasLong - ? entry + reward - : entry - reward; - - // - signal.sl = sl; - signal.tp = tp; - signal.type = type; - signal.mode = mode; - signal.entry = entry; - signal.volume = volume; - signal.symbol = symbol; - signal.period = period; - signal.pushers = pushers; - signal.provider = provider; - signal.time = TimeCurrent(); - - // - Copy( - conditions.targets, - signal.targets // - ); - - // - result = PrepareSignal(signal); - - // - if (result) - { - // - if (useXWZSignal && - hasXWZSignal) - { - // - // Configuring Amount Percent and etc ... - // TODO: Enable if required ... - bool ignoreEAVolume = false && - mXWZConditions.reward > 0 && - mXWZConditions.amountPercent > 0; - if (ignoreEAVolume) - { - // - double cReward = mXWZConditions.reward; - double cAmountPercent = mXWZConditions.amountPercent; - - // - double cRiskReward = risk * cReward; - double cTP = hasLong - ? entry + cRiskReward - : entry - cRiskReward; - - // - double balance = mAccount.GetBalance(); - double cRiskAmount = balance * cAmountPercent / 100; - double cRiskInPoints = risk / points; - double cVolume = mAccount.CalculateVolume( - signal.symbol, - cRiskAmount, - cRiskInPoints // - ); - cVolume = NormalizeVolume(cVolume, signal.symbol); - - // - if (cVolume > 0) - { - // - signal.ignoreEAVolume = ignoreEAVolume; - signal.volume = cVolume; - } - } - } - - // - // Draw Signal Oject ... - XCSignalObject *iSignalObj; - bool isCreated = mVisionCycleHelper - .mPOIDrawer - .DrawSignal(signal, iSignalObj); - if (isCreated) - { - // - mSignalDrawnObjects.Add(iSignalObj); - - // - int maxAllowedDrawnSignals = 15; - int count = mSignalDrawnObjects.Total(); - if (count > maxAllowedDrawnSignals) - { - // - int to = count - maxAllowedDrawnSignals; - mSignalDrawnObjects.DeleteRange( - 0, - to // - ); - } - } - } - - // - // Apply Spread on Signal's TP ... - signal.tp = - hasLong - ? signal.tp + spread - : signal.tp - spread; - - // - hasLong = false; - hasShort = false; - } - - // - mXWZConditions.Clean(); - mXICHConditions.Clean(); - - // - return result; - } - - /** - * Check for any Guard Actions ... - */ - bool CheckGuard( - X121SMCGuard &guards[], - const XPosition &positions[] // - ) override - { - // - bool result = false; - - // - Clean(guards); - - // - int count = ArraySize(positions); - result = IsValidSize(count); - if (!result) - { - return result; - } - - // - // XWZ Guard Detection ... - if (useXWZSignal && - useXWZSignalGuard) - { - // - X121SMCGuard xwzGuards[]; - bool hasGuard = mXWZSignalDetector.DetectGuards( - xwzGuards, - positions, - cycleProvider // - ); - - // - if (hasGuard) - { - // - Copy( - xwzGuards, - guards, - false // - ); - } - - // - Clean(xwzGuards); - } - - // - // XICH Guard Detection ... - if (useXINDSignal && - useXINDSignalGuard) - { - // - X121SMCGuard xichGuards[]; - bool hasGuard = mXINDSignalDetector.DetectGuards( - xichGuards, - positions, - cycleProvider // - ); - - // - if (hasGuard) - { - // - Copy( - xichGuards, - guards, - false // - ); - } - - // - Clean(xichGuards); - } - - // - count = ArraySize(guards); - result = IsValidSize(count); - - // - return result; - } - - /** - * Update all Requirements without waiting ... - */ - void DoUnwaitedTicksWork() override - { - } - - /** - * Customize Strategy Identifier ... - */ - string GetTag() override - { - return X121SMCStrategyToken; - } - - // - // Protected ... - protected: - // - - // - // Props ... - CArrayObj mSignalDrawnObjects; - - // - // XC121SMCCycleHelper *mTriggerCycleHelper; - XC121SMCCycleHelper *mTriggerCycleHelper; - XC121SMCCycleHelper *mDecisionCycleHelper; - XC121SMCCycleHelper *mAnalyseCycleHelper; - XC121SMCCycleHelper *mVerificationCycleHelper; - XC121SMCCycleHelper *mConsolidationCycleHelper; - XC121SMCCycleHelper *mVisionCycleHelper; - - // - // Actions ... - - // - // Signalling Functions ... - - // - // XWZ Signal ... - bool DetectXWZSignal( - X121SMCStrategyConditions &conditions, - X121SMCStrategyXWZSignalConditions &xWZConditions // - ) - { - // - bool result = false; - - // - bool isBullish = false; - bool isBearish = false; - - // - int zIndex = 0; - int cIndex = zIndex + 1; - int pIndex = cIndex + 1; - int ppIndex = pIndex + 1; - - // - string symbol = GetSymbol(); - ENUM_TIMEFRAMES period = GetPeriod(); - - // - datetime cTime = TimeCurrent(); - - // - ENUM_X_121_SMC_PROVIDERS provider = X_121_SMC_PROVIDER_XWZ; - string providerStr = ToString(provider); - - // - // Detect Setup Conditions ... - datetime setupTime = mXWZSignalDetector.mConditions.setupTime; - bool isSetuped = mXWZSignalDetector.mConditions.IsSetuped(); - ENUM_X_DIRECTION setupDir = mXWZSignalDetector.mConditions.dir; - if (!isSetuped) - { - // - // Detect Signal Setup ... - isSetuped = mXWZSignalDetector.DetectSignalSetup( - cycleProvider // - ); - - // - setupDir = mXWZSignalDetector.mConditions.dir; - setupTime = mXWZSignalDetector.mConditions.setupTime; - - // - if (isSetuped) - { - // - int items = mXWZSignalDetector - .AddConditionsIfNotExists(); - - // - mXWZSignalDetector.mConditions.Clean(); - } - } - - // - int conditionsCount = ArraySize(mXWZSignalDetector.mConditionsCollection); - result = IsValidSize(conditionsCount); - if (!result) - { - return result; - } - - // - // Looking For Conditions ... - int selectedIndex = 0; - X121SMCStrategyXWZSignalConditions mTmpConditions[]; - Copy( - mXWZSignalDetector.mConditionsCollection, - mTmpConditions // - ); - X121SMCStrategyXWZSignalConditions mConditions; - for (int i = 0; i < conditionsCount; i++) - { - // - // Check Triggers ... - bool canTrigger = mTmpConditions[i].CanTrigger(); - datetime triggerTime = mTmpConditions[i].triggerTime; - if (!canTrigger) - { - // - // Detect Signal Trigger ... - canTrigger = mXWZSignalDetector - .DetectSignalTrigger( - mTmpConditions[i], - cycleProvider // - ); - - // - result = canTrigger; - if (!result) - { - // - bool isISetuped = mTmpConditions[i].IsSetuped(); - if (!isISetuped) - { - // - ArrayRemove( - mXWZSignalDetector.mConditionsCollection, - i, - 1 // - ); - } - continue; - } - - // - triggerTime = mTmpConditions[i].triggerTime; - } - - // - if (canTrigger) - { - // - selectedIndex = i; - mConditions = mTmpConditions[i]; - break; - } - } - - // - result = IsValid(mConditions.setupTime) && - HasDirection(mConditions.dir); - if (!result) - { - return result; - } - - // - // Remove Selected Index from Main Collection ... - ArrayRemove( - mXWZSignalDetector.mConditionsCollection, - selectedIndex, - 1 // - ); - - // - // Check Signal Direction ... - isBullish = IsBullish(mConditions.dir); - isBearish = IsBearish(mConditions.dir); - result = isBullish || - isBearish; - if (!result) - { - return result; - } - - // - // Issues Signal on Conditions ... - conditions.sl = mConditions.sl; - conditions.provider = providerStr; - conditions.signalDir = mConditions.dir; - - // - Copy( - mConditions.targets, - conditions.targets // - ); - - // - xWZConditions = mConditions; - - // - mConditions.Clean(); - - // - return result; - } - - // - // XICH Signal ... - bool DetectXINDSignal( - X121SMCStrategyConditions &conditions, - X121SMCStrategyXINDSignalConditions &xINDConditions // - ) - { - // - bool result = false; - - // - bool isBullish = false; - bool isBearish = false; - - // - int zIndex = 0; - int cIndex = zIndex + 1; - int pIndex = cIndex + 1; - int ppIndex = pIndex + 1; - - // - string symbol = GetSymbol(); - ENUM_TIMEFRAMES period = GetPeriod(); - - // - datetime cTime = TimeCurrent(); - - // - ENUM_X_121_SMC_PROVIDERS provider = X_121_SMC_PROVIDER_XICH; - string providerStr = ToString(provider); - - // - // Detect Setup Conditions ... - datetime setupTime = mXINDSignalDetector.mConditions.setupTime; - bool isSetuped = mXINDSignalDetector.mConditions.IsSetuped(); - ENUM_X_DIRECTION setupDir = mXINDSignalDetector.mConditions.dir; - if (!isSetuped) - { - // - // Detect Signal Setup ... - isSetuped = mXINDSignalDetector.DetectSignalSetup( - cycleProvider, - R2R() // - ); - - // - setupDir = mXINDSignalDetector.mConditions.dir; - setupTime = mXINDSignalDetector.mConditions.setupTime; - - // - if (isSetuped) - { - // - int items = mXINDSignalDetector - .AddConditionsIfNotExists(); - - // - mXINDSignalDetector.mConditions.Clean(); - } - } - - // - int conditionsCount = ArraySize(mXINDSignalDetector.mConditionsCollection); - result = IsValidSize(conditionsCount); - if (!result) - { - return result; - } - - // - // Looking For Conditions ... - int selectedIndex = 0; - X121SMCStrategyXINDSignalConditions mTmpConditions[]; - Copy( - mXINDSignalDetector.mConditionsCollection, - mTmpConditions // - ); - X121SMCStrategyXINDSignalConditions mConditions; - for (int i = 0; i < conditionsCount; i++) - { - // - // Check Triggers ... - bool canTrigger = mTmpConditions[i].CanTrigger(); - datetime triggerTime = mTmpConditions[i].triggerTime; - if (!canTrigger) - { - // - // Detect Signal Trigger ... - canTrigger = mXINDSignalDetector - .DetectSignalTrigger( - mTmpConditions[i], - cycleProvider // - ); - - // - result = canTrigger; - if (!result) - { - // - bool isISetuped = mTmpConditions[i].IsSetuped(); - if (!isISetuped) - { - // - ArrayRemove( - mXINDSignalDetector.mConditionsCollection, - i, - 1 // - ); - } - continue; - } - - // - triggerTime = mTmpConditions[i].triggerTime; - } - - // - if (canTrigger) - { - // - selectedIndex = i; - mConditions = mTmpConditions[i]; - break; - } - } - - // - result = IsValid(mConditions.setupTime) && - HasDirection(mConditions.dir); - if (!result) - { - return result; - } - - // - // Remove Selected Index from Main Collection ... - ArrayRemove( - mXINDSignalDetector.mConditionsCollection, - selectedIndex, - 1 // - ); - - // - // Check Signal Direction ... - isBullish = IsBullish(mConditions.dir); - isBearish = IsBearish(mConditions.dir); - result = isBullish || - isBearish; - if (!result) - { - return result; - } - - // - // Issues Signal on Conditions ... - conditions.sl = mConditions.sl; - conditions.provider = providerStr; - conditions.signalDir = mConditions.dir; - - // - Copy( - mConditions.targets, - conditions.targets // - ); - - // - xINDConditions = mConditions; - - // - mConditions.Clean(); - - // - return result; - } - - // - // Private ... - private: - // - // Props ... - - // - int mMaxAllowedRequiredPOIs; // Max Allowed Required POI(s) to Find ... - - /** - * Initial Required Indicators Helper ... - */ - void InitialHelpers() - { - // - useXWZSignal = false; - useXWZSignalGuard = false; - - // - useXINDSignal = true; - useXINDSignalGuard = false; - - // - string symbol = GetSymbol(); - ENUM_TIMEFRAMES period = GetPeriod(); - - // - if (mMaxAllowedRequiredPOIs <= 0) - { - mMaxAllowedRequiredPOIs = 0; - } - - // - X121Inputs x121Inputs; - x121Inputs.Default(); - - // - // Short ... - ENUM_X_PERIOD_METHOD scMethod = X_PERIOD_AUTO; // How to Find Period - ENUM_TIMEFRAMES scPeriod = NULL; // Time Period - - // - // Medium ... - ENUM_X_PERIOD_METHOD mcMethod = X_PERIOD_AUTO; // How to Find Period - ENUM_TIMEFRAMES mcPeriod = NULL; // Time Period - - // - // Long ... - ENUM_X_PERIOD_METHOD lcMethod = X_PERIOD_AUTO; // How to Find Period - ENUM_TIMEFRAMES lcPeriod = NULL; // Time Period - - // - // Hind ... - ENUM_X_PERIOD_METHOD hcMethod = X_PERIOD_AUTO; // How to Find Period - ENUM_TIMEFRAMES hcPeriod = NULL; // Time Period - - // - bool showAll = false; - int swingLength = 14; - - // - x121Inputs.showRSI = showAll || false; - - // - // - // - - // - // XCC ... - - // - // Configurations ... - - // - // Presentations ... - x121Inputs.xccInputs.showCandles = showAll || true; - - // - // XPV ... - - // - // Configurations ... - x121Inputs.xpvInputs.scMethod = scMethod; - x121Inputs.xpvInputs.scPeriod = scPeriod; - x121Inputs.xpvInputs.mcMethod = mcMethod; - x121Inputs.xpvInputs.mcPeriod = mcPeriod; - x121Inputs.xpvInputs.lcMethod = lcMethod; - x121Inputs.xpvInputs.lcPeriod = lcPeriod; - x121Inputs.xpvInputs.hcMethod = hcMethod; - x121Inputs.xpvInputs.hcPeriod = hcPeriod; - x121Inputs.xpvInputs.goldenZoneLevel = X_FIBO_LEVEL_236; - - // - // Presentations ... - x121Inputs.xpvInputs.showSar = showAll || true; - x121Inputs.xpvInputs.showPeaks = showAll || true; - x121Inputs.xpvInputs.showVales = showAll || true; - x121Inputs.xpvInputs.showTrend = showAll || false; - x121Inputs.xpvInputs.showSupports = showAll || false; - x121Inputs.xpvInputs.showSwingLows = showAll || false; - x121Inputs.xpvInputs.showSwingHighs = showAll || false; - x121Inputs.xpvInputs.showGoldenZones = showAll || true; - x121Inputs.xpvInputs.showResistances = showAll || false; - - // - // XHK ... - - // - // Configurations ... - x121Inputs.xhkInputs.xhkIgnoreSmoothingShadows = true; - x121Inputs.xhkInputs.xhkSmoothingLength = swingLength; - x121Inputs.xhkInputs.xhkSmoothingMode = X_MA_MODE_SMA; - - // - // Presentations ... - x121Inputs.xhkInputs.drawRawXHKCandles = showAll || false; - x121Inputs.xhkInputs.drawSmoothedXHKCandles = showAll || false; - - // - // XMAS ... - - // - // Configurations ... - x121Inputs.xmasInputs.method = MODE_SMA; - x121Inputs.xmasInputs.length = swingLength; - - // - // Presentations ... - x121Inputs.xmasInputs.showMid = showAll || false; - x121Inputs.xmasInputs.showUpper = showAll || false; - x121Inputs.xmasInputs.showLower = showAll || false; - - // - // XATR ... - - // - // Configurations ... - x121Inputs.xatrInputs.atrMultiplier = 2; - x121Inputs.xatrInputs.rsiLength = swingLength; - x121Inputs.xatrInputs.atrLength = swingLength; - x121Inputs.xatrInputs.priceChangeSmoothingLength = swingLength; - x121Inputs.xatrInputs.rsiSmoothingMethod = X_MA_MODE_SMA; - x121Inputs.xatrInputs.atrSmoothingMethod = X_MA_MODE_SMA; - x121Inputs.xatrInputs.priceChangeSmoothingMethod = X_MA_MODE_SMA; - - // - // Presentations ... - x121Inputs.xatrInputs.showAtrUpper = showAll || false; - x121Inputs.xatrInputs.showAtrLower = showAll || false; - x121Inputs.xatrInputs.showRSIChange = showAll || true; - x121Inputs.xatrInputs.showPriceChange = showAll || true; - x121Inputs.xatrInputs.showSmoothedAtrUpper = showAll || false; - x121Inputs.xatrInputs.showSmoothedAtrLower = showAll || false; - x121Inputs.xatrInputs.showSmoothedRSIChange = showAll || false; - x121Inputs.xatrInputs.showSmoothedPriceChange = showAll || false; - - // - // XSTR ... - - // - // Configurations ... - x121Inputs.xstrInputs.strMultiplier = 5; - x121Inputs.xstrInputs.strLength = swingLength; - x121Inputs.xstrInputs.strBoundaryMode = MODE_SMA; - x121Inputs.xstrInputs.strAppliedTo = PRICE_TYPICAL; - - // - // Presentations ... - x121Inputs.xstrInputs.showStr = showAll || true; - x121Inputs.xstrInputs.showStrMid = showAll || false; - x121Inputs.xstrInputs.showStrUpper = showAll || false; - x121Inputs.xstrInputs.showStrLower = showAll || false; - x121Inputs.xstrInputs.showStrSMLow = showAll || false; - x121Inputs.xstrInputs.showStrSMHigh = showAll || false; - - // - // XCHE ... - - // - // Configurations ... - - // - // Presentations ... - x121Inputs.xcheInputs.showLE1 = showAll || false; - x121Inputs.xcheInputs.showSE1 = showAll || false; - x121Inputs.xcheInputs.showLE2 = showAll || false; - x121Inputs.xcheInputs.showSE2 = showAll || false; - - // - // X3MA ... - - // - // Configurations ... - x121Inputs.x3maInputs.x3maMaMethod = MODE_SMA; - x121Inputs.x3maInputs.x3maFastMALength = swingLength; - x121Inputs.x3maInputs.x3maMidMALength = (swingLength * 2); - x121Inputs.x3maInputs.x3maSlowMALength = 50; - x121Inputs.x3maInputs.x3maMaAppliedTo = PRICE_TYPICAL; - - // - // Presentations ... - x121Inputs.x3maInputs.showX3MaMid = showAll || false; - x121Inputs.x3maInputs.showX3MaFast = showAll || false; - x121Inputs.x3maInputs.showX3MaSlow = showAll || false; - - // - // XVWAP ... - - // - // Configurations ... - x121Inputs.xvwapInputs.vwapFastLength = swingLength; - x121Inputs.xvwapInputs.vwapMidLength = (swingLength * 2); - x121Inputs.xvwapInputs.vwapSlowLength = 50; - x121Inputs.xvwapInputs.vwapAppliedTo = PRICE_TYPICAL; - - // - // Presentations ... - x121Inputs.xvwapInputs.showVWapFast = showAll || false; - x121Inputs.xvwapInputs.showVWapSlow = showAll || false; - x121Inputs.xvwapInputs.showVWapMedium = showAll || false; - - // - // - // - - // - // Initialize Cycle Helpers ... - - // - bool isInited = false; - - // - int requiredPOIS = MaxAllowedRequiredPOIs(); - - // - // Trigger Cycle ... - mTriggerCycleHelper = new XC121SMCCycleHelper(); - isInited = mTriggerCycleHelper.Init( - symbol, - PERIOD_M1, - x121Inputs, - requiredPOIS // - ); - if (isInited) - { - // - // Configure POI Drawer ... - color bullishColor = clrDodgerBlue; - color bearishColor = clrSienna; - - // - // Bars ... - mTriggerCycleHelper.mPOIDrawer.BarBullishColor(bullishColor); - mTriggerCycleHelper.mPOIDrawer.BarBearishColor(bearishColor); - - // - // Swings ... - mTriggerCycleHelper.mPOIDrawer.SwingLowColor(bullishColor); - mTriggerCycleHelper.mPOIDrawer.SwingHighColor(bearishColor); - - // - // Momentum ... - mTriggerCycleHelper.mPOIDrawer.BullishMomentumBarColor(bullishColor); - mTriggerCycleHelper.mPOIDrawer.BearishMomentumBarColor(bearishColor); - - // - // Rejection ... - mTriggerCycleHelper.mPOIDrawer.BullishRejectionBarColor(bullishColor); - mTriggerCycleHelper.mPOIDrawer.BearishRejectionBarColor(bearishColor); - - // - // Support and Resistance ... - mTriggerCycleHelper.mPOIDrawer.SupportZoneColor(bullishColor); - mTriggerCycleHelper.mPOIDrawer.ResistanceZoneColor(bearishColor); - - // - // Demand and Supply ... - mTriggerCycleHelper.mPOIDrawer.DemandZoneColor(bullishColor); - mTriggerCycleHelper.mPOIDrawer.SupplyZoneColor(bearishColor); - - // - // Order Blocks ... - mTriggerCycleHelper.mPOIDrawer.BullishOrderBlockColor(bullishColor); - mTriggerCycleHelper.mPOIDrawer.BearishOrderBlockColor(bearishColor); - - // - // Fair Value Gaps ... - mTriggerCycleHelper.mPOIDrawer.BullishFVGColor(bullishColor); - mTriggerCycleHelper.mPOIDrawer.BearishFVGColor(bearishColor); - } - - // - // Decision Cycle ... - mDecisionCycleHelper = new XC121SMCCycleHelper(); - isInited = mDecisionCycleHelper.Init( - symbol, - PERIOD_M5, - x121Inputs, - requiredPOIS // - ); - if (isInited) - { - // - // Configure POI Drawer ... - color bullishColor = clrDodgerBlue; - color bearishColor = clrSienna; - - // - // Bars ... - mDecisionCycleHelper.mPOIDrawer.BarBullishColor(bullishColor); - mDecisionCycleHelper.mPOIDrawer.BarBearishColor(bearishColor); - - // - // Swings ... - mDecisionCycleHelper.mPOIDrawer.SwingLowColor(bullishColor); - mDecisionCycleHelper.mPOIDrawer.SwingHighColor(bearishColor); - - // - // Momentum ... - mDecisionCycleHelper.mPOIDrawer.BullishMomentumBarColor(bullishColor); - mDecisionCycleHelper.mPOIDrawer.BearishMomentumBarColor(bearishColor); - - // - // Rejection ... - mDecisionCycleHelper.mPOIDrawer.BullishRejectionBarColor(bullishColor); - mDecisionCycleHelper.mPOIDrawer.BearishRejectionBarColor(bearishColor); - - // - // Support and Resistance ... - mDecisionCycleHelper.mPOIDrawer.SupportZoneColor(bullishColor); - mDecisionCycleHelper.mPOIDrawer.ResistanceZoneColor(bearishColor); - - // - // Demand and Supply ... - mDecisionCycleHelper.mPOIDrawer.DemandZoneColor(bullishColor); - mDecisionCycleHelper.mPOIDrawer.SupplyZoneColor(bearishColor); - - // - // Order Blocks ... - mDecisionCycleHelper.mPOIDrawer.BullishOrderBlockColor(bullishColor); - mDecisionCycleHelper.mPOIDrawer.BearishOrderBlockColor(bearishColor); - - // - // Fair Value Gaps ... - mDecisionCycleHelper.mPOIDrawer.BullishFVGColor(bullishColor); - mDecisionCycleHelper.mPOIDrawer.BearishFVGColor(bearishColor); - } - - // - // Analyse Cycle ... - mAnalyseCycleHelper = new XC121SMCCycleHelper(); - isInited = mAnalyseCycleHelper.Init( - symbol, - PERIOD_M15, - x121Inputs, - requiredPOIS // - ); - if (isInited) - { - // - // Configure POI Drawer ... - color bullishColor = clrMediumSeaGreen; - color bearishColor = clrBlueViolet; - - // - // Bars ... - mAnalyseCycleHelper.mPOIDrawer.BarBullishColor(bullishColor); - mAnalyseCycleHelper.mPOIDrawer.BarBearishColor(bearishColor); - - // - // Swings ... - mAnalyseCycleHelper.mPOIDrawer.SwingLowColor(bullishColor); - mAnalyseCycleHelper.mPOIDrawer.SwingHighColor(bearishColor); - - // - // Momentum ... - mAnalyseCycleHelper.mPOIDrawer.BullishMomentumBarColor(bullishColor); - mAnalyseCycleHelper.mPOIDrawer.BearishMomentumBarColor(bearishColor); - - // - // Rejection ... - mAnalyseCycleHelper.mPOIDrawer.BullishRejectionBarColor(bullishColor); - mAnalyseCycleHelper.mPOIDrawer.BearishRejectionBarColor(bearishColor); - - // - // Support and Resistance ... - mAnalyseCycleHelper.mPOIDrawer.SupportZoneColor(bullishColor); - mAnalyseCycleHelper.mPOIDrawer.ResistanceZoneColor(bearishColor); - - // - // Demand and Supply ... - mAnalyseCycleHelper.mPOIDrawer.DemandZoneColor(bullishColor); - mAnalyseCycleHelper.mPOIDrawer.SupplyZoneColor(bearishColor); - - // - // Order Blocks ... - mAnalyseCycleHelper.mPOIDrawer.BullishOrderBlockColor(bullishColor); - mAnalyseCycleHelper.mPOIDrawer.BearishOrderBlockColor(bearishColor); - - // - // Fair Value Gaps ... - mAnalyseCycleHelper.mPOIDrawer.BullishFVGColor(bullishColor); - mAnalyseCycleHelper.mPOIDrawer.BearishFVGColor(bearishColor); - } - - // - // Verification Cycle ... - mVerificationCycleHelper = new XC121SMCCycleHelper(); - isInited = mVerificationCycleHelper.Init( - symbol, - PERIOD_M30, - x121Inputs, - requiredPOIS // - ); - if (isInited) - { - // - // Configure POI Drawer ... - color bullishColor = clrDodgerBlue; - color bearishColor = clrSienna; - - // - // Bars ... - mVerificationCycleHelper.mPOIDrawer.BarBullishColor(bullishColor); - mVerificationCycleHelper.mPOIDrawer.BarBearishColor(bearishColor); - - // - // Swings ... - mVerificationCycleHelper.mPOIDrawer.SwingLowColor(bullishColor); - mVerificationCycleHelper.mPOIDrawer.SwingHighColor(bearishColor); - - // - // Momentum ... - mVerificationCycleHelper.mPOIDrawer.BullishMomentumBarColor(bullishColor); - mVerificationCycleHelper.mPOIDrawer.BearishMomentumBarColor(bearishColor); - - // - // Rejection ... - mVerificationCycleHelper.mPOIDrawer.BullishRejectionBarColor(bullishColor); - mVerificationCycleHelper.mPOIDrawer.BearishRejectionBarColor(bearishColor); - - // - // Support and Resistance ... - mVerificationCycleHelper.mPOIDrawer.SupportZoneColor(bullishColor); - mVerificationCycleHelper.mPOIDrawer.ResistanceZoneColor(bearishColor); - - // - // Demand and Supply ... - mVerificationCycleHelper.mPOIDrawer.DemandZoneColor(bullishColor); - mVerificationCycleHelper.mPOIDrawer.SupplyZoneColor(bearishColor); - - // - // Order Blocks ... - mVerificationCycleHelper.mPOIDrawer.BullishOrderBlockColor(bullishColor); - mVerificationCycleHelper.mPOIDrawer.BearishOrderBlockColor(bearishColor); - - // - // Fair Value Gaps ... - mVerificationCycleHelper.mPOIDrawer.BullishFVGColor(bullishColor); - mVerificationCycleHelper.mPOIDrawer.BearishFVGColor(bearishColor); - } - - // - // Consolidation Cycle ... - mConsolidationCycleHelper = new XC121SMCCycleHelper(); - isInited = mConsolidationCycleHelper.Init( - symbol, - PERIOD_H1, - x121Inputs, - requiredPOIS // - ); - if (isInited) - { - // - // Configure POI Drawer ... - color bullishColor = clrLime; - color bearishColor = clrRed; - - // - // Bars ... - mConsolidationCycleHelper.mPOIDrawer.BarBullishColor(bullishColor); - mConsolidationCycleHelper.mPOIDrawer.BarBearishColor(bearishColor); - - // - // Swings ... - mConsolidationCycleHelper.mPOIDrawer.SwingLowColor(bullishColor); - mConsolidationCycleHelper.mPOIDrawer.SwingHighColor(bearishColor); - - // - // Momentum ... - mConsolidationCycleHelper.mPOIDrawer.BullishMomentumBarColor(bullishColor); - mConsolidationCycleHelper.mPOIDrawer.BearishMomentumBarColor(bearishColor); - - // - // Rejection ... - mConsolidationCycleHelper.mPOIDrawer.BullishRejectionBarColor(bullishColor); - mConsolidationCycleHelper.mPOIDrawer.BearishRejectionBarColor(bearishColor); - - // - // Support and Resistance ... - mConsolidationCycleHelper.mPOIDrawer.SupportZoneColor(bullishColor); - mConsolidationCycleHelper.mPOIDrawer.ResistanceZoneColor(bearishColor); - - // - // Demand and Supply ... - mConsolidationCycleHelper.mPOIDrawer.DemandZoneColor(bullishColor); - mConsolidationCycleHelper.mPOIDrawer.SupplyZoneColor(bearishColor); - - // - // Order Blocks ... - mConsolidationCycleHelper.mPOIDrawer.BullishOrderBlockColor(bullishColor); - mConsolidationCycleHelper.mPOIDrawer.BearishOrderBlockColor(bearishColor); - - // - // Fair Value Gaps ... - mConsolidationCycleHelper.mPOIDrawer.BullishFVGColor(bullishColor); - mConsolidationCycleHelper.mPOIDrawer.BearishFVGColor(bearishColor); - } - - // - // Vision Cycle ... - mVisionCycleHelper = new XC121SMCCycleHelper(); - isInited = mVisionCycleHelper.Init( - symbol, - PERIOD_H4, - x121Inputs, - requiredPOIS // - ); - if (isInited) - { - // - // Configure POI Drawer ... - color bullishColor = clrAqua; - color bearishColor = clrMagenta; - - // - // Bars ... - mVisionCycleHelper.mPOIDrawer.BarBullishColor(bullishColor); - mVisionCycleHelper.mPOIDrawer.BarBearishColor(bearishColor); - - // - // Swings ... - mVisionCycleHelper.mPOIDrawer.SwingLowColor(bullishColor); - mVisionCycleHelper.mPOIDrawer.SwingHighColor(bearishColor); - - // - // Momentum ... - mVisionCycleHelper.mPOIDrawer.BullishMomentumBarColor(bullishColor); - mVisionCycleHelper.mPOIDrawer.BearishMomentumBarColor(bearishColor); - - // - // Rejection ... - mVisionCycleHelper.mPOIDrawer.BullishRejectionBarColor(bullishColor); - mVisionCycleHelper.mPOIDrawer.BearishRejectionBarColor(bearishColor); - - // - // Support and Resistance ... - mVisionCycleHelper.mPOIDrawer.SupportZoneColor(bullishColor); - mVisionCycleHelper.mPOIDrawer.ResistanceZoneColor(bearishColor); - - // - // Demand and Supply ... - mVisionCycleHelper.mPOIDrawer.DemandZoneColor(bullishColor); - mVisionCycleHelper.mPOIDrawer.SupplyZoneColor(bearishColor); - - // - // Order Blocks ... - mVisionCycleHelper.mPOIDrawer.BullishOrderBlockColor(bullishColor); - mVisionCycleHelper.mPOIDrawer.BearishOrderBlockColor(bearishColor); - - // - // Fair Value Gaps ... - mVisionCycleHelper.mPOIDrawer.BullishFVGColor(bullishColor); - mVisionCycleHelper.mPOIDrawer.BearishFVGColor(bearishColor); - } - - // - // Initial Cycle Provider ... - cycleProvider.Init( - mTriggerCycleHelper, - mDecisionCycleHelper, - mAnalyseCycleHelper, - mVerificationCycleHelper, - mConsolidationCycleHelper, - mVisionCycleHelper // - ); - } - - // -}; - -// \ No newline at end of file