Index_pair_v22b_diff
Download scriptThis script is designed for MetaTrader 4 to analyze the relative strength of major currencies by calculating a unique "Index" for each currency. Instead of looking at one pair in isolation, it evaluates how a specific currency performs against all other major players simultaneously.
Core Logic and Workflow
1. Currency Indexing The script identifies five major currencies: USD, EUR, GBP, CHF, and JPY. For each currency, it creates a synthetic "Index" value based on its exchange rates with other pairs.
- For example, the EUR Index is calculated by taking the geometric mean of the Euro's performance against the Dollar, Pound, Franc, and Yen.
- The USD Index is derived using a different set of cross-rates to ensure it represents the Dollar's strength relative to the others.
2. Dynamic Pair Recognition The script is designed to work only on specific major currency pairs (such as EURUSD, GBPJPY, USDCHF, etc.). When you apply it to a chart, it automatically detects which two currencies are being traded and selects the corresponding data from its internal calculations to display.
3. The Strength Difference Calculation Rather than just showing you how strong one currency is, the script highlights the momentum gap between the two currencies in your current pair.
- It calculates the Relative Strength Index (RSI) for the first currency of the pair.
- It then calculates the RSI for the second currency of the pair.
- Finally, it subtracts the second value from the first.
4. Smoothing and Final Output To prevent the data from being too "jittery" or volatile, the script applies two layers of smoothing:
- Price Smoothing: It uses a Moving Average on the base prices before calculating the indices.
- RSI Smoothing: It applies an Exponential Moving Average (EMA) to the final difference result.
Summary for the User
Essentially, this tool tells you which side of your current trade has more "strength." If the resulting line moves significantly upward, it indicates that the first currency in the pair is gaining momentum relative to the second. If it moves downward, the second currency is stronger. It allows a trader to see the underlying power balance of a currency pair by filtering out the "noise" of individual exchange rates.
//+-------------------------------------------------------------------------+
//| Index_pair_v22b_diff.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 - ðàñ÷åò èíäåêñîâ - â ôóíêöèÿõ |
//| |
//| v22_diff - âû÷èñëÿåòñÿ ðàçíîñòü ìåæäó ëèíèÿìè èíäèêàòîðà v22 |
//| |
//| v22b_diff - ïîèñê áàðîâ â èñòîðèè íå ïî ñìåùåíèþ, à ïî âðåìåíè |
//| |
//+-------------------------------------------------------------------------+
#property copyright "GrayMan77"
#property link ""
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Red
//#property indicator_color2 Aqua
#property indicator_level1 0
//#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(4);
SetIndexBuffer(0,RSIBuffer);
SetIndexStyle(0,DRAW_LINE);
// SetIndexBuffer(1,RSIBuffer1);
// SetIndexStyle(1,DRAW_LINE);
SetIndexBuffer(1,IndexBuffer);
SetIndexBuffer(2,IndexBuffer1);
SetIndexBuffer(3,Buffer);
// SetIndexBuffer(4,Buffer1);
IndicatorShortName("Index_pair_v22b_diff: "+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)-iRSIOnArray(IndexBuffer1,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