Помогите с корреляцией

 

Нашел в include библиотеку ClassCorelation.mqh

пытаюсь сделать такой скрипт

#include <MyClass/ClassCorelation.mqh>
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
  double buf1[],buf2[];
  ArrayInitialize(buf1,0);
  ArrayInitialize(buf2,0);
  int copied1=CopyClose("EURJPY",NULL,1,100,buf1);
  int copied2=CopyClose("USDJPY",NULL,1,100,buf2);
  double cor=Correlation::Spirman(buf1,buf2);
  Print(cor);
  }

а компилятор выдает такую ошибку

'Spirman' - access to non-static member or function      21    27

что я делаю не так?

то,что я объявляю и инициализирую double массив,а класс требует const double?

double   Correlation::Spirman(const double& mass1[],const double&  mass2[])
 
ivanivan_11:

Нашел в include библиотеку ClassCorelation.mqh

пытаюсь сделать такой скрипт

#include <MyClass/ClassCorelation.mqh>
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
  double buf1[],buf2[];
  ArrayInitialize(buf1,0);
  ArrayInitialize(buf2,0);
  int copied1=CopyClose("EURJPY",NULL,1,100,buf1);
  int copied2=CopyClose("USDJPY",NULL,1,100,buf2);
  double cor=Correlation::Spirman(buf1,buf2);
  Print(cor);
  }

а компилятор выдает такую ошибку

'Spirman' - access to non-static member or function      21    27

что я делаю не так?

то,что я объявляю и инициализирую double массив,а класс требует const double?

double   Correlation::Spirman(const double& mass1[],const double&  mass2[])

У меня такого ClassCorelation.mqh нет, но из описания ошибки четко видно, что надо создать объект класса Correlation.

#include <MyClass/ClassCorelation.mqh>
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+

Correlation m_corelation;

void OnStart()
  {
//---
  double buf1[],buf2[];
  ArrayInitialize(buf1,0);
  ArrayInitialize(buf2,0);
  int copied1=CopyClose("EURJPY",NULL,1,100,buf1);
  int copied2=CopyClose("USDJPY",NULL,1,100,buf2);
  double cor=m_corelation.Spirman(buf1,buf2);
  Print(cor);
  }


 Если не работает, приаттачьте ClassCorelation.mqh

 

В ClassCorelation.mqh перед double Spirman(...) пропишите static.

По какой-то причине многие не прописывают static там, где это логично. По итогу вынуждая создавать объекты там, где это вовсе не нужно. В частности, СБ этим страдает.

 
Alexey Volchanskiy:

У меня такого ClassCorelation.mqh нет, но из описания ошибки четко видно, что надо создать объект класса Correlation.

#include <MyClass/ClassCorelation.mqh>
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+

Correlation m_corelation;

void OnStart()
  {
//---
  double buf1[],buf2[];
  ArrayInitialize(buf1,0);
  ArrayInitialize(buf2,0);
  int copied1=CopyClose("EURJPY",NULL,1,100,buf1);
  int copied2=CopyClose("USDJPY",NULL,1,100,buf2);
  double cor=m_corelation.Spirman(buf1,buf2);
  Print(cor);
  }


 Если не работает, приаттачьте ClassCorelation.mqh

спасибо,я просто не умею пользоваться классами. сейчас попробую.

у меня в штатной поставке,я так понимаю, в мт5 в Include\MyClass 2 файла ClassCorelation.mqh и ClassLinearRegression.mqh

проверил их наличие сейчас на разных терминалах,в обоих они присутствуют

Файлы:
 

Рассчитать коэффициенты корреляции также можно при помощи функций библиотеки Math.mqh

#include <Math\Stat\Math.mqh>
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   double buf1[],buf2[];
   ArrayInitialize(buf1,0);
   ArrayInitialize(buf2,0);
   int copied1=CopyClose("EURJPY",NULL,1,100,buf1);
   int copied2=CopyClose("USDJPY",NULL,1,100,buf2);
   if(copied1!=copied2)
      return;
   double pearson,spearman,kendall;
   if(MathCorrelationPearson(buf1,buf2,pearson))
      PrintFormat("Pearson =%5.8f",pearson);
   if(MathCorrelationSpearman(buf1,buf2,spearman))
      PrintFormat("Spearman =%5.8f",spearman);
   if(MathCorrelationKendall(buf1,buf2,kendall))
      PrintFormat("Kendall =%5.8f",kendall);
  }
2016.12.01 14:38:48.309    CorrTest (EURUSD,H1)    Pearson =0.94884178
2016.12.01 14:38:48.309    CorrTest (EURUSD,H1)    Spearman =0.91392036
2016.12.01 14:38:48.310    CorrTest (EURUSD,H1)    Kendall =0.74696847
 
Quantum:

Рассчитать коэффициенты корреляции также можно при помощи функций библиотеки Math.mqh

Если нужно КК расчитать на каждом сдвиге окна, то каждый раз вызывать MathCorrelationPearson?
 
ivanivan_11:

спасибо,я просто не умею пользоваться классами. сейчас попробую.

у меня в штатной поставке,я так понимаю, в мт5 в Include\MyClass 2 файла ClassCorelation.mqh и ClassLinearRegression.mqh

проверил их наличие сейчас на разных терминалах,в обоих они присутствуют

Папки MyClass в поставке нет, это чье-то творчество. Посмотрел, я правильно написал совет, все методы нестатические, надо создавать экземпляр.

И вот это смешно, это не конструктор )))

public:
            void Corrlation() ;// конструктор класса


void Correlation::Corrlation(void)
{
   clProba=0 ;
}

 Выложите и второй класс ClassLinearRegression.mqh пожалуйста, интересно посмотреть.

 

спасибо,всем ответившим.

способ Алексея дал результат.

сравнил 2 варианта Пирсон и Спирман, разница между корреляцией велика. по Пирсону 0.96, по Спирману всего лишь 0.81,используя упомянутую мной библиотеку

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

Файлы:
 
fxsaber:
Если нужно КК расчитать на каждом сдвиге окна, то каждый раз вызывать MathCorrelationPearson?

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

 
ivanivan_11:

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

Файл Math.mqh нужно положить в папку terminal_data_folder\MQL5\Include\Math\Stat\.
Файлы:
Math.mqh  447 kb
 
Quantum:
Файл Math.mqh нужно положить в папку terminal_data_folder\MQL5\Include\Math\Stat\.

спасибо.

нет,нет,я говорил про самую первую библиотеку. Math.mqh в штатной поставке есть.

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