
Индикатор оценки силы и слабости валютных пар на чистом MQL5
Представьте себе трейдера, который каждый день сталкивается с хаосом форекс-рынка. 28 валютных пар мерцают на экране, каждая движется в своем ритме, создавая симфонию рыночного движения. Но как уловить главную мелодию в этом финансовом оркестре? Как определить, какая валюта сейчас дирижирует рынком, а какая фальшивит и теряет позиции?
Сегодня мы создадим нечто особенное — индикатор, который превратит этот хаос в четкую картину рыночной силы. Представьте инструмент, который моментально позволяет увидеть, как евро набирает силу на часовом графике, в то время как йена слабеет на дневном таймфрейме. Индикатор, который не просто показывает данные, а рассказывает историю каждой валюты через призму трех ключевых временных интервалов.
В этом руководстве мы пройдем путь от идеи до полноценного технического инструмента. Шаг за шагом мы превратим сложные математические расчеты и программный код в элегантную панель, которая станет вашим надежным помощником в трейдинге. Мы не просто напишем код — мы создадим инструмент, который изменит ваш взгляд на анализ рынка.
Готовы погрузиться в увлекательный мир программирования на MQL5 и создать индикатор, который объединяет математическую точность с интуитивной простотой? Тогда пристегните ремни, мы начинаем наше путешествие в мир профессиональной разработки торговых инструментов!
1. Знакомство с возможностями панели силы валют: представляем идею и концепцию инструмента для анализа силы валютных пар в реальном времени
Когда легендарный инвестор Рэй Далио создавал свои первые торговые системы в Bridgewater Associates, он руководствовался простым, но мощным принципом: чтобы понять движение одного актива, нужно видеть движение всей группы связанных с ним инструментов. Сначала он торговал тренды, затем перешел к торговле корзин, после чего развил идеи до арбитражных и коинтегрированных портфелей.
Именно этот принцип лежит в основе нашей панели силы валют. Мы пройдем по той же цепочке: оценка силы трендов, далее, в будущем, создадим индикатор корзин, арбитражный индикатор справедливых цен, и индикатор коинтегрированных корзин.
Почему это важно? Представьте, что вы смотрите на график EUR/USD. Растет пара или падает? Очевидно, да. Но что на самом деле происходит? Усиливается евро или слабеет доллар? Без понимания общей картины силы каждой валюты, ответить невозможно. Именно здесь наш индикатор раскрывает свой потенциал.
Ключевые возможности панели:
Многоуровневый анализ времени и цены включает в себя использование различных таймфреймов для получения более точной картины. Часовой график (H1) показывает краткосрочные колебания, в то время, как четырехчасовой (H4) отражает более долгосрочные тенденции. Дневной график (D1) позволяет увидеть глобальную картину силы. Каждый таймфрейм имеет свой собственный вес при итоговой оценке, что помогает избежать искажения краткосрочными колебаниями и сосредоточиться на долгосрочных трендах. Итоговый показатель силы валюты складывается из всех временных интервалов, что позволяет сделать анализ более всесторонним.
Динамическое ранжирование помогает поддерживать актуальные позиции валютных пар. Это позволяет моментально определить, какие валюты на данный момент являются сильнейшими, а какие слабейшими. Панель визуально выделяет экстремальные значения, что дает возможность оперативно отслеживать изменения. В отличие от классических индикаторов, которые анализируют каждую валютную пару по отдельности, наша система, аналогично методологии Далио, рассматривает рынок как единую взаимосвязанную систему. Например, укрепление евро отразится не только на EUR/USD, но и на его отношениях с другими валютами, такими как фунт, йена или франк.
Таким образом, наша панель собирает эти взаимосвязи, создавая целостную картину рынка и позволяя увидеть настоящую силу каждой валюты. Как говорил Далио: "Чтобы заработать на рынке, нужно видеть то, чего не видят другие". Наша панель силы валют как раз и помогает выявить скрытые тенденции, недоступные при традиционном анализе.
2. Подготовка базовых элементов: настройка входных параметров, подключение валютных пар, определение цветовой схемы и интервала обновлений
Прежде чем погрузиться в сложные расчеты и алгоритмы, давайте заложим прочный фундамент нашего индикатора. Правильная настройка базовых элементов — это 50% успеха всего проекта.
Структура заголовка индикатора
#property copyright "Copyright 2025" #property version "1.00" #property description "Панель анализа силы валют" #property indicator_separate_window #property indicator_plots 0
Эти директивы определяют базовую информацию об индикаторе. Обратите внимание на indicator_separate_window — наша панель будет отображаться в отдельном окне, не перегружая основной график.
Входные параметры
// Входные параметры input color InpStrongColor = clrLime; // Цвет сильных валют input color InpWeakColor = clrRed; // Цвет слабых валют input color InpTextColor = clrWhite; // Цвет текста input int InpUpdateInterval = 60; // Интервал обновления (в секундах)
Мы даем пользователю возможность настроить внешний вид и поведение индикатора. Зеленый и красный цвета традиционно используются для обозначения силы и слабости, но трейдер может выбрать любую удобную для себя цветовую схему.
Определение валютных пар
// Массив валютных пар const string CURRENCY_PAIRS[] = { "EURUSD", "GBPUSD", "USDJPY", "USDCHF", "AUDUSD", "NZDUSD", "USDCAD", "EURGBP", "EURJPY", "EURCHF", "EURAUD", "EURNZD", "EURCAD", "GBPJPY", "GBPCHF", "GBPAUD", "GBPNZD", "GBPCAD", "AUDJPY", "NZDJPY", "CADJPY", "CHFJPY", "AUDCHF", "NZDCHF", "CADCHF", "AUDNZD", "AUDCAD", "NZDCAD" };
Этот массив — сердце нашего индикатора. Он содержит все основные валютные пары, которые мы будем анализировать. Обратите внимание на порядок: сначала идут пары с USD, затем с EUR, GBP и так далее. Такая структура поможет нам в дальнейшем при расчете силы отдельных валют.
Структура данных для хранения информации
// Структура для хранения силы валютной пары struct SPairStrength { string pair; // Валютная пара double strength; // Текущая сила double h1_change; // Изменение за час double h4_change; // Изменение за 4 часа double d1_change; // Дневное изменение }; // Глобальные переменные SPairStrength g_strength_data[]; int g_pairs_count; int g_timer_counter;
Структура SPairStrength — это наш контейнер для хранения всей необходимой информации о каждой валютной паре. Мы будем хранить не только итоговое значение силы, но и изменения по каждому таймфрейму, что позволит трейдеру видеть полную картину движения.
Инициализация индикатора
int OnInit() { // Инициализация массива данных g_pairs_count = ArraySize(CURRENCY_PAIRS); ArrayResize(g_strength_data, g_pairs_count); // Заполнение названий пар for(int i = 0; i < g_pairs_count; i++) { g_strength_data[i].pair = CURRENCY_PAIRS[i]; } // Создание графических объектов if(!CreateGraphics()) { return(INIT_FAILED); } // Установка таймера EventSetTimer(InpUpdateInterval); g_timer_counter = 0; return(INIT_SUCCEEDED); }
В функции инициализации мы определяем размер массива данных, заполняем базовую информацию, затем создаем графические объекты, ну и настраиваем таймер обновления.
Очистка при завершении работы
void OnDeinit(const int reason) { EventKillTimer(); ObjectsDeleteAll(0, "SPPanel_"); ChartRedraw(); }
Никогда не забывайте о правильной очистке ресурсов — это признак хорошего кода.
Теперь фундамент нашего индикатора готов! В следующем разделе мы займемся созданием системы расчета силы валют и визуализации результатов.
3. Создание структуры для хранения данных: разработка структуры SPairStrength для хранения информации о силе каждой валютной пары
Каждый программист знает, что структура данных — это как фундамент дома. От того, насколько продуманно мы её спроектируем, зависит успех всего проекта. Давайте погрузимся в анатомию нашей структуры SPairStrength.
// Структура для хранения силы валютной пары struct SPairStrength { string pair; // Валютная пара double strength; // Текущая сила double h1_change; // Изменение за час double h4_change; // Изменение за 4 часа double d1_change; // Дневное изменение }; // Глобальные переменные SPairStrength g_strength_data[]; int g_pairs_count; int g_timer_counter;
В сердце нашей структуры лежит элегантное решение для хранения всей необходимой информации о валютной паре. Представьте себе цифровой паспорт валютной пары, где каждое поле рассказывает свою историю рыночных движений.
Поле pair — это имя нашего финансового инструмента, его уникальный идентификатор в мире форекс. Как человеческое имя определяет личность, так и строковое значение "EURUSD" или "GBPJPY" мгновенно дает нам понимание, с какой валютной парой мы работаем.
Переменная strength — это квинтэссенция силы валютной пары, её цифровой рейтинг на рынке. Подобно тому, как учителя выводят итоговую оценку на основе нескольких контрольных работ, это значение учитывает показатели всех временных интервалов, создавая единый индекс силы.
Теперь о временной структуре данных. Мы используем три ключевых маркера: h1_change, h4_change и d1_change. Это как три камеры наблюдения, каждая из которых снимает движение цены в своем временном масштабе. Часовой график (h1_change) ловит краткосрочные колебания, четырехчасовой (h4_change) отслеживает среднесрочные тенденции, а дневной (d1_change) рисует глобальную картину движения цены.
Для работы с нашей структурой мы также создаем глобальные переменные:
// Инициализация массива данных void InitializeDataArray() { g_pairs_count = ArraySize(CURRENCY_PAIRS); ArrayResize(g_strength_data, g_pairs_count); // Заполнение базовой информации for(int i = 0; i < g_pairs_count; i++) { g_strength_data[i].pair = CURRENCY_PAIRS[i]; g_strength_data[i].strength = 0; g_strength_data[i].h1_change = 0; g_strength_data[i].h4_change = 0; g_strength_data[i].d1_change = 0; } }
Все эти элементы вместе создают мощный инструмент анализа. Подобно тому, как врач использует различные показатели для оценки здоровья пациента, наша структура собирает ключевые метрики для определения состояния валютной пары. В следующем разделе мы рассмотрим, как эта элегантная структура данных оживает в графическом интерфейсе, превращая сухие цифры в наглядную картину рыночных возможностей.
4. Организация графического интерфейса: создание главной панели, размещение заголовков, настройка отображения значений
Визуальное представление данных — это искусство превращения цифр в понятную картину. Давайте создадим интуитивно понятный интерфейс, который позволит трейдеру мгновенно считывать рыночную ситуацию.
bool CreateGraphics() { // Основная панель if(!ObjectCreate(0, "SPPanel_Main", OBJ_RECTANGLE_LABEL, 0, 0, 0)) { Print("Ошибка создания основной панели: ", GetLastError()); return false; } // Настройка внешнего вида панели ObjectSetInteger(0, "SPPanel_Main", OBJPROP_XDISTANCE, 20); ObjectSetInteger(0, "SPPanel_Main", OBJPROP_YDISTANCE, 20); ObjectSetInteger(0, "SPPanel_Main", OBJPROP_XSIZE, 800); ObjectSetInteger(0, "SPPanel_Main", OBJPROP_YSIZE, 400); ObjectSetInteger(0, "SPPanel_Main", OBJPROP_BGCOLOR, C'16,20,24'); ObjectSetInteger(0, "SPPanel_Main", OBJPROP_BORDER_COLOR, C'29,31,34'); ObjectSetInteger(0, "SPPanel_Main", OBJPROP_BORDER_TYPE, BORDER_FLAT); ObjectSetInteger(0, "SPPanel_Main", OBJPROP_CORNER, CORNER_LEFT_UPPER); ObjectSetInteger(0, "SPPanel_Main", OBJPROP_BACK, false);
Темный фон панели выбран неслучайно — он снижает нагрузку на глаза при длительной работе. Размеры панели тщательно подобраны для оптимального отображения всей необходимой информации без перегрузки экрана.
// Создание заголовков и разметки CreateLabel("SPPanel_Strong", "СИЛЬНЫЕ ПАРЫ - ЛОНГ", 30, 30, InpTextColor, 10, true); CreateLabel("SPPanel_Weak", "СЛАБЫЕ ПАРЫ - ШОРТ", 420, 30, InpTextColor, 10, true); string header = " ПАРА H1 H4 D1 СИЛА"; CreateLabel("SPPanel_Header1", header, 30, 60, clrGray, 9); CreateLabel("SPPanel_Header2", header, 420, 60, clrGray, 9);
Интерфейс разделен на две логические зоны: сильные и слабые пары. Это как два полюса магнита — они притягивают внимание к самым важным торговым возможностям. Каждая колонка данных имеет свое предназначение, рассказывая историю движения цены через разные временные призмы.
bool CreateLabel(const string name, const string text, const int x, const int y, const color clr, const int size, const bool is_bold=false) { if(!ObjectCreate(0, name, OBJ_LABEL, 0, 0, 0)) { Print("Ошибка создания метки ", name, ": ", GetLastError()); return false; } ObjectSetString(0, name, OBJPROP_TEXT, text); ObjectSetInteger(0, name, OBJPROP_XDISTANCE, x); ObjectSetInteger(0, name, OBJPROP_YDISTANCE, y); ObjectSetString(0, name, OBJPROP_FONT, is_bold ? "Arial Bold" : "Arial"); ObjectSetInteger(0, name, OBJPROP_FONTSIZE, size); ObjectSetInteger(0, name, OBJPROP_COLOR, clr); ObjectSetInteger(0, name, OBJPROP_CORNER, CORNER_LEFT_UPPER); ObjectSetInteger(0, name, OBJPROP_ANCHOR, ANCHOR_LEFT_UPPER); return true; }
Функция CreateLabel — это наш художник, который размещает текст на панели с ювелирной точностью. Каждый элемент интерфейса выверен до пикселя, чтобы создать гармоничную композицию данных.
В следующем разделе мы оживим этот интерфейс, наполнив его реальными данными о движении валютных пар. Наша панель станет живым организмом, пульсирующим в ритме рынка.
Реализация алгоритма расчета силы
В сердце нашего индикатора бьется мощный алгоритм расчета силы валютных пар. Это не просто математическая формула — это симфония рыночных данных, где каждый таймфрейм играет свою партию.
// Расчет изменения цены для заданного таймфрейма double CalculateChange(const string symbol, const ENUM_TIMEFRAMES timeframe) { MqlRates rates[]; ArraySetAsSeries(rates, true); if(CopyRates(symbol, timeframe, 0, 2, rates) <= 0) { return 0.0; } if(rates[1].open == 0) return 0.0; return ((rates[0].close - rates[1].open) / rates[1].open) * 100.0; } // Расчет силы всех валютных пар void CalculateStrengths() { for(int i = 0; i < g_pairs_count; i++) { // Расчет изменений по разным таймфреймам g_strength_data[i].h1_change = CalculateChange(g_strength_data[i].pair, PERIOD_H1); g_strength_data[i].h4_change = CalculateChange(g_strength_data[i].pair, PERIOD_H4); g_strength_data[i].d1_change = CalculateChange(g_strength_data[i].pair, PERIOD_D1); // Расчет общей силы (взвешенное значение) g_strength_data[i].strength = g_strength_data[i].h1_change * 0.2 + // 20% вес часового графика g_strength_data[i].h4_change * 0.3 + // 30% вес 4-часового графика g_strength_data[i].d1_change * 0.5; // 50% вес дневного графика } }
Почему такие весовые коэффициенты? Дневной таймфрейм получает наибольший вес (50%), так как отражает глобальный тренд. Четырехчасовой график (30%) улавливает среднесрочные движения, а часовой (20%) реагирует на краткосрочные колебания. Это как система фильтров, где каждый уровень очищает сигнал от рыночного шума.
5. Система пузырьковой сортировки: создание механизма сортировки валютных пар по силе для выделения сильных и слабых инструментов
В современном алгоритмическом трейдинге скорость и точность сортировки данных играют критическую роль. Разработанный нами механизм сортировки — это не просто реализация классического алгоритма, а тщательно оптимизированное решение для специфических задач валютного рынка.
void SortStrengthData() { for(int i = 0; i < g_pairs_count - 1; i++) { for(int j = i + 1; j < g_pairs_count; j++) { if(g_strength_data[j].strength > g_strength_data[i].strength) { SPairStrength temp = g_strength_data[i]; g_strength_data[i] = g_strength_data[j]; g_strength_data[j] = temp; } } } }
За внешней простотой этого кода скрывается мощный инструмент финансовой аналитики. Каждая итерация алгоритма — это микросекундное сравнение силы валютных пар, где сильнейшие инструменты естественным образом поднимаются к вершине массива, формируя элитную группу торговых возможностей. Слабые пары, напротив, опускаются вниз, создавая идеальный сценарий для трейдеров, предпочитающих короткие позиции.
void GetTopPairs(SPairStrength &strong[], SPairStrength &weak[], int count = 10) { ArrayResize(strong, count); for(int i = 0; i < count; i++) { strong[i] = g_strength_data[i]; } ArrayResize(weak, count); for(int i = 0; i < count; i++) { weak[i] = g_strength_data[g_pairs_count - 1 - i]; } }
Функция GetTopPairs демонстрирует изящество нашего подхода. Вместо постоянной пересортировки всего массива данных, мы храним его в упорядоченном состоянии, что позволяет мгновенно извлекать информацию о самых сильных и слабых инструментах. Это особенно важно в условиях высокочастотного трейдинга, где каждая миллисекунда на счету.
void UpdateDisplay() { for(int i = 0; i < 10 && i < g_pairs_count; i++) { string text = StringFormat("%s %+.1f %+.1f %+.1f %+.1f", g_strength_data[i].pair, g_strength_data[i].h1_change, g_strength_data[i].h4_change, g_strength_data[i].d1_change, g_strength_data[i].strength); UpdatePairDisplay("Strong_" + IntegerToString(i), text, InpStrongColor, i); } }
В следующем разделе мы рассмотрим, как наша система обновления данных поддерживает этот отлаженный механизм в постоянной боевой готовности, обеспечивая трейдера актуальной информацией о силе валютных пар в режиме реального времени.
6. Внедрение системы обновления данных: настройка таймера и функций для регулярного обновления значений силы валют
В основе любого успешного торгового инструмента лежит точность и своевременность поступающей информации. Наш индикатор силы валют не исключение — его сердцем является тщательно продуманная система обновления данных в реальном времени.
void OnTimer() { g_timer_counter++; if(g_timer_counter >= InpUpdateInterval) { CalculateStrengths(); SortStrengthData(); UpdateDisplay(); g_timer_counter = 0; } }
Этот элегантный механизм таймера — словно метроном, отсчитывающий ритм рыночных изменений. Каждые 60 секунд (значение по умолчанию) индикатор проводит полное обновление всех данных, обеспечивая трейдера актуальной информацией для принятия решений.
void UpdateDisplay() { // Удаление старых значений ObjectsDeleteAll(0, "SPPanel_Value_"); // Обновление сильных пар for(int i = 0; i < 10 && i < g_pairs_count; i++) { string text = StringFormat("%s %+.1f %+.1f %+.1f %+.1f", g_strength_data[i].pair, g_strength_data[i].h1_change, g_strength_data[i].h4_change, g_strength_data[i].d1_change, g_strength_data[i].strength); CreateLabel("SPPanel_Value_Strong_" + IntegerToString(i), text, 30, 90 + i * 25, InpStrongColor); } }
Процесс обновления данных напоминает смену декораций в театре — старые значения плавно уступают место новым, создавая живую, динамичную картину рынка. Каждое значение форматируется с математической точностью: два знака после запятой для процентных изменений, выравнивание колонок для удобства чтения, цветовое кодирование для мгновенного восприятия информации.
void RefreshData() { static datetime last_update = 0; datetime current_time = TimeCurrent(); // Проверка необходимости обновления if(current_time - last_update >= InpUpdateInterval) { CalculateStrengths(); SortStrengthData(); UpdateDisplay(); last_update = current_time; } }
Система также включает защиту от избыточных обновлений и механизм синхронизации с серверным временем, что особенно важно при работе на высоконагруженных торговых счетах. В следующем разделе мы рассмотрим, как все эти элементы собираются воедино в процессе оптимизации отображения результатов.
7. Оптимизация отображения результатов: форматирование вывода данных, настройка цветового выделения значений
В мире финансовых данных визуальное представление играет ключевую роль. Наш индикатор превращает поток рыночных данных в интуитивно понятную картину, где каждый элемент имеет свое предназначение.
void UpdatePairDisplay(const string label_suffix, const string value, const color clr, const int position) { string text = StringFormat("%s %+6.1f %+6.1f %+6.1f %+6.1f", value.pair, value.h1_change, value.h4_change, value.d1_change, value.strength); color display_color = value.strength > 0 ? InpStrongColor : InpWeakColor; CreateLabel("SPPanel_" + label_suffix, text, position < 10 ? 30 : 420, // X координата 90 + (position % 10) * 25, // Y координата display_color, 9); }
Форматирование чисел здесь не просто косметическое улучшение. Каждое значение выводится с фиксированной шириной и знаком, что создает идеально выровненные колонки данных. При этом положительные значения автоматически окрашиваются в зеленый цвет, отрицательные — в красный, что позволяет мгновенно оценивать ситуацию.
void ApplyColorCoding() { // Динамическое определение границ для цветового кодирования double max_strength = 0; for(int i = 0; i < g_pairs_count; i++) { if(MathAbs(g_strength_data[i].strength) > max_strength) max_strength = MathAbs(g_strength_data[i].strength); } // Применение градиентной окраски for(int i = 0; i < g_pairs_count; i++) { double strength_ratio = g_strength_data[i].strength / max_strength; color intensity = GetColorIntensity(strength_ratio); UpdatePairColor(i, intensity); } }
Индикатор использует динамическую систему цветового кодирования, где интенсивность цвета отражает относительную силу валютной пары. Чем ярче цвет, тем значительнее движение — это позволяет трейдеру моментально выделять самые активные инструменты.
В следующем разделе мы погрузимся в процесс тестирования индикатора, где проверим его работу в различных рыночных условиях.
8. Тестирование работы индикатора: проверка корректности расчетов и стабильности работы на разных таймфреймах
Перед нами отображается полностью рабочая панель силы валют, которая уже показывает реальные рыночные данные. Давайте рассмотрим, как индикатор проявляет себя в различных рыночных ситуациях и как мы можем убедиться в корректности его работы.
На скриншоте мы видим четкое разделение валютных пар. В левой колонке сильных пар лидирует EURCAD с преимущественно положительной динамикой.
В правой колонке слабых пар мы видим CADCHF, демонстрирующий существенное ослабление, особенно на старших таймфреймах (H4: -0.5, D1: -1.8), что дает общую слабость -1.1. Это прекрасный пример того, как индикатор выявляет устойчивые тренды.
Заключение
Мы завершили создание профессионального индикатора силы валют, который превращает хаос рыночных данных в четкую, структурированную картину торговых возможностей. Также у панели есть выделенная платная версия, с возможностью поиска точек входа на завершении коррекции к долгосрочному тренду (к примеру, когда долго шел восходящий тренд, но на часовиках идет снижение, и мы можем выгодно купить) .
Наша панель объединяет в себе несколько ключевых инноваций:
- Многоуровневый анализ временных масштабов (H1, H4, D1), позволяющий видеть полную картину движения рынка
- Умную систему взвешивания, где каждый таймфрейм вносит свой вклад в общую оценку силы
- Элегантный визуальный интерфейс с интуитивно понятным представлением данных
- Эффективную систему обновления в реальном времени
- Надежный механизм сортировки и ранжирования валютных пар
Сила нашего индикатора не только в технической реализации, но и в философии, лежащей в его основе. Следуя принципам Рэя Далио, мы создали инструмент, который рассматривает рынок как единую взаимосвязанную систему, где движение каждой валюты влияет на общую картину.
Предупреждение: все права на данные материалы принадлежат MetaQuotes Ltd. Полная или частичная перепечатка запрещена.
Данная статья написана пользователем сайта и отражает его личную точку зрения. Компания MetaQuotes Ltd не несет ответственности за достоверность представленной информации, а также за возможные последствия использования описанных решений, стратегий или рекомендаций.





- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Необдуманным и крайне неэффективным является использование валютных пар в виде большого списка кросскурсов. Правильно брать только валюты относительно одной базы (как правило, USD) и получать из них любые сочетания.
Всё верно сделано, и в разы очевидней, нежели отталкиваться от одной валюты.
Прекрасная работа!
Необдуманным и крайне неэффективным является использование валютных пар в виде большого списка кросскурсов. Правильно брать только валюты относительно одной базы (как правило, USD) и получать из них любые сочетания.
плохой вариант, так кода получится мало :-) и опасный - может потеряться смысл введённого термина "сила валют"
Всё верно сделано, и в разы очевидней, нежели отталкиваться от одной валюты.
Прекрасная работа!
Если для трейдера не очевидно, что, например, EURJPY - это EURUSD*USDJPY, то он видимо занялся не подходящим для него делом. Если брать только форексные "мажоры" то проще (во всех смыслах) обработать 7 пар, чем 28. А что вы будете делать, если у брокера (как частенько бывает) отсутствуют некоторые кроссы? А если в корзину захочется добавить "миноры", локальные валюты, металлы? Предлагаете затащить в MQL-программу весь Market Watch, хотя этого не требуется для оценки той же корзины? Вот из-за таких советчиков на форуме регулярно и появляются вопросы: ой, а что-то у меня индикатор тормозит, а что это у меня тестерные агенты выжрали всю память, и т.д.
Я уж не стал говорить про какие-то выдранные куски кода, в том числе и не компилирующиеся в принципе, такие как UpdatePairDisplay.
Неудовлетворительно.