Wednesday, August 13, 2025

Author: Roberto Jacobs (3rjfx) | Featured on Forex Home Expert

Introduction

The Money Flow Index Multi-Timeframe (MFI_MTF) Indicator for MetaTrader 5 calculates and scans the Money Flow Index (MFI) on all 21 standard MT5 timeframes (M1 … MN1) and displays per-timeframe signals directly on the chart. The indicator creates a native iMFI handle for every timeframe, draws Wingdings arrow labels per timeframe, and computes a single consensus summary signal (exported as PowerMove[]) when a dominant directional majority exists. An on-chart clickable panel allows instant timeframe switching without reattaching the indicator.

The Money Flow Index Multi-Timeframe for MT5 (MFI_MTF) utilizes a template and displays a panel on the chart. Its function, operation, and usage are identical to the Commodity Channel Index Multi-Timeframe Indicator for MT5 (CCI_MTF) as detailed in the previous article. For a comprehensive guide on creating a multi-timeframe indicator, you can refer to the following resources: Commodity Channel Index Multi-Timeframe Indicator for MT5

Key Features

  • 21-Timeframe MFI Scanning — MFI is calculated using iMFI(Symbol(), TFId[x], MFI_period, VOLUME_TICK) for each timeframe defined in TFIx[].
  • Per-timeframe Wingdings Arrow Overlay — per timeframe arrow uses windchar (char 108) and colored by inputs ArrowUp, ArrowDn, NTArrow.
  • Consensus Summary Signal — consensus computed in MFIMovementCalculation() and written to PowerMove[]. Condition: up > down + 1 → UP (1.0); down > up + 1 → DOWN (-1.0).
  • Interactive On-Chart Panel — clickable timeframe buttons (CreateButtonClick()) and panel position controls (artop / arbot), handled in OnChartEvent().
  • Customizable Appearance — control font via input f_model (Verdana or Bodoni MT Black), arrow sizes (windsize), and layout offsets (offsetX, offsetY).
  • Alerts — popup alerts plus optional email and push via UseEmailAlert and UseSendnotify. Alerts are sent in Do_Alerts() when curAlert changes.
  • EA-Friendly Output — consensus exported to index buffer: SetIndexBuffer(0, mi.PowerMove, INDICATOR_DATA) so EAs can read 1.0 / -1.0.
  • Clean resource management — all indicator handles are released in OnDeinit() with IndicatorRelease() and chart objects removed via DeletedMFIObject().
Implementation note: This article is faithful to the MFI_MTF.mq5 source (Roberto Jacobs, 2025-01-14). Variable names and behavior described below are taken directly from the source code.

Inputs and Parameters

InputDescription
BarCalcIndicator period for MFI calculation (validated; fallback to 14 if <1)
ArrowUpColor for Up arrow (default clrMediumSeaGreen)
ArrowDnColor for Down arrow (default clrDeepPink)
NTArrowColor for No-Signal arrow (default clrGold)
f_modelFont model enum (Verdana, Bodoni_MT_Black)
alertsPopup alerts toggle (enum YN)
UseEmailAlertEmail alert toggle (enum YN)
UseSendnotifyPush notification toggle (enum YN)

2. About This Indicator

The Money Flow Index Multi-Timeframe (MFI_MTF) Indicator for MetaTrader 5 utilizes a template and displays a panel on the chart.

Its function, operation, and usage are identical to the On Balance Volume Multi-Timeframe Indicator for MT5 (OBV_MTF) as detailed in the previous article. For a comprehensive guide on creating a multi-timeframe indicator, you can refer to the following resources: On Balance Volume Multi-Timeframe Indicator for MT5

🔁 Note: All multi-timeframe indicators developed by Forex Home Expert use this exact signal logic programs structure.

GBPUSDH1_MFI_MTF

How It Works (implementation details)

1. Initialization

OnInit() calls mi.MFI_MTF_Config(). The config routine defines the timeframe array TFIx[] and label array TFSc[], sets tfxar = ArraySize(TFIx), validates BarCalc to set MFI_period, computes ttlbars = BarCalc*3+3, and creates an iMFI handle for each timeframe:

hMFI[x] = iMFI(Symbol(), TFId[x], MFI_period, VOLUME_TICK);
2. Price and Buffer Management

The indicator keeps routines UpdatePrice() and RefreshPrice() to ensure arrays for OHLC, TIME, and VOLUME are prepared if needed. Crucially, MFI values are obtained from the indicator handles via CopyBuffer():

CopyBuffer(hMFI[index], 0, 0, br, MFI);
3. Per-timeframe Direction Scan

MFIDirectionScan(stf, shift) copies br = shift + 2 MFI points and compares MFI[shift] vs MFI[shift+1]:

if (MFI[shift] > MFI[shift+1]) ret = 1; // rise 
if (MFI[shift] < MFI[shift+1]) ret = -1; // down 

This uses closed buffer values (historical indices), so past signals are based on confirmed data.

4. Consensus Calculation

MFIMovementCalculation(barCnt) loops through recent bars and for each bar it scans all tfxar timeframes:

  • Initialize up=0, dw=0, set Arwcolor[x] = NTArrow.
  • Call MFIDirectionScan() for each timeframe; increment up or dw and set per-timeframe arrow color.
  • After scanning all timeframes, if up > dw + 1 then PowerMove[i] = 1.0, TColor = ArrowUp, curAlert = 1. If dw > up + 1 then PowerMove[i] = -1.0, TColor = ArrowDn, curAlert = -1.

The consensus buffer PowerMove[] is written to indicator buffer index 0 so other programs (EAs) can read consensus signals.

5. Alerts

Alerts are handled in OnCalculate() after mi.MFIMovementCalculation(limit) runs. If alerts are enabled, the indicator compares current minute (mi.ThisTime(mi.min)) with the previously alerted minute and sends alerts only when the minute changes and curAlert differs from prvAlert. Messages are sent via Do_Alerts() and contain these texts:

  • "The strength of the MFI movement appears to be Rise."
  • "The strength of the MFI movement appears to be Down."
6. UI / Panel / Interaction

DrawMFIObject() draws the main rectangle template (panel), per-timeframe arrow labels (CreateArrowLabel()), and clickable timeframe buttons (CreateButtonClick()). The big consensus arrow uses Wingdings characters (tstar=217 or bstar=218) and the per-timeframe arrows use windchar=108. Clicking a timeframe button triggers OnChartEvent() and the indicator calls ChangeChartSymbol() which runs ChartSetSymbolPeriod(CI, Symbol(), stf) to change the chart timeframe while preserving the indicator display.

How to Trade (code-faithful guidance)

  1. Attach to any chart — the indicator scans all 21 timeframes regardless of the chart timeframe.
  2. Observe per-timeframe arrows — these show the short-term direction of MFI per timeframe as computed by MFIDirectionScan().
  3. Watch the consensus (PowerMove) — a large arrow appears in the panel if up > down + 1 or down > up + 1. The consensus is the main multi-timeframe trigger for trade consideration.
  4. Use alerts — enable alerts, UseEmailAlert, or UseSendnotify to be notified when consensus changes (note: alerts fire only once per minute per change).
  5. Switch timeframe via panel — click a timeframe label to instantly change the chart timeframe while the multi-timeframe scan remains active.
  6. Programmatic access — read PowerMove[] via iCustom() inside an EA to automate decisions based on consensus values (1.0 or -1.0).

Q/A Section

Q1: Which timeframes does the indicator scan?
A: All 21 standard MT5 timeframes declared in the code’s TFIx[] array: M1, M2, M3, M4, M5, M6, M10, M12, M15, M20, M30, H1, H2, H3, H4, H6, H8, H12, D1, W1, MN1.

Q2: How is the MFI period set?
A: The BarCalc input sets the MFI period. If BarCalc < 1 the code falls back to a default MFI_period = 14 and prints a warning.

Q3: Does the indicator repaint?
A: No. The indicator uses CopyBuffer() to read closed/historical MFI buffer values and compares MFI[shift] against MFI[shift+1], so past signals are based on confirmed buffer values.

Q4: When are alerts triggered?
A: Alerts are triggered only when alerts are enabled, the minute changed since the last alert, and curAlert differs from prvAlert. The messages are generated in Do_Alerts().

Q5: How does the consensus logic decide direction?
A: After scanning all timeframes the code counts up and dw. Consensus UP is set when up > dw + 1. Consensus DOWN is set when dw > up + 1. This requires a margin greater than 1 to avoid marginal-majority triggers.

Q6: Can I change where the panel is located?
A: Yes. Use the on-panel buttons (artop / arbot) to move the panel between top and bottom; this is handled by PanelPosChange().

Q7: Can an EA read the indicator output?
A: Yes — PowerMove[] is assigned to the indicator buffer (index 0) via SetIndexBuffer(0, mi.PowerMove, INDICATOR_DATA), so external EAs can read it with iCustom().

Q8: Are external libraries required?
A: No. The indicator uses native MT5 functions only: iMFI, CopyBuffer, object creation APIs, ChartSetSymbolPeriod, SendMail, and SendNotification.

Q9: Which characters are used for arrows?
A: Per-timeframe arrows use windchar = 108 (Wingdings char 108). The summary large arrows use tstar = 217 (up) and bstar = 218 (down).

Q10: What happens at deinit?
A: OnDeinit() releases all iMFI handles (IndicatorRelease(mi.hMFI[x])), deletes drawn objects via mi.DeletedMFIObject(), and calls ChartRedraw().

Final Words

The Money Flow Index Multi-Timeframe Indicator for MT5 indicator is a robust, non-repainting multi-timeframe MFI scanner designed for MT5. Its architecture separates per-timeframe signal extraction (MFIDirectionScan()) from consensus generation (MFIMovementCalculation()), exports the consensus buffer for EA integration, and offers an interactive panel for quick exploration. The indicator cleanly manages indicator handles and drawn objects on deinit and supports popup, email, and push notifications for live monitoring.

We hope that this article and the MFI_MTF or Money Flow Index Multi-Timeframe Indicator for MT5 program will be useful for traders in learning and generating new ideas for forex trading.

Vital Records

If you think the Money Flow Index Multi-Timeframe Indicator for MT5 is worthy of being used for automated trading as an Expert Advisor, please leave a comment below this article.

If at least 25 people agree that this indicator is worthy of being used as an Expert Advisor, I will create an Expert Advisor based on its signals and share it on this blog.

Thanks for reading this article.

Note: Please see the source program and download at the bottom of this article.

Risk Warning: Trading Forex and CFDs involves significant risk and may not be suitable for all investors. All content provided is for educational purposes only.


//+------------------------------------------------------------------+
//|                                                      MFI_MTF.mq5 |
//|        Copyright 2025, Roberto Jacobs (3rjfx) ~ Date: 2025-01-14 |
//|                              https://www.mql5.com/en/users/3rjfx |
//+------------------------------------------------------------------+
#property copyright "Copyright 2025, Roberto Jacobs (3rjfx) ~ Date: 2025-01-14"
#property link      "https://www.mql5.com/en/users/3rjfx"
#property version   "1.00"
#property description "MFI_MTF is the Money Flow Index Indicator for MT5 in"
#property description "Multi Timeframe which is calculated and scan MFI on each timeframe."
//---
#property indicator_chart_window
#property indicator_plots   1
#property indicator_buffers 1
//---
//--
enum YN
  {
   No,
   Yes
  };
//--
enum fonts
  {
   Verdana,
   Bodoni_MT_Black
  };
//--
//---
input group   "====  Indicator Period Calculation  ===="
input int                BarCalc = 14;                // Input Indicator Period
input group   "====  Indicator Color and Font   ===="
input color              ArrowUp = clrMediumSeaGreen; // Arrow Up Color
input color              ArrowDn = clrDeepPink;       // Arrow Down Color
input color              NTArrow = clrGold;           // Arrow No Signal
input fonts              f_model = Bodoni_MT_Black;   // Select Font Model
input group   "====  Input parameters for alerts  ===="
input YN                  alerts = Yes;               // Display Alerts Pop-up on Chart (Yes) or (No)
input YN           UseEmailAlert = No;                // Email Alert (Yes) or (No)
input YN           UseSendnotify = No;                // Send Notification (Yes) or (No)
//---
//---------//
//+------------------------------------------------------------------+
//| class for MTF indicator                                          |
//+------------------------------------------------------------------+
class MTF_Indi
  {
   //---
   public:
   //--
   int               fbar;
   int               star,
                     tstar,
                     bstar;
   int               hMFI[];
   int               TNamex,
                     TNamexn,
                     TNamey1,
                     TNamey2,
                     TNamey3,
                     TNamey1n,
                     TNamey2n,
                     TNamey3n;
   int               tfxar;
   int               up,dw;
   int               tfhalf;
   int               maxbar;
   int               ttlbars;
   int               scaleX,
                     scaleA,
                     scaleY,
                     horizL1,
                     horizL2,
                     horizL3,
                     horizL4,
                     horizL5,
                     horizL6,
                     vertiL1,
                     vertiL2,
                     vertiL3,
                     vertiL4,
                     vertiL5,
                     vertiL6,
                     offsetX,
                     offsetY,
                     fontSize,
                     windchar,
                     windsize;
   int               corx,
                     cory,
                     txttf;
   int               curmin,
                     prvmin;
   int               corpos;
   int               pospos,
                     postop,
                     posbot;
   int               curAlert;
   int               prvAlert;
   int               MFI_period;
   //--
   long              CI;
   string            posisi,
                     sigpos,
                     indname,
                     msgText,
                     ObjName;
   string            cstar,
                     artop,
                     arbot;
   string            hName1,
                     hName2,
                     hName3;
   string            font_mode;
   bool              display;
   double            OPEN[],
                     HIGH[],
                     LOW[],
                     CLOSE[];
   long              VOLUME[];
   datetime          TIME[];
   datetime          cbartime;
   //--
   int               year,  // Year
                     mon,   // Month
                     day,   // Day
                     hour,  // Hour
                     min,   // Minutes
                     sec,   // Seconds
                     dow,   // Day of week (0-Sunday, 1-Monday, ... ,6-Saturday)
                     doy;   // Day number of the year (January 1st is assigned the number value of zero)
   //---- buffers
   double            PowerMove[];
   string            TFSc[];
   color             Arwcolor[];
   color             TColor;
   ENUM_TIMEFRAMES   TFId[];
   ENUM_BASE_CORNER  bcor;
   ENUM_ANCHOR_POINT ancp;
   //---
   //---
   //- Constructor
                     MTF_Indi(void):
                     year(0),
                     mon(1),
                     day(2),
                     hour(3),
                     min(4),
                     sec(5),
                     dow(6),
                     doy(7),
                     fbar(125),
                     star(181),
                     maxbar(3),
                     pospos(0),
                     postop(0),
                     posbot(1),
                     tstar(217),
                     bstar(218),
                     tfhalf(11),
                     scaleX(35),
                     scaleA(36),
                     scaleY(50),
                     offsetY(18),
                     offsetX(120),
                     fontSize(7),
                     cbartime(0),
                     posisi(""),
                     sigpos(""),
                     msgText(""),
                     curAlert(0),
                     prvAlert(0),
                     windsize(12),
                     windchar(108),
                     CI(ChartID()),
                     display(false),
                     ObjName("MFI_"),
                     font_mode(FontsModel(f_model)),
                     cstar(CharToString((uchar)star)),
                     artop(CharToString((uchar)tstar)),
                     arbot(CharToString((uchar)bstar)),
                     indname(MQLInfoString(MQL_PROGRAM_NAME))
     {
     }
   //---
   //- Destructor
                    ~MTF_Indi(void)
     {
     }
   //---
   //---
   virtual void      MFI_MTF_Config(void)
     {
      //--
      ENUM_TIMEFRAMES TFIx[]= {PERIOD_M1,PERIOD_M2,PERIOD_M3,PERIOD_M4,PERIOD_M5,PERIOD_M6,PERIOD_M10,PERIOD_M12,PERIOD_M15,
                               PERIOD_M20,PERIOD_M30,PERIOD_H1,PERIOD_H2,PERIOD_H3,PERIOD_H4,PERIOD_H6,PERIOD_H8,PERIOD_H12,
                               PERIOD_D1,PERIOD_W1,PERIOD_MN1};
      tfxar=ArraySize(TFIx);
      ArrayResize(TFId,tfxar,tfxar);
      ArrayResize(Arwcolor,tfxar,tfxar);
      ArrayCopy(TFId,TFIx,0,0,WHOLE_ARRAY);
      //--
      string TFxc[]= {"M1","M2","M3","M4","M5","M6","M10","M12","M15","M20","M30","H1",
                      "H2","H3","H4","H6","H8","H12","D1","W1","MN1"}; // 21 Timeframes
      //--
      ArrayResize(hMFI,tfxar,tfxar);
      ArrayResize(TFSc,tfxar,tfxar);
      ArrayCopy(TFSc,TFxc,0,0,WHOLE_ARRAY);
      //--
      if(BarCalc<1)
        {
         MFI_period=14;
         PrintFormat("Incorrect value for input variable BarCalc = %d. Indicator will use value %d for calculations.",
                  BarCalc,MFI_period);
        }
      else
         MFI_period=BarCalc;
      //--
      ttlbars=BarCalc*3+3;
      //--
      for(int x=0; x<tfxar; x++)
        hMFI[x]=iMFI(Symbol(),TFId[x],MFI_period,VOLUME_TICK); // Handle of iMFI Indicator on each timeframe
      //--
      DeletedMFIObject();
      MFIMovementCalculation(25);
      PositionCore();
      //--
      if(display)
         DrawMFIObject();
      //---
     }
   //---
   //---
   void              PositionCore(void)
     {
      corpos=pospos;
      if(corpos>-1)
        {
         if(corpos==postop)
           {
            bcor=CORNER_LEFT_UPPER;
            ancp=ANCHOR_CENTER;
            corx=155;
            cory=13;
            txttf=45;
            horizL1=8;
            horizL2=-5;
            horizL3=8;
            horizL4=-5;
            horizL5=11;
            horizL6=10;
            vertiL1=39;
            vertiL2=18;
            vertiL3=69;
            vertiL4=48;
            vertiL5=52;
            vertiL6=67;
            TNamex=554;
            TNamexn=562;
            TNamey1=30;
            TNamey2=46;
            TNamey3=62;
            TNamey1n=38;
            TNamey2n=54;
            TNamey3n=70;
            hName1="M";
            hName2="F";
            hName3="I";
            //--
            DisplayButtonClick("cstar");
            DisplayButtonClick("arbot");
            //--
           }
         if(corpos==posbot)
           {
            bcor=CORNER_LEFT_LOWER;
            ancp=ANCHOR_CENTER;
            corx=155;
            cory=74;
            txttf=45;
            horizL1=8;
            horizL2=-5;
            horizL3=8;
            horizL4=-5;
            horizL5=11;
            horizL6=10;
            vertiL1=34;
            vertiL2=29;
            vertiL3=65;
            vertiL4=59;
            vertiL5=49;
            vertiL6=61;
            TNamex=554;
            TNamexn=562;
            TNamey1=13;
            TNamey2=46;
            TNamey3=62;
            TNamey1n=18;
            TNamey2n=33;
            TNamey3n=49;
            hName1="I";
            hName2="F";
            hName3="M";
            //--
            DisplayButtonClick("cstar");
            DisplayButtonClick("artop");
            //--
           }
         display=true;
        }
     }
   //---
   //---
   void              DrawMFIObject(void)
     {
      //--
      CreateButtonTemplate(CI,ObjName+"Template",397,66,STYLE_SOLID,9,BORDER_RAISED,clrMistyRose,clrLavenderBlush,clrWhite,bcor,corx,cory,true);
      for(int x=0; x<tfhalf; x++)
        {
         CreateArrowLabel(CI,ObjName+"_win_arrow_"+string(x),CharToString((uchar)windchar),"Wingdings",windsize,Arwcolor[x],bcor,
                             txttf+horizL1+(x*scaleX)+offsetX+x,vertiL1,true,"Arrow_"+TFSc[x]);
         CreateButtonClick(CI,TFSc[x],27,15,font_mode,fontSize,BORDER_FLAT,TFSc[x],clrBurlyWood,clrSilver,clrBlue,
                              bcor,txttf+horizL2+(x*scaleA)+offsetX,vertiL2,true,
                              "Change Timeframe to : "+TFSc[x]);
        }
      for(int x=tfhalf, x2=0; x<tfxar; x++, x2++)
        {
         CreateArrowLabel(CI,ObjName+"_win_arrow_"+string(x),CharToString((uchar)windchar),"Wingdings",windsize,Arwcolor[x],bcor,
                             txttf+horizL3+(x2*scaleX)+offsetX+x2,vertiL3,true,"Arrow_"+TFSc[x]);
         CreateButtonClick(CI,TFSc[x],27,15,font_mode,fontSize,BORDER_FLAT,TFSc[x],clrBurlyWood,clrSilver,clrBlue,
                              bcor,txttf+horizL4+(x2*scaleA)+offsetX,vertiL4,true,
                              "Change Timeframe to : "+TFSc[x]);
         //--
         if(x==20)
           {
            int arrowChar=TColor==ArrowUp ? 200 : TColor==ArrowDn ? 202 : windchar;
            CreateArrowLabel(CI,ObjName+"_tfx_arrow_"+string(x+1),"Move",font_mode,fontSize,clrBlue,bcor,
                                519+horizL5,vertiL5,true,"Move");
            CreateArrowLabel(CI,ObjName+"_win_arrow_"+string(x+1),CharToString((uchar)arrowChar),"Wingdings",15,TColor,bcor,
                                522+horizL6,vertiL6,true,"Arrow Indicator Movement");
           }
        }
      DisplayButtonClick("X");
      CreateButtonTemplate(CI,ObjName+"TemplateName1",17,15,STYLE_SOLID,1,BORDER_FLAT,clrMistyRose,clrLavenderBlush,clrWhite,bcor,TNamex,TNamey1,true);
      CreateButtonTemplate(CI,ObjName+"TemplateName2",17,15,STYLE_SOLID,1,BORDER_FLAT,clrMistyRose,clrLavenderBlush,clrWhite,bcor,TNamex,TNamey2,true);
      CreateButtonTemplate(CI,ObjName+"TemplateName3",17,15,STYLE_SOLID,1,BORDER_FLAT,clrMistyRose,clrLavenderBlush,clrWhite,bcor,TNamex,TNamey3,true);
      CreateArrowLabel(CI,ObjName+"_name1",hName1,font_mode,fontSize+1,clrBlue,bcor,TNamexn,TNamey1n,true,hName1);
      CreateArrowLabel(CI,ObjName+"_name2",hName2,font_mode,fontSize+1,clrBlue,bcor,TNamexn,TNamey2n,true,hName2);
      CreateArrowLabel(CI,ObjName+"_name3",hName3,font_mode,fontSize+1,clrBlue,bcor,TNamexn,TNamey3n,true,hName3);
      //--
      if(corpos==postop)
        {
          DisplayButtonClick("cstar");
          DisplayButtonClick("arbot");
        }
      if(corpos==posbot)
        {
          DisplayButtonClick("cstar");
          DisplayButtonClick("artop");
        }
      //--
      return;
      //---
     } //-end DrawMFIObject()
   //---
   //---
   void              PanelPosChange(int inpos)
     {
      corpos=inpos;
      //--
      if(inpos>=0)
        {
         if(inpos==postop)
           {
            bcor=CORNER_LEFT_UPPER;
            ancp=ANCHOR_CENTER;
            corx=155;
            cory=13;
            txttf=45;
            horizL1=8;
            horizL2=-5;
            horizL3=8;
            horizL4=-5;
            horizL5=11;
            horizL6=10;
            vertiL1=39;
            vertiL2=18;
            vertiL3=69;
            vertiL4=48;
            vertiL5=52;
            vertiL6=67;
            TNamex=554;
            TNamexn=562;
            TNamey1=30;
            TNamey2=46;
            TNamey3=62;
            TNamey1n=38;
            TNamey2n=54;
            TNamey3n=70;
            hName1="M";
            hName2="F";
            hName3="I";
            //--
            DisplayButtonClick("cstar");
            DisplayButtonClick("arbot");
            //--
           }
         if(inpos==posbot)
           {
            bcor=CORNER_LEFT_LOWER;
            ancp=ANCHOR_CENTER;
            corx=155;
            cory=74;
            txttf=45;
            horizL1=8;
            horizL2=-5;
            horizL3=8;
            horizL4=-5;
            horizL5=11;
            horizL6=10;
            vertiL1=34;
            vertiL2=29;
            vertiL3=65;
            vertiL4=59;
            vertiL5=49;
            vertiL6=61;
            TNamex=554;
            TNamexn=562;
            TNamey1=25;
            TNamey2=41;
            TNamey3=57;
            TNamey1n=18;
            TNamey2n=33;
            TNamey3n=49;
            hName1="I";
            hName2="F";
            hName3="M";
            //--
            DisplayButtonClick("cstar");
            DisplayButtonClick("artop");
            //--
           }
         display=true;
        }
      //---
     }
   //---
   //---
   void              UpdatePrice(ENUM_TIMEFRAMES xtf)
     {
      maxbar=fbar;
      //--
      ArrayFree(OPEN);
      ArrayFree(HIGH);
      ArrayFree(LOW);
      ArrayFree(CLOSE);
      ArrayFree(TIME);
      ArrayFree(VOLUME);
      //--
      ArrayResize(OPEN,maxbar,maxbar);
      ArrayResize(HIGH,maxbar,maxbar);
      ArrayResize(LOW,maxbar,maxbar);
      ArrayResize(CLOSE,maxbar,maxbar);
      ArrayResize(TIME,maxbar,maxbar);
      ArrayResize(VOLUME,maxbar,maxbar);
      //--
      ArraySetAsSeries(OPEN,true);
      ArraySetAsSeries(HIGH,true);
      ArraySetAsSeries(LOW,true);
      ArraySetAsSeries(CLOSE,true);
      ArraySetAsSeries(TIME,true);
      ArraySetAsSeries(VOLUME,true);
      //--
      ArrayInitialize(OPEN,0.0);
      ArrayInitialize(HIGH,0.0);
      ArrayInitialize(LOW,0.0);
      ArrayInitialize(CLOSE,0.0);
      ArrayInitialize(TIME,0);
      ArrayInitialize(VOLUME,0);
      //--
      int barx=PeriodSeconds(xtf)/60*maxbar;
      RefreshPrice(PERIOD_M1,maxbar);
      RefreshPrice(xtf,barx);
      //--
      int co=CopyOpen(Symbol(),xtf,0,maxbar,OPEN);
      int ch=CopyHigh(Symbol(),xtf,0,maxbar,HIGH);
      int cl=CopyLow(Symbol(),xtf,0,maxbar,LOW);
      int cc=CopyClose(Symbol(),xtf,0,maxbar,CLOSE);
      int ct=CopyTime(Symbol(),xtf,0,maxbar,TIME);
      int cv=CopyTickVolume(Symbol(),xtf,0,maxbar,VOLUME);
      //--
      return;
      //---
     } //-end UpdatePrice()
   //---
   //---
   void              RefreshPrice(ENUM_TIMEFRAMES xtf,int bars)
     {
      //--
      MqlRates parray[];
      ArraySetAsSeries(parray,true);
      int copied=CopyRates(Symbol(),xtf,0,bars,parray);
      //--
      return;
      //---
     } //-end RefreshPrice()
   //---
   //---
   int               MFIDirectionScan(const ENUM_TIMEFRAMES stf,int shift) // Scan OBV Direction
     {
      //--
      int ret=0;
      int rise=1,
          down=-1;
      //--
      int br=shift+2;
      double res=0.0;
      UpdatePrice(stf);
      //--
      double MFI[];
      ArrayResize(MFI,br,br);
      ArraySetAsSeries(MFI,true);
      //--
      int xx=TFIndexArray(stf);
      CopyBuffer(hMFI[xx],0,0,br,MFI);
      //--
      if(MFI[shift]>MFI[shift+1]) ret=rise;
      if(MFI[shift]<MFI[shift+1]) ret=down;
      //--
      return(ret);
      //---
     } //-end MFIDirectionScan()
   //---
   //---
   void              MFIMovementCalculation(int barCnt) // Scan the direction of iMFI on each timeframe
     {
      //--
      ArrayResize(PowerMove,barCnt,barCnt);
      ArraySetAsSeries(PowerMove,true);
      //--
      for(int i=barCnt-1; i>=0; i--)
        {
         up=0;
         dw=0;
         //--
         for(int x=0; x<tfxar; x++)
           {
            Arwcolor[x]=NTArrow;
            PowerMove[i]=0.0;
            int PPM=MFIDirectionScan(TFId[x],0);
            if(PPM>0)
              {
               up++;
               Arwcolor[x]=ArrowUp;
              }
            if(PPM<0)
              {
               dw++;
               Arwcolor[x]=ArrowDn;
              }
            if(x==tfxar-1)
              {
               if(up>dw+1)
                 {
                  PowerMove[i]=1.0;
                  TColor=ArrowUp;
                  curAlert=1;
                 }
               if(dw>up+1)
                 {
                  PowerMove[i]=-1.0;
                  TColor=ArrowDn;
                  curAlert=-1;
                 }
              }
           }
        }
      //--
      return;
      //---
     } //-end MFIMovementCalculation()
   //---
   //---
   double NonZeroDiv(double val1,double val2)
     {
      //--
      double resval=0;
      if(val1==0.0 || val2==0.0) resval=0.00;
      else
      resval=val1/val2;
      //--
      return(resval);
      //---
     } //-end NonZeroDiv()
   //---
   //---
   int TFIndexArray(ENUM_TIMEFRAMES TF)
     {
      //--
      int res=-1;
      //--
      for(int x=0; x<tfxar; x++)
        {
          if(TF==TFId[x])
            {
              res=x;
              break;
            }
        }
      //--
      return(res);
      //---
     } //-end TFIndexArray()
   //---
   //---
   int               ThisTime(const int reqmode)
     {
      //--
      MqlDateTime tm;
      TimeCurrent(tm);
      int valtm=0;
      //--
      switch(reqmode)
        {
         case 0:
            valtm=tm.year;
            break;        // Return Year
         case 1:
            valtm=tm.mon;
            break;        // Return Month
         case 2:
            valtm=tm.day;
            break;        // Return Day
         case 3:
            valtm=tm.hour;
            break;        // Return Hour
         case 4:
            valtm=tm.min;
            break;        // Return Minutes
         case 5:
            valtm=tm.sec;
            break;        // Return Seconds
         case 6:
            valtm=tm.day_of_week;
            break;        // Return Day of week (0-Sunday, 1-Monday, ... ,6-Saturday)
         case 7:
            valtm=tm.day_of_year;
            break;        // Return Day number of the year (January 1st is assigned the number value of zero)
        }
      //--
      return(valtm);
      //---
     } //-end ThisTime()
   //---
   //---
   void              Do_Alerts(string msg)
     {
      //--
      Print("--- "+Symbol()+","+strTF(Period())+": "+msg+
            "\n--- at: ",TimeToString(TimeCurrent(),TIME_DATE|TIME_MINUTES));
      //--
      if(alerts==Yes)
        {
         Alert("--- "+Symbol()+","+strTF(Period())+": "+msg+
               "--- at: ",TimeToString(TimeCurrent(),TIME_DATE|TIME_MINUTES));
        }
      //--
      if(UseEmailAlert==Yes)
         SendMail(indname,"--- "+Symbol()+" "+strTF(Period())+": "+msg+
                  "\n--- at: "+TimeToString(TimeCurrent(),TIME_DATE|TIME_MINUTES));
      //--
      if(UseSendnotify==Yes)
         SendNotification(Symbol()+"--- "+Symbol()+" "+strTF(Period())+": "+msg+
                          "\n--- at: "+TimeToString(iTime(Symbol(),0,0),TIME_DATE|TIME_MINUTES));
      //--
      return;
      //---
     } //-end Do_Alerts()
   //---
   //---
   string            FontsModel(int mode)
     {
      string str_font;
      switch(mode)
        {
         case 0:
            str_font="Verdana";
            break;
         case 1:
            str_font="Bodoni MT Black";
            break;
        }
      //--
      return(str_font);
      //---
     } //-end FontsModel()
   //---
   //---
   void              ChangeChartSymbol(string tf_name,ENUM_TIMEFRAMES stf)
     {
      //---
      //--- unpress the button
      ObjectSetInteger(CI,tf_name,OBJPROP_STATE,false);
      ObjectSetInteger(CI,tf_name,OBJPROP_ZORDER,0);
      //--
      DeletedMFIObject();
      PanelPosChange(corpos);
      ChartSetSymbolPeriod(CI,Symbol(),stf);
      if(display)
         DrawMFIObject();
      //--
      ChartRedraw(CI);
      //--
      return;
      //---
     } //-end ChangeChartSymbol()
   //---
   //---
   void              DisplayPanelButton(void)
     {
      //--
      ObjectDelete(CI,cstar);
      ObjectDelete(CI,artop);
      ObjectDelete(CI,arbot);
      //--
      CreateButtonClick(CI,cstar,20,20,"Wingdings",13,BORDER_FLAT,cstar,clrWhite,clrWhite,TColor,CORNER_RIGHT_UPPER,25,40,true,"Open Panel Indicator");
      CreateButtonClick(CI,artop,18,18,"Wingdings",11,BORDER_FLAT,artop,clrWhite,clrWhite,clrGreen,CORNER_RIGHT_UPPER,24,20,true,"Change Panel to Top");
      CreateButtonClick(CI,arbot,18,18,"Wingdings",11,BORDER_FLAT,arbot,clrWhite,clrWhite,clrGreen,CORNER_RIGHT_UPPER,24,62,true,"Change Panel to Bottom");
      //--
      ChartRedraw(CI);
      //--
      return;
      //---
     } //-end DisplayPanelButton()
   //---
   //---
   void              DisplayButtonClick(string actreq)
     {
      //--
      if(actreq=="cstar")
         CreateButtonClick(CI,cstar,20,20,"Wingdings",13,BORDER_FLAT,cstar,clrWhite,clrWhite,TColor,CORNER_RIGHT_UPPER,25,40,true,"Open Panel Indicator");
      if(actreq=="artop")
         CreateButtonClick(CI,artop,18,18,"Wingdings",11,BORDER_FLAT,artop,clrWhite,clrWhite,clrGreen,CORNER_RIGHT_UPPER,24,20,true,"Change Panel to Top");
      if(actreq=="arbot")
         CreateButtonClick(CI,arbot,18,18,"Wingdings",11,BORDER_FLAT,arbot,clrWhite,clrWhite,clrGreen,CORNER_RIGHT_UPPER,24,62,true,"Change Panel to Bottom");
      if(actreq=="X")
         CreateButtonClick(CI,"X",17,15,"Arial Black",fontSize,BORDER_FLAT,"X",clrWhite,clrWhite,clrRed,bcor,txttf-7+(11*scaleA)+offsetX,cory,true,"Close Panel");
      //--
      ChartRedraw(CI);
      //--
      return;
      //---
     } //-end DisplayButtonClick()
   //---
   //---
   void              DeletedMFIObject(void)
     {
      //--
      string name;
      for(int i=ObjectsTotal(CI,-1,-1)-1; i>=0; i--)
        {
         name=ObjectName(CI,i,-1,-1);
         if(StringFind(name,ObjName,0)>-1)
            ObjectDelete(CI,name);
         for(int x=0; x<tfxar; x++)
           {
            if(StringFind(name,TFSc[x],0)>-1)
               ObjectDelete(CI,name);
           }
         //--
         ObjectDelete(CI,"X");
         ObjectDelete(CI,cstar);
         ObjectDelete(CI,artop);
         ObjectDelete(CI,arbot);
        }
      //--
      return;
      //---
     } //-end DeletedMFIObject()
   //---
   //---
   string            strTF(ENUM_TIMEFRAMES period)
     {
      string intf="";
      //--
      switch(period)
        {
         //--
         case PERIOD_M1:
           {intf="M1";  break;}
         case PERIOD_M2:
           {intf="M2";  break;}
         case PERIOD_M3:
           {intf="M3";  break;}
         case PERIOD_M4:
           {intf="M4";  break;}
         case PERIOD_M5:
           {intf="M5";  break;}
         case PERIOD_M6:
           {intf="M6";  break;}
         case PERIOD_M10:
           {intf="M10"; break;}
         case PERIOD_M12:
           {intf="M12"; break;}
         case PERIOD_M15:
           {intf="M15"; break;}
         case PERIOD_M20:
           {intf="M20"; break;}
         case PERIOD_M30:
           {intf="M30"; break;}
         case PERIOD_H1:
           {intf="H1";  break;}
         case PERIOD_H2:
           {intf="H2";  break;}
         case PERIOD_H3:
           {intf="H3";  break;}
         case PERIOD_H4:
           {intf="H4";  break;}
         case PERIOD_H6:
           {intf="H6";  break;}
         case PERIOD_H8:
           {intf="H8";  break;}
         case PERIOD_H12:
           {intf="H12"; break;}
         case PERIOD_D1:
           {intf="D1";  break;}
         case PERIOD_W1:
           {intf="W1";  break;}
         case PERIOD_MN1:
           {intf="MN1"; break;}
            //--
        }
      return(intf);
      //---
     } //-end strTF()
   //---
   //---
   string            getUninitReasonText(int reasonCode)
     {
      //--
      string text="";
      //--
      switch(reasonCode)
        {
         case REASON_PROGRAM:
            text="The EA has stopped working calling by remove function.";
            break;
         case REASON_REMOVE:
            text="Program "+__FILE__+" was removed from chart";
            break;
         case REASON_RECOMPILE:
            text="Program recompiled.";
            break;
         case REASON_CHARTCHANGE:
            text="Symbol or timeframe was changed";
            break;
         case REASON_CHARTCLOSE:
            text="Chart was closed";
            break;
         case REASON_PARAMETERS:
            text="Input-parameter was changed";
            break;
         case REASON_ACCOUNT:
            text="Account was changed";
            break;
         case REASON_TEMPLATE:
            text="New template was applied to chart";
            break;
         case REASON_INITFAILED:
            text="The OnInit() handler returned a non-zero value.";
            break;
         case REASON_CLOSE:
            text="Terminal closed.";
            break;
         default:
            text="Another reason";
            break;
        }
      //--
      return text;
      //---
     } //-end getUninitReasonText()
   //---
   //---
   int               WS(int width) // Width Scaling factor wide button
     {
      //--
      int res=0;
      int reswidth=0;
      //-- Calculating the scaling factor wide button on a screen
      int scale_factor=(TerminalInfoInteger(TERMINAL_SCREEN_DPI));
      // The basic width in the screen points for standard monitors with DPI=96
      //-- Use of the scaling factor
      reswidth=(width * scale_factor) / 96;
      res=(int)NormalizeDouble(reswidth*1.25,0);
      //--
      return(res);
      //---
     } //-end WS()
   //---
   //---
   void              CreateButtonClick(long   chartid,
                                       string button_name,
                                       int    button_x_size,
                                       int    button_y_size,
                                       string button_font_model,
                                       int    button_font_size,
                                       int    button_border,
                                       string button_name_text,
                                       color  button_bord_color,
                                       color  button_bg_color,
                                       color  button_color,
                                       int    button_corner,
                                       int    button_xdist,
                                       int    button_ydist,
                                       bool   button_hidden,
                                       string tooltip)
     {
      //--
      ObjectCreate(chartid,button_name,OBJ_BUTTON,0,0,0); // create button
      ObjectSetInteger(chartid,button_name,OBJPROP_XSIZE,WS(button_x_size));
      ObjectSetInteger(chartid,button_name,OBJPROP_YSIZE,WS(button_y_size));
      ObjectSetString(chartid,button_name,OBJPROP_TEXT,button_name_text);
      ObjectSetString(chartid,button_name,OBJPROP_FONT,button_font_model);
      ObjectSetInteger(chartid,button_name,OBJPROP_FONTSIZE,WS(button_font_size));
      ObjectSetInteger(chartid,button_name,OBJPROP_BORDER_TYPE,WS(button_border));
      ObjectSetInteger(chartid,button_name,OBJPROP_BORDER_COLOR,button_bord_color);
      ObjectSetInteger(chartid,button_name,OBJPROP_BGCOLOR,button_bg_color);
      ObjectSetInteger(chartid,button_name,OBJPROP_COLOR,button_color);
      ObjectSetInteger(chartid,button_name,OBJPROP_ANCHOR,ancp);
      ObjectSetInteger(chartid,button_name,OBJPROP_CORNER,button_corner);
      ObjectSetInteger(chartid,button_name,OBJPROP_XDISTANCE,WS(button_xdist));
      ObjectSetInteger(chartid,button_name,OBJPROP_YDISTANCE,WS(button_ydist));
      ObjectSetInteger(chartid,button_name,OBJPROP_HIDDEN,button_hidden);
      ObjectSetString(chartid,button_name,OBJPROP_TOOLTIP,tooltip);
      ChartRedraw(chartid);
      //--
      return;
      //---
     } //-end CreateButtonClick()
   //---
   //---
   bool              CreateArrowLabel(long   chart_id,
                                      string lable_name,
                                      string label_text,
                                      string font_model,
                                      int    font_size,
                                      color  label_color,
                                      int    chart_corner,
                                      int    x_cor,
                                      int    y_cor,
                                      bool   price_hidden,
                                      string tooltip)
     {
      //--
      ObjectDelete(chart_id,lable_name);
      //--
      if(!ObjectCreate(chart_id,lable_name,OBJ_LABEL,0,0,0,0,0)) // create Label
        {
         Print(__FUNCTION__, ": failed to create \"Arrow Label\" sign! Error code = ",GetLastError());
         return(false);
        }
      //--
      ObjectSetString(chart_id,lable_name,OBJPROP_TEXT,label_text);
      ObjectSetString(chart_id,lable_name,OBJPROP_FONT,font_model);
      ObjectSetInteger(chart_id,lable_name,OBJPROP_FONTSIZE,WS(font_size));
      ObjectSetInteger(chart_id,lable_name,OBJPROP_COLOR,label_color);
      ObjectSetInteger(chart_id,lable_name,OBJPROP_CORNER,chart_corner);
      ObjectSetInteger(chart_id,lable_name,OBJPROP_ANCHOR,ancp);
      ObjectSetInteger(chart_id,lable_name,OBJPROP_XDISTANCE,WS(x_cor));
      ObjectSetInteger(chart_id,lable_name,OBJPROP_YDISTANCE,WS(y_cor));
      ObjectSetInteger(chart_id,lable_name,OBJPROP_HIDDEN,price_hidden);
      ObjectSetString(chart_id,lable_name,OBJPROP_TOOLTIP,tooltip);
      //-- successful execution
      return(true);
      //---
     } //-end CreateArrowLabel()
   //---
   //---
   void              CreateButtonTemplate(long chartid,
                                          string obj_name,
                                          int    x_size,
                                          int    y_size,
                                          int    style,
                                          int    width,
                                          int    border,
                                          color  bordcolor,
                                          color  bgcolor,
                                          color  objcolor,
                                          int    corner,
                                          int    x_dist,
                                          int    y_dist,
                                          bool   hidden)
     {
      //--
      ObjectCreate(chartid,obj_name,OBJ_RECTANGLE_LABEL,0,0,0); // create Rectangle Label
      ObjectSetInteger(chartid,obj_name,OBJPROP_XSIZE,WS(x_size));
      ObjectSetInteger(chartid,obj_name,OBJPROP_YSIZE,WS(y_size));
      ObjectSetInteger(chartid,obj_name,OBJPROP_STYLE,style);
      ObjectSetInteger(chartid,obj_name,OBJPROP_WIDTH,WS(width));
      ObjectSetInteger(chartid,obj_name,OBJPROP_BORDER_TYPE,WS(border));
      ObjectSetInteger(chartid,obj_name,OBJPROP_BORDER_COLOR,bordcolor);
      ObjectSetInteger(chartid,obj_name,OBJPROP_BGCOLOR,bgcolor);
      ObjectSetInteger(chartid,obj_name,OBJPROP_COLOR,objcolor);
      ObjectSetInteger(chartid,obj_name,OBJPROP_CORNER,corner);
      ObjectSetInteger(chartid,obj_name,OBJPROP_XDISTANCE,WS(x_dist));
      ObjectSetInteger(chartid,obj_name,OBJPROP_YDISTANCE,WS(y_dist));
      ObjectSetInteger(chartid,obj_name,OBJPROP_HIDDEN,hidden);
      ChartRedraw(chartid);
      //--
      return;
      //---
     } //-end CreateButtonTemplate()
   //---
   //---
  }; //-end class MTF_Indi()
//---------//

MTF_Indi mi;

//---------//
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   mi.MFI_MTF_Config();
//--
   SetIndexBuffer(0,mi.PowerMove,INDICATOR_DATA);
   PlotIndexSetString(0,PLOT_LABEL,"Move");
//--
   IndicatorSetString(INDICATOR_SHORTNAME,mi.indname);
   IndicatorSetInteger(INDICATOR_DIGITS,2);
//---
   return(INIT_SUCCEEDED);
  }
//---------//
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   Comment("");
   Print(mi.getUninitReasonText(reason));
   //-- Release all handle indicators for all symbols
   for(int x=0; x<mi.tfxar; x++) 
     IndicatorRelease(mi.hMFI[x]);
//--
   mi.DeletedMFIObject();
//--
   ChartRedraw(mi.CI);
//---
   return;
//---
  } //-end OnDeinit()
//-------//
//+------------------------------------------------------------------+
//| 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[])
  {
//---
   ResetLastError();
   //--
   int limit;
   limit=rates_total-prev_calculated;
   if(prev_calculated>0)
      limit++;
   if(limit>mi.ttlbars)
      limit=mi.ttlbars;
   if(limit-3<=1)
      limit=3;
   //--
   mi.MFIMovementCalculation(limit);
   //--
   if(alerts==Yes||UseEmailAlert==Yes||UseSendnotify==Yes)
     {
       mi.curmin=mi.ThisTime(mi.min);
       if(mi.curmin!=mi.prvmin && mi.curAlert==1 && mi.curAlert!=mi.prvAlert)
         {
           string AlertTxt="The strength of the MFI movement appears to be Rise.";
           mi.Do_Alerts(AlertTxt);
           mi.prvAlert=mi.curAlert;
           mi.prvmin=mi.curmin;
         }
       if(mi.curmin!=mi.prvmin && mi.curAlert==-1 && mi.curAlert!=mi.prvAlert)
         {
           string AlertTxt="The strength of the MFI movement appears to be Down.";
           mi.Do_Alerts(AlertTxt);
           mi.prvAlert=mi.curAlert;
           mi.prvmin=mi.curmin;
         }
     }
   //--
   if(mi.display)
     mi.DrawMFIObject();
   //---
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//---------//
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//---
//--- handling CHARTEVENT_CLICK event ("Clicking the chart")
   ResetLastError();
//--
   if(id==CHARTEVENT_OBJECT_CLICK)
     {
      //--- if "X" button is click
      if(sparam=="X")
        {
         mi.DeletedMFIObject();
         //--- unpress the button
         ObjectSetInteger(mi.CI,"X",OBJPROP_STATE,false);
         ObjectSetInteger(mi.CI,"X",OBJPROP_ZORDER,0);
         //--
         mi.display=false;
         ObjectDelete(mi.CI,"X");
         mi.DisplayPanelButton();
        }
      //--- if "cstar" button is click
      if(sparam==mi.cstar)
        {
         mi.DeletedMFIObject();
         mi.DisplayPanelButton();
         //--- unpress the button
         ObjectSetInteger(mi.CI,mi.cstar,OBJPROP_STATE,false);
         ObjectSetInteger(mi.CI,mi.cstar,OBJPROP_ZORDER,0);
         if(!mi.display)
            mi.display=true;
         if(mi.corpos==mi.posbot) ObjectDelete(mi.CI,mi.arbot);
         if(mi.corpos==mi.postop) ObjectDelete(mi.CI,mi.artop);
         mi.DrawMFIObject();
         //--
         ChartRedraw(mi.CI);
        }
      //--- if "artop" button is click
      if(sparam==mi.artop)
        {
         mi.DeletedMFIObject();
         mi.DisplayPanelButton();
         //--- unpress the button
         ObjectSetInteger(mi.CI,mi.artop,OBJPROP_STATE,false);
         ObjectSetInteger(mi.CI,mi.artop,OBJPROP_ZORDER,0);
         if(!mi.display)
            mi.display=true;
         ObjectDelete(mi.CI,mi.artop);
         mi.PanelPosChange(mi.postop);
         //--
         ObjectDelete(mi.CI,"X");
         mi.DisplayButtonClick("arbot");
         mi.DrawMFIObject();
         //--
         ChartRedraw(mi.CI);
        }
      //--- if "arbot" button is click
      if(sparam==mi.arbot)
        {
         mi.DeletedMFIObject();
         mi.DisplayPanelButton();
         //--- unpress the button
         ObjectSetInteger(mi.CI,mi.arbot,OBJPROP_STATE,false);
         ObjectSetInteger(mi.CI,mi.arbot,OBJPROP_ZORDER,0);
         if(!mi.display)
            mi.display=true;
         ObjectDelete(mi.CI,mi.arbot);
         mi.PanelPosChange(mi.posbot);
         //--
         ObjectDelete(mi.CI,"X");
         mi.DisplayButtonClick("artop");
         mi.DrawMFIObject();
         //--
         ChartRedraw(mi.CI);
        }
      //--- if TF button is click
      //--
      if(sparam==mi.TFSc[0])
        {
         mi.ChangeChartSymbol(mi.TFSc[0],mi.TFId[0]);
        }
      //--
      if(sparam==mi.TFSc[1])
        {
         mi.ChangeChartSymbol(mi.TFSc[1],mi.TFId[1]);
        }
      //--
      if(sparam==mi.TFSc[2])
        {
         mi.ChangeChartSymbol(mi.TFSc[2],mi.TFId[2]);
        }
      //--
      if(sparam==mi.TFSc[3])
        {
         mi.ChangeChartSymbol(mi.TFSc[3],mi.TFId[3]);
        }
      //--
      if(sparam==mi.TFSc[4])
        {
         mi.ChangeChartSymbol(mi.TFSc[4],mi.TFId[4]);
        }
      //--
      if(sparam==mi.TFSc[5])
        {
         mi.ChangeChartSymbol(mi.TFSc[5],mi.TFId[5]);
        }
      //--
      if(sparam==mi.TFSc[6])
        {
         mi.ChangeChartSymbol(mi.TFSc[6],mi.TFId[6]);
        }
      //--
      if(sparam==mi.TFSc[7])
        {
         mi.ChangeChartSymbol(mi.TFSc[7],mi.TFId[7]);
        }
      //--
      if(sparam==mi.TFSc[8])
        {
         mi.ChangeChartSymbol(mi.TFSc[8],mi.TFId[8]);
        }
      //--
      if(sparam==mi.TFSc[9])
        {
         mi.ChangeChartSymbol(mi.TFSc[9],mi.TFId[9]);
        }
      //--
      if(sparam==mi.TFSc[10])
        {
         mi.ChangeChartSymbol(mi.TFSc[10],mi.TFId[10]);
        }
      //--
      if(sparam==mi.TFSc[11])
        {
         mi.ChangeChartSymbol(mi.TFSc[11],mi.TFId[11]);
        }
      //--
      if(sparam==mi.TFSc[12])
        {
         mi.ChangeChartSymbol(mi.TFSc[12],mi.TFId[12]);
        }
      //--
      if(sparam==mi.TFSc[13])
        {
         mi.ChangeChartSymbol(mi.TFSc[13],mi.TFId[13]);
        }
      //--
      if(sparam==mi.TFSc[14])
        {
         mi.ChangeChartSymbol(mi.TFSc[14],mi.TFId[14]);
        }
      //--
      if(sparam==mi.TFSc[15])
        {
         mi.ChangeChartSymbol(mi.TFSc[15],mi.TFId[15]);
        }
      //--
      if(sparam==mi.TFSc[16])
        {
         mi.ChangeChartSymbol(mi.TFSc[16],mi.TFId[16]);
        }
      //--
      if(sparam==mi.TFSc[17])
        {
         mi.ChangeChartSymbol(mi.TFSc[17],mi.TFId[17]);
        }
      //--
      if(sparam==mi.TFSc[18])
        {
         mi.ChangeChartSymbol(mi.TFSc[18],mi.TFId[18]);
        }
      //--
      if(sparam==mi.TFSc[19])
        {
         mi.ChangeChartSymbol(mi.TFSc[19],mi.TFId[19]);
        }
      //--
      if(sparam==mi.TFSc[20])
        {
         mi.ChangeChartSymbol(mi.TFSc[20],mi.TFId[20]);
        }
      //--
     }
//---
  } //-end OnChartEvent()
//---------//
***Copyright © 2025 3rjfx ~ For educational purposes only.***

Please download the MFI_MTF indicator: Money Flow Index Multi-Timeframe Indicator for MT5


© 2025 MFI_MTF - Developed by Roberto Jacobs (3rjfx)

Tagged: , , , , ,

0 comments:

Post a Comment

Featured Post

A Comprehensive Guide to FiboPivotCandleBar: Functions and Performance of the Expert Advisor for MT5

Author: Roberto Jacobs (3rjfx) | Featured on Forex Home Expert FiboPivotCandleBar is a sophisticated trading tool designed to prov...