English 中文 Español Deutsch 日本語 Português
Принцип суперпозиции и интерференции финансовых инструментов

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

MetaTrader 4Примеры | 21 апреля 2009, 13:16
1 767 29
Khristian Piligrim
Khristian Piligrim

"Как невозможно дважды войти в одну и ту же реку,
Так невозможно дважды войти в один и тот же рынок.
Все течет, все изменяется …"

DAO Piligrimm



Введение

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

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

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

Возьмем в качестве примера валютную пару 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.57 KB)
Последние комментарии | Перейти к обсуждению на форуме трейдеров (29)
Khristian Piligrim
Khristian Piligrim | 9 июн. 2009 в 12:40
voidpiligrim:
Если вести расчёт по приведённой формуле, то вес пар с GBP будет в 200 раз больше, чем вес пар с JPY - что весьма неадекватно. Вести расчёт абсолютной стоимости валют, по-моему путь тупиковый, можно лишь расчитвать относительное изменение стоимости валют относительно других, тогда и погнрешности при обратном пересчёте не будет. Кроме того формула не учитавает вес движения валют по отдельности, в валютной паре - предполагая что валюты движутся на 50% от общего изменения цены.
Что-то у Вас с расчетами не то. Все валюты приводятся к одинаковому масштабу и вес каждой из них относительно другой может отличаться только на столько, на сколько они отличаются друг от друга после масштабирования, а это в пределе не более 10%.
[Удален] | 23 июн. 2009 в 11:13

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

Про не совпадение синтезированого курса и исходного. Нужно смотреть в сторону не среднеарифметического, а сренегеометрического. У меня они практически полностью совпадают.

Khristian Piligrim
Khristian Piligrim | 30 июн. 2009 в 18:29

Я завершаю свою деятельность на рынке Форекс, и больше не появлюсь на этом форуме, поэтому далее отвечать на появляющиеся вопросы не смогу. Смотрите подробнее в теме 'Piligrimus - нейросетевой индикатор.'

Юрий Макаров
Юрий Макаров | 15 окт. 2009 в 19:21
Xupypr:

Название статьи очень понравилось:) Я то считал это индексами валют называется.

А нет ли у Вас примера расчёта российского рубля?

Так это и называется.

Смотри индикатор MIndex (был когда-то тут опубликован)

На выходе индексы валют, но с корректным расчетом :)

Юрий Макаров
Юрий Макаров | 15 окт. 2009 в 19:24
Mak:
Xupypr:

Название статьи очень понравилось:) Я то считал это индексами валют называется.

А нет ли у Вас примера расчёта российского рубля?

Так это и называется.

Смотри индикатор MIndex (был когда-то тут опубликован)

На выходе индексы валют, но с корректным расчетом :)

Вот ссылка на индикатор - https://www.mql5.com/ru/code/7252
К вопросу об управлении капиталом К вопросу об управлении капиталом
В статье рассмотрены некоторые аспекты, возникающие при использовании различных систем управления капиталом, применительно к ФОРЕКС. Приведены данные экспериментов с моделью процесса торговли, в которой при совершении торговых сделок используются разные методы управления капиталом (Money Management - ММ).
Alert и Comment для внешних индикаторов Alert и Comment для внешних индикаторов
В практической работе трейдер иногда сталкивается с такой ситуацией: нужно получить «alert» или текстовое сообщение на экране монитора, (в окне графика) сообщение или информацию о появившемся сигнале от какого-либо индикатора. В статье приводится пример вывода информации о графических объектах, созданных сторонним индикатором.
Тестирование экспертов на нестандартных таймфреймах Тестирование экспертов на нестандартных таймфреймах
Это не только просто, это очень просто. Тестирование Советников на нестандартных периодах возможно! Для этого всего лишь достаточно заменить данные стандартного таймфрейма данными нестандартного таймфрейма. Более того, возможно даже тестировать экспертов, пользующихся данными нескольких нестандартных периодов.
Конструктор трейдера: Украшение индикаторов Конструктор трейдера: Украшение индикаторов
Основные задачи при раскрашивании индикаторов, их решение и автоматизация.