xMeterMTF1
Download scriptOverview 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.
/*
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