// Функция для вычисления коэффициента корреляции между двумя сериями
double CalculateCorrelation(const double series1[], const double series2[], const int size)
{
double mean1 = 0.0, mean2 = 0.0;
for (int i = 0; i < size; i++)
{
mean1 += series1[i];
mean2 += series2[i];
}
mean1 /= size;
mean2 /= size;
double cov = 0.0, stdDev1 = 0.0, stdDev2 = 0.0;
for (int i = 0; i < size; i++)
{
cov += (series1[i] - mean1) * (series2[i] - mean2);
stdDev1 += pow(series1[i] - mean1, 2);
stdDev2 += pow(series2[i] - mean2, 2);
}
stdDev1 = sqrt(stdDev1 / size);
stdDev2 = sqrt(stdDev2 / size);
double correlation = cov / (stdDev1 * stdDev2);
return correlation;
}
// Функция для выделения окна в 50 баров и расчета прогноза
void PerformAnalysis()
{
const int windowSize = 50;
const int samplesToSelect = 10;
double prices[windowSize];
// Получение исторических цен в окне
for (int i = 0; i < windowSize; i++)
{
prices[i] = iClose(_Symbol, _Period, i);
}
double correlations[_Bars - windowSize];
// Поиск самых похожих ситуаций в прошлом
for (int i = windowSize; i < _Bars; i++)
{
double currentPrices[windowSize];
CopyArray(currentPrices, prices, i - windowSize, windowSize);
correlations[i - windowSize] = CalculateCorrelation(prices, currentPrices, windowSize);
}
// Выбор лучших образцов по коэффициенту корреляции
double sortedCorrelations[_Bars - windowSize];
CopyArray(sortedCorrelations, correlations, 0, _Bars - windowSize);
ArraySort(sortedCorrelations);
double selectedCorrelations[samplesToSelect];
CopyArray(selectedCorrelations, sortedCorrelations, _Bars - windowSize - samplesToSelect, samplesToSelect);
// Вычисление прогноза на основе выбранных образцов
double forecast = 0.0;
for (int i = 0; i < samplesToSelect; i++)
{
int index = ArrayBsearch(correlations, selectedCorrelations[i], _Bars - windowSize);
if (index != -1)
{
double futurePrice = iClose(_Symbol, _Period, index + windowSize);
forecast += futurePrice > prices[windowSize - 1] ? 1 : -1;
}
}
forecast /= samplesToSelect;
if (forecast > 0)
Print("Прогноз: Рост цен");
else if (forecast < 0)
Print("Прогноз: Падение цен");
else
Print("Прогноз: Нет тенденции");
}
Shtenco