← К каталогу
Исходный код · ID 3454

correlations.mq5

Вы автор или правообладатель?

Сообщите нам, если считаете, что материал размещён без разрешения.

Краткий обзор

О программе

Этот советник для MetaTrader 4 вычисляет корреляции между всеми парами доступных символов на текущем таймфрейме. Он считывает список символов из истории терминала и для каждой пары рассчитывает значение корреляции на основе цен закрытия за заданный период. Поддерживается два метода расчёта: стандартная корреляция и ранговая корреляция. Результаты выводятся в комментарий графика в режиме реального времени и сохраняются в текстовый файл при завершении работы.

Настройки программы

НастройкаОписание
StartTime Время начала — Начальная дата расчёта корреляции (по умолчанию 2010.01.01)
FALSE - Pearson, TRUE - Spearman (Rank) Ранг — Переключатель метода корреляции: выключен — стандартный метод, включён — ранговый метод
Получить полный код

Поиск по коду файла

#property show_inputs

#define MAX_POINTS 100000
#define TWO_SYMBOLS 2

extern datetime StartTime = D'2010.01.01';
extern bool Rank = FALSE; // FALSE - Pearson, TRUE - Spearman

string SymbolsAll[], Symbols[TWO_SYMBOLS], SymbolsDescription[];
double BaseMatrix[TWO_SYMBOLS][MAX_POINTS];
int AmountSymbols, MatrixRows;

double Vector1[][2], Vector2[][2];

double Correlations[];
string StrOut[];
int Amount;

datetime GetStartTime( datetime StartTime )
{
  datetime Tmp;
  int Pos;

  for (int i = 0; i < TWO_SYMBOLS; i++)
  {
    Pos = iBarShift(Symbols[i], Period(), StartTime);

    if (Pos == 0)
      return(-1);

    Tmp = iTime(Symbols[i], Period(), Pos);

    if (Tmp < StartTime)
      Tmp = iTime(Symbols[i], Period(), Pos - 1);

    StartTime = Tmp;
  }

  for (i = 0; i < AmountSymbols; i++)
    if (StartTime > iTime(Symbols[i], Period(), 0))
      return(-1);

  return(StartTime);
}

double GetPrice( string Symb, int time )
{
  double Price;

  Price = iClose(Symb, Period(), iBarShift(Symb, Period(), time));

  return(Price);
}

int GetNextTime( int CurrTime )
{
  static int Pos[TWO_SYMBOLS];
  int i, MinTime, Tmp = -1;

  for (i = 0; i < TWO_SYMBOLS; i++)
  {
    Pos[i] = iBarShift(Symbols[i], Period(), CurrTime) - 1;

    if (Pos[i] <= 0)
      return(-1);
  }
  MinTime = iTime(Symbols[0], Period(), Pos[0]);

  for (i = 1; i < TWO_SYMBOLS; i++)
  {
    Tmp = iTime(Symbols[i], Period(), Pos[i]);

    if (Tmp < MinTime)
      MinTime = Tmp;
  }

  return(MinTime);
}

double GetMean( int Pos )
{
  double Sum = 0;

  for (int i = 0; i < MatrixRows;, i++)
    Sum += BaseMatrix[Pos][i];

  if (MatrixRows != 0)
    Sum /= MatrixRows;

  return(Sum);
}

double GetCorrelation( int Pos1, int Pos2 )
{
  double Sum = 0;

  for (int i = 0; i < MatrixRows;, i++)
    Sum += BaseMatrix[Pos1][i] * BaseMatrix[Pos2][i];

  if (MatrixRows != 0)
    Sum /= MatrixRows;

  return(Sum);
}

int GetRank( double& Vector[][] )
{
  double Tmp;
  int i, Count;
  int Res = 0;

  ArraySort(Vector);

  for (i = 0; i < MatrixRows; i++)
  {
    Count = 0;

    while (i < MatrixRows - 1)
    {
      if (Vector[i][0] != Vector[i + 1][0])
        break;

      Count++;
      i++;
    }

    Tmp = i;

    if (Count > 0)
    {
      Tmp -= Count / 2.0;
      Res += Count * (Count + 1) * (Count + 2);
    }

    while (Count >= 0)
    {
      Vector[i - Count][0] = Vector[i - Count][1];
      Vector[i - Count][1] = Tmp;

      Count--;
    }
  }

  ArraySort(Vector);

  return(Res);
}

double GetSpearmanRankCorr()
{
  double Tmp, Res = 0;
  double N = MatrixRows;
  int A1, A2;

  A1 = GetRank(Vector1);
  A2 = GetRank(Vector2);

  for (int i = 0; i < MatrixRows; i++)
  {
    Tmp = Vector1[i][1] - Vector2[i][1];
    Res += Tmp * Tmp;
  }

  N *= N * N - 1;

  if ((A1 == 0) && (A2 == 0))
    Res = 1 - 6 * Res / N;
  else
    Res = (N - (A1 + A2) / 2.0 - 6 * Res) / MathSqrt((N - A1) * (N - A2));

  return(Res);
}

double GetCorr()
{
  double Res = 0;

  if (MatrixRows > 0)
  {
    if (Rank)
      Res = GetSpearmanRankCorr();
    else
      Res = GetCorrelation(0, 1);
  }

  return(Res);
}

int GetVectors( int StartTime )
{
  int i, j, CurrTime = StartTime, NextTime = StartTime;
  double Mean, Variance;

  ArrayResize(Vector1, MAX_POINTS);
  ArrayResize(Vector2, MAX_POINTS);

  MatrixRows = 0;

  while (NextTime >= 0)
  {
    CurrTime = NextTime;

    Vector1[MatrixRows][0] = GetPrice(Symbols[0], CurrTime);
    Vector1[MatrixRows][1] = MatrixRows;

    Vector2[MatrixRows][0] = GetPrice(Symbols[1], CurrTime);
    Vector2[MatrixRows][1] = MatrixRows;

    MatrixRows++;

    if (MatrixRows == MAX_POINTS)
      break;

    NextTime = GetNextTime(CurrTime);
  }

  ArrayResize(Vector1, MatrixRows);
  ArrayResize(Vector2, MatrixRows);

  return(CurrTime);
}

int GetBaseMatrix( int StartTime)
{
  int i, j, CurrTime = StartTime, NextTime = StartTime;
  double Mean, Variance;

  MatrixRows = 0;

  while (NextTime >= 0)
  {
    CurrTime = NextTime;

    for (i = 0; i < TWO_SYMBOLS; i++)
      BaseMatrix[i][MatrixRows] = MathLog(GetPrice(Symbols[i], CurrTime));

    MatrixRows++;

    if (MatrixRows == MAX_POINTS)
      break;

    NextTime = GetNextTime(CurrTime);
  }

  for (i = 0; i < TWO_SYMBOLS; i++)
  {
    Mean = GetMean(i);

    for (j = 0; j < MatrixRows; j++)
      BaseMatrix[i][j] -= Mean;
  }

  for (i = 0; i < TWO_SYMBOLS; i++)
  {
    Variance = GetCorrelation(i, i);
    Variance = MathSqrt(Variance);

    for (j = 0; j < MatrixRows; j++)
      BaseMatrix[i][j] /= Variance;
  }

  return(CurrTime);
}

int GetData( int StartTime )
{
  int Res;

  if (Rank)
    Res = GetVectors(StartTime);
  else
    Res = GetBaseMatrix(StartTime);

  return(Res);
}

int SymbolsList( string &Symbols[] )
{
   int Offset, SymbolsNumber;

   int hFile = FileOpenHistory("symbols.sel", FILE_BIN|FILE_READ);
   SymbolsNumber = (FileSize(hFile) - 4) / 128;
   Offset = 116;

   ArrayResize(Symbols, SymbolsNumber);

   FileSeek(hFile, 4, SEEK_SET);

   for(int i = 0; i < SymbolsNumber; i++)
   {
      Symbols[i]

Показано первые 50% кода (символов: 7593)

Открыть по тарифу

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

Разовая покупка файла

На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.

Чтобы оформить заказ, введите email и перейдите к оплате.

Стоимость полного кода
759,30₽ ≈ $9.28