Индекс доллара, индексы валют, относительное изменение.

Изменения котировок валютных пар на Forex происходит в результате изменения стоимости каждой составляющей пары. В результате часто возникает идея выделить одну составляющую пары и посмотреть её изменение. Поскольку одной из составляющих наиболее ликвидных и популярных пар на Forex является USD, то в первую очередь обычно интересует изменение именно этой валюты.
Существует так называемый «индекс доллара», это относительная величина, показывающая относительное изменение стоимости доллара во времени. Он рассчитывается исходя из котировок нескольких валютных пар с учетом объемов внешней торговли. Этот индекс очень удобен для оценки изменения «главной» валюты, но вот найти его котировки зачастую не так просто.
Однако есть формула, для расчета этого индекса
Index USD = 50.14348112*EUR/USD^-.0567*USD/JPY^0.136*GBP/USD^-0.119*USD/CAD^0.091*USD/SEC^0.042*USD/CHF^0.036
Возможно, эта формула не совсем точна, но получаемые при её помощи значения довольно близко соответствуют настоящим.
Написал код, автоматически рассчитывающий индекс доллара по выше приведенной формуле. По причине того, что у меня в базе нет котировок Шведской Кроны (USD/SEC), а влияние на конечный результат она оказывает мало, заменил её на 7. Кроме того, сделал расчет не только цен закрытия, что было бы наиболее правильно, но и цен Open, High и Low. Рассчитывать таким образом High и Low вообще не корректно, т.к. максимумы и минимумы на графиках различных пар происходят не одновременно, но учитывая, что формула все равно приблизительная и хотелось видеть на графике привычные свечки пошел на такое допущение.
Возможно Вам, для работы нижеприведенных кодов придется исправить в них имена символов используемых в Вашей базе данных.
Например:
«EUR» на «EURUSD» или «EUR/USD» Итак.

Индекс USD

C = 50.14348112 *
Foreign("EUR", "C")^-0.567 *
Foreign("JPY", "C")^ 0.136 *
Foreign("GBP", "C")^-0.119 *
Foreign("CAD", "C")^ 0.091 *
/*Foreign("USDSEK", "C")*/7 ^ 0.042 *
Foreign("CHF", "C")^ 0.036;

O = 50.14348112 *
Foreign("EUR", "O")^-0.567 *
Foreign("JPY", "O")^ 0.136 *
Foreign("GBP", "O")^-0.119 *
Foreign("CAD", "O")^ 0.091 *
Foreign("CHF", "O")^ 0.036 * 7 ^ 0.042 ;

H = 50.14348112 *
Foreign("EUR", "L")^-0.567 *
Foreign("JPY", "H")^ 0.136 *
Foreign("GBP", "L")^-0.119 *
Foreign("CAD", "H")^ 0.091 *
Foreign("CHF", "H")^ 0.036 * 7 ^ 0.042 ;

L = 50.14348112 *
Foreign("EUR", "H")^-0.567 *
Foreign("JPY", "L")^ 0.136 *
Foreign("GBP", "H")^-0.119 *
Foreign("CAD", "L")^ 0.091 *
Foreign("CHF", "L")^ 0.036 * 7 ^ 0.042 ;




Plot(C, "USD Index", 1 , 64);

В результате должен получиться примерно такой график.



Теперь, зная изменение одной из составляющих долларовых пар можно легко построить графики относительного изменения валют.
Началом отсчета служит выбранный бар, который выбирается щелчком на графике и по умолчанию обозначается вертикальной голубой линией.

GraphXSpace = 5;
SetBarsRequired(100000, 0);

EU =
Foreign("EUR","C");
JP =
Foreign("JPY","C");
CH =
Foreign("CHF","C");
GB =
Foreign("GBP","C");
CA =
Foreign("CAD","C");
AU =
Foreign("AUD","C");
N =
Foreign("NZD","C");


Start =
IIf(SelectedValue(DateNum())<850000, 1041001, SelectedValue(DateNum()));
D1 = Start ==
DateNum();

// синтетический индекс USD
US =
50.14348112 *
Foreign("EUR", "C")^-0.567 *
Foreign("JPY", "C")^ 0.136 *
Foreign("GBP", "C")^-0.119 *
Foreign("CAD", "C")^ 0.091 *
7 ^ 0.042 *
Foreign("CHF", "C")^ 0.036;

StartUS =
ValueWhen(d1, US, 1);

//EU = EU/US;

StartEU =
ValueWhen(d1, EU, 1);
StartJP =
ValueWhen(d1, JP, 1);
StartCH =
ValueWhen(d1, CH, 1);
StartGB =
ValueWhen(d1, GB, 1);
StartCA =
ValueWhen(d1, CA, 1);
StartAU =
ValueWhen(d1, AU, 1);

ChangeUS = US/StartUS;
ChangeEU = EU/StartEU;
ChangeJP = JP/StartJP;
ChangeCH = CH/StartCH;
ChangeGB = GB/StartGB;
ChangeCA = CA/StartCA;
ChangeAU = AU/StartAU;

Plot((ChangeUS - 1)*100, "USD", colorGold, 4);

Plot((ChangeEU * ChangeUS - 1)*100, "EUR", colorBlack, 4);
Plot((ChangeUS / ChangeJP - 1)*100, "JPY", colorRed, 4);
Plot((ChangeUS / ChangeCH - 1)*100, "CHF", colorGreen, 4);
Plot((ChangeGB * ChangeUS - 1)*100, "GBP", colorBlue, 4);
Plot((ChangeUS / ChangeCA - 1)*100, "CAD", colorOrange, 4);
Plot((ChangeAU * ChangeUS - 1)*100, "AUD", colorAqua, 4);


PlotText(" EUR", BarCount, LastValue( (ChangeEU * ChangeUS - 1)*100), colorBlack);
PlotText(" JPY", BarCount, LastValue( (ChangeUS / ChangeJP - 1)*100), colorRed);
PlotText(" CHF", BarCount, LastValue( (ChangeUS / ChangeCH - 1)*100), colorGreen);
PlotText(" GBP", BarCount, LastValue( (ChangeGB * ChangeUS - 1)*100), colorBlue);
PlotText(" CAD", BarCount, LastValue( (ChangeUS / ChangeCA - 1)*100), colorOrange);
PlotText(" AUD", BarCount, LastValue( (ChangeAU * ChangeUS - 1)*100), colorAqua);
PlotText(" USD", BarCount, LastValue( (ChangeUS - 1)*100), colorGold);

Выглядит это так.



Можно построить графики относительного изменения не от выбранной точки, как в предыдущем коде, а за некоторый период.
В коде ниже по умолчанию взят период 22. Это соответствует месяцу на дневных графиках.

GraphXSpace = 5;
SetBarsRequired(100000, 0);

showUS =
ParamToggle("Show USD", "No|Yes");
showEU =
ParamToggle("Show EUR", "No|Yes");
showJP =
ParamToggle("Show JPY", "No|Yes");
showCH =
ParamToggle("Show CHF", "No|Yes");
showGB =
ParamToggle("Show GBP", "No|Yes");
showCA =
ParamToggle("Show CAD", "No|Yes");
showAU =
ParamToggle("Show AUD", "No|Yes");

Per =
Param("Period", 22, 1, 65, 1);

EU =
Foreign("EUR","C");
JP =
Foreign("JPY","C");
CH =
Foreign("CHF","C");
GB =
Foreign("GBP","C");
CA =
Foreign("CAD","C");
AU =
Foreign("AUD","C");

// синтетический индекс USD
US =
   
50.14348112 *
   
Foreign("EUR", "C")^-0.567 *
   
Foreign("JPY", "C")^ 0.136 *
   
Foreign("GBP", "C")^-0.119 *
   
Foreign("CAD", "C")^ 0.091 *
   
/*Foreign("USDSEK", "C")*/7 ^ 0.042 *
   
Foreign("CHF", "C")^ 0.036;

EU = EU*US;
JP = US/JP;
CH = US/CH;
GB = GB*US;
CA = US/CA;
AU = AU*US;

USChange = (US -
Ref(US, -Per))/Ref(US, -Per)*100;
EUChange = (EU -
Ref(EU, -Per))/Ref(EU, -Per)*100;
JPChange = (JP -
Ref(JP, -Per))/Ref(JP, -Per)*100;
CHChange = (CH -
Ref(CH, -Per))/Ref(CH, -Per)*100;
GBChange = (GB -
Ref(GB, -Per))/Ref(GB, -Per)*100;
CAChange = (CA -
Ref(CA, -Per))/Ref(CA, -Per)*100;
AUChange = (AU -
Ref(AU, -Per))/Ref(AU, -Per)*100;

if(showUS == 1){
Plot(USChange, "USD", colorGold, 4);
PlotText(" USD", BarCount, LastValue( (US - Ref(US, -Per))/Ref(US, -Per)*100), colorGold);}
if(showEU == 1){
Plot(EUChange, "EUR", colorBlack, 4);
PlotText(" EUR", BarCount, LastValue( (EU - Ref(EU, -Per))/Ref(EU, -Per)*100), colorBlack);}
if(showJP == 1){
Plot(JPChange, "JPY", colorRed, 4);
PlotText(" JPY", BarCount, LastValue( (JP - Ref(JP, -Per))/Ref(JP, -Per)*100), colorRed);}
if(showCH == 1){
Plot(CHChange, "GHF", colorGreen, 4);
PlotText(" CHF", BarCount, LastValue( (CH - Ref(CH, -Per))/Ref(CH, -Per)*100), colorGreen);}
if(showGB == 1){
Plot(GBChange, "GBP", colorBlue, 4);
PlotText(" GBP", BarCount, LastValue( (GB - Ref(GB, -Per))/Ref(GB, -Per)*100), colorBlue);}
if(showCA == 1){
Plot(CAChange, "CAD", colorOrange, 4);
PlotText(" CAD", BarCount, LastValue( (CA - Ref(CA, -Per))/Ref(CA, -Per)*100), colorOrange);}
if(showAU == 1){
Plot(AUChange, "AUD", colorAqua, 4);
PlotText(" AUD", BarCount, LastValue( (AU - Ref(AU, -Per))/Ref(AU, -Per)*100), colorAqua);}

Тут предусмотрена возможность отключения отображения ненужных линий.




Удачи.