This script is a specialized financial analysis tool designed to calculate and visualize independent "strength indices" for major currencies (USD, EUR, GBP, JPY, and CHF). Instead of looking at a single currency pair in isolation, the logic synthesizes data from multiple pairs to determine the relative strength of individual currencies.
Core Logic Overview
The script operates by breaking down currency movements into their base components. For example, if you are viewing a chart for the Euro (EUR) against the US Dollar (USD), the tool doesn't just look at that specific pair. It calculates a separate "index value" for the EUR and a separate "index value" for the USD based on how those currencies perform against all other major counterparts simultaneously.
How it Works Step-by-Step
1. Currency Decomposition The script identifies each of the five major currencies and creates a mathematical model for each one. It looks at the exchange rates of various pairs to isolate the behavior of a single currency:
- USD Index: Derived from its relationship with CHF, JPY, GBP, and EUR.
- EUR Index: Derived from its relationships with USD, GBP, CHF, and JPY.
- GBP Index: Derived from its relationships with USD, CHF, JPY, and EUR.
- CHF Index: Derived from its relationships with JPY, USD, EUR, and GBP.
- JPY Index: Derived from its relationships with USD, EUR, GBP, and CHF.
2. Smoothing and Normalization To ensure the data is readable and less "noisy," the script applies two layers of smoothing:
- Initial Smoothing: It first uses a moving average on the raw price data to filter out sudden, insignificant spikes.
- Final Smoothing: After calculating the relative strength indices, it applies a secondary Relative Strength Index (RSI) calculation and another moving average. This creates a fluid line that represents the momentum of that specific currency.
3. Dynamic Pair Matching Depending on which chart you have open, the script automatically identifies the two currencies involved in that pair. It then plots two distinct lines on your screen:
- One line represents the strength of the Base Currency.
- The other line represents the strength of the Quote Currency.
Practical Application
By observing these two lines together, a user can see which currency is gaining momentum relative to the other. Because these values are derived from a broad basket of pairs rather than just one, the resulting movement is intended to show the "true" strength of the currencies, helping to filter out the noise of individual pair fluctuations.
Technical Constraints
- Supported Pairs: The script is specifically programmed to work on pairs involving the major currencies (USD, EUR, GBP, JPY, CHF). If used on a pair not listed in its internal logic, it will trigger an error message.
- Data Synchronization: The script automatically aligns the time data across different charts to ensure that the strength indices are calculated based on the exact same moment in history.
//+-------------------------------------------------------------------------+
//| Index_pair_v22b.mq4 |
//| GrayMan77 |
//| Ðàñ÷åò RSI îò èíäåêñîâ âàëþò ïàðû |
//| Èäåÿ ðàñ÷åòà èíäåêñà: |
//| - Þ.Ìàêàðîâ |
//| http://www.may.nnov.ru/mak/ |
//| - À.Ïëÿñóíîâ |
//| http://www.umis.ru/clients1/study/trading_school/fc_methods?start=0 |
//| Èäåÿ ïðèìåíåíèÿ RSI - akadex |
//| http://www.kroufr.ru/forum/index.php?topic=2692.msg6724;topicseen |
//| Ðåàëèçàöèÿ - GrayMan77 |
//| |
//| ÏÐÈÌÅÍßÒÜ ÒÎËÜÊÎ ÄËß ÏÀÐ ÂÀËÞÒ USD,EUR,GBP,JPY,CHF! |
//| ----------------------------------------------------------------------- |
//| v1 - ïåðåïèñàí èíäèêàòîð îò akadex dex_RSIndex.mq4: |
//| äîáàâëåíî àâòîîïðåäåëåíèå ïàðû, IndicatorCounted è |
//| ïåðâè÷íîå ñãëàæèâàíèå öåíû (FirstEMA). |
//| |
//| v2 - âû÷èñëåíèå èíäåêñîâ äðóãèõ âàëþò ÷åðåç êðîññû |
//| (áåç âåñîâûõ êîýôôèöèåíòîâ) |
//| |
//| v21 - èíäèêàòîð ïåðåïèñàí ñ öåëüþ îïòèìèçàöèè |
//| |
//| v22 - ðàñ÷åò èíäåêñîâ - â ôóíêöèÿõ |
//| |
//| v22b - ïîèñê áàðîâ â èñòîðèè íå ïî ñìåùåíèþ, à ïî âðåìåíè |
//| |
//+-------------------------------------------------------------------------+
#property copyright "GrayMan77"
#property link ""
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1 Red
#property indicator_color2 Aqua
#property indicator_level1 30
#property indicator_level2 50
#property indicator_level3 70
//#property indicator_width1 2
//#property indicator_minimum 0
//#property indicator_maximum 100
//---- Âíåøíèå ïàðàìåòðû
extern int RSIPeriod=12;
extern int Smooth=10;
extern int PeriodFirstEMA=3; // Ïåðâè÷íîå ñãëàæèâàíèå - ïåðèîä
extern int PriceFirstEMA=6; // Ïåðâè÷íîå ñãëàæèâàíèå - öåíà:
// 0-Close; 1-Open; 2-High; 3-Low; 4-(H+L)/2; 5-(H+L+C)/3; 6-(H+L+C+C)/4.
//---- Áóôåðû èíäèêàòîðà
double IndexBuffer[],Buffer[],RSIBuffer[];
double IndexBuffer1[],Buffer1[],RSIBuffer1[];
//---- Ïåðåìåííûå
int BarsMin;
bool Show=false;
//----
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//---- indicators
IndicatorBuffers(6);
SetIndexBuffer(0,RSIBuffer);
SetIndexStyle(0,DRAW_LINE);
SetIndexBuffer(1,RSIBuffer1);
SetIndexStyle(1,DRAW_LINE);
SetIndexBuffer(2,IndexBuffer);
SetIndexBuffer(3,IndexBuffer1);
SetIndexBuffer(4,Buffer);
SetIndexBuffer(5,Buffer1);
IndicatorShortName("Index_pair_v22b: "+Symbol() + "(" + Period() + "): ");
SetIndexLabel(0, StringSubstr(Symbol(),0,3));
SetIndexLabel(1, StringSubstr(Symbol(),3,3));
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
int limit,i;
string S=Symbol();
int counted_bars=IndicatorCounted();
//---- ïðîâåðêà íà âîçìîæíûå îøèáêè
if(counted_bars<0) return(-1);
if(Show==false)
{
if(S=="GBPUSD" || S=="USDCHF" || S=="EURUSD" || S=="USDJPY" || S=="EURGBP" ||
S=="EURCHF" || S=="EURJPY" || S=="GBPCHF" || S=="GBPJPY" || S=="CHFJPY")
Show=true;
}
if(Show==false)
{
Alert("- ERROR! - Èíäèêàòîð íå ðàáîòàåò íà ïàðå ",S," !!!");
Print("--- ERROR ! --- Èíäèêàòîð íå ðàáîòàåò íà ïàðå ",S," !!!");
return(-1);
}
//---- âû÷èñëåíèå ìèíèìàëüíîãî êîë-âà áàðîâ (äëèíû îòîáðàæàåìîãî ãðàôèêà)
if(counted_bars==0)
{
BarsMin=iBars("GBPUSD",NULL);
if(BarsMin>iBars("USDCHF",NULL)) BarsMin=iBars("USDCHF",NULL);
if(BarsMin>iBars("EURUSD",NULL)) BarsMin=iBars("EURUSD",NULL);
if(BarsMin>iBars("USDJPY",NULL)) BarsMin=iBars("USDJPY",NULL);
if(BarsMin>iBars("EURGBP",NULL)) BarsMin=iBars("EURGBP",NULL);
if(BarsMin>iBars("EURCHF",NULL)) BarsMin=iBars("EURCHF",NULL);
if(BarsMin>iBars("EURJPY",NULL)) BarsMin=iBars("EURJPY",NULL);
if(BarsMin>iBars("GBPCHF",NULL)) BarsMin=iBars("GBPCHF",NULL);
if(BarsMin>iBars("GBPJPY",NULL)) BarsMin=iBars("GBPJPY",NULL);
if(BarsMin>iBars("CHFJPY",NULL)) BarsMin=iBars("CHFJPY",NULL);
}
//---- ïîñëåäíèé ïîñ÷èòàííûé áàð áóäåò ïåðåñ÷èòàí
if(counted_bars>0) counted_bars--;
limit=Bars-counted_bars;
if(limit>BarsMin-2) limit=BarsMin-2;
//---- îñíîâíîé öèêë
for(i=limit;i>=0;i--)
{
//---- Âûáîð íóæíîé ïàðû èíäåêñîâ
if (Symbol() == "EURUSD") { IndexBuffer[i]=EUR(i); IndexBuffer1[i]=USD(i); }
if (Symbol() == "EURGBP") { IndexBuffer[i]=EUR(i); IndexBuffer1[i]=GBP(i); }
if (Symbol() == "EURCHF") { IndexBuffer[i]=EUR(i); IndexBuffer1[i]=CHF(i); }
if (Symbol() == "EURJPY") { IndexBuffer[i]=EUR(i); IndexBuffer1[i]=JPY(i); }
if (Symbol() == "GBPUSD") { IndexBuffer[i]=GBP(i); IndexBuffer1[i]=USD(i); }
if (Symbol() == "GBPCHF") { IndexBuffer[i]=GBP(i); IndexBuffer1[i]=CHF(i); }
if (Symbol() == "GBPJPY") { IndexBuffer[i]=GBP(i); IndexBuffer1[i]=JPY(i); }
if (Symbol() == "USDCHF") { IndexBuffer[i]=USD(i); IndexBuffer1[i]=CHF(i); }
if (Symbol() == "USDJPY") { IndexBuffer[i]=USD(i); IndexBuffer1[i]=JPY(i); }
if (Symbol() == "CHFJPY") { IndexBuffer[i]=CHF(i); IndexBuffer1[i]=JPY(i); }
}
//---- Âû÷èñëåíèå RSI îò èíäåêñîâ
for(i=limit;i>=0;i--)
{
Buffer[i]=iRSIOnArray(IndexBuffer,0,RSIPeriod,i);
Buffer1[i]=iRSIOnArray(IndexBuffer1,0,RSIPeriod,i);
}
//---- Ñãëàæèâàíèå RSI
for(i=limit;i>=0;i--)
{
RSIBuffer[i]=iMAOnArray(Buffer,0,Smooth,0,MODE_EMA,i);
RSIBuffer1[i]=iMAOnArray(Buffer1,0,Smooth,0,MODE_EMA,i);
if(RSIBuffer[i]>100.) RSIBuffer[i]=100.;
if(RSIBuffer1[i]>100.) RSIBuffer1[i]=100.;
}
//----
return(0);
}
//+------------------------------------------------------------------+
double USD(int j)
{
double value;
datetime TimeBar=Time[j];
double GBP_USD=iMA("GBPUSD",NULL,PeriodFirstEMA,0,1,PriceFirstEMA,iBarShift("GBPUSD",NULL,TimeBar,false));
double USD_CHF=iMA("USDCHF",NULL,PeriodFirstEMA,0,1,PriceFirstEMA,iBarShift("USDCHF",NULL,TimeBar,false));
double EUR_USD=iMA("EURUSD",NULL,PeriodFirstEMA,0,1,PriceFirstEMA,iBarShift("EURUSD",NULL,TimeBar,false));
double USD_JPY=iMA("USDJPY",NULL,PeriodFirstEMA,0,1,PriceFirstEMA,iBarShift("USDJPY",NULL,TimeBar,false));
// Ïðîâåðêà äëÿ èñêëþ÷åíèÿ äåëåíèÿ íà 0
if(GBP_USD==0) GBP_USD=1.;
if(EUR_USD==0) EUR_USD=1.;
value = MathPow(USD_CHF*USD_JPY/GBP_USD/EUR_USD,0.2);
return(value);
}
//+------------------------------------------------------------------+
double GBP(int j)
{
double value;
datetime TimeBar=Time[j];
double GBP_USD=iMA("GBPUSD",NULL,PeriodFirstEMA,0,1,PriceFirstEMA,iBarShift("GBPUSD",NULL,TimeBar,false));
double EUR_GBP=iMA("EURGBP",NULL,PeriodFirstEMA,0,1,PriceFirstEMA,iBarShift("EURGBP",NULL,TimeBar,false));
double GBP_CHF=iMA("GBPCHF",NULL,PeriodFirstEMA,0,1,PriceFirstEMA,iBarShift("GBPCHF",NULL,TimeBar,false));
double GBP_JPY=iMA("GBPJPY",NULL,PeriodFirstEMA,0,1,PriceFirstEMA,iBarShift("GBPJPY",NULL,TimeBar,false));
// Ïðîâåðêà äëÿ èñêëþ÷åíèÿ äåëåíèÿ íà 0
if(EUR_GBP==0) EUR_GBP=1.;
value = MathPow(GBP_USD*GBP_CHF*GBP_JPY/EUR_GBP,0.2);
return(value);
}
//+------------------------------------------------------------------+
double EUR(int j)
{
double value;
datetime TimeBar=Time[j];
double EUR_USD=iMA("EURUSD",NULL,PeriodFirstEMA,0,1,PriceFirstEMA,iBarShift("EURUSD",NULL,TimeBar,false));
double EUR_GBP=iMA("EURGBP",NULL,PeriodFirstEMA,0,1,PriceFirstEMA,iBarShift("EURGBP",NULL,TimeBar,false));
double EUR_CHF=iMA("EURCHF",NULL,PeriodFirstEMA,0,1,PriceFirstEMA,iBarShift("EURCHF",NULL,TimeBar,false));
double EUR_JPY=iMA("EURJPY",NULL,PeriodFirstEMA,0,1,PriceFirstEMA,iBarShift("EURJPY",NULL,TimeBar,false));
value = MathPow(EUR_USD*EUR_GBP*EUR_CHF*EUR_JPY,0.2);
return(value);
}
//+------------------------------------------------------------------+
double CHF(int j)
{
double value;
datetime TimeBar=Time[j];
double USD_CHF=iMA("USDCHF",NULL,PeriodFirstEMA,0,1,PriceFirstEMA,iBarShift("USDCHF",NULL,TimeBar,false));
double EUR_CHF=iMA("EURCHF",NULL,PeriodFirstEMA,0,1,PriceFirstEMA,iBarShift("EURCHF",NULL,TimeBar,false));
double GBP_CHF=iMA("GBPCHF",NULL,PeriodFirstEMA,0,1,PriceFirstEMA,iBarShift("GBPCHF",NULL,TimeBar,false));
double CHF_JPY=iMA("CHFJPY",NULL,PeriodFirstEMA,0,1,PriceFirstEMA,iBarShift("CHFJPY",NULL,TimeBar,false));
// Ïðîâåðêà äëÿ èñêëþ÷åíèÿ äåëåíèÿ íà 0
if(USD_CHF==0) USD_CHF=1.;
if(EUR_CHF==0) EUR_CHF=1.;
if(GBP_CHF==0) GBP_CHF=1.;
value = MathPow(CHF_JPY/USD_CHF/EUR_CHF/GBP_CHF,0.2);
return(value);
}
//+------------------------------------------------------------------+
double JPY(int j)
{
double value;
datetime TimeBar=Time[j];
double USD_JPY=iMA("USDJPY",NULL,PeriodFirstEMA,0,1,PriceFirstEMA,iBarShift("USDJPY",NULL,TimeBar,false));
double EUR_JPY=iMA("EURJPY",NULL,PeriodFirstEMA,0,1,PriceFirstEMA,iBarShift("EURJPY",NULL,TimeBar,false));
double GBP_JPY=iMA("GBPJPY",NULL,PeriodFirstEMA,0,1,PriceFirstEMA,iBarShift("GBPJPY",NULL,TimeBar,false));
double CHF_JPY=iMA("CHFJPY",NULL,PeriodFirstEMA,0,1,PriceFirstEMA,iBarShift("CHFJPY",NULL,TimeBar,false));
// Ïðîâåðêà äëÿ èñêëþ÷åíèÿ äåëåíèÿ íà 0
if(USD_JPY==0) USD_JPY=1.;
if(EUR_JPY==0) EUR_JPY=1.;
if(GBP_JPY==0) GBP_JPY=1.;
if(CHF_JPY==0) CHF_JPY=1.;
value = MathPow(1./USD_JPY/EUR_JPY/GBP_JPY/CHF_JPY,0.2);
return(value);
}
//+------------------------------------------------------------------+
Comments