Index_pair_v22

Download script
Author: GrayMan77
Index_pair_v22

This script is designed for traders who want to analyze the relative strength of major currencies (USD, EUR, GBP, JPY, and CHF) by creating a custom "Index" for each currency pair. Instead of looking at a single chart, it calculates a synthetic value that helps represent how strong one currency is compared to the others in the market.

Core Logic Overview

The tool operates through a multi-step mathematical process to transform raw market prices into readable trend indicators:

1. Currency Index Calculation The primary logic of the script is to derive a unique "Index" value for each major currency. It does this by looking at multiple currency pairs simultaneously. For example, to determine the strength of the Euro (EUR), it pulls data from several different pairs (like EUR/USD, EUR/GBP, EUR/CHF, and EUR/JPY) and combines them into a single mathematical formula.

This creates a "weighted" view of the currency's behavior across the entire market, rather than just its relationship with one other currency. This method helps filter out "noise" from individual pairs that might be moving due to specific local events rather than broader market trends.

2. Smoothing the Price Data Before calculating the final indicators, the script applies an initial smoothing layer to the prices. It uses a Moving Average (EMA) to ensure that sudden, erratic price spikes don't cause the resulting index to jump around too wildly. This ensures the data represents a steady trend.

3. Relative Strength Analysis (RSI) Once the indices for the two currencies in your current chart are calculated (e.g., if you are viewing EUR/USD, it calculates an Index for EUR and an Index for USD), the script applies a Relative Strength Index (RSI) calculation to both.

  • This transforms the raw index numbers into a standardized scale (typically 0 to 100).
  • It identifies whether the currency is currently in a state of "overbought" or "oversold" momentum relative to its own history.

4. Final Trend Smoothing To make the final output even easier for a human to read, the script applies one last smoothing pass (an EMA) over the RSI values. This produces two distinct lines on your chart:

  • One line represents the momentum of the Base Currency (the first part of the pair).
  • The other line represents the momentum of the Quote Currency (the second part of the pair).

User Experience

  • Compatibility: The script is specifically programmed to work on major pairs involving USD, EUR, GBP, JPY, and CHF. If you try to run it on an unsupported pair, it will alert you that it cannot function there.
  • Visual Output: It provides two colored lines in a separate window. By observing the distance between these two lines and their respective directions, a trader can determine which currency is currently dominant and which is losing strength.
  • Automatic Scaling: The script automatically handles the data requirements for all necessary pairs in the background, meaning you only need to apply it to the chart of the pair you are currently interested in trading.
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
7 Views
0 Downloads
0 Favorites
Index_pair_v22
//+-------------------------------------------------------------------------+
//|                                                      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 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_v22:  "+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=iMA("GBPUSD",NULL,PeriodFirstEMA,0,1,PriceFirstEMA,j);
  double USD_CHF=iMA("USDCHF",NULL,PeriodFirstEMA,0,1,PriceFirstEMA,j);
  double EUR_USD=iMA("EURUSD",NULL,PeriodFirstEMA,0,1,PriceFirstEMA,j);
  double USD_JPY=iMA("USDJPY",NULL,PeriodFirstEMA,0,1,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=iMA("GBPUSD",NULL,PeriodFirstEMA,0,1,PriceFirstEMA,j);
  double EUR_GBP=iMA("EURGBP",NULL,PeriodFirstEMA,0,1,PriceFirstEMA,j);
  double GBP_CHF=iMA("GBPCHF",NULL,PeriodFirstEMA,0,1,PriceFirstEMA,j);
  double GBP_JPY=iMA("GBPJPY",NULL,PeriodFirstEMA,0,1,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=iMA("EURUSD",NULL,PeriodFirstEMA,0,1,PriceFirstEMA,j);
  double EUR_GBP=iMA("EURGBP",NULL,PeriodFirstEMA,0,1,PriceFirstEMA,j);
  double EUR_CHF=iMA("EURCHF",NULL,PeriodFirstEMA,0,1,PriceFirstEMA,j);
  double EUR_JPY=iMA("EURJPY",NULL,PeriodFirstEMA,0,1,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=iMA("USDCHF",NULL,PeriodFirstEMA,0,1,PriceFirstEMA,j);
  double EUR_CHF=iMA("EURCHF",NULL,PeriodFirstEMA,0,1,PriceFirstEMA,j);
  double GBP_CHF=iMA("GBPCHF",NULL,PeriodFirstEMA,0,1,PriceFirstEMA,j);
  double CHF_JPY=iMA("CHFJPY",NULL,PeriodFirstEMA,0,1,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