This script is a comprehensive currency index tool designed to help traders visualize the relative performance of various major currencies against each other. Instead of looking at individual price charts, it consolidates data into a unified "index" system, making it easier to see which currencies are leading or lagging in real-time.
Core Functionality
The primary goal of this tool is to calculate and display a normalized index for eight major currencies: USD, EUR, GBP, JPY, CHF, AUD, CAD, and NZD. It sets a "base point" (usually at 100%) at a specific date in history. From that moment forward, the lines on the chart show how much each currency has gained or lost relative to that starting point.
Key Features
- Currency Selection & Filtering: Users can choose to show or hide specific currencies based on their interests. If you only care about the relationship between the US Dollar and the Euro, you can toggle off the other currencies to declutter your view.
- Automated Pair Detection: The tool can automatically detect which currency pair you are currently viewing. In this mode, it highlights the relevant indices for that specific pair, making it much faster to switch between different trading setups without manually changing settings.
- Advanced Indicator Integration: This isn't just a simple price tracker. The script allows you to layer several technical analysis indicators onto these currency indexes, including:
- RSI (Relative Strength Index)
- CCI (Commodity Channel Index)
- Momentum
- MACD (Moving Average Convergence Divergence)
- Stochastic Oscillator
- Moving Averages (SMA, EMA, SMMA, or LWMA)
- Difference Analysis: For advanced users, there is an "Auto-Detect Difference" mode. This calculates the mathematical difference between indices when trading a pair, helping to isolate the specific movement of one currency against another more clearly.
- Price Customization: You can choose which price data the index uses for its calculations—ranging from standard Close prices to High/Low averages or weighted prices.
How it Works for the Trader
When you load this script, it looks back at a specific timeframe (the "Start Time") and establishes a baseline. As new market data comes in, the script performs the following steps:
- Data Fetching: It pulls real-time price data for all specified major currency symbols simultaneously.
- Normalization: It calculates the percentage change for every currency relative to that starting "baseline."
- Processing: Depending on your settings, it applies technical filters (like a Moving Average or an RSI calculation) to those percentages.
- Visualization: It draws multiple lines in a separate window on your chart. This allows you to see at a glance, for example, if the AUD is strengthening while the CAD is weakening, providing a much broader perspective than looking at a single pair's price action.
Visual Aids
The tool also includes a "Start Time" vertical line on the chart. This serves as a visual anchor, marking the exact moment when all currency indexes were set to 100%, making it easy to track growth or decline from that specific historical milestone.
//+------------------------------------------------------------------+
//| Indexes_v7L.mq4 |
//| Copyright © 2009, Xupypr |
//| http://www.mql4.com/ru/users/Xupypr |
//| Âåðñèÿ îò 27.05.2009 |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2009, Xupypr"
#property link "http://www.mql4.com/ru/users/Xupypr"
#property indicator_separate_window
#property indicator_buffers 8
#property indicator_level1 100
#property indicator_level2 0
#property indicator_level3 -100
#property indicator_levelcolor LightSlateGray
#property indicator_color1 Lime
#property indicator_color2 DodgerBlue
#property indicator_color3 Red
#property indicator_color4 Yellow
#property indicator_color5 DeepPink
#property indicator_color6 DarkOrange
#property indicator_color7 MediumSpringGreen
#property indicator_color8 LightSkyBlue
#property indicator_width1 1
#property indicator_width2 1
#property indicator_width3 1
#property indicator_width4 1
#property indicator_width5 1
#property indicator_width6 1
#property indicator_width7 1
#property indicator_width8 1
//---- input parameters
extern string Start_Time="2008.08.01 22:59"; // òî÷êà îò÷¸òà (â íåé âñå èíäåêñû ðàâíû 100%)
extern bool Use_Start_Time=false; // èñïîëüçîâàòü òî÷êó îò÷åòà, èíà÷å áðàòü öåíû çàêðûòèÿ íåäåëè
extern bool Auto_Detect_Pair=false; // îïðåäåëÿòü àâòîìàòè÷åñêè âàëþòíóþ ïàðó è îòîáðàæàòü ñîîòâåòñâóþùèå èíäåêñû
extern bool Diff_Indicators=false; // ñ÷èòàòü ðàçíîñòü èíäåêñîâ/èíäèêàòîðîâ â ðåæèìå "àâòîîïðåäåëåíèÿ" ïàðû
extern bool Reverse_Index=false; // "ïåðåâîðà÷èâàòü" èíäåêñ âàëþòû, ñòîÿùåé â ïàðå âòîðîé
extern int Applied_Price=0; // èñïîëüçóåìàÿ öåíà: 0-CLOSE; 1-OPEN; 2-HIGH; 3-LOW; 4-MEDIAN; 5-TYPICAL; 6-WEIGHTED;
extern int MA_Period=1; // ïåðèîä óñðåäíåíèÿ äëÿ âû÷èñëåíèÿ ñêîëüçÿùåãî ñðåäíåãî
extern int MA_Method=3; // ìåòîä óñðåäíåíèÿ: 0-MODE_SMA; 1-MODE_EMA; 2-MODE_SMMA; 3-MODE_LWMA
extern int Select_Indicator=0; // 0-èíäåêñû âàëþò áåç èíäèêàòîðîâ; 1-CCI; 2-RSI; 3-Momentum; 4-MACD; 5-Stochastic;
extern int Period_Indicator=14; // ïåðèîä óñðåäíåíèÿ äëÿ âû÷èñëåíèÿ èíäèêàòîðà
extern int Fast_EMA=12; // äëÿ èíäèêàòîðà MACD
extern int Slow_EMA=26; // äëÿ èíäèêàòîðà MACD
extern int K_Period=5; // äëÿ èíäèêàòîðà Stochastic
extern int Slowing=3; // äëÿ èíäèêàòîðà Stochastic
extern int Limit_Bars=1000; // Îãðàíè÷åíèå íà êîëè÷åñòâî áàðîâ â ðàñ÷¸òå.
extern bool Show_USD=true;
extern bool Show_EUR=true;
extern bool Show_GBP=true;
extern bool Show_JPY=true;
extern bool Show_CHF=true;
extern bool Show_AUD=true;
extern bool Show_CAD=true;
extern bool Show_NZD=true;
//---- buffers
double iUSDBuffer[];
double iEURBuffer[];
double iGBPBuffer[];
double iJPYBuffer[];
double iCHFBuffer[];
double iAUDBuffer[];
double iCADBuffer[];
double iNZDBuffer[];
double xUSDBuffer[];
double xEURBuffer[];
double xGBPBuffer[];
double xJPYBuffer[];
double xCHFBuffer[];
double xAUDBuffer[];
double xCADBuffer[];
double xNZDBuffer[];
//---- indicator buffers
double USDBuffer[];
double EURBuffer[];
double GBPBuffer[];
double JPYBuffer[];
double CHFBuffer[];
double AUDBuffer[];
double CADBuffer[];
double NZDBuffer[];
//---- indicator parameters
int BarsCS,LB;
bool Show_CUR[8],Stop=false;
double SPrice[7];
string CS1,CS2;
string Currency[8]={"USD","EUR","GBP","JPY","CHF","AUD","CAD","NZD"};
string Symbols[7]={"AUDUSD","EURUSD","GBPUSD","NZDUSD","USDCAD","USDCHF","USDJPY"};
datetime Period_End,SPoint;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
int i,sbar,stime[8];
bool show=false;
string name;
Comment("");
if (Period()==PERIOD_MN1)
{
Comment("Ïåðèîä íå ìîæåò áûòü áîëüøå W1");
Stop=true;
return(-1);
}
if (Auto_Detect_Pair)
{
ArrayInitialize(Show_CUR,false);
CS1=StringSubstr(Symbol(),0,3);
CS2=StringSubstr(Symbol(),3,3);
for (i=0;i<8;i++)
{
if (Currency[i]==CS1 || Currency[i]==CS2)
{
Show_CUR[i]=true;
show=true;
}
}
if (!show)
{
ArrayInitialize(Show_CUR,true);
Comment("Äàííîìó èíñòðóìåíòó íå ñîîòâåòñòâóåò íè îäèí èíäåêñ");
}
}
else
{
Show_CUR[0]=Show_USD;
Show_CUR[1]=Show_EUR;
Show_CUR[2]=Show_GBP;
Show_CUR[3]=Show_JPY;
Show_CUR[4]=Show_CHF;
Show_CUR[5]=Show_AUD;
Show_CUR[6]=Show_CAD;
Show_CUR[7]=Show_NZD;
}
for (i=0;i<7;i++)
{
sbar=iBars(Symbols[i],0);
if (sbar==0)
{
Comment("Îòñóòñòâóåò èñòîðèÿ äëÿ "+Symbols[i]);
Stop=true;
return(-1);
}
stime[i]=iTime(Symbols[i],0,sbar-1);
}
sbar=iBars(NULL,0);
stime[7]=iTime(NULL,0,sbar-1);
SPoint=stime[ArrayMaximum(stime)];
BarsCS=iBarShift(NULL,0,SPoint);
if (Use_Start_Time)
{
Period_End=StrToTime(Start_Time);
if (Period_End<SPoint)
{
Period_End=SPoint+60*Period()*(Period_Indicator+1);
Comment("Âûáðàíà äðóãàÿ òî÷êà îò÷¸òà - "+TimeToStr(Period_End));
}
}
else
{
i=0;
while ((iTime(NULL,0,i+1)+172800)>iTime(NULL,0,i)) i++;
Period_End=iTime(NULL,0,i+1);
}
if (Applied_Price<0) Applied_Price=0;
if (Applied_Price>6) Applied_Price=6;
for (i=0;i<7;i++) SPrice[i]=Price(i,Period_End);
name="Indexes( ";
for (i=0;i<8;i++) if (Show_CUR[i])
{
switch (i)
{
case 0: {SetIndexBuffer(0,USDBuffer); ArraySetAsSeries(iUSDBuffer,true); ArraySetAsSeries(xUSDBuffer,true);} break;
case 1: {SetIndexBuffer(1,EURBuffer); ArraySetAsSeries(iEURBuffer,true); ArraySetAsSeries(xEURBuffer,true);} break;
case 2: {SetIndexBuffer(2,GBPBuffer); ArraySetAsSeries(iGBPBuffer,true); ArraySetAsSeries(xGBPBuffer,true);} break;
case 3: {SetIndexBuffer(3,JPYBuffer); ArraySetAsSeries(iJPYBuffer,true); ArraySetAsSeries(xJPYBuffer,true);} break;
case 4: {SetIndexBuffer(4,CHFBuffer); ArraySetAsSeries(iCHFBuffer,true); ArraySetAsSeries(xCHFBuffer,true);} break;
case 5: {SetIndexBuffer(5,AUDBuffer); ArraySetAsSeries(iAUDBuffer,true); ArraySetAsSeries(xAUDBuffer,true);} break;
case 6: {SetIndexBuffer(6,CADBuffer); ArraySetAsSeries(iCADBuffer,true); ArraySetAsSeries(xCADBuffer,true);} break;
case 7: {SetIndexBuffer(7,NZDBuffer); ArraySetAsSeries(iNZDBuffer,true); ArraySetAsSeries(xNZDBuffer,true);}
}
SetIndexStyle(i,DRAW_LINE);
if (Reverse_Index && Currency[i]==CS2) SetIndexLabel(i,Currency[i]+" reverse");
else SetIndexLabel(i,Currency[i]);
name=StringConcatenate(name,Currency[i]," ");
}
name=name+")";
if (MA_Period<1) MA_Period=1;
if (MA_Method<0) MA_Method=0;
if (MA_Method>3) MA_Method=3;
if (Select_Indicator<0) Select_Indicator=0;
if (Select_Indicator>5) Select_Indicator=5;
if (Period_Indicator<1) Period_Indicator=1;
if (Limit_Bars<1) Limit_Bars=1;
Limit_Bars+=Period_Indicator;
switch (Select_Indicator)
{
case 1: name=StringConcatenate(name,"+CCI(",Period_Indicator,")"); break;
case 2: name=StringConcatenate(name,"+RSI(",Period_Indicator,")"); break;
case 3: name=StringConcatenate(name,"+Mom.(",Period_Indicator,")"); break;
case 4: name=StringConcatenate(name,"+MACD(",Fast_EMA,",",Slow_EMA,")"); break;
case 5: name=StringConcatenate(name,"+St.(",K_Period,",",Slowing,")");
}
name=StringConcatenate(name,"+MA(",MA_Period,",",MA_Method,")");
if (Diff_Indicators && Auto_Detect_Pair) name=StringConcatenate(name,"+diff");
IndicatorDigits(2);
IndicatorShortName(name);
return(0);
}
//+----------------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+----------------------------------------------------------------------------+
int deinit()
{
ObjectDelete("Period_End");
return(0);
}
//+------------------------------------------------------------------+
//| Indexes foreign exchange |
//+------------------------------------------------------------------+
int start()
{
int i,b,c,limit;
double curbuffer,change,cindex[8];
datetime btime,ltime;
static datetime timebar;
if (Stop) return(-1);
if (timebar!=Time[0])
{
timebar=Time[0];
BarsCS=iBarShift(NULL,0,SPoint);
if (BarsCS>Limit_Bars) BarsCS=Limit_Bars;
if (Show_CUR[0]) {ArrayResize(iUSDBuffer,BarsCS+1); ArrayResize(xUSDBuffer,BarsCS-Period_Indicator+1);}
if (Show_CUR[1]) {ArrayResize(iEURBuffer,BarsCS+1); ArrayResize(xEURBuffer,BarsCS-Period_Indicator+1);}
if (Show_CUR[2]) {ArrayResize(iGBPBuffer,BarsCS+1); ArrayResize(xGBPBuffer,BarsCS-Period_Indicator+1);}
if (Show_CUR[3]) {ArrayResize(iJPYBuffer,BarsCS+1); ArrayResize(xJPYBuffer,BarsCS-Period_Indicator+1);}
if (Show_CUR[4]) {ArrayResize(iCHFBuffer,BarsCS+1); ArrayResize(xCHFBuffer,BarsCS-Period_Indicator+1);}
if (Show_CUR[5]) {ArrayResize(iAUDBuffer,BarsCS+1); ArrayResize(xAUDBuffer,BarsCS-Period_Indicator+1);}
if (Show_CUR[6]) {ArrayResize(iCADBuffer,BarsCS+1); ArrayResize(xCADBuffer,BarsCS-Period_Indicator+1);}
if (Show_CUR[7]) {ArrayResize(iNZDBuffer,BarsCS+1); ArrayResize(xNZDBuffer,BarsCS-Period_Indicator+1);}
for (i=BarsCS;i>0;i--)
{
if (Show_CUR[0]) iUSDBuffer[i]=iUSDBuffer[i-1];
if (Show_CUR[1]) iEURBuffer[i]=iEURBuffer[i-1];
if (Show_CUR[2]) iGBPBuffer[i]=iGBPBuffer[i-1];
if (Show_CUR[3]) iJPYBuffer[i]=iJPYBuffer[i-1];
if (Show_CUR[4]) iCHFBuffer[i]=iCHFBuffer[i-1];
if (Show_CUR[5]) iAUDBuffer[i]=iAUDBuffer[i-1];
if (Show_CUR[6]) iCADBuffer[i]=iCADBuffer[i-1];
if (Show_CUR[7]) iNZDBuffer[i]=iNZDBuffer[i-1];
}
for (i=BarsCS-Period_Indicator;i>0;i--)
{
if (Show_CUR[0]) xUSDBuffer[i]=xUSDBuffer[i-1];
if (Show_CUR[1]) xEURBuffer[i]=xEURBuffer[i-1];
if (Show_CUR[2]) xGBPBuffer[i]=xGBPBuffer[i-1];
if (Show_CUR[3]) xJPYBuffer[i]=xJPYBuffer[i-1];
if (Show_CUR[4]) xCHFBuffer[i]=xCHFBuffer[i-1];
if (Show_CUR[5]) xAUDBuffer[i]=xAUDBuffer[i-1];
if (Show_CUR[6]) xCADBuffer[i]=xCADBuffer[i-1];
if (Show_CUR[7]) xNZDBuffer[i]=xNZDBuffer[i-1];
}
}
if (ObjectFind("Period_End")==-1)
{
ObjectCreate("Period_End",OBJ_VLINE,0,Period_End,0);
ObjectSetText("Period_End","Òî÷êà îò÷¸òà");
ObjectSet("Period_End",OBJPROP_COLOR,OrangeRed);
ObjectSet("Period_End",OBJPROP_WIDTH,2);
}
if (Period_End!=ObjectGet("Period_End",OBJPROP_TIME1))
{
Period_End=ObjectGet("Period_End",OBJPROP_TIME1);
for (i=0;i<7;i++) SPrice[i]=Price(i,Period_End);
LB=BarsCS;
}
limit=BarsCS;
int counted_bars=IndicatorCounted();
if (counted_bars>0) limit=Bars-counted_bars-1;
if (limit<LB) limit=LB;
for (b=limit;b>=0;b--)
{
ArrayInitialize(cindex,1.0);
btime=iTime(NULL,0,b);
//ðàñ÷¸ò èíäåêñà äîëëàðà
for (i=0;i<7;i++)
{
change=Price(i,btime)/SPrice[i];
if (StringSubstr(Symbols[i],0,3)==Currency[0]) cindex[0]*=change;
if (StringSubstr(Symbols[i],3,3)==Currency[0]) cindex[0]/=change;
}
cindex[0]=100*MathPow(cindex[0],0.125);
if (Show_CUR[1]) cindex[1]=cindex[0]*(Price(1,btime)/SPrice[1]);
if (Show_CUR[2]) cindex[2]=cindex[0]*(Price(2,btime)/SPrice[2]);
if (Show_CUR[3]) cindex[3]=cindex[0]/(Price(6,btime)/SPrice[6]);
if (Show_CUR[4]) cindex[4]=cindex[0]/(Price(5,btime)/SPrice[5]);
if (Show_CUR[5]) cindex[5]=cindex[0]*(Price(0,btime)/SPrice[0]);
if (Show_CUR[6]) cindex[6]=cindex[0]/(Price(4,btime)/SPrice[4]);
if (Show_CUR[7]) cindex[7]=cindex[0]*(Price(3,btime)/SPrice[3]);
if (Reverse_Index) for (c=0;c<8;c++)
{
if (Show_CUR[c] && Currency[c]==CS2) cindex[c]=200-cindex[c];
}
if (Show_CUR[0]) iUSDBuffer[b]=cindex[0];
if (Show_CUR[1]) iEURBuffer[b]=cindex[1];
if (Show_CUR[2]) iGBPBuffer[b]=cindex[2];
if (Show_CUR[3]) iJPYBuffer[b]=cindex[3];
if (Show_CUR[4]) iCHFBuffer[b]=cindex[4];
if (Show_CUR[5]) iAUDBuffer[b]=cindex[5];
if (Show_CUR[6]) iCADBuffer[b]=cindex[6];
if (Show_CUR[7]) iNZDBuffer[b]=cindex[7];
}
if (limit>(BarsCS-Period_Indicator)) limit=BarsCS-Period_Indicator;
for (b=limit;b>=0;b--)
{
switch (Select_Indicator)
{
case 0:
{
if (Show_CUR[0]) xUSDBuffer[b]=iUSDBuffer[b];
if (Show_CUR[1]) xEURBuffer[b]=iEURBuffer[b];
if (Show_CUR[2]) xGBPBuffer[b]=iGBPBuffer[b];
if (Show_CUR[3]) xJPYBuffer[b]=iJPYBuffer[b];
if (Show_CUR[4]) xCHFBuffer[b]=iCHFBuffer[b];
if (Show_CUR[5]) xAUDBuffer[b]=iAUDBuffer[b];
if (Show_CUR[6]) xCADBuffer[b]=iCADBuffer[b];
if (Show_CUR[7]) xNZDBuffer[b]=iNZDBuffer[b];
} break;
case 1:
{
if (Show_CUR[0]) xUSDBuffer[b]=iCCIOnArray(iUSDBuffer,0,Period_Indicator,b);
if (Show_CUR[1]) xEURBuffer[b]=iCCIOnArray(iEURBuffer,0,Period_Indicator,b);
if (Show_CUR[2]) xGBPBuffer[b]=iCCIOnArray(iGBPBuffer,0,Period_Indicator,b);
if (Show_CUR[3]) xJPYBuffer[b]=iCCIOnArray(iJPYBuffer,0,Period_Indicator,b);
if (Show_CUR[4]) xCHFBuffer[b]=iCCIOnArray(iCHFBuffer,0,Period_Indicator,b);
if (Show_CUR[5]) xAUDBuffer[b]=iCCIOnArray(iAUDBuffer,0,Period_Indicator,b);
if (Show_CUR[6]) xCADBuffer[b]=iCCIOnArray(iCADBuffer,0,Period_Indicator,b);
if (Show_CUR[7]) xNZDBuffer[b]=iCCIOnArray(iNZDBuffer,0,Period_Indicator,b);
} break;
case 2:
{
if (Show_CUR[0]) xUSDBuffer[b]=iRSIOnArray(iUSDBuffer,0,Period_Indicator,b);
if (Show_CUR[1]) xEURBuffer[b]=iRSIOnArray(iEURBuffer,0,Period_Indicator,b);
if (Show_CUR[2]) xGBPBuffer[b]=iRSIOnArray(iGBPBuffer,0,Period_Indicator,b);
if (Show_CUR[3]) xJPYBuffer[b]=iRSIOnArray(iJPYBuffer,0,Period_Indicator,b);
if (Show_CUR[4]) xCHFBuffer[b]=iRSIOnArray(iCHFBuffer,0,Period_Indicator,b);
if (Show_CUR[5]) xAUDBuffer[b]=iRSIOnArray(iAUDBuffer,0,Period_Indicator,b);
if (Show_CUR[6]) xCADBuffer[b]=iRSIOnArray(iCADBuffer,0,Period_Indicator,b);
if (Show_CUR[7]) xNZDBuffer[b]=iRSIOnArray(iNZDBuffer,0,Period_Indicator,b);
} break;
case 3:
{
if (Show_CUR[0]) xUSDBuffer[b]=iMomentumOnArray(iUSDBuffer,0,Period_Indicator,b);
if (Show_CUR[1]) xEURBuffer[b]=iMomentumOnArray(iEURBuffer,0,Period_Indicator,b);
if (Show_CUR[2]) xGBPBuffer[b]=iMomentumOnArray(iGBPBuffer,0,Period_Indicator,b);
if (Show_CUR[3]) xJPYBuffer[b]=iMomentumOnArray(iJPYBuffer,0,Period_Indicator,b);
if (Show_CUR[4]) xCHFBuffer[b]=iMomentumOnArray(iCHFBuffer,0,Period_Indicator,b);
if (Show_CUR[5]) xAUDBuffer[b]=iMomentumOnArray(iAUDBuffer,0,Period_Indicator,b);
if (Show_CUR[6]) xCADBuffer[b]=iMomentumOnArray(iCADBuffer,0,Period_Indicator,b);
if (Show_CUR[7]) xNZDBuffer[b]=iMomentumOnArray(iNZDBuffer,0,Period_Indicator,b);
} break;
case 4:
{
if (Show_CUR[0]) xUSDBuffer[b]=iMAOnArray(iUSDBuffer,0,Fast_EMA,0,MODE_EMA,b)-iMAOnArray(iUSDBuffer,0,Slow_EMA,0,MODE_EMA,b);
if (Show_CUR[1]) xEURBuffer[b]=iMAOnArray(iEURBuffer,0,Fast_EMA,0,MODE_EMA,b)-iMAOnArray(iEURBuffer,0,Slow_EMA,0,MODE_EMA,b);
if (Show_CUR[2]) xGBPBuffer[b]=iMAOnArray(iGBPBuffer,0,Fast_EMA,0,MODE_EMA,b)-iMAOnArray(iGBPBuffer,0,Slow_EMA,0,MODE_EMA,b);
if (Show_CUR[3]) xJPYBuffer[b]=iMAOnArray(iJPYBuffer,0,Fast_EMA,0,MODE_EMA,b)-iMAOnArray(iJPYBuffer,0,Slow_EMA,0,MODE_EMA,b);
if (Show_CUR[4]) xCHFBuffer[b]=iMAOnArray(iCHFBuffer,0,Fast_EMA,0,MODE_EMA,b)-iMAOnArray(iCHFBuffer,0,Slow_EMA,0,MODE_EMA,b);
if (Show_CUR[5]) xAUDBuffer[b]=iMAOnArray(iAUDBuffer,0,Fast_EMA,0,MODE_EMA,b)-iMAOnArray(iAUDBuffer,0,Slow_EMA,0,MODE_EMA,b);
if (Show_CUR[6]) xCADBuffer[b]=iMAOnArray(iCADBuffer,0,Fast_EMA,0,MODE_EMA,b)-iMAOnArray(iCADBuffer,0,Slow_EMA,0,MODE_EMA,b);
if (Show_CUR[7]) xNZDBuffer[b]=iMAOnArray(iNZDBuffer,0,Fast_EMA,0,MODE_EMA,b)-iMAOnArray(iNZDBuffer,0,Slow_EMA,0,MODE_EMA,b);
} break;
case 5:
{
if (Show_CUR[0]) xUSDBuffer[b]=Stochastic(b,iUSDBuffer);
if (Show_CUR[1]) xEURBuffer[b]=Stochastic(b,iEURBuffer);
if (Show_CUR[2]) xGBPBuffer[b]=Stochastic(b,iGBPBuffer);
if (Show_CUR[3]) xJPYBuffer[b]=Stochastic(b,iJPYBuffer);
if (Show_CUR[4]) xCHFBuffer[b]=Stochastic(b,iCHFBuffer);
if (Show_CUR[5]) xAUDBuffer[b]=Stochastic(b,iAUDBuffer);
if (Show_CUR[6]) xCADBuffer[b]=Stochastic(b,iCADBuffer);
if (Show_CUR[7]) xNZDBuffer[b]=Stochastic(b,iNZDBuffer);
}
}
}
if (limit>(BarsCS-MA_Period-Period_Indicator)) limit-=MA_Period;
for (b=limit;b>=0;b--)
{
if (Show_CUR[0]) USDBuffer[b]=NormalizeDouble(iMAOnArray(xUSDBuffer,0,MA_Period,0,MA_Method,b),3);
if (Show_CUR[1]) EURBuffer[b]=NormalizeDouble(iMAOnArray(xEURBuffer,0,MA_Period,0,MA_Method,b),3);
if (Show_CUR[2]) GBPBuffer[b]=NormalizeDouble(iMAOnArray(xGBPBuffer,0,MA_Period,0,MA_Method,b),3);
if (Show_CUR[3]) JPYBuffer[b]=NormalizeDouble(iMAOnArray(xJPYBuffer,0,MA_Period,0,MA_Method,b),3);
if (Show_CUR[4]) CHFBuffer[b]=NormalizeDouble(iMAOnArray(xCHFBuffer,0,MA_Period,0,MA_Method,b),3);
if (Show_CUR[5]) AUDBuffer[b]=NormalizeDouble(iMAOnArray(xAUDBuffer,0,MA_Period,0,MA_Method,b),3);
if (Show_CUR[6]) CADBuffer[b]=NormalizeDouble(iMAOnArray(xCADBuffer,0,MA_Period,0,MA_Method,b),3);
if (Show_CUR[7]) NZDBuffer[b]=NormalizeDouble(iMAOnArray(xNZDBuffer,0,MA_Period,0,MA_Method,b),3);
if (Diff_Indicators && Auto_Detect_Pair)
{
if (CS1==Currency[0]) {curbuffer=USDBuffer[b]; USDBuffer[b]=EMPTY_VALUE;}
if (CS1==Currency[1]) {curbuffer=EURBuffer[b]; EURBuffer[b]=EMPTY_VALUE;}
if (CS1==Currency[2]) {curbuffer=GBPBuffer[b]; GBPBuffer[b]=EMPTY_VALUE;}
if (CS1==Currency[3]) {curbuffer=JPYBuffer[b]; JPYBuffer[b]=EMPTY_VALUE;}
if (CS1==Currency[4]) {curbuffer=CHFBuffer[b]; CHFBuffer[b]=EMPTY_VALUE;}
if (CS1==Currency[5]) {curbuffer=AUDBuffer[b]; AUDBuffer[b]=EMPTY_VALUE;}
if (CS1==Currency[6]) {curbuffer=CADBuffer[b]; CADBuffer[b]=EMPTY_VALUE;}
if (CS1==Currency[7]) {curbuffer=NZDBuffer[b]; NZDBuffer[b]=EMPTY_VALUE;}
if (CS2==Currency[0]) USDBuffer[b]=curbuffer-USDBuffer[b];
if (CS2==Currency[1]) EURBuffer[b]=curbuffer-EURBuffer[b];
if (CS2==Currency[2]) GBPBuffer[b]=curbuffer-GBPBuffer[b];
if (CS2==Currency[3]) JPYBuffer[b]=curbuffer-JPYBuffer[b];
if (CS2==Currency[4]) CHFBuffer[b]=curbuffer-CHFBuffer[b];
if (CS2==Currency[5]) AUDBuffer[b]=curbuffer-AUDBuffer[b];
if (CS2==Currency[6]) CADBuffer[b]=curbuffer-CADBuffer[b];
if (CS2==Currency[7]) NZDBuffer[b]=curbuffer-NZDBuffer[b];
}
}
ltime=iTime(NULL,0,1);
for (i=0;i<7;i++) if (iTime(Symbols[i],0,1)<ltime) ltime=iTime(Symbols[i],0,1);
LB=iBarShift(NULL,0,ltime);
return(0);
}
double Price(int k, datetime time)
{
double price;
int bar=iBarShift(Symbols[k],0,time);
switch (Applied_Price)
{
case PRICE_CLOSE: price=iClose(Symbols[k],0,bar); break;
case PRICE_OPEN: price=iOpen(Symbols[k],0,bar); break;
case PRICE_HIGH: price=iHigh(Symbols[k],0,bar); break;
case PRICE_LOW: price=iLow(Symbols[k],0,bar); break;
case PRICE_MEDIAN: price=(iHigh(Symbols[k],0,bar)+iLow(Symbols[k],0,bar))/2; break;
case PRICE_TYPICAL: price=(iHigh(Symbols[k],0,bar)+iLow(Symbols[k],0,bar)+iClose(Symbols[k],0,bar))/3; break;
case PRICE_WEIGHTED: price=(iHigh(Symbols[k],0,bar)+iLow(Symbols[k],0,bar)+iClose(Symbols[k],0,bar)+iClose(Symbols[k],0,bar))/4;
}
return(price);
}
double Stochastic(int k, double buffer[])
{
double max,min;
double sum1=0.0;
double sum2=0.0;
for (int n=0;n<Slowing;n++)
{
max=buffer[ArrayMaximum(buffer,K_Period,k+n)];
min=buffer[ArrayMinimum(buffer,K_Period,k+n)];
sum1+=buffer[k+n]-min;
sum2+=max-min;
}
if (sum2==0.0) return(100);
else return(sum1/sum2*100);
}
//+------------------------------------------------------------------+
Comments