Index_pair_Dev_v1

Download script
Author: GrayMan77
Index_pair_Dev_v1

This script is designed as a specialized financial indicator for the MetaTrader 4 platform. Its primary purpose is to break down complex currency pair movements into individual "strength indices" for major world currencies (USD, EUR, GBP, JPY, and CHF). By isolating these components, the tool allows traders to see the underlying dynamics of a specific currency pair more clearly.

Core Logic and Functionality

1. Currency Isolation (The Index System) Instead of looking at a single exchange rate (like EUR/USD), the script calculates an independent "strength index" for each major currency. It does this by analyzing several different currency crosses simultaneously. For example, to determine the strength of the Euro (EUR), the script looks at its performance against the Dollar, Pound, Swiss Franc, and Yen.

It uses a mathematical formula (specifically a geometric mean approach) to combine these various cross-rates. This ensures that the resulting index represents the "true" strength of that specific currency relative to the entire market, rather than just its relationship with one other neighbor.

2. Relative Strength Analysis (RSI) Once the individual strength indices for the two currencies in a pair are calculated, the script applies a Relative Strength Index (RSI). This is a standard technical analysis tool used to identify whether a currency is "overbought" or "oversold." By applying RSI to the custom-calculated indices rather than raw price data, the indicator provides a more nuanced view of momentum.

3. Smoothing and Refinement To prevent the data from being too erratic or "noisy," the script includes two layers of smoothing:

  • Price Smoothing: It first cleans the raw price data using an Exponential Moving Average (EMA) to establish a stable baseline.
  • Signal Smoothing: It then applies a second layer of smoothing to the final RSI result. This helps traders identify clear trends and avoid reacting to minor, insignificant fluctuations in the market.

4. Automated Pair Detection The script is designed with specific "compatibility" logic. It identifies which currency pairs it should operate on (such as GBPUSD, EURJPY, etc.) and automatically detects the components of those pairs. If a user opens the chart on a pair not supported by this specific logic, the script will provide an alert notifying them that it is not compatible with that specific asset.

Summary for the User

In simple terms, if you are looking at a chart of GBP/USD, this indicator doesn't just show you how the Pound moves against the Dollar. It calculates the independent power of the Pound and the independent power of the Dollar across the entire global market, then plots those two strengths as smooth lines on your screen. This allows you to see if a move is driven by the strength of one currency, the weakness of another, or a balanced shift in both.

Price Data Components
Indicators Used
Relative strength indexMoving average indicatorStandard Deviation indicatorMoving average indicator
Miscellaneous
Implements a curve of type %1It issuies visual alerts to the screen
10 Views
0 Downloads
0 Favorites
Index_pair_Dev_v1
//+-------------------------------------------------------------------------+
//|                                                      Index_pair_v22.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 - ðàñ÷åò èíäåêñîâ - â ôóíêöèÿõ                                      |
//|    |
//+-------------------------------------------------------------------------+
#property copyright "GrayMan77"
#property link      ""

#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1 Aqua
#property indicator_color2 Red

#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=5;
extern int Smooth=5;
extern int PeriodFirstEMA=5; // Ïåðâè÷íîå ñãëàæèâàíèå - ïåðèîä
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_Dev_v1:  "+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;
  double GBP_USD=iStdDev("GBPUSD",NULL,PeriodFirstEMA,MODE_EMA,0,PriceFirstEMA,j);
  double USD_CHF=iStdDev("USDCHF",NULL,PeriodFirstEMA,MODE_EMA,0,PriceFirstEMA,j);
  double EUR_USD=iStdDev("EURUSD",NULL,PeriodFirstEMA,MODE_EMA,0,PriceFirstEMA,j);
  double USD_JPY=iStdDev("USDJPY",NULL,PeriodFirstEMA,MODE_EMA,0,PriceFirstEMA,j);
         // Ïðîâåðêà äëÿ èñêëþ÷åíèÿ äåëåíèÿ íà 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;
  double GBP_USD=iStdDev("GBPUSD",NULL,PeriodFirstEMA,MODE_EMA,0,PriceFirstEMA,j);
  double EUR_GBP=iStdDev("EURGBP",NULL,PeriodFirstEMA,MODE_EMA,0,PriceFirstEMA,j);
  double GBP_CHF=iStdDev("GBPCHF",NULL,PeriodFirstEMA,MODE_EMA,0,PriceFirstEMA,j);
  double GBP_JPY=iStdDev("GBPJPY",NULL,PeriodFirstEMA,MODE_EMA,0,PriceFirstEMA,j);
         // Ïðîâåðêà äëÿ èñêëþ÷åíèÿ äåëåíèÿ íà 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;
  double EUR_USD=iStdDev("EURUSD",NULL,PeriodFirstEMA,MODE_EMA,0,PriceFirstEMA,j);
  double EUR_GBP=iStdDev("EURGBP",NULL,PeriodFirstEMA,MODE_EMA,0,PriceFirstEMA,j);
  double EUR_CHF=iStdDev("EURCHF",NULL,PeriodFirstEMA,MODE_EMA,0,PriceFirstEMA,j);
  double EUR_JPY=iStdDev("EURJPY",NULL,PeriodFirstEMA,MODE_EMA,0,PriceFirstEMA,j);
  value = MathPow(EUR_USD*EUR_GBP*EUR_CHF*EUR_JPY,0.2);
  return(value);
  }
//+------------------------------------------------------------------+
double CHF(int j)
  {
  double value;
  double USD_CHF=iStdDev("USDCHF",NULL,PeriodFirstEMA,MODE_EMA,0,PriceFirstEMA,j);
  double EUR_CHF=iStdDev("EURCHF",NULL,PeriodFirstEMA,MODE_EMA,0,PriceFirstEMA,j);
  double GBP_CHF=iStdDev("GBPCHF",NULL,PeriodFirstEMA,MODE_EMA,0,PriceFirstEMA,j);
  double CHF_JPY=iStdDev("CHFJPY",NULL,PeriodFirstEMA,MODE_EMA,0,PriceFirstEMA,j);
         // Ïðîâåðêà äëÿ èñêëþ÷åíèÿ äåëåíèÿ íà 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;
  double USD_JPY=iMA("USDJPY",NULL,PeriodFirstEMA,0,1,PriceFirstEMA,j);
  double EUR_JPY=iMA("EURJPY",NULL,PeriodFirstEMA,0,1,PriceFirstEMA,j);
  double GBP_JPY=iMA("GBPJPY",NULL,PeriodFirstEMA,0,1,PriceFirstEMA,j);
  double CHF_JPY=iMA("CHFJPY",NULL,PeriodFirstEMA,0,1,PriceFirstEMA,j);
         // Ïðîâåðêà äëÿ èñêëþ÷åíèÿ äåëåíèÿ íà 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