Индикатор корреляции. Помогите найти ошибку

 

подскажите, пожалуйста, где ошибка. Вроде бы всё по формулам, но индикатор не работает

#property indicator_separate_window
#property indicator_buffers 1
 
extern string Pair2 = "GBPUSD";
extern int CorrelationPeriod = 50;
 
double Cor[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   SetIndexBuffer(0,Cor);
   SetIndexStyle(0,DRAW_LINE);  
//---- indicators
//----
   return(0);
  }
 
//+------------------------------------------------------------------+
int start()
  {
   double sum1,sum2,m1,m2,s1,s2; 
   double cov,sd1,sd2,Den; 
   int    counted_bars=IndicatorCounted();
   if (counted_bars>0) counted_bars--;
//----
   for (int i=Bars-CorrelationPeriod-1; i>=0; i--)
      {
      m1 = iMA(NULL,0,CorrelationPeriod,0,MODE_SMA,PRICE_CLOSE,i);
      m2 = iMA(Pair2,0,CorrelationPeriod,0,MODE_SMA,PRICE_CLOSE,i);
      sum1 = 0; sum2 = 0;
      for (int j=i; j<=i+CorrelationPeriod; j++)
         {
         sum1 += Close[j]-m1;
         sum2 += iClose(Pair2,0,j)-m2;
         s1 += (Close[j]-m1)*(Close[j]-m1);
         s2 += (iClose(Pair2,0,j)-m2)*(iClose(Pair2,0,j)-m2);
         }
      cov = (sum1*sum2)/CorrelationPeriod;
      sd1 = MathSqrt(s1/CorrelationPeriod);
      sd2 = MathSqrt(s2/CorrelationPeriod);
      Den = sd1*sd2;
      if (Den == 0) Den = 0.0001;
      Cor[i] = cov/Den;
      }
//----
   return(0);
  }
Заранее благодарен
 
Цвет линии определить надо и все "проявится"   ;)

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Red
 
extern string Pair2 = "GBPUSD";
extern int CorrelationPeriod = 50;
 
double Cor[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   SetIndexBuffer(0,Cor);
   SetIndexStyle(0,DRAW_LINE);  
//---- indicators
//----
   return(0);
  }
 
//+------------------------------------------------------------------+
int start()
  {
   double sum1,sum2,m1,m2,s1,s2; 
   double cov,sd1,sd2,Den; 
   int    counted_bars=IndicatorCounted();
   if (counted_bars>0) counted_bars--;
//----
   for (int i=Bars-CorrelationPeriod-1; i>=0; i--)
      {
      m1 = iMA(NULL,0,CorrelationPeriod,0,MODE_SMA,PRICE_CLOSE,i);
      m2 = iMA(Pair2,0,CorrelationPeriod,0,MODE_SMA,PRICE_CLOSE,i);
      sum1 = 0; sum2 = 0;
      for (int j=i; j<=i+CorrelationPeriod; j++)
         {
         sum1 += Close[j]-m1;
         sum2 += iClose(Pair2,0,j)-m2;
         s1 += (Close[j]-m1)*(Close[j]-m1);
         s2 += (iClose(Pair2,0,j)-m2)*(iClose(Pair2,0,j)-m2);
         }
      cov = (sum1*sum2)/CorrelationPeriod;
      sd1 = MathSqrt(s1/CorrelationPeriod);
      sd2 = MathSqrt(s2/CorrelationPeriod);
      Den = sd1*sd2;
      if (Den == 0) Den = 0.0001;
      Cor[i] = cov/Den;
      }
//----
   return(0);
  }
 
Rone:

подскажите, пожалуйста, где ошибка. Вроде бы всё по формулам, но индикатор не работает

Заранее благодарен

Что вы проверяете на кореляцию? Какие 2 массива. Можно словами, т.к. из кода не все понимаю. Правильно ли я понял, что Вы проверяете кореляцию Close какой то валюты (та на которой висит индикатор) с GBPUSD, а 50 означает размер массива.
 
Странный какой-то метод определения корреляции. Нет x*y
 
Prival:
Rone:

подскажите, пожалуйста, где ошибка. Вроде бы всё по формулам, но индикатор не работает

Заранее благодарен

Что вы проверяете на кореляцию? Какие 2 массива. Можно словами, т.к. из кода не все понимаю. Правильно ли я понял, что Вы проверяете кореляцию Close какой то валюты (та на которой висит индикатор) с GBPUSD, а 50 означает размер массива.


Именно так, как Вы и описали: Close валюты на которой висит индикатор и Close GBPUSD, 50 же означает размер массива.


Integer:
Странный какой-то метод определения корреляции. Нет x*y

Почему нет? По определению корреляция это ковариация делённая на произведение стандартных отклонений (если я правильн понял, именно то самое х*у). Вот этот кусок кода:

      sd1 = MathSqrt(s1/CorrelationPeriod);
      sd2 = MathSqrt(s2/CorrelationPeriod);
      Den = sd1*sd2;
      if (Den == 0) Den = 0.0001;
      Cor[i] = cov/Den;

Я действительно изначально не определил цвет линии, но теперь линия то есть, но во-первых терминал зависает (почему это происходит не знаю), а во-вторых та ли это линия - её колебания должны происходить в пределах -1 и 1, но этого нет...

 

Вроде вот так она должна рассчитываться, это маткад. mean() эта фунция вычисляет МОЖ

 
Rone:
Prival:
Rone:

подскажите, пожалуйста, где ошибка. Вроде бы всё по формулам, но индикатор не работает

Заранее благодарен

Что вы проверяете на кореляцию? Какие 2 массива. Можно словами, т.к. из кода не все понимаю. Правильно ли я понял, что Вы проверяете кореляцию Close какой то валюты (та на которой висит индикатор) с GBPUSD, а 50 означает размер массива.


Именно так, как Вы и описали: Close валюты на которой висит индикатор и Close GBPUSD, 50 же означает размер массива.


Integer:
Странный какой-то метод определения корреляции. Нет x*y

Почему нет? По определению корреляция это ковариация делённая на произведение стандартных отклонений (если я правильн понял, именно то самое х*у). Вот этот кусок кода:

      sd1 = MathSqrt(s1/CorrelationPeriod);
      sd2 = MathSqrt(s2/CorrelationPeriod);
      Den = sd1*sd2;
      if (Den == 0) Den = 0.0001;
      Cor[i] = cov/Den;

Я действительно изначально не определил цвет линии, но теперь линия то есть, но во-первых терминал зависает (почему это происходит не знаю), а во-вторых та ли это линия - её колебания должны происходить в пределах -1 и 1, но этого нет...


counted_bars=1000

если больше - начинает умирать
 
Prival:

Вроде вот так она должна рассчитываться, это маткад. mean() эта фунция вычисляет МОЖ

Хм... да я в принципе так и пытаюсь сделать... Только вот теперь меня смущает формула расчёта ковариации, сравните со справкой Excel:

я имею ввиду её начало: 1/n в Excel и 1/m*n в Mathcad. Или я что-то неправильно понимаю?

сейчас ещё попробую counted_bars = 1000

Причина обращения: