correlations.mq5
Сообщите нам, если считаете, что материал размещён без разрешения.
Сообщить о материале
Обращение по товару «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? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.