Принцип суперпозиции и интерференции финансовых инструментов

Автор: lexy Вторник, Сентябрь 9th, 2014 Нет комментариев

Рубрика: Разное

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

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

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

Возьмем в качестве примера валютную пару EURUSD. Результирующее движение на графике цен формируется следующим образом с учетом меняющихся во времени национальных валют EUR и USD:

1). EURUSD – растет, если:

а). EUR – растет и USD – падает;

б). EUR – растет и USD – не меняется;

в). EUR – не меняется и USD – падает;

г). EUR – растет и USD – растет, но медленнее чем EUR;

2). EURUSD – падает, если:

а). USD – растет и EUR – падает;

б). USD – растет и EUR – не меняется;

в). USD – не меняется и EUR – падает;

г). USD – растет и EUR – растет, но медленнее чем USD;

3). EURUSD – не меняется, если:

а). USD – не меняется и EUR – не меняется;

б). USD – растет и EUR – растет, но одинаково с USD;

в). USD – падает и EUR – падает, но одинаково с USD.

 

Чем больше факторов влияют на поведение валютной пары, тем сложнее оценить ее поведение и сделать прогнозы на будущее. И, следовательно, если бы нам удалось из валютной пары выделить ее составляющие, меняющиеся во времени значения национальной валюты, то тем самым мы существенно сократили бы степень свободы движения национальной валюты по сравнению с валютной парой, в которую она входит, и количество факторов влияющих на ее поведение. А как результат, повысили бы точность оценки ее поведения и прогнозирования будущих значений. Как же нам это сделать?

 

Принцип суперпозиции и интерференции финансовых инструментов

 

Итак, задача формулируется следующим образом: имеем валютную пару, например, EURUSD, нужно разделить входящие в эту валютную пару составляющие EUR и USD. Для решения этой задачи я взял имеющиеся в моем распоряжении кросс-курсы валют EUR и USD с другими валютами: EURGBP, EURJPY, EURAUD, EURCHF, EURCAD, EURNOK, EURSEK, EURDKK, EURNZD, EURSGD, EURHKD, USDCHF, USDJPY, USDCAD, USDNOK, USDSEK, USDDKK, USDSGD, USDHKD, USDMXN, USDZAR, GBPUSD, AUDUSD, NZDUSD. Имея данные по кросс-курсам USDMXN, USDZAR, я не имел в своем ДЦ соответствующих кросс-курсов относительно EUR. Но этот пробел не сложно исправить: EURMXN = EURUSD * USDMXN; EURZAR = EURUSD * USDZAR.

На первом этапе решения поставленной задачи необходимо все валютные пары привести к единому масштабу. Для этой цели рассчитаем масштабирующие коэффициенты для каждой валютной пары как усредненное значение Close для соответствующей валютной пары на длине выборки LengthSample. Далее разделив ценовые значения каждой валютной пары по всей длине выборки на соответствующей этой валютной паре масштабирующий коэффициент, получим приведенные к единому масштабу валютные пары.

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

EUR = (EURUSD + EURGBP + EURJPY + EURAUD + EURCHF + EURCAD + EURNOK + EURSEK + EURDKK + EURNZD + EURSGD + EURHKD + EURMXN + EURZAR)/14;

 

USD = (USDCHF + USDJPY + USDCAD + USDNOK + USDSEK + USDDKK + USDSGD + USDHKD + USDMXN + USDZAR + 1/GBPUSD + 1/AUDUSD + 1/NZDUSD + 1/EURUSD)/14;

Приняв априори, что каждая валютная пара формируется из двух векторов национальных валют, и изменения фаз этих векторов во времени не синхронны между собой, а формируются в большей степени под влиянием экономических факторов конкретной страны, мы можем сделать следующий вывод:

При суперпозиции кросс-курсов различных валют составляющая числителя, по закону интерференции, за счет совпадения фаз усиливается, составляющие знаменателя за счет несовпадения фаз в значительной степени взаимно компенсируются.

На рис.1 представлены графики результатов расчетов EUR и USD по вышеприведенным формулам. Розовый цвет соответствует EUR, синий – USD, голубой – EURUSD.

Рис.1

 

Далее оценим, какова погрешность расчетов EUR и USD, вызванная неполной компенсацией составляющих знаменателя в выше приведенных формулах. Для этого построим графики EURUSD, голубая линия рис.2, и отношения рассчитанного EUR к рассчитанному USD, красная линия рис.2.

Рис.2

 

Из приведенных графиков видно, что фазовые искажения EUR и USD, полученных путем суперпозиции и интерференции кросс-курсов валют, незначительны, но амплитудная погрешность существенна, что говорит о не полной компенсации составляющих национальных валют, входящих в кросс-курсы EUR и USD. Однако можно заметить, что нелинейность погрешности от бара к бару мала, это дает нам возможность осуществить компенсацию погрешности на текущем баре за счет введения в выше приведенные формулы компенсирующей погрешности с предыдущего бара.

Расчет компенсирующей погрешности осуществим следующим образом:

  Och   = EURUSD * USD / EUR;

Вводя полученное значение погрешности в формулы расчетов EUR и USD в качестве компенсирующего элемента с предыдущего бара при расчете текущего, мы получим вполне приемлемую погрешность расчетов для большинства прикладных задач. На рис.3 представлены результаты расчетов после компенсации, графики EURUSD, голубая линия рис.3, и отношения рассчитанного EUR к рассчитанному USD, красная линия рис.3. Как видно из графиков, полученные результаты существенно лучше, чем до компенсации погрешности.

Рис.3

Как было уже сказано, фазовые искажения, вносимые предложенным методом выделения составляющих EUR и USD из EURUSD, незначительны, но чем дальше от нулевого бара мы будем рассматривать историю, а так же EUR и USD, полученные на основании этой истории, тем сильнее будет проявляться эффект так называемых дыр в истории. При пропуске баров за счет дыр в истории нарушается синхронизация кросс-курсов различных валют между собой, а это в свою очередь приводит к возникновению фазовых искажений в рассчитанных EUR и USD по отношению к EURUSD.

Чем глубже в историю мы будем погружаться или более младшие таймфреймы использовать в своих расчетах, тем сильнее будет проявляться эффект дыр в истории, и больше фазовые искажения мы получим в результате. На рис.4 приведены графики, подтверждающие выше сказанное. Эти графики – продолжение графиков представленных на рис.3, вглубь истории. За счет накопления погрешности, связанной с пропусками отдельных баров в истории различных используемых инструментах, мы видим существенные фазовые искажения. Чтобы устранить эту проблему, нужно использовать более качественные исторические данные или применять специальные методы латания дыр в истории.

Рис.4

 

 

Рассчитав EUR и USD, мы можем легко рассчитать и любые другие национальные валюты.

GBP = (EUR / EURGBP + GBPUSD * USD) / 2;
JPY = (EUR / EURJPY + USD / USDJPY) / 2;
AUD = (EUR / EURAUD + AUDUSD * USD) / 2;
CHF = (EUR / EURCHF + USD / USDCHF) / 2;
CAD = (EUR / EURCAD + USD / USDCAD) / 2;
NOK = (EUR / EURNOK + USD / USDNOK) / 2;
SEK = (EUR / EURSEK + USD / USDSEK) / 2;
DKK = (EUR / EURDKK + USD / USDDKK) / 2;
NZD = (EUR / EURNZD + NZDUSD * USD) / 2;
SGD = (EUR / EURSGD + USD / USDSGD) / 2;
HKD = (EUR / EURHKD + USD / USDHKD) / 2;
MXN = (EUR / EURMXN + USD / USDMXN) / 2;
ZAR = (EUR / EURZAR + USD / USDZAR) / 2;

На рис.5 представлены ряды из рассчитанных выше валют, выведенные на один график. EURUSD – голубой цвет, EUR – розовый цвет, USD – синий цвет, GBP – красный цвет, JPY – коричневый цвет, AUD – фиолетовый цвет, CHF – желтый цвет, CAD – черный цвет.

Рис.5

 

Вышеизложенный алгоритм расчета национальных валют с использованием принципа суперпозиции и интерференции реализован мною в виде индикатора SuperPosition, листинг которого представлен ниже.

 

//+------------------------------------------------------------------+
//|                                                SuperPosition.mq4 |
//|                                       Copyright © 2009,Piligrimm |
//|                                     mailto: piligrimm_fx@mail.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2009,Piligrimm"
#property link      "mailto: piligrimm_fx@mail.ru"
#property indicator_separate_window  
#property indicator_buffers 3
#property indicator_color1 Magenta
#property indicator_color2 Blue
#property indicator_color3 Aqua
//---- input parameters
extern int LengthSample=1000;
int i,j;
double GL[][81],EURClose[],USDClose[],EURUSDClose[],EURHigh[],USDHigh[],EURUSDHigh[],EURLow[],USDLow[];
double GBPClose[],JPYClose[],AUDClose[],CHFClose[],CADClose[],NOKClose[],SEKClose[],EURUSDLow[],Kf[27];
double DKKClose[],NZDClose[],SGDClose[],HKDClose[],MXNClose[],ZARClose[],SGDLow[],HKDLow[],MXNLow[];
double GBPHigh[],JPYHigh[],AUDHigh[],CHFHigh[],CADHigh[],NOKHigh[],SEKHigh[],DKKLow[],NZDLow[];
double DKKHigh[],NZDHigh[],SGDHigh[],HKDHigh[],MXNHigh[],ZARHigh[],ZARLow[],CloseOch,HighOch,LowOch;
double GBPLow[],JPYLow[],AUDLow[],CHFLow[],CADLow[],NOKLow[],SEKLow[];
//---- buffers

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators

       SetIndexBuffer(0,EURClose);               // Назначение массива буферу
   //    SetIndexBuffer(0,EURHigh);              // Назначение массива буферу
   //    SetIndexBuffer(0,EURLow);               // Назначение массива буферу
       SetIndexStyle (0,DRAW_LINE,STYLE_SOLID,2);//   Стиль линии
       SetIndexBuffer(1,USDClose);               // Назначение массива буферу
   //    SetIndexBuffer(1,USDHigh);              // Назначение массива буферу
   //    SetIndexBuffer(1,USDLow);               // Назначение массива буферу
       SetIndexStyle (1,DRAW_LINE,STYLE_SOLID,2);//   Стиль линии
       SetIndexBuffer(2,EURUSDClose);            // Назначение массива буферу
   //    SetIndexBuffer(2,EURUSDHigh);           // Назначение массива буферу
   //    SetIndexBuffer(2,EURUSDLow);            // Назначение массива буферу
       SetIndexStyle (2,DRAW_LINE,STYLE_SOLID,2);//   Стиль линии   

       ArrayResize(GL, LengthSample+1);
       ArrayResize(EURClose, LengthSample);
       ArrayResize(USDClose, LengthSample);
       ArrayResize(GBPClose, LengthSample);
       ArrayResize(JPYClose, LengthSample);
       ArrayResize(AUDClose, LengthSample);
       ArrayResize(CHFClose, LengthSample);
       ArrayResize(CADClose, LengthSample);
       ArrayResize(NOKClose, LengthSample);
       ArrayResize(SEKClose, LengthSample);
       ArrayResize(DKKClose, LengthSample);
       ArrayResize(NZDClose, LengthSample);
       ArrayResize(SGDClose, LengthSample);
       ArrayResize(HKDClose, LengthSample);
       ArrayResize(MXNClose, LengthSample);
       ArrayResize(ZARClose, LengthSample);      
       ArrayResize(EURHigh, LengthSample);
       ArrayResize(USDHigh, LengthSample);      
       ArrayResize(GBPHigh, LengthSample);
       ArrayResize(JPYHigh, LengthSample);
       ArrayResize(AUDHigh, LengthSample);
       ArrayResize(CHFHigh, LengthSample);
       ArrayResize(CADHigh, LengthSample);
       ArrayResize(NOKHigh, LengthSample);
       ArrayResize(SEKHigh, LengthSample);
       ArrayResize(DKKHigh, LengthSample);
       ArrayResize(NZDHigh, LengthSample);
       ArrayResize(SGDHigh, LengthSample);
       ArrayResize(HKDHigh, LengthSample);
       ArrayResize(MXNHigh, LengthSample);
       ArrayResize(ZARHigh, LengthSample);
       ArrayResize(EURLow, LengthSample);
       ArrayResize(USDLow, LengthSample);
       ArrayResize(GBPLow, LengthSample);
       ArrayResize(JPYLow, LengthSample);
       ArrayResize(AUDLow, LengthSample);
       ArrayResize(CHFLow, LengthSample);
       ArrayResize(CADLow, LengthSample);
       ArrayResize(NOKLow, LengthSample);
       ArrayResize(SEKLow, LengthSample);
       ArrayResize(DKKLow, LengthSample);
       ArrayResize(NZDLow, LengthSample);
       ArrayResize(SGDLow, LengthSample);
       ArrayResize(HKDLow, LengthSample);
       ArrayResize(MXNLow, LengthSample);
       ArrayResize(ZARLow, LengthSample);
       ArrayResize(EURUSDClose, LengthSample);
       ArrayResize(EURUSDHigh, LengthSample);      
       ArrayResize(EURUSDLow, LengthSample);

//----

   return(0);
  }
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//---- 

//----
   return(0);
  }

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
//
int start()
    {//1

   for (i=0; i<=LengthSample; i++)                    
     {//2
       GL[i][0]=  iClose("EURUSD",0,i);
       GL[i][1]=  iClose("EURGBP",0,i);
       GL[i][2]=  iClose("EURJPY",0,i);
       GL[i][3]=  iClose("EURAUD",0,i);
       GL[i][4]=  iClose("EURCHF",0,i);
       GL[i][5]=  iClose("EURCAD",0,i);
       GL[i][6]=  iClose("EURNOK",0,i);
       GL[i][7]=  iClose("EURSEK",0,i);
       GL[i][8]=  iClose("EURDKK",0,i);
       GL[i][9]=  iClose("EURNZD",0,i);
       GL[i][10]= iClose("EURSGD",0,i);
       GL[i][11]= iClose("EURHKD",0,i);
       GL[i][12]= iClose("USDCHF",0,i);
       GL[i][13]= iClose("USDJPY",0,i);
       GL[i][14]= iClose("USDCAD",0,i);
       GL[i][15]= iClose("USDNOK",0,i);
       GL[i][16]= iClose("USDSEK",0,i);
       GL[i][17]= iClose("USDDKK",0,i);
       GL[i][18]= iClose("USDSGD",0,i);
       GL[i][19]= iClose("USDHKD",0,i);
       GL[i][20]= iClose("USDMXN",0,i);
       GL[i][21]= iClose("USDZAR",0,i);
       GL[i][22]= iClose("GBPUSD",0,i);
       GL[i][23]= iClose("AUDUSD",0,i);
       GL[i][24]= iClose("NZDUSD",0,i);
       GL[i][25]= GL[i][0]*GL[i][20];  //Close"EURMXN"
       GL[i][26]= GL[i][0]*GL[i][21];  //Close"EURZAR"
       GL[i][27]= iHigh ("EURUSD",0,i);
       GL[i][28]= iHigh ("EURGBP",0,i);
       GL[i][29]= iHigh ("EURJPY",0,i);
       GL[i][30]= iHigh ("EURAUD",0,i);
       GL[i][31]= iHigh ("EURCHF",0,i);
       GL[i][32]= iHigh ("EURCAD",0,i);
       GL[i][33]= iHigh ("EURNOK",0,i);
       GL[i][34]= iHigh ("EURSEK",0,i);
       GL[i][35]= iHigh ("EURDKK",0,i);
       GL[i][36]= iHigh ("EURNZD",0,i);
       GL[i][37]= iHigh ("EURSGD",0,i);
       GL[i][38]= iHigh ("EURHKD",0,i);
       GL[i][39]= iHigh ("USDCHF",0,i);
       GL[i][40]= iHigh ("USDJPY",0,i);
       GL[i][41]= iHigh ("USDCAD",0,i);
       GL[i][42]= iHigh ("USDNOK",0,i);
       GL[i][43]= iHigh ("USDSEK",0,i);
       GL[i][44]= iHigh ("USDDKK",0,i);
       GL[i][45]= iHigh ("USDSGD",0,i);
       GL[i][46]= iHigh ("USDHKD",0,i);
       GL[i][47]= iHigh ("USDMXN",0,i);
       GL[i][48]= iHigh ("USDZAR",0,i);
       GL[i][49]= iHigh ("GBPUSD",0,i);
       GL[i][50]= iHigh ("AUDUSD",0,i);
       GL[i][51]= iHigh ("NZDUSD",0,i);
       GL[i][52]= GL[i][27]*GL[i][47];  //High"EURMXN"
       GL[i][53]= GL[i][27]*GL[i][48];  //High"EURZAR"
       GL[i][54]= iLow  ("EURUSD",0,i);
       GL[i][55]= iLow  ("EURGBP",0,i);
       GL[i][56]= iLow  ("EURJPY",0,i);
       GL[i][57]= iLow  ("EURAUD",0,i);
       GL[i][58]= iLow  ("EURCHF",0,i);
       GL[i][59]= iLow  ("EURCAD",0,i);
       GL[i][60]= iLow  ("EURNOK",0,i);
       GL[i][61]= iLow  ("EURSEK",0,i);
       GL[i][62]= iLow  ("EURDKK",0,i);
       GL[i][63]= iLow  ("EURNZD",0,i);
       GL[i][64]= iLow  ("EURSGD",0,i);
       GL[i][65]= iLow  ("EURHKD",0,i);
       GL[i][66]= iLow  ("USDCHF",0,i);
       GL[i][67]= iLow  ("USDJPY",0,i);
       GL[i][68]= iLow  ("USDCAD",0,i);
       GL[i][69]= iLow  ("USDNOK",0,i);
       GL[i][70]= iLow  ("USDSEK",0,i);
       GL[i][71]= iLow  ("USDDKK",0,i);
       GL[i][72]= iLow  ("USDSGD",0,i);
       GL[i][73]= iLow  ("USDHKD",0,i);
       GL[i][74]= iLow  ("USDMXN",0,i);
       GL[i][75]= iLow  ("USDZAR",0,i);
       GL[i][76]= iLow  ("GBPUSD",0,i);
       GL[i][77]= iLow  ("AUDUSD",0,i);
       GL[i][78]= iLow  ("NZDUSD",0,i);
       GL[i][79]= GL[i][54]*GL[i][74];  //Low"EURMXN"
       GL[i][80]= GL[i][54]*GL[i][75];  //Low"EURZAR"                              
     }//2 

   for (j=0; j<27; j++)
     {//3
      Kf[j]=0;
    for (i=1; i<=LengthSample; i++)
      Kf[j]+=GL[i][j];
      Kf[j]/=LengthSample;
     }//3 

      CloseOch   = (GL[LengthSample][0]/Kf[0])*((Kf[0]/GL[LengthSample][0]+GL[LengthSample][12]/Kf[12]+GL[LengthSample][13]/Kf[13]
                   +GL[LengthSample][14]/Kf[14]+GL[LengthSample][15]/Kf[15]+GL[LengthSample][16]/Kf[16]+GL[LengthSample][17]/Kf[17]
                   +GL[LengthSample][18]/Kf[18]+GL[LengthSample][19]/Kf[19]+GL[LengthSample][20]/Kf[20]+GL[LengthSample][21]/Kf[21]
                   +Kf[22]/GL[LengthSample][22]+Kf[23]/GL[LengthSample][23]
                   +Kf[24]/GL[LengthSample][24])/14)/((GL[LengthSample][0]/Kf[0]
                   +GL[LengthSample][1]/Kf[1]+GL[LengthSample][2]/Kf[2]+GL[LengthSample][3]/Kf[3]+GL[LengthSample][4]/Kf[4]
                   +GL[LengthSample][5]/Kf[5]+GL[LengthSample][6]/Kf[6]+GL[LengthSample][7]/Kf[7]+GL[LengthSample][8]/Kf[8]
                   +GL[LengthSample][9]/Kf[9]+GL[LengthSample][10]/Kf[10]+GL[LengthSample][11]/Kf[11]+GL[LengthSample][25]/Kf[25]
                   +GL[LengthSample][26]/Kf[26])/14); 

      HighOch    = (GL[LengthSample][27]/Kf[0])*((Kf[0]/GL[LengthSample][27]+GL[LengthSample][39]/Kf[12]+GL[LengthSample][40]/Kf[13]
                   +GL[LengthSample][41]/Kf[14]+GL[LengthSample][42]/Kf[15]+GL[LengthSample][43]/Kf[16]+GL[LengthSample][44]/Kf[17]
                   +GL[LengthSample][45]/Kf[18]+GL[LengthSample][46]/Kf[19]+GL[LengthSample][47]/Kf[20]+GL[LengthSample][48]/Kf[21]
                   +Kf[22]/GL[LengthSample][49]+Kf[23]/GL[LengthSample][50]
                   +Kf[24]/GL[LengthSample][51])/14)/((GL[LengthSample][27]/Kf[0]
                   +GL[LengthSample][28]/Kf[1]+GL[LengthSample][29]/Kf[2]+GL[LengthSample][30]/Kf[3]+GL[LengthSample][31]/Kf[4]
                   +GL[LengthSample][32]/Kf[5]+GL[LengthSample][33]/Kf[6]+GL[LengthSample][34]/Kf[7]+GL[LengthSample][35]/Kf[8]
                   +GL[LengthSample][36]/Kf[9]+GL[LengthSample][37]/Kf[10]+GL[LengthSample][38]/Kf[11]+GL[LengthSample][52]/Kf[25]
                   +GL[LengthSample][53]/Kf[26])/14);

      LowOch     = (GL[LengthSample][54]/Kf[0])*((Kf[0]/GL[LengthSample][54]+GL[LengthSample][66]/Kf[12]+GL[LengthSample][67]/Kf[13]
                   +GL[LengthSample][68]/Kf[14]+GL[LengthSample][69]/Kf[15]+GL[LengthSample][70]/Kf[16]+GL[LengthSample][71]/Kf[17]
                   +GL[LengthSample][72]/Kf[18]+GL[LengthSample][73]/Kf[19]+GL[LengthSample][74]/Kf[20]+GL[LengthSample][75]/Kf[21]
                   +Kf[22]/GL[LengthSample][76]+Kf[23]/GL[LengthSample][77]+Kf[24]/GL[LengthSample][78])/14)/((GL[LengthSample][54]/Kf[0]
                   +GL[LengthSample][55]/Kf[1]+GL[LengthSample][56]/Kf[2]+GL[LengthSample][57]/Kf[3]+GL[LengthSample][58]/Kf[4]
                   +GL[LengthSample][59]/Kf[5]+GL[LengthSample][60]/Kf[6]+GL[LengthSample][61]/Kf[7]+GL[LengthSample][62]/Kf[8]
                   +GL[LengthSample][63]/Kf[9]+GL[LengthSample][64]/Kf[10]+GL[LengthSample][65]/Kf[11]+GL[LengthSample][79]/Kf[25]
                   +GL[LengthSample][80]/Kf[26])/14);

   for (i=LengthSample-1; i>=0; i--)
     {//4
      EURUSDClose[i]= GL[i][0]/Kf[0];

      EURClose[i]= (GL[i][0]/Kf[0]+GL[i][1]/Kf[1]+GL[i][2]/Kf[2]+GL[i][3]/Kf[3]+GL[i][4]/Kf[4]+GL[i][5]/Kf[5]+GL[i][6]/Kf[6]
                   +GL[i][7]/Kf[7]+GL[i][8]/Kf[8]+GL[i][9]/Kf[9]+GL[i][10]/Kf[10]+GL[i][11]/Kf[11]+GL[i][25]/Kf[25]
                   +GL[i][26]/Kf[26]+CloseOch)/14; 

      USDClose[i]= (Kf[0]/GL[i][0]+GL[i][12]/Kf[12]+GL[i][13]/Kf[13]+GL[i][14]/Kf[14]+GL[i][15]/Kf[15]+GL[i][16]/Kf[16]
                   +GL[i][17]/Kf[17]+GL[i][18]/Kf[18]+GL[i][19]/Kf[19]+GL[i][20]/Kf[20]+GL[i][21]/Kf[21]+Kf[22]/GL[i][22]
                   +Kf[23]/GL[i][23]+Kf[24]/GL[i][24]+CloseOch)/14;

      CloseOch   = EURUSDClose[i]*USDClose[i]/EURClose[i];      
      GBPClose[i]= (Kf[1]*EURClose[i]/GL[i][1]+GL[i][22]*USDClose[i]/Kf[22])/2;                                                                
      JPYClose[i]= (Kf[2]*EURClose[i]/GL[i][2]+Kf[13]*USDClose[i]/GL[i][13])/2;      
      AUDClose[i]= (Kf[3]*EURClose[i]/GL[i][3]+GL[i][23]*USDClose[i]/Kf[23])/2;      
      CHFClose[i]= (Kf[4]*EURClose[i]/GL[i][4]+Kf[12]*USDClose[i]/GL[i][12])/2;      
      CADClose[i]= (Kf[5]*EURClose[i]/GL[i][5]+Kf[14]*USDClose[i]/GL[i][14])/2;      
      NOKClose[i]= (Kf[6]*EURClose[i]/GL[i][6]+Kf[15]*USDClose[i]/GL[i][15])/2;      
      SEKClose[i]= (Kf[7]*EURClose[i]/GL[i][7]+Kf[16]*USDClose[i]/GL[i][16])/2;      
      DKKClose[i]= (Kf[8]*EURClose[i]/GL[i][8]+Kf[17]*USDClose[i]/GL[i][17])/2;      
      NZDClose[i]= (Kf[9]*EURClose[i]/GL[i][9]+GL[i][24]*USDClose[i]/Kf[24])/2;      
      SGDClose[i]= (Kf[10]*EURClose[i]/GL[i][10]+Kf[18]*USDClose[i]/GL[i][18])/2;      
      HKDClose[i]= (Kf[11]*EURClose[i]/GL[i][11]+Kf[19]*USDClose[i]/GL[i][19])/2;      
      MXNClose[i]= (Kf[25]*EURClose[i]/GL[i][25]+Kf[20]*USDClose[i]/GL[i][20])/2;      
      ZARClose[i]= (Kf[26]*EURClose[i]/GL[i][26]+Kf[21]*USDClose[i]/GL[i][21])/2;      
      EURUSDHigh[i] = GL[i][27]/Kf[0];                  
      EURHigh[i] = (GL[i][27]/Kf[0]+GL[i][28]/Kf[1]+GL[i][29]/Kf[2]+GL[i][30]/Kf[3]+GL[i][31]/Kf[4]+GL[i][32]/Kf[5]
                   +GL[i][33]/Kf[6]+GL[i][34]/Kf[7]+GL[i][35]/Kf[8]+GL[i][36]/Kf[9]+GL[i][37]/Kf[10]+GL[i][38]/Kf[11]
                   +GL[i][52]/Kf[25]+GL[i][53]/Kf[26]+HighOch)/14; 

      USDHigh[i] = (Kf[0]/GL[i][27]+GL[i][39]/Kf[12]+GL[i][40]/Kf[13]+GL[i][41]/Kf[14]+GL[i][42]/Kf[15]+GL[i][43]/Kf[16]
                   +GL[i][44]/Kf[17]+GL[i][45]/Kf[18]+GL[i][46]/Kf[19]+GL[i][47]/Kf[20]+GL[i][48]/Kf[21]+Kf[22]/GL[i][49]
                   +Kf[23]/GL[i][50]+Kf[24]/GL[i][51]+HighOch)/14;             

      HighOch    = EURUSDHigh[i]*USDHigh[i]/EURHigh[i];      
      GBPHigh[i] = (Kf[1]*EURHigh[i]/GL[i][28]+GL[i][49]*USDHigh[i]/Kf[22])/2;                                                                
      JPYHigh[i] = (Kf[2]*EURHigh[i]/GL[i][29]+Kf[13]*USDHigh[i]/GL[i][40])/2;      
      AUDHigh[i] = (Kf[3]*EURHigh[i]/GL[i][30]+GL[i][50]*USDHigh[i]/Kf[23])/2;      
      CHFHigh[i] = (Kf[4]*EURHigh[i]/GL[i][31]+Kf[12]*USDHigh[i]/GL[i][39])/2;      
      CADHigh[i] = (Kf[5]*EURHigh[i]/GL[i][32]+Kf[14]*USDHigh[i]/GL[i][41])/2;      
      NOKHigh[i] = (Kf[6]*EURHigh[i]/GL[i][33]+Kf[15]*USDHigh[i]/GL[i][42])/2;      
      SEKHigh[i] = (Kf[7]*EURHigh[i]/GL[i][34]+Kf[16]*USDHigh[i]/GL[i][43])/2;      
      DKKHigh[i] = (Kf[8]*EURHigh[i]/GL[i][35]+Kf[17]*USDHigh[i]/GL[i][44])/2;      
      NZDHigh[i] = (Kf[9]*EURHigh[i]/GL[i][36]+GL[i][51]*USDHigh[i]/Kf[24])/2;      
      SGDHigh[i] = (Kf[10]*EURHigh[i]/GL[i][37]+Kf[18]*USDHigh[i]/GL[i][45])/2;      
      HKDHigh[i] = (Kf[11]*EURHigh[i]/GL[i][38]+Kf[19]*USDHigh[i]/GL[i][46])/2;      
      MXNHigh[i] = (Kf[25]*EURHigh[i]/GL[i][52]+Kf[20]*USDHigh[i]/GL[i][47])/2;      
      ZARHigh[i] = (Kf[26]*EURHigh[i]/GL[i][53]+Kf[21]*USDHigh[i]/GL[i][48])/2;

      EURUSDLow[i]  = GL[i][54]/Kf[0];      
      EURLow[i]  = (GL[i][54]/Kf[0]+GL[i][55]/Kf[1]+GL[i][56]/Kf[2]+GL[i][57]/Kf[3]+GL[i][58]/Kf[4]+GL[i][59]/Kf[5]
                   +GL[i][60]/Kf[6]+GL[i][61]/Kf[7]+GL[i][62]/Kf[8]+GL[i][63]/Kf[9]+GL[i][64]/Kf[10]+GL[i][65]/Kf[11]
                   +GL[i][79]/Kf[25]+GL[i][80]/Kf[26]+LowOch)/14; 

      USDLow[i]  = (Kf[0]/GL[i][54]+GL[i][66]/Kf[12]+GL[i][67]/Kf[13]+GL[i][68]/Kf[14]+GL[i][69]/Kf[15]+GL[i][70]/Kf[16]
                   +GL[i][71]/Kf[17]+GL[i][72]/Kf[18]+GL[i][73]/Kf[19]+GL[i][74]/Kf[20]+GL[i][75]/Kf[21]+Kf[22]/GL[i][76]
                   +Kf[23]/GL[i][77]+Kf[24]/GL[i][78]+LowOch)/14;

      LowOch     = EURUSDLow[i]*USDLow[i]/EURLow[i];      
      GBPLow[i]  = (Kf[1]*EURLow[i]/GL[i][55]+GL[i][76]*USDLow[i]/Kf[22])/2;                                                                
      JPYLow[i]  = (Kf[2]*EURLow[i]/GL[i][56]+Kf[13]*USDLow[i]/GL[i][67])/2;      
      AUDLow[i]  = (Kf[3]*EURLow[i]/GL[i][57]+GL[i][77]*USDLow[i]/Kf[23])/2;      
      CHFLow[i]  = (Kf[4]*EURLow[i]/GL[i][58]+Kf[12]*USDLow[i]/GL[i][66])/2;      
      CADLow[i]  = (Kf[5]*EURLow[i]/GL[i][59]+Kf[14]*USDLow[i]/GL[i][68])/2;      
      NOKLow[i]  = (Kf[6]*EURLow[i]/GL[i][60]+Kf[15]*USDLow[i]/GL[i][69])/2;      
      SEKLow[i]  = (Kf[7]*EURLow[i]/GL[i][61]+Kf[16]*USDLow[i]/GL[i][70])/2;      
      DKKLow[i]  = (Kf[8]*EURLow[i]/GL[i][62]+Kf[17]*USDLow[i]/GL[i][71])/2;      
      NZDLow[i]  = (Kf[9]*EURLow[i]/GL[i][63]+GL[i][78]*USDLow[i]/Kf[24])/2;      
      SGDLow[i]  = (Kf[10]*EURLow[i]/GL[i][64]+Kf[18]*USDLow[i]/GL[i][72])/2;      
      HKDLow[i]  = (Kf[11]*EURLow[i]/GL[i][65]+Kf[19]*USDLow[i]/GL[i][73])/2;      
      MXNLow[i]  = (Kf[25]*EURLow[i]/GL[i][79]+Kf[20]*USDLow[i]/GL[i][74])/2;      
      ZARLow[i]  = (Kf[26]*EURLow[i]/GL[i][80]+Kf[21]*USDLow[i]/GL[i][75])/2;      
     }//4  

   return(0);

     }//1
//+------------------------------------------------------------------+

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

В цикле, ограниченном «//2″, осуществляется загрузка данных со всех используемых индикатором инструментов с помощью функций iClose, iHigh, iLow. В цикле, ограниченным «//3″, осуществляется расчет масштабирующих коэффициентов для всех используемых инструментов. Далее рассчитывается компенсирующая погрешность на баре LengthSample. В цикле, ограниченном «//4″, производится расчет всех национальных валют по описанному выше алгоритму, а так же компенсирующая погрешность на рассчитываемом баре.

Если необходимо представлять рассчитанные данные не в отдельном окне, а выводить их на график главного окна, то необходимо рассчитанные значения валют умножить на масштабирующий коэффициент, полученный от EURUSD, при этом также необходимо заменить #property indicator_separate_window на #property indicator_chart_window. На рис.6 представлен результат такого расчета. EUR – розовый цвет, USD – синий цвет, GBP – красный цвет, JPY – коричневый цвет, AUD – фиолетовый цвет, CHF – желтый цвет, CAD – черный цвет.

 

 

 

 

Рис.6

 

Заключение

 

Представленная методика расчета национальных валют является универсальной и может по аналогии проводиться для других инструментов. Также она дает возможность синтезировать валютные пары, которые отсутствуют в Вашем ДЦ, или получать какие-либо экзотические валютные пары, которые не существуют вовсе. Все это, наряду с выделением национальных валют из валютных пар, повысит информативность используемых Вами инструментов, позволит проводить более точную оценку рыночной ситуации и строить различные более эффективные стратегии торговли.

 

Прикрепленные файлы:
 SuperPosition.mq4 (17.6 Kb)
Источник: mql4.com

Оставить комментарий

Чтобы оставлять комментарии Вы должны быть авторизованы.

Похожие посты