BW MFI |
BW MFI |
BW MFI |
BW MFI |
The Market Facilitation Index - BW MFI (MFI) is the creation of Dr. Bill Williams. In his book "Trading Chaos", where plays a key role unique indicator Market Facilitation Index - BW MFI (MFI), Bill Williams introduces a new method of combining price and volume in order to see the true market development. It is an indicator, which shows the change of price for one tick, respectively endeavors to establish the effectiveness of price movement by computing the price movement per volume unit. This is accomplished by subtracting the days low from the high and dividing the result by the total volume.
The indicator highlight four zones:
Green - The BW MFI increases and the volume increases. This points out that, the number of players coming into the market increases - increasing the volume, or the new coming players open positions in the direction of market development.
Brown - The BW MFI falls and volume falls. It means the market participants are not interested anymore. Often this can be observed at the end of a trend.
Blue - The BW MFI increases, but the volume falls. The market is not supported by major clients, only speculative trade.
Pink - The BW MFI falls, but the volume increases. Fighting between the purchase and sale, which increases the volume, but price remains unchanged.
The indicator highlight four zones:
Green - The BW MFI increases and the volume increases. This points out that, the number of players coming into the market increases - increasing the volume, or the new coming players open positions in the direction of market development.
Brown - The BW MFI falls and volume falls. It means the market participants are not interested anymore. Often this can be observed at the end of a trend.
Blue - The BW MFI increases, but the volume falls. The market is not supported by major clients, only speculative trade.
Pink - The BW MFI falls, but the volume increases. Fighting between the purchase and sale, which increases the volume, but price remains unchanged.
Mathematical Formula:
Market Facilitation Index (BW MFI) = RANGE*(HIGH-LOW)/VOLUME
Market Facilitation Index - BW MFI MQ4 Code Base (Copy Code)
//+------------------------------------------------------------------+ //| BW Market Facilitation Index.mq4 | //| Copyright © 2005, MetaQuotes Software Corp. | //| http://www.metaquotes.net/ | //+------------------------------------------------------------------+ #property copyright "Copyright © 2004, MetaQuotes Software Corp." #property link "http://www.metaquotes.net/" //---- indicator settings #property indicator_separate_window #property indicator_minimum 0 #property indicator_buffers 5 #property indicator_color1 Black #property indicator_color2 Lime #property indicator_color3 SaddleBrown #property indicator_color4 Blue #property indicator_color5 Pink #property indicator_width2 2 #property indicator_width3 2 #property indicator_width4 2 #property indicator_width5 2 //---- indicator buffers double ExtMFIBuffer[]; double ExtMFIUpVUpBuffer[]; double ExtMFIDownVDownBuffer[]; double ExtMFIUpVDownBuffer[]; double ExtMFIDownVUpBuffer[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { //---- indicator buffers mapping SetIndexBuffer(0,ExtMFIBuffer); SetIndexBuffer(1,ExtMFIUpVUpBuffer); SetIndexBuffer(2,ExtMFIDownVDownBuffer); SetIndexBuffer(3,ExtMFIUpVDownBuffer); SetIndexBuffer(4,ExtMFIDownVUpBuffer); //---- drawing settings SetIndexStyle(0,DRAW_NONE); SetIndexStyle(1,DRAW_HISTOGRAM); SetIndexStyle(2,DRAW_HISTOGRAM); SetIndexStyle(3,DRAW_HISTOGRAM); SetIndexStyle(4,DRAW_HISTOGRAM); //---- name for DataWindow and indicator subwindow label IndicatorShortName("BW MFI"); SetIndexLabel(0,"BW MFI"); SetIndexLabel(1,NULL); SetIndexLabel(2,NULL); SetIndexLabel(3,NULL); SetIndexLabel(4,NULL); //---- sets drawing line empty value SetIndexEmptyValue(0, 0.0); SetIndexEmptyValue(1, 0.0); SetIndexEmptyValue(2, 0.0); SetIndexEmptyValue(3, 0.0); SetIndexEmptyValue(4, 0.0); //---- initialization done return(0); } //+------------------------------------------------------------------+ //| BW Market Facilitation Index | //+------------------------------------------------------------------+ int start() { int i,nLimit,nCountedBars; bool bMfiUp=true,bVolUp=true; //---- bars count that does not changed after last indicator launch. nCountedBars=IndicatorCounted(); //---- last counted bar will be recounted if(nCountedBars>0) nCountedBars--; nLimit=Bars-nCountedBars; //---- Market Facilitation Index calculation for(i=0; i<nLimit; i++) { if(CompareDouble(Volume[i],0.0)) { Print(Volume[i]); if(i==Bars-1) ExtMFIBuffer[i]=0.0; else ExtMFIBuffer[i]=ExtMFIBuffer[i+1]; } else ExtMFIBuffer[i]=(High[i]-Low[i])/(Volume[i]*Point); } //---- upanddown flags setting if(nCountedBars>1) { //---- analyze previous bar before recounted bar i=nLimit+1; if(ExtMFIUpVUpBuffer[i]!=0.0) { bMfiUp=true; bVolUp=true; } if(ExtMFIDownVDownBuffer[i]!=0.0) { bMfiUp=false; bVolUp=false; } if(ExtMFIUpVDownBuffer[i]!=0.0) { bMfiUp=true; bVolUp=false; } if(ExtMFIDownVUpBuffer[i]!=0.0) { bMfiUp=false; bVolUp=true; } } //---- dispatch values between 4 buffers for(i=nLimit-1; i>=0; i--) { if(i<Bars-1) { if(ExtMFIBuffer[i]>ExtMFIBuffer[i+1]) bMfiUp=true; if(ExtMFIBuffer[i]<ExtMFIBuffer[i+1]) bMfiUp=false; if(Volume[i]>Volume[i+1]) bVolUp=true; if(Volume[i]<Volume[i+1]) bVolUp=false; } if(bMfiUp && bVolUp) { ExtMFIUpVUpBuffer[i]=ExtMFIBuffer[i]; ExtMFIDownVDownBuffer[i]=0.0; ExtMFIUpVDownBuffer[i]=0.0; ExtMFIDownVUpBuffer[i]=0.0; continue; } if(!bMfiUp && !bVolUp) { ExtMFIUpVUpBuffer[i]=0.0; ExtMFIDownVDownBuffer[i]=ExtMFIBuffer[i]; ExtMFIUpVDownBuffer[i]=0.0; ExtMFIDownVUpBuffer[i]=0.0; continue; } if(bMfiUp && !bVolUp) { ExtMFIUpVUpBuffer[i]=0.0; ExtMFIDownVDownBuffer[i]=0.0; ExtMFIUpVDownBuffer[i]=ExtMFIBuffer[i]; ExtMFIDownVUpBuffer[i]=0.0; continue; } if(!bMfiUp && bVolUp) { ExtMFIUpVUpBuffer[i]=0.0; ExtMFIDownVDownBuffer[i]=0.0; ExtMFIUpVDownBuffer[i]=0.0; ExtMFIDownVUpBuffer[i]=ExtMFIBuffer[i]; continue; } } //---- done return(0); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ bool CompareDouble(double dNumber1, double dNumber2) { bool bCompare=NormalizeDouble(dNumber1-dNumber2,8) == 0; return(bCompare); } //+------------------------------------------------------------------+
Market Facilitation Index - BW MFI MQ5 Code Base (Copy Code)
//+------------------------------------------------------------------+ //| MarketFacilitationIndex.mq5 | //| Copyright 2009, MetaQuotes Software Corp. | //| http://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "2009, MetaQuotes Software Corp." #property link "http://www.mql5.com" //--- indicator settings #property indicator_separate_window #property indicator_buffers 2 #property indicator_plots 1 #property indicator_type1 DRAW_COLOR_HISTOGRAM #property indicator_color1 Lime,SaddleBrown,Blue,Pink #property indicator_width1 2 //--- input parameter input ENUM_APPLIED_VOLUME InpVolumeType=VOLUME_TICK; // Volumes //---- buffers double ExtMFIBuffer[]; double ExtColorBuffer[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ void OnInit() { //---- indicators SetIndexBuffer(0,ExtMFIBuffer,INDICATOR_DATA); SetIndexBuffer(1,ExtColorBuffer,INDICATOR_COLOR_INDEX); //--- name for DataWindow IndicatorSetString(INDICATOR_SHORTNAME,"BWMFI"); //--- set accuracy IndicatorSetInteger(INDICATOR_DIGITS,_Digits); //---- } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void CalculateMFI(const int start,const int rates_total, const double &High[], const double &Low[], const long &Volume[]) { int i=start; bool mfi_up=true,vol_up=true; //--- calculate first values of mfi_up and vol_up if(i>0) { int n=i; while(n>0) { if(ExtMFIBuffer[n]>ExtMFIBuffer[n-1]) { mfi_up=true; break; } if(ExtMFIBuffer[n]<ExtMFIBuffer[n-1]) { mfi_up=false; break; } //--- if mfi values are equal continue n--; } n=i; while(n>0) { if(Volume[n]>Volume[n-1]) { vol_up=true; break; } if(Volume[n]<Volume[n-1]) { vol_up=false; break; } //--- if real volumes are equal continue n--; } } //--- while(i<rates_total && !IsStopped()) { if(Volume[i]==0) { if(i>0) ExtMFIBuffer[i]=ExtMFIBuffer[i-1]; else ExtMFIBuffer[i]=0; } else ExtMFIBuffer[i]=(High[i]-Low[i])/_Point/Volume[i]; //--- calculate changes if(i>0) { if(ExtMFIBuffer[i]>ExtMFIBuffer[i-1]) mfi_up=true; if(ExtMFIBuffer[i]<ExtMFIBuffer[i-1]) mfi_up=false; if(Volume[i]>Volume[i-1]) vol_up=true; if(Volume[i]<Volume[i-1]) vol_up=false; } //--- set colors if(mfi_up && vol_up) ExtColorBuffer[i]=0.0; if(!mfi_up && !vol_up) ExtColorBuffer[i]=1.0; if(mfi_up && !vol_up) ExtColorBuffer[i]=2.0; if(!mfi_up && vol_up) ExtColorBuffer[i]=3.0; i++; } } //+------------------------------------------------------------------+ //| 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 &TickVolume[], const long &Volume[], const int &Spread[]) { //--- int start=0; //--- if(start<prev_calculated) start=prev_calculated-1; //--- calculate with tick or real volumes if(InpVolumeType==VOLUME_TICK) CalculateMFI(start,rates_total,High,Low,TickVolume); else CalculateMFI(start,rates_total,High,Low,Volume); //--- normalize last mfi value if(rates_total>1) { datetime ctm=TimeTradeServer(),lasttm=Time[rates_total-1],nexttm=lasttm+datetime(PeriodSeconds()); if(ctm<nexttm && ctm>=lasttm && nexttm!=lasttm) { double correction_koef=double(1+ctm-lasttm)/double(nexttm-lasttm); ExtMFIBuffer[rates_total-1]*=correction_koef; } } //--- return(rates_total); } //+------------------------------------------------------------------+