diff --git a/Experts/x-saherelm.xfima.backtester.ea.mq5 b/Experts/x-saherelm.xfima.backtester.ea.mq5 index 906f7e02..50cc914a 100644 --- a/Experts/x-saherelm.xfima.backtester.ea.mq5 +++ b/Experts/x-saherelm.xfima.backtester.ea.mq5 @@ -118,6 +118,7 @@ input ENUM_BASE_CORNER barTimeCorner = CORNER_RIGHT_LOWER; // Text Position // Presentation ... input group "Presentation"; input bool showPV = true; // Show PV +input bool showHK = true; // Show HK input bool showSAR = true; // Show Sar input bool showMAFast = true; // Show MA Fast input bool showMASlow = true; // Show MA Slow @@ -293,6 +294,7 @@ int OnInit() fimaInputs.zigzagUppersMode = zigzagUppersMode; fimaInputs.zigzagLowersMode = zigzagLowersMode; fimaInputs.showPV = showPV; + fimaInputs.showHK = showHK; fimaInputs.showSAR = showSAR; fimaInputs.showMAFast = showMAFast; fimaInputs.showMASlow = showMASlow; diff --git a/Helpers/x-saherelm.xfima.helper.mq5 b/Helpers/x-saherelm.xfima.helper.mq5 index f12f1980..9c094d4a 100644 --- a/Helpers/x-saherelm.xfima.helper.mq5 +++ b/Helpers/x-saherelm.xfima.helper.mq5 @@ -35,13 +35,13 @@ enum ENUM_XFIMA_BUFFERS { XFIMA_MA_FAST_LINE = 0, XFIMA_MA_FAST_COLOR_LINE = 1, - XFIMA_MA_FAST_STATE_LINE = 12, + XFIMA_MA_FAST_STATE_LINE = 19, XFIMA_MA_SLOW_LINE = 2, XFIMA_MA_SLOW_COLOR_LINE = 3, - XFIMA_MA_SLOW_STATE_LINE = 13, + XFIMA_MA_SLOW_STATE_LINE = 20, XFIMA_SAR_LINE = 4, XFIMA_SAR_COLOR_LINE = 5, - XFIMA_SAR_STATE_LINE = 14, + XFIMA_SAR_STATE_LINE = 21, XFIMA_PEAK_LINE = 6, XFIMA_VALE_LINE = 7, XFIMA_FIBO_UPPER_LINE = 8, @@ -50,25 +50,31 @@ enum ENUM_XFIMA_BUFFERS XFIMA_ZIGZAG_LINE = 11, XFIMA_MA_BAND_UPPER_LINE = 12, XFIMA_MA_BAND_LOWER_LINE = 13, - XFIMA_ZIGZAG_HIGHS_LINE = 25, - XFIMA_ZIGZAG_HIGHS_TIME_LINE = 26, - XFIMA_ZIGZAG_LOWS_LINE = 27, - XFIMA_ZIGZAG_LOWS_TIME_LINE = 28, - // 14 Ma Fast State - // 15 Ma Slow State - // 16 Sar State - XFIMA_SC_HH_LINE = 17, - XFIMA_SC_LL_LINE = 18, - XFIMA_MC_HH_LINE = 19, - XFIMA_MC_LL_LINE = 20, - XFIMA_LC_HH_LINE = 21, - XFIMA_LC_LL_LINE = 22, - XFIMA_HC_HH_LINE = 23, - XFIMA_HC_LL_LINE = 24, - // 25 ZigZag Highs - // 26 ZigZag Highs Time - // 27 ZigZag Lows - // 28 ZigZag Lows Time + XFIMA_ZIGZAG_HIGHS_LINE = 30, + XFIMA_ZIGZAG_HIGHS_TIME_LINE = 31, + XFIMA_ZIGZAG_LOWS_LINE = 32, + XFIMA_ZIGZAG_LOWS_TIME_LINE = 33, + // + XFIMA_HK_OPEN_LINE = 14, + XFIMA_HK_HIGH_LINE = 15, + XFIMA_HK_LOW_LINE = 16, + XFIMA_HK_CLOSE_LINE = 17, + XFIMA_HK_COLOR_LINE = 18, + // 19 Ma Fast State + // 20 Ma Slow State + // 21 Sar State + XFIMA_SC_HH_LINE = 22, + XFIMA_SC_LL_LINE = 23, + XFIMA_MC_HH_LINE = 24, + XFIMA_MC_LL_LINE = 25, + XFIMA_LC_HH_LINE = 26, + XFIMA_LC_LL_LINE = 27, + XFIMA_HC_HH_LINE = 28, + XFIMA_HC_LL_LINE = 29, + // 30 ZigZag Highs + // 31 ZigZag Highs Time + // 32 ZigZag Lows + // 33 ZigZag Lows Time }; // @@ -109,6 +115,7 @@ struct XFIMAInputs // // Presentation ... bool showPV; // Show PV + bool showHK; // Show HK bool showSAR; // Show Sar bool showMAFast; // Show MA Fast bool showMASlow; // Show MA Slow @@ -172,6 +179,7 @@ struct XFIMAInputs // // Presentation ... showPV = true; // Show PV + showHK = true; // Show HK showSAR = true; // Show Sar showMAFast = true; // Show MA Fast showMASlow = true; // Show MA Slow @@ -190,6 +198,7 @@ struct XFIMAInputs { // showPV = false; + showHK = false; showSAR = false; showMAFast = false; showMASlow = false; @@ -289,6 +298,11 @@ struct XFIMAConditions double highsTimeBuffer[]; double lowsBuffer[]; double lowsTimeBuffer[]; + double hkOpenBuffer[]; + double hkHighBuffer[]; + double hkLowBuffer[]; + double hkCloseBuffer[]; + double hkColorBuffer[]; // // Conditions ... @@ -352,6 +366,11 @@ struct XFIMAConditions SpecifiedClean(highsTimeBuffer); SpecifiedClean(lowsBuffer); SpecifiedClean(lowsTimeBuffer); + SpecifiedClean(hkOpenBuffer); + SpecifiedClean(hkHighBuffer); + SpecifiedClean(hkLowBuffer); + SpecifiedClean(hkCloseBuffer); + SpecifiedClean(hkColorBuffer); // // Conditions ... @@ -389,6 +408,11 @@ struct XFIMAConditions ArraySetAsSeries(highsTimeBuffer, true); ArraySetAsSeries(lowsBuffer, true); ArraySetAsSeries(lowsTimeBuffer, true); + ArraySetAsSeries(hkOpenBuffer, true); + ArraySetAsSeries(hkHighBuffer, true); + ArraySetAsSeries(hkLowBuffer, true); + ArraySetAsSeries(hkCloseBuffer, true); + ArraySetAsSeries(hkColorBuffer, true); // ZeroMemory(this); @@ -481,6 +505,11 @@ class XCXFIMAHelper : public XCBaseHelper double highsTimeBuffer[]; double lowsBuffer[]; double lowsTimeBuffer[]; + double hkOpenBuffer[]; + double hkHighBuffer[]; + double hkLowBuffer[]; + double hkCloseBuffer[]; + double hkColorBuffer[]; // // Constructors ... @@ -550,6 +579,11 @@ class XCXFIMAHelper : public XCBaseHelper ArraySetAsSeries(highsTimeBuffer, true); ArraySetAsSeries(lowsBuffer, true); ArraySetAsSeries(lowsTimeBuffer, true); + ArraySetAsSeries(hkOpenBuffer, true); + ArraySetAsSeries(hkHighBuffer, true); + ArraySetAsSeries(hkLowBuffer, true); + ArraySetAsSeries(hkCloseBuffer, true); + ArraySetAsSeries(hkColorBuffer, true); // mInputs = inputs; @@ -587,6 +621,7 @@ class XCXFIMAHelper : public XCBaseHelper mInputs.zigzagLowersMode, "", // Presentation ... mInputs.showPV, + mInputs.showHK, mInputs.showSAR, mInputs.showMAFast, mInputs.showMASlow, @@ -863,6 +898,41 @@ class XCXFIMAHelper : public XCBaseHelper conditions.hLLBuffer // ); + // + CopyHKOpen( + zIndex, + loopback, + conditions.hkOpenBuffer // + ); + + // + CopyHKHigh( + zIndex, + loopback, + conditions.hkHighBuffer // + ); + + // + CopyHKLow( + zIndex, + loopback, + conditions.hkLowBuffer // + ); + + // + CopyHKClose( + zIndex, + loopback, + conditions.hkCloseBuffer // + ); + + // + CopyHKColor( + zIndex, + loopback, + conditions.hkColorBuffer // + ); + // // Conditions ... @@ -3081,6 +3151,269 @@ class XCXFIMAHelper : public XCBaseHelper ); } + // + // XHK ... + + // + // XHK Open ... + + // + double GetHKOpen( + int barIndex // Bar Index + ) + { + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + Calculate(barIndex); + + // + int count = ArraySize(hkOpenBuffer); + if (barIndex >= count) + { + barIndex = count - 1; + } + + // + return hkOpenBuffer[barIndex]; + } + + // + int CopyHKOpen( + 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, + hkOpenBuffer, + buffer, + forceClean + // + ); + } + + // + // XHK High ... + + // + double GetHKHigh( + int barIndex // Bar Index + ) + { + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + Calculate(barIndex); + + // + int count = ArraySize(hkHighBuffer); + if (barIndex >= count) + { + barIndex = count - 1; + } + + // + return hkHighBuffer[barIndex]; + } + + // + int CopyHKHigh( + 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, + hkHighBuffer, + buffer, + forceClean + // + ); + } + + // + // XHK Low ... + + // + double GetHKLow( + int barIndex // Bar Index + ) + { + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + Calculate(barIndex); + + // + int count = ArraySize(hkLowBuffer); + if (barIndex >= count) + { + barIndex = count - 1; + } + + // + return hkLowBuffer[barIndex]; + } + + // + int CopyHKLow( + 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, + hkLowBuffer, + buffer, + forceClean + // + ); + } + + // + // XHK Close ... + + // + double GetHKClose( + int barIndex // Bar Index + ) + { + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + Calculate(barIndex); + + // + int count = ArraySize(hkCloseBuffer); + if (barIndex >= count) + { + barIndex = count - 1; + } + + // + return hkCloseBuffer[barIndex]; + } + + // + int CopyHKClose( + 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, + hkCloseBuffer, + buffer, + forceClean + // + ); + } + + // + // XHK Color ... + + // + double GetHKColor( + int barIndex // Bar Index + ) + { + // + if (barIndex < 0) + { + barIndex = 0; + } + + // + Calculate(barIndex); + + // + int count = ArraySize(hkColorBuffer); + if (barIndex >= count) + { + barIndex = count - 1; + } + + // + return hkColorBuffer[barIndex]; + } + + // + int CopyHKColor( + 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, + hkColorBuffer, + buffer, + forceClean + // + ); + } + // // Protected ... protected: @@ -3368,6 +3701,51 @@ class XCXFIMAHelper : public XCBaseHelper maxRequiredBars, lowsTimeBuffer // ); + + // + CopyBuffer( + mHandler, + XFIMA_HK_OPEN_LINE, + barIndex, + maxRequiredBars, + hkOpenBuffer // + ); + + // + CopyBuffer( + mHandler, + XFIMA_HK_HIGH_LINE, + barIndex, + maxRequiredBars, + hkHighBuffer // + ); + + // + CopyBuffer( + mHandler, + XFIMA_HK_LOW_LINE, + barIndex, + maxRequiredBars, + hkLowBuffer // + ); + + // + CopyBuffer( + mHandler, + XFIMA_HK_CLOSE_LINE, + barIndex, + maxRequiredBars, + hkCloseBuffer // + ); + + // + CopyBuffer( + mHandler, + XFIMA_HK_COLOR_LINE, + barIndex, + maxRequiredBars, + hkColorBuffer // + ); } // @@ -3548,6 +3926,36 @@ class XCXFIMAHelper : public XCBaseHelper lowsTimeBuffer, maxAllowed // ); + + // + CleanupArray( + hkOpenBuffer, + maxAllowed // + ); + + // + CleanupArray( + hkHighBuffer, + maxAllowed // + ); + + // + CleanupArray( + hkLowBuffer, + maxAllowed // + ); + + // + CleanupArray( + hkCloseBuffer, + maxAllowed // + ); + + // + CleanupArray( + hkColorBuffer, + maxAllowed // + ); } }; diff --git a/Indicators/x-saherelm.xfima.mq5 b/Indicators/x-saherelm.xfima.mq5 index e6aa0216..961e150c 100644 --- a/Indicators/x-saherelm.xfima.mq5 +++ b/Indicators/x-saherelm.xfima.mq5 @@ -94,6 +94,7 @@ input ENUM_X_PRICE zigzagLowersMode = X_PRICE_LOW; // ZigZag Low D // Presentation ... input group "Presentation"; input bool showPV = true; // Show PV +input bool showHK = true; // Show HK input bool showSAR = true; // Show Sar input bool showMAFast = true; // Show MA Fast input bool showMASlow = true; // Show MA Slow @@ -133,8 +134,8 @@ input int valeArrowCode = 159; // Vales Arrow Code #property indicator_chart_window // -#property indicator_buffers 29 -#property indicator_plots 11 +#property indicator_buffers 34 +#property indicator_plots 12 // // Plot Buffers ... @@ -305,11 +306,40 @@ double maLowerBuffer[]; #property indicator_color11 clrMagenta #property indicator_width11 3 +// +// XHK ... + +// +#define hkOpenBufferIndex 14 +double hkOpenBuffer[]; + +// +#define hkHighBufferIndex 15 +double hkHighBuffer[]; + +// +#define hkLowBufferIndex 16 +double hkLowBuffer[]; + +// +#define hkCloseBufferIndex 17 +double hkCloseBuffer[]; + +// +#define hkColorBufferIndex 18 +double hkColorBuffer[]; + +// +#define hkBufferPlotIndex 11 +#property indicator_label12 "XHK Open;XHK High;XHK Low;XHK Close" +#property indicator_type12 DRAW_COLOR_CANDLES +#property indicator_color12 CLR_NONE, clrAqua, clrMagenta + // // Data Buffers ... // -#define mLastBufferIndex 13 +#define mLastBufferIndex 18 // // MA ... @@ -963,6 +993,39 @@ void DefineBuffers() PlotIndexSetInteger(maLowerBufferPlotIndex, PLOT_DRAW_BEGIN, 0); PlotIndexSetDouble(maLowerBufferPlotIndex, PLOT_EMPTY_VALUE, 0); + // + // XHK ... + + // + // XHK Color ... + ArraySetAsSeries(hkColorBuffer, true); + SetIndexBuffer(hkColorBufferIndex, hkColorBuffer, INDICATOR_COLOR_INDEX); + + // + // Set EMPTY_VALUE on XHK Bar Buffer ... + PlotIndexSetDouble(hkBufferPlotIndex, PLOT_EMPTY_VALUE, emptyValue); + PlotIndexSetInteger(hkBufferPlotIndex, PLOT_SHOW_DATA, false); + + // + // Open ... + ArraySetAsSeries(hkOpenBuffer, true); + SetIndexBuffer(hkOpenBufferIndex, hkOpenBuffer, INDICATOR_DATA); + + // + // High ... + ArraySetAsSeries(hkHighBuffer, true); + SetIndexBuffer(hkHighBufferIndex, hkHighBuffer, INDICATOR_DATA); + + // + // Low ... + ArraySetAsSeries(hkLowBuffer, true); + SetIndexBuffer(hkLowBufferIndex, hkLowBuffer, INDICATOR_DATA); + + // + // Close ... + ArraySetAsSeries(hkCloseBuffer, true); + SetIndexBuffer(hkCloseBufferIndex, hkCloseBuffer, INDICATOR_DATA); + // // Data Buffers ... @@ -1373,6 +1436,19 @@ void CalculateValues( tickVolume // ); + // + // XHK ... + CalculateHKBar( + barIndex, + prevCalculated, + ratesTotal, + open, + high, + close, + low, + tickVolume // + ); + // // Fast MA ... double iFastMa = maFastBuffer[barIndex]; @@ -1920,6 +1996,60 @@ int CalculateZigZag( return result; } +// +void CalculateHKBar( + int barIndex, + const int prevCalculated, + const int ratesTotal, + const double &open[], + const double &high[], + const double &close[], + const double &low[], + const long &tickVolume[] // +) +{ + // + int lastBarIndex = barIndex + 1; + bool isFirstBar = + startCalculationForLastBars > 0 + ? barIndex == startCalculationForLastBars + : barIndex == firstBarIndex; + + // + double lastHKOpen = + isFirstBar + ? emptyValue + : hkOpenBuffer[lastBarIndex]; + double lastHKClose = + isFirstBar + ? emptyValue + : hkCloseBuffer[lastBarIndex]; + + // + double iHKOpenValue = (lastHKOpen + lastHKClose) / 2; + double iHKCloseValue = (open[barIndex] + high[barIndex] + close[barIndex] + low[barIndex]) / 4; + double iHKHighValue = MathMax(high[barIndex], MathMax(iHKOpenValue, iHKCloseValue)); + double iHKLowValue = MathMin(low[barIndex], MathMin(iHKOpenValue, iHKCloseValue)); + + // + // Raw HK Buffers ... + hkOpenBuffer[barIndex] = iHKOpenValue; + hkHighBuffer[barIndex] = iHKHighValue; + hkLowBuffer[barIndex] = iHKLowValue; + hkCloseBuffer[barIndex] = iHKCloseValue; + + // + // Calculate HK Color ... + double iHKColorValue = + hkOpenBuffer[barIndex] < hkCloseBuffer[barIndex] + ? bullishColorIDX + : bearishColorIDX; + hkColorBuffer[barIndex] = + showHK + ? iHKColorValue + : hideColorIDX; +} + // void CalculateCycleRanges( int barIndex, diff --git a/XFIMAEA/Classes/x-saherelm.xfima.signaller.class.mq5 b/XFIMAEA/Classes/x-saherelm.xfima.signaller.class.mq5 index 15e95b6d..563ff6a6 100644 --- a/XFIMAEA/Classes/x-saherelm.xfima.signaller.class.mq5 +++ b/XFIMAEA/Classes/x-saherelm.xfima.signaller.class.mq5 @@ -631,6 +631,7 @@ class XCXFIMAStrategy2Signaller : public XCXFIMABaseSignaller ENUM_X_PRICE iPriceType = X_PRICE_NONE; ENUM_X_DIRECTION iDir = X_DIRECTION_NONE; ENUM_X_PRICE iPriceEdgeType = X_PRICE_NONE; + ENUM_X_DIRECTION iHKSwitchedDir = X_DIRECTION_NONE; // XPivot pvPivots[]; @@ -683,6 +684,41 @@ class XCXFIMAStrategy2Signaller : public XCXFIMABaseSignaller analyserConfig // ); + // + // TODO: Testing ... + + // + double cHKO = fimaConditions.hkOpenBuffer[0]; + double cHKH = fimaConditions.hkHighBuffer[0]; + double cHKL = fimaConditions.hkLowBuffer[0]; + double cHKC = fimaConditions.hkCloseBuffer[0]; + + // + double pHKO = fimaConditions.hkOpenBuffer[1]; + double pHKH = fimaConditions.hkHighBuffer[1]; + double pHKL = fimaConditions.hkLowBuffer[1]; + double pHKC = fimaConditions.hkCloseBuffer[1]; + + // + bool isCHKBullish = cHKO < cHKC; + bool isCHKBearish = cHKO > cHKC; + + // + bool isPHKBullish = pHKO < pHKC; + bool isPHKBearish = pHKO > pHKC; + + // + bool isCHKSwitchedToBullish = isCHKBullish && !isPHKBullish; + bool isCHKSwitchedToBearish = isCHKBearish && !isPHKBearish; + + // + // Add this as Param in Strategy Finders for Using it ... + iHKSwitchedDir = isCHKSwitchedToBullish + ? X_DIRECTION_BULLISH + : isCHKSwitchedToBullish + ? X_DIRECTION_BEARISH + : X_DIRECTION_NONE; + // // Collect Support and Resistance Zones and Validate by them ...