Author: x Meter System� �GPL
xMeterMTF1

Overview of the Price Meter System

The script is designed as a visual analytical tool for forex traders. Its primary purpose is to measure and display the relative "strength" or "power" of major world currencies in real-time. Instead of looking at individual price movements, this tool aggregates data across multiple currency pairs to provide a comprehensive snapshot of which currencies are leading the market and which are lagging.

How the Logic Works

1. Data Collection and Range Analysis The system monitors a specific set of major currency pairs (such as EURUSD, USDJPY, etc.). For each pair, it calculates the price range—the difference between the highest and lowest prices over a defined period. It then determines where the current market price sits within that range.

2. Strength Scoring By identifying where a currency is trading relative to its daily highs and lows, the script assigns a numerical "grade" or power score to each individual pair:

  • If a currency is trading near its high for the day, it is considered strong.
  • If it is trading near its low, it is considered weak.

3. Aggregate Currency Calculation This is the core logic of the tool. Rather than just showing you the strength of one pair, the script isolates each individual major currency (like the USD, EUR, or GBP) and looks at every pair it participates in.

  • For example, to calculate the "Power" of the US Dollar (USD), the script looks at every pair where the USD is either the base currency or the quote currency.
  • It averages the scores from all these different interactions to produce a single, unified strength rating for that specific currency.

4. Visual Representation The results are displayed on your trading chart as a "Meter." The tool translates the calculated numerical scores into a visual gauge:

  • Color Coding: The meter uses a gradient of colors (ranging from Red to Lime) to indicate the intensity of a currency's strength. Higher values trigger brighter, more positive colors, allowing traders to identify market leaders at a glance.
  • Dynamic Updates: The script continuously refreshes this data, updating the positions and colors on the meter automatically as market prices fluctuate.

Summary for the Trader

Essentially, this tool acts like a "power meter" for the global forex market. It strips away the noise of individual pair fluctuations and provides a bird's-eye view of currency trends, helping you see which currencies are currently dominating the market and which are under pressure.

Price Data Components
Series array that contains the highest prices of each barSeries array that contains the lowest prices of each bar
10 Views
0 Downloads
0 Favorites
xMeterMTF1
/*
xMeterMTF.mq4     
Copyright © 2007, MetaQuotes Software Corp.     
Price Meter System™ ©GPL     

Hartono Setiono
   5/17/2007 Redsigned based on xMeter_mini.mq4 indicator
*/

#property copyright "x Meter System™ ©GPL"
#property link      "forex-tsd dot com"
#include <stdlib.mqh>
#include <stderror.mqh> 

#define ARRSIZE  12                     // number of pairs !!!DON'T CHANGE THIS NUMBER!!!
#define PAIRSIZE 7                      // number of currencies !!!DON'T CHANGE THIS NUMBER!!!
#define TABSIZE  10                     // scale of currency's power !!!DON'T CHANGE THIS NUMBER!!!
#define ORDER    2                      // available type of order !!!DON'T CHANGE THIS NUMBER!!!

extern bool AccountIsIBFXmini = false;
extern int mTimeFrame = 1440;
extern int mPeriod=3;
extern bool LoopOnInit=false;

   string aPair[ARRSIZE]   = {"EURUSD","GBPUSD","AUDUSD","USDJPY","USDCHF","USDCAD",
                              "EURJPY","EURGBP","EURCHF","EURAUD","GBPJPY","GBPCHF"};
   string aMajor[PAIRSIZE] = {"USD","EUR","GBP","CHF","CAD","AUD","JPY"};
   int    aMajorPos[PAIRSIZE] = {130, 110, 90, 70, 50, 30, 10};
   string aOrder[ORDER]    = {"BUY ","SELL "};
   int    aTable[TABSIZE]  = {0,3,10,25,40,50,60,75,90,97};                 // grade table for currency's power

//+------------------------------------------------------------------+
//     expert initialization function                                |       
//+------------------------------------------------------------------+
int init()
  {
   int   err,lastError;
//----
   initGraph();
   if (LoopOnInit)
   {
      while (true)                                                           // infinite loop for main program
      {
        if (IsConnected()) main();
        if (!IsConnected()) objectBlank();
        WindowRedraw();
        Sleep(1000);                                                          // give your PC a breath
      }
   }
//----
   return(0);                                                               // end of init function
  }
//+------------------------------------------------------------------+
//     expert deinitialization function                              |       
//+------------------------------------------------------------------+
int deinit()
  {
//----
   ObjectsDeleteAll(0,OBJ_LABEL);
   Print("shutdown error - ",ErrorDescription(GetLastError()));                               // system is detached from platform
//----
   return(0);                                                               // end of deinit function
  }
//+------------------------------------------------------------------+
//     expert start function                                         |       
//+------------------------------------------------------------------+
int start()
  {
//----
   if (!LoopOnInit) main();
//----
   return(0);                                                               // end of start funtion
  }
//+------------------------------------------------------------------+
//     expert custom function                                        |       
//+------------------------------------------------------------------+    
void main()                                                                 // this a control center
  {
//----
   double aMeter[PAIRSIZE];
   double aHigh[ARRSIZE];
   double aLow[ARRSIZE];
   double aBid[ARRSIZE];
   double aAsk[ARRSIZE];
   double aRatio[ARRSIZE];
   double aRange[ARRSIZE];
   double aLookup[ARRSIZE];
   double aStrength[ARRSIZE];
   double point;
   int    index, pindex, cnt;
   string mySymbol;
   double cmeter;
     
   for (index = 0; index < ARRSIZE; index++)                                // initialize all pairs required value 
      {
      RefreshRates();                                                       // refresh all currency's instrument
      if (AccountIsIBFXmini)
         mySymbol = aPair[index]+'m';                                       // Add "m for IBFX mini
      else
         mySymbol = aPair[index];                        
      point            = GetPoint(mySymbol);                                // get a point basis
      aHigh[index]     = iHigh(mySymbol,mTimeFrame,iHighest(mySymbol,mTimeFrame,MODE_HIGH,mPeriod,0));   // find highest
      aLow[index]      = iLow(mySymbol,mTimeFrame,iLowest(mySymbol,mTimeFrame,MODE_LOW,mPeriod,0));   // find lowest
      aBid[index]      = MarketInfo(mySymbol,MODE_BID);                 // set a last bid
      aAsk[index]      = MarketInfo(mySymbol,MODE_ASK);                 // set a last ask
      aRange[index]    = MathMax((aHigh[index]-aLow[index])/point,1);       // calculate range today
      aRatio[index]    = (aBid[index]-aLow[index])/aRange[index]/point;     // calculate pair ratio
      aLookup[index]   = iLookup(aRatio[index]*100);                        // set a pair grade
      aStrength[index] = 9-aLookup[index];                                  // set a pair strengh
      } 

   // calculate all currencies meter         
   for (pindex=0; pindex<PAIRSIZE; pindex++)
   { 
     cnt=0; 
     cmeter=0;
     for (index = 0; index < ARRSIZE; index++)                                // initialize all pairs required value 
     {
       if (StringSubstr(aPair[index],0,3)==aMajor[pindex])
       {
        cnt++;
        cmeter = cmeter + aLookup[index];
       }
       if (StringSubstr(aPair[index],3,3)==aMajor[pindex])
       {
        cnt++;
        cmeter = cmeter + aStrength[index];
       }
       if (cnt>0) aMeter[pindex]=NormalizeDouble(cmeter / cnt,1); else aMeter[pindex]=-1;
       //Print(aMajor[pindex],":",StringSubstr(aPair[index],1,3),":",StringSubstr(aPair[index],4,3),":",cmeter,":",cnt);
     }
   }
             
   objectBlank();
   
   for (pindex=0; pindex<PAIRSIZE; pindex++)
   {
     paintCurr(pindex, aMeter[pindex]); 
   }
   paintLine();
                                                                            
//----
  }
  
double GetPoint(string mSymbol)
{
 double myPoint = 0.0001, YenPoint = 0.01;
 string mySymbol;
 if (StringSubstr(mySymbol,3,3) == "JPY") return (YenPoint);
 return(myPoint);

}
  
int iLookup(double ratio)                                                   // this function will return a grade value
  {                                                                         // based on its power.
   int   index=-1, i;
   
   if      (ratio <= aTable[0]) index = 0;
   else {
     for (i=1; i<TABSIZE; i++) if(ratio < aTable[i]) {index=i-1;  break; }
     if(index==-1) index=9;
   }
   return(index);                                                           // end of iLookup function
  }
  
void initGraph()
  {
   int pindex;
   ObjectsDeleteAll(0,OBJ_LABEL);

   for (pindex=0; pindex<PAIRSIZE; pindex++)
   { 
   objectCreate(aMajor[pindex]+"_1",aMajorPos[pindex],43);
   objectCreate(aMajor[pindex]+"_2",aMajorPos[pindex],35);
   objectCreate(aMajor[pindex]+"_3",aMajorPos[pindex],27);
   objectCreate(aMajor[pindex]+"_4",aMajorPos[pindex],19);
   objectCreate(aMajor[pindex]+"_5",aMajorPos[pindex],11);
   objectCreate(aMajor[pindex],aMajorPos[pindex]+2,12,aMajor[pindex],7,"Arial Narrow",SkyBlue);
   objectCreate(aMajor[pindex]+"p",aMajorPos[pindex]+4,21,DoubleToStr(9,1),8,"Arial Narrow",Silver);
   }
   
   objectCreate("line",10,6,"-----------------------------------",10,"Arial",DimGray);  
   objectCreate("line1",10,27,"-----------------------------------",10,"Arial",DimGray);  
   objectCreate("line2",10,69,"-----------------------------------",10,"Arial",DimGray);
   objectCreate("sign",11,1,"»»» Price Meter System™ ©GPL «««",8,"Arial Narrow",DimGray);
   WindowRedraw();
  }
//+------------------------------------------------------------------+
void objectCreate(string name,int x,int y,string text="-",int size=42,
                  string font="Arial",color colour=CLR_NONE)
  {
   ObjectCreate(name,OBJ_LABEL,0,0,0);
   ObjectSet(name,OBJPROP_CORNER,3);
   ObjectSet(name,OBJPROP_COLOR,colour);
   ObjectSet(name,OBJPROP_XDISTANCE,x);
   ObjectSet(name,OBJPROP_YDISTANCE,y);
   ObjectSetText(name,text,size,font,colour);
  }

void objectBlank()
  {
   int pindex;
   
   for (pindex=0; pindex<PAIRSIZE; pindex++)
   { 
   ObjectSet(aMajor[pindex]+"_1",OBJPROP_COLOR,CLR_NONE);
   ObjectSet(aMajor[pindex]+"_2",OBJPROP_COLOR,CLR_NONE);
   ObjectSet(aMajor[pindex]+"_3",OBJPROP_COLOR,CLR_NONE);
   ObjectSet(aMajor[pindex]+"_4",OBJPROP_COLOR,CLR_NONE);
   ObjectSet(aMajor[pindex]+"_5",OBJPROP_COLOR,CLR_NONE);
   ObjectSet(aMajor[pindex],OBJPROP_COLOR,CLR_NONE);
   ObjectSet(aMajor[pindex]+"p",OBJPROP_COLOR,CLR_NONE);
   }
  
   ObjectSet("line1",OBJPROP_COLOR,CLR_NONE);
   ObjectSet("line2",OBJPROP_COLOR,CLR_NONE); 
  }
  
void paintCurr(int pindex, double value)
{
  if (value > 0) ObjectSet(aMajor[pindex]+"_5",OBJPROP_COLOR,Red);
  if (value > 2) ObjectSet(aMajor[pindex]+"_4",OBJPROP_COLOR,Orange);
  if (value > 4) ObjectSet(aMajor[pindex]+"_3",OBJPROP_COLOR,Gold);   
  if (value > 6) ObjectSet(aMajor[pindex]+"_2",OBJPROP_COLOR,YellowGreen);
  if (value > 7) ObjectSet(aMajor[pindex]+"_1",OBJPROP_COLOR,Lime);
  ObjectSet(aMajor[pindex],OBJPROP_COLOR,SkyBlue);
  ObjectSetText(aMajor[pindex]+"p",DoubleToStr(value,1),8,"Arial Narrow",Silver);
}
  
void paintLine()
  {
   ObjectSet("line1",OBJPROP_COLOR,DimGray);
   ObjectSet("line2",OBJPROP_COLOR,DimGray);
  }

Comments