Как Senior Quant Developer, я часто сталкиваюсь с задачами, требующими анализа взаимосвязей между различными рыночными активами. Одним из ключевых индикаторов рыночного настроения является индекс волатильности VIX, часто называемый «индексом страха». Его динамика может многое рассказать о потенциальном движении рисковых активов, включая валютные пары.
В этой статье мы рассмотрим, как создать MQL5 скрипт для расчета коэффициента корреляции между индексом VIX и выбранной валютной парой. Особенность задачи заключается в том, что VIX не является стандартным символом в большинстве брокеров MT5, поэтому нам потребуется импортировать его данные как пользовательский символ.
Понимание корреляции между VIX и валютными парами может дать трейдерам ценные инсайты. Например, часто наблюдается обратная корреляция между VIX и такими парами, как AUD/JPY или EUR/USD: когда VIX растет (увеличивается страх), эти пары могут падать, и наоборот. Расчет этой корреляции поможет вам принимать более обоснованные торговые решения.
Исходный код
Представленный ниже MQL5 скрипт предназначен для расчета коэффициента корреляции Пирсона между двумя сериями данных: ценами закрытия пользовательского символа (например, VIX) и ценами закрытия стандартной валютной пары. Скрипт запрашивает исторические данные для обоих символов на указанном таймфрейме и за заданное количество баров, затем выполняет расчет и выводит результат в журнал вкладки «Эксперты» терминала MT5.
//+------------------------------------------------------------------+
//| VIX_Currency_Correlation.mq5 |
//| Copyright 2023, FinFluct |
//| https://finfluct.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2023, FinFluct"
#property link "https://finfluct.com"
#property version "1.00"
#property description "Скрипт для расчета корреляции между пользовательским символом VIX и выбранной валютной парой."
#property description "Использует импортированные данные VIX и выводит коэффициент корреляции в журнал."
//--- Входные параметры
input string VIX_SymbolName = "VIX_CUSTOM"; // Имя пользовательского символа VIX
input string Currency_SymbolName = "EURUSD"; // Имя валютной пары для сравнения
input ENUM_TIMEFRAMES Timeframe = PERIOD_H1; // Таймфрейм для расчета
input int LookbackPeriods = 200; // Количество баров для расчета корреляции
//+------------------------------------------------------------------+
//| OnStart function |
//+------------------------------------------------------------------+
void OnStart()
{
// Проверка входных параметров
if (LookbackPeriods <= 1)
{
Print("Ошибка: LookbackPeriods должен быть больше 1.");
return;
}
//--- Получаем данные для VIX
MqlRates rates_vix[];
int copied_vix = CopyRates(VIX_SymbolName, Timeframe, 0, LookbackPeriods, rates_vix);
if (copied_vix != LookbackPeriods)
{
Print("Ошибка при получении данных для VIX (", VIX_SymbolName, "). Скопировано: ", copied_vix, ", Ожидалось: ", LookbackPeriods);
return;
}
//--- Получаем данные для валютной пары
MqlRates rates_currency[];
int copied_currency = CopyRates(Currency_SymbolName, Timeframe, 0, LookbackPeriods, rates_currency);
if (copied_currency != LookbackPeriods)
{
Print("Ошибка при получении данных для валютной пары (", Currency_SymbolName, "). Скопировано: ", copied_currency, ", Ожидалось: ", LookbackPeriods);
return;
}
//--- Подготовка данных для расчета корреляции
double vix_prices[LookbackPeriods];
double currency_prices[LookbackPeriods];
// Заполняем массивы, начиная с самых старых данных (индекс 0) до самых новых (индекс LookbackPeriods-1)
// CopyRates возвращает данные от старых к новым, поэтому rates_vix[i].close соответствует vix_prices[i]
for (int i = 0; i < LookbackPeriods; i++)
{
vix_prices[i] = rates_vix[i].close;
currency_prices[i] = rates_currency[i].close;
}
//--- Расчет корреляции
double correlation = CalculateCorrelation(vix_prices, currency_prices, LookbackPeriods);
//--- Вывод результата
Print("Корреляция между ", VIX_SymbolName, " и ", Currency_SymbolName, " на таймфрейме ",
EnumToString(Timeframe), " за последние ", LookbackPeriods, " баров: ", DoubleToString(correlation, 4));
}
//+------------------------------------------------------------------+
//| Функция для расчета коэффициента корреляции Пирсона |
//+------------------------------------------------------------------+
double CalculateCorrelation(const double& series1[], const double& series2[], int count)
{
if (count <= 1)
{
return 0.0; // Недостаточно данных для расчета
}
double sum_x = 0.0;
double sum_y = 0.0;
double sum_xy = 0.0;
double sum_x2 = 0.0;
double sum_y2 = 0.0;
for (int i = 0; i < count; i++)
{
sum_x += series1[i];
sum_y += series2[i];
sum_xy += series1[i] * series2[i];
sum_x2 += series1[i] * series1[i];
sum_y2 += series2[i] * series2[i];
}
double numerator = (count * sum_xy - sum_x * sum_y);
double denominator = MathSqrt((count * sum_x2 - sum_x * sum_x) * (count * sum_y2 - sum_y * sum_y));
if (denominator == 0.0)
{
return 0.0; // Избегаем деления на ноль, если одна из серий имеет нулевую дисперсию
}
return numerator / denominator;
}
Разбор параметров
VIX_SymbolName: Строковое имя пользовательского символа, который вы создали для индекса VIX. По умолчанию установлено значение"VIX_CUSTOM". Убедитесь, что это имя точно соответствует имени вашего пользовательского символа в MT5.Currency_SymbolName: Строковое имя валютной пары, с которой вы хотите рассчитать корреляцию. Например,"EURUSD","GBPUSD","AUDJPY"и т.д.Timeframe: Таймфрейм, на котором будет производиться расчет корреляции. Вы можете выбрать любой стандартный таймфрейм MT5, например,PERIOD_H1(часовой),PERIOD_D1(дневной) и т.д.LookbackPeriods: Количество баров (свечей) истории, которые будут использоваться для расчета корреляции. Чем больше баров, тем более сглаженным и долгосрочным будет результат, но он может не отражать текущие краткосрочные изменения. Рекомендуется использовать значения от 100 до 500.
Как запустить
Чтобы успешно использовать этот скрипт, выполните следующие шаги:
-
Импорт данных VIX как пользовательского символа: Поскольку VIX обычно не доступен напрямую в MT5, вам необходимо импортировать его исторические данные. Вы можете найти данные VIX на различных финансовых сайтах (например, Yahoo Finance) в формате CSV. Подробную инструкцию по импорту данных и созданию пользовательского символа в MT5 вы найдете в нашей статье Импорт котировок криптовалют из CSV в MT5: Создание Custom Symbol. Адаптируйте ее для VIX, используя соответствующее имя символа, например,
VIX_CUSTOM. -
Создание и компиляция скрипта:
- Откройте MetaEditor (IDE для MQL5), нажав
F4в вашем терминале MT5. - Создайте новый скрипт (File -> New -> Script) и назовите его, например,
VIX_Currency_Correlation.mq5. - Скопируйте предоставленный выше код и вставьте его в новый файл.
- Нажмите кнопку «Компилировать» (или
F7). Убедитесь, что нет ошибок компиляции.
- Откройте MetaEditor (IDE для MQL5), нажав
-
Запуск скрипта в MT5:
- Вернитесь в терминал MT5.
- В окне «Навигатор» найдите раздел «Скрипты».
- Найдите ваш скрипт
VIX_Currency_Correlation. - Перетащите скрипт на любой график. Откроется окно настроек.
- На вкладке «Параметры» (Inputs) установите значения для
VIX_SymbolName(убедитесь, что оно совпадает с именем вашего пользовательского символа VIX),Currency_SymbolName,TimeframeиLookbackPeriods. - Нажмите «ОК».
-
Просмотр результатов:
- Результат расчета корреляции будет выведен в журнал терминала MT5, на вкладке «Эксперты» (Experts).
- Коэффициент корреляции Пирсона находится в диапазоне от -1 до +1:
+1: Идеальная прямая корреляция (активы движутся в одном направлении).-1: Идеальная обратная корреляция (активы движутся в противоположных направлениях).0: Отсутствие линейной корреляции.
Используя этот скрипт, вы сможете оперативно оценивать взаимосвязь между рыночным страхом (VIX) и динамикой интересующих вас валютных пар. Это может стать частью вашей стратегии для подтверждения трендов или поиска расхождений. Для более продвинутого визуального анализа вы можете рассмотреть возможность использования техник, описанных в статье MQL5 Drag-and-Drop: Перетаскивание торговых уровней на графике, чтобы, например, отображать корреляцию на графике или использовать ее для управления торговыми уровнями. А для тех, кто хочет интегрировать эти данные в свои торговые системы, может быть полезна статья о Виртуальный Stop Loss и Take Profit в MQL4: Невидимые для брокера, чтобы создавать более гибкие и невидимые для брокера стратегии, основанные на таких корреляциях.




