Index_pair_v22b

Author: GrayMan77
Index_pair_v22b

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.
Price Data Components
Indicators Used
Relative strength indexMoving average indicatorMoving average indicator
Miscellaneous
Implements a curve of type %1It issuies visual alerts to the screen
12 Views
0 Downloads
0 Favorites
Index_pair_v22b
//+-------------------------------------------------------------------------+
//|                                                     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