From d86a1b642806813f59aac1efa6ce1f54771cef55 Mon Sep 17 00:00:00 2001 From: Hadi Khazaee Asl Date: Tue, 28 Oct 2025 09:24:32 +0330 Subject: [PATCH] add support for cycles ma in xfima ... --- Indicators/x-saherelm.xfima.mq5 | 226 +++++++++++++++++++++++++++++--- 1 file changed, 208 insertions(+), 18 deletions(-) diff --git a/Indicators/x-saherelm.xfima.mq5 b/Indicators/x-saherelm.xfima.mq5 index 4ecda4ca..5889549d 100644 --- a/Indicators/x-saherelm.xfima.mq5 +++ b/Indicators/x-saherelm.xfima.mq5 @@ -145,8 +145,8 @@ input int valeArrowCode = 159; // Vales Arrow Code #property indicator_chart_window // -#property indicator_buffers 49 -#property indicator_plots 18 +#property indicator_buffers 57 +#property indicator_plots 22 // // Plot Buffers ... @@ -424,11 +424,60 @@ double atrBandLowerBuffer[]; #property indicator_color18 clrOrange #property indicator_width18 2 + +// +#define scMaBufferIndex 25 +double scMaBuffer[]; + +// +#define scMaBufferPlotIndex 18 +#property indicator_label19 "SCMA" +#property indicator_type19 DRAW_LINE +#property indicator_color19 clrChocolate +#property indicator_style19 STYLE_DASHDOT +#property indicator_width19 2 + +// +#define mcMaBufferIndex 26 +double mcMaBuffer[]; + +// +#define mcMaBufferPlotIndex 19 +#property indicator_label20 "MCMA" +#property indicator_type20 DRAW_LINE +#property indicator_color20 clrChocolate +#property indicator_style20 STYLE_DASHDOT +#property indicator_width20 2 + +// +#define lcMaBufferIndex 27 +double lcMaBuffer[]; + +// +#define lcMaBufferPlotIndex 20 +#property indicator_label21 "LCMA" +#property indicator_type21 DRAW_LINE +#property indicator_color21 clrChocolate +#property indicator_style21 STYLE_DASHDOT +#property indicator_width21 2 + +// +#define hcMaBufferIndex 28 +double hcMaBuffer[]; + +// +#define hcMaBufferPlotIndex 21 +#property indicator_label22 "HCMA" +#property indicator_type22 DRAW_LINE +#property indicator_color22 clrChocolate +#property indicator_style22 STYLE_DASHDOT +#property indicator_width22 2 + // // Data Buffers ... // -#define mLastBufferIndex 24 +#define mLastBufferIndex 28 // // MA ... @@ -559,32 +608,59 @@ double atrBandRawUpperBuffer[]; #define atrBandRawLowerBufferIndex mLastBufferIndex + 24 double atrBandRawLowerBuffer[]; +// +// XCMA Data ... + +// +#define scMaStateBufferIndex mLastBufferIndex + 25 +double scMaStateBuffer[]; + +// +#define mcMaStateBufferIndex mLastBufferIndex + 26 +double mcMaStateBuffer[]; + +// +#define lcMaStateBufferIndex mLastBufferIndex + 27 +double lcMaStateBuffer[]; + +// +#define hcMaStateBufferIndex mLastBufferIndex + 28 +double hcMaStateBuffer[]; + // // Variables, Properties and etc ... // // XMarketCycle sc; int mSCLength = 0; +int mSCMALength = 0; ENUM_TIMEFRAMES mSCPeriod = NULL; // // XMarketCycle mc; int mMCLength = 0; +int mMCMALength = 0; ENUM_TIMEFRAMES mMCPeriod = NULL; // // XMarketCycle lc; int mLCLength = 0; +int mLCMALength = 0; ENUM_TIMEFRAMES mLCPeriod = NULL; // // XMarketCycle hc; int mHCLength = 0; +int mHCMALength = 0; ENUM_TIMEFRAMES mHCPeriod = NULL; // int sarHandler = INVALID_HANDLE; int atrHandler = INVALID_HANDLE; +int scMaHandler = INVALID_HANDLE; +int mcMaHandler = INVALID_HANDLE; +int lcMaHandler = INVALID_HANDLE; +int hcMaHandler = INVALID_HANDLE; int maFastHandler = INVALID_HANDLE; int maSlowHandler = INVALID_HANDLE; int maUpperHandler = INVALID_HANDLE; @@ -599,11 +675,6 @@ int maxLength; // int firstBarIndex; -// -// Requirements ... -CArrayObj mObjects; -XCPOIDrawer *mDrawer; - // double zigzagUppers[]; double zigzagLowers[]; @@ -703,17 +774,14 @@ void OnDeinit(const int reason) // REASON_INITFAILED 8 The OnInit() handler returned a non-zero value // REASON_CLOSE 9 Terminal closed - // - delete mDrawer; - ZeroMemory(mDrawer); - - // - mObjects.Clear(); - // // De Initialize all Handlers and etc ... IndicatorRelease(sarHandler); IndicatorRelease(atrHandler); + IndicatorRelease(scMaHandler); + IndicatorRelease(mcMaHandler); + IndicatorRelease(lcMaHandler); + IndicatorRelease(hcMaHandler); IndicatorRelease(maFastHandler); IndicatorRelease(maSlowHandler); IndicatorRelease(maUpperHandler); @@ -780,6 +848,12 @@ int OnCalculate( // // Validate Calculated Bars ... + // + int scCalculatedBars = BarsCalculated(scMaHandler); + int mcCalculatedBars = BarsCalculated(mcMaHandler); + int lcCalculatedBars = BarsCalculated(lcMaHandler); + int hcCalculatedBars = BarsCalculated(hcMaHandler); + // // MA ... int maFastCalculatedBars = BarsCalculated(maFastHandler); @@ -797,6 +871,12 @@ int OnCalculate( // bool isPassedRequiredCalculatedBars = + // + // Cycles MA Handlers ... + scCalculatedBars >= maxLength && + mcCalculatedBars >= maxLength && + lcCalculatedBars >= maxLength && + hcCalculatedBars >= maxLength && // // MA ... maFastCalculatedBars >= maxLength && @@ -808,8 +888,7 @@ int OnCalculate( sarCalculatedBars >= maxLength && // // ATR ... - atrCalculatedBars >= maxLength - // + atrCalculatedBars >= maxLength // ; if (!isPassedRequiredCalculatedBars) { @@ -824,6 +903,12 @@ int OnCalculate( // // Buffers Copy ... + // + int copiedSCs = CopyBuffer(scMaHandler, MAIN_LINE, 0, limit, scMaBuffer); + int copiedMCs = CopyBuffer(mcMaHandler, MAIN_LINE, 0, limit, mcMaBuffer); + int copiedLCs = CopyBuffer(lcMaHandler, MAIN_LINE, 0, limit, lcMaBuffer); + int copiedHCs = CopyBuffer(hcMaHandler, MAIN_LINE, 0, limit, hcMaBuffer); + // // MA ... int copiedMAFasts = CopyBuffer(maFastHandler, MAIN_LINE, 0, limit, maFastBuffer); @@ -842,6 +927,12 @@ int OnCalculate( // // Validate Copied Items ... bool isPassedRequiredCopiedItems = + // + // Cycles MA ... + copiedSCs >= limit && + copiedMCs >= limit && + copiedLCs >= limit && + copiedHCs >= limit && // // MA ... copiedMAFasts >= limit && @@ -1479,6 +1570,21 @@ bool InitCycles() mMCLength > mSCLength && mLCLength > mMCLength && mHCLength > mLCLength; + if (result) + { + // + // Initialized Cycles MA Ribons Length ... + mSCMALength = maBandLength * mSCLength; + mMCMALength = maBandLength * mMCLength; + mLCMALength = maBandLength * mLCLength; + mHCMALength = maBandLength * mHCLength; + + // + result = mSCMALength > 0 && + mMCMALength > mSCMALength && + mLCMALength > mMCMALength && + mHCMALength > mLCMALength; + } // return result; @@ -1590,7 +1696,71 @@ bool InitRequirements() } // - mDrawer = new XCPOIDrawer(); + // Cycles MA Handler ... + + // + // SC ... + scMaHandler = iMA( + _Symbol, + _Period, + mSCMALength, + 0, + maMethod, + maAppliedTo // + ); + result = scMaHandler != INVALID_HANDLE; + if (!result) + { + return result; + } + + // + // MC ... + mcMaHandler = iMA( + _Symbol, + _Period, + mMCMALength, + 0, + maMethod, + maAppliedTo // + ); + result = mcMaHandler != INVALID_HANDLE; + if (!result) + { + return result; + } + + // + // LC ... + lcMaHandler = iMA( + _Symbol, + _Period, + mLCMALength, + 0, + maMethod, + maAppliedTo // + ); + result = lcMaHandler != INVALID_HANDLE; + if (!result) + { + return result; + } + + // + // HC ... + hcMaHandler = iMA( + _Symbol, + _Period, + mHCMALength, + 0, + maMethod, + maAppliedTo // + ); + result = hcMaHandler != INVALID_HANDLE; + if (!result) + { + return result; + } // return result; @@ -2577,6 +2747,26 @@ void CalculateATR( } } +// +void CalculateCyclesMA( + 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; +} + // void CalculateCycleRanges( int barIndex,