Разработка инструментария для анализа Price Action (Часть 57): Создание модуля классификации состояния рынка на MQL5
Содержание
Введение
Когда мы смотрим на ценовой график, важно сначала понять, что означает текущее движение цены, и только потом формировать ожидания относительно того, что может последовать. Этот контекст помогает определить, подходят ли условия для участия или лучше дождаться более ясной и устойчивой структуры. Выявление текущего состояния рынка вручную требует времени и постоянной сосредоточенности, особенно при работе на нескольких таймфреймах. Постоянное повторение этого процесса может быть утомительным и неэффективным.
В этой части серии Разработка инструментария для анализа Price Action мы представляем автоматизированную систему на MQL5, предназначенную для классификации текущего состояния рынка на основе одного лишь движения цены. В следующих разделах подробно разобраны основная идея, логика классификации и подход к реализации.
Понимание состояний рынка
Перед тем как рассматривать состояния рынка в контексте Price Action, полезно начать со знакомой научной концепции – состояний вещества. Вещество – это все, что имеет массу и занимает пространство; в зависимости от внутренней энергии и внешнего давления оно может существовать в разных агрегатных состояниях. Эти состояния обычно обозначают как твердое, жидкое и газообразное.
В твердом состоянии частицы обладают относительно низкой энергией. Они плотно упакованы и прочно связаны, поэтому свобода их движения ограничена. По мере роста энергии эти связи ослабевают, и вещество переходит в жидкое состояние, где частицы остаются близко друг к другу, но уже не закреплены жестко. При дальнейшем росте энергии частицы становятся очень активными и свободно рассеиваются, образуя газообразное состояние.
Ключевой принцип здесь в том, что само вещество не меняется – меняется только его состояние. Вода остается водой, будь то лед, жидкость или пар. Меняется внутренняя энергия и то, как она проявляется через структуру и движение. Этот принцип дает полезную основу для интерпретации поведения рынка. Сама цена не меняется по своей сути – она лишь проявляет разные состояния поведения в зависимости от внутренних условий, таких как волатильность и структура. Эти состояния описывают, как ведет себя рынок, а не куда он направлен.
От агрегатных состояний к состояниям рынка
На рисунке ниже показана аналогия агрегатных состояний вещества с состояниями рынка, при этом акцент делается на волатильности и структурных ограничениях, а не на направленности тренда.

В науке газы сжимаются легче, чем твердые тела, что при такой аналогии может показаться нелогичным. Однако в данном контексте сжатие означает не способность к сжатию, а состояние ограниченности. Твердое тело здесь обозначает состояние, в котором частицы уже плотно упакованы, а их движение ограничено. Аналогичным образом, состояние сжатия на рынке означает, что цена уже зажата в узком диапазоне. Таким образом, аналогия опирается на свободу движения и внутреннюю энергию, а не на механическую сжимаемость. В рамках этой системы состояния рынка рассматриваются как описательные условия, а не как прогнозные сигналы. Цель состоит в том, чтобы по наблюдаемым в последних полностью закрытых свечах признакам определить, находится ли цена в сжатом состоянии, выходит из него или движется свободно.
В этой разработке используется следующая схема соответствия:
- твердое тело – сжатие;
- жидкость – переходное состояние;
- газ – расширение.
Эти состояния меняются непрерывно, а не скачком. Рынок обычно проходит через промежуточные состояния по мере изменения волатильности и структуры, а не переключается мгновенно из одного состояния в другое.
Состояние сжатия (твердое тело)
Состояние сжатия описывает ситуацию, в которой цена структурно ограничена. Диапазоны свечей сужаются, волатильность уменьшается, а цена колеблется в относительно узком диапазоне. Максимумы и минимумы перекрываются, а направленное продвижение остается ограниченным.

Сжатие не тождественно бездействию. Цена продолжает колебаться, но движение поглощается, а не получает развития. Выявление сжатия позволяет по данным закрытых свечей понять, что движение ограничено, не делая предположений о будущем направлении. Сжатие может сохраняться длительное время на нескольких таймфреймах, особенно когда участие покупателей и продавцов сбалансировано или внешние драйверы отсутствуют. На младших таймфреймах это часто выглядит как перекрывающиеся свечи с частыми тенями и минимальным итоговым смещением, тогда как на старших таймфреймах может проявляться как компактная структура консолидации. Важно, что сжатие не означает слабость или нерешительность; оно отражает временное равновесие, при котором движение цены поглощается и не получает развития. Распознавание этого состояния помогает правильно соотносить ожидания со сниженной эффективностью движения и интерпретировать последующее поведение цены в нужном контексте.
Переходное состояние (жидкость)
Переходное состояние отражает ослабление структурных ограничений. Диапазоны свечей становятся менее однородными, волатильность меняется, и цена может выходить за пределы недавних экстремумов без устойчивого продолжения движения. Структурные сигналы часто оказываются смешанными, а структурные ограничения ослабевают, но не исчезают полностью.

Это состояние объясняет, почему поведение цены может казаться непоследовательным или текучим, не будучи при этом случайным. Переход – это промежуточное состояние, в котором не доминируют ни ограниченность, ни свободное движение.
Состояние расширения (газ)
Состояние расширения характеризуется повышенной волатильностью и широкими диапазонами свечей. Структурные ограничения ослабевают, и цена движется свободно, совершая большие, неравномерные колебания. Согласованность по направлению здесь не требуется; расширение описывает масштаб движения, а не его согласованность.

Расширение не подразумевает ни продолжения, ни тренда, ни длительности. Это состояние описывает повышенную внутреннюю энергию, которая выражается в широком движении цены и оценивается строго по закрытым свечам.
Тренд как структурное состояние

Трендовое состояние определяется, когда цена формирует последовательность из:
- повышающихся максимумов и повышающихся минимумов; либо
- понижающихся максимумов и понижающихся минимумов,
сопровождаемую устойчивой направленностью закрытий свечей. Рынок может демонстрировать расширение без устойчивого тренда или сохранять тренд при умеренной волатильности. По этой причине тренд оценивается независимо от аналогии, основанной на волатильности. Он дополняет систему классификации, добавляя направленный контекст без каких-либо прогнозных допущений.
Почему важно понимать состояние рынка
Понимание состояний рынка позволяет интерпретировать динамику цены в текущем контексте. Одна и та же структурная особенность может означать разное в зависимости от того, находится ли рынок в сжатии, переходном состоянии, расширении или тренде. Когда преобладающее состояние классифицируется по данным закрытых свечей, анализ становится более цельным и внутренне согласованным. Данная система делает акцент на наблюдении и классификации, а не на исполнении торговых решений, и дает нейтральную основу для осмысленной интерпретации.
Реализация на MQL5
После того как концептуальная рамка задана, следующим шагом становится реализация классификации состояния рынка в виде конкретного и надежного модуля на MQL5. Этот модуль реализован как советник без торговых функций, единственная задача которого – наблюдать динамику цены по закрытым свечам, классифицировать преобладающее состояние рынка и визуально отображать этот контекст на графике. Никакие ордера не выставляются, сигналы не формируются, а предположения о будущем не делаются. Советник служит исключительно аналитическим слоем.
С архитектурной точки зрения его реализация организована так, чтобы оставаться системной, читаемой и легко расширяемой. Вместо того чтобы сводить всю логику к одному циклу выполнения, функционал четко разграничен. На практике советник выполняет четыре основные задачи:
- отбор по закрытым свечам и проверка условия расчета;
- извлечение структуры свингов;
- классификация состояния рынка;
- визуализация на графике.
Такое архитектурное разделение сделано намеренно. За счет разделения извлечения признаков, логики классификации и визуализации реализацию легко проверять, отлаживать и расширять. Изменения в визуальном представлении не влияют на аналитические результаты, а правила классификации можно уточнять без изменения логики выполнения. Структура отражает профессиональный подход к проектированию аналитических систем, где ясность и воспроизводимость важнее компактности или оптимизационных уловок. Такое разделение делает аналитические решения независимыми от представления, поэтому классификатор можно оценивать независимо.
Оценка по закрытым свечам
Прежде всего, все расчеты в советнике проходят строгую проверку того, что свеча закрыта. На каждом тике советник проверяет временную метку бара с индексом 1, который соответствует последней полностью закрытой свече. Если эта временная метка не изменилась с предыдущего тика, выполнение немедленно прекращается.
Только после полного закрытия новой свечи советник приступает к перерасчету диапазонов, оценке структуры, классификации состояния рынка и обновлению графических объектов. Такой подход гарантирует работу без перерисовки. Это также гарантирует, что тестирование на исторических данных и работа в реальном времени будут вести себя одинаково, поскольку в обоих случаях используются только завершенные данные. С точки зрения производительности такая схема поддерживает стабильную загрузку процессора, поскольку классификатор выполняется один раз на бар, а не непрерывно на каждом тике.
void OnTick() { // 1. Closed-candle gating (non-repainting core) datetime closed=iTime(_Symbol,_Period,1); if(closed==0 || closed==g_lastClosedBar) return; g_lastClosedBar=closed; // 2. Feature extraction + classification double avgR,lastR,lastCLV,meanCLV,swingScore,recentAvg,prevAvg; ENUM_MARKET_STATE newState = ClassifyState(avgR,lastR,lastCLV,meanCLV, swingScore,recentAvg,prevAvg); // 3. State transition handling DrawStateHistory(g_state,newState); g_prevState=g_state; g_state=newState; // 4. Visualization layer DrawSwingDots(); DrawActiveLabels(); DrawCompressionBox(); DrawInfoLines(); }
Эта структура гарантирует, что извлечение признаков, классификация состояния и отрисовка графика выполняются ровно один раз на каждую закрытую свечу, сохраняя детерминированное поведение без перерисовки.
Входные параметры и настраиваемое поведение
После того как логика работы определена, в советнике необходимо объявить несколько входных параметров, управляющих чувствительностью, порогами и визуализацией. Эти параметры концептуально сгруппированы так, чтобы поведенческая логика и настройки отображения оставались разделенными.
input int InpLookbackBars = 60; input int InpTrendBars = 20; input int InpCompressionBars = 16; input int InpSwingLeftRight = 3; input double InpRangeShrinkRatio = 0.70; input double InpExpansionMult = 1.80; input double InpCLVStrong = 0.60;
Параметры окна проверки и чувствительности
Эти параметры определяют, насколько исторические данные влияют на расчеты классификатора:
- InpLookbackBars задает базовое окно, используемое для расчета среднего диапазона свечи;
- InpTrendBars задает, сколько закрытых свечей участвует в расчете среднего направленного уклона CLV, используемого для определения тренда;
- InpCompressionBars определяет длину окна, используемого для сравнения недавнего сжатия диапазона;
- InpSwingLeftRight задает строгость определения максимумов и минимумов свинга.
Пороговые параметры
Пороги определяют, насколько жестко классификатор различает состояния:
- InpRangeShrinkRatio определяет, насколько средний недавний диапазон должен сократиться относительно предыдущего окна, чтобы состояние считалось сжатием;
- InpExpansionMult задает, насколько диапазон последней свечи должен превышать базовое среднее значение, чтобы состояние считалось расширением;
- InpCLVStrong выступает фильтром расширения, поэтому учитываются только широкие свечи с уверенным закрытием;
- InpTrendBiasCLV и InpTrendMinSwingScore определяют минимальный направленный уклон цен закрытия и согласованность структуры, необходимые для трендового состояния.
Переключатели визуализации
Каждый визуальный элемент – точки свинга, метки активной структуры, область сжатия, блоки истории состояний и вертикальная информационная панель – можно включать и отключать по отдельности. Это позволяет сохранять аналитический движок неизменным и при этом подстраивать визуальное представление под разные макеты графика.
Признаки Price Action, используемые классификатором
В основе классификатора лежит небольшой набор признаков, вычисляемых напрямую из цены и исключительно по закрытым свечам. Эти показатели намеренно сделаны простыми и прозрачными, поэтому логику легко проверять и осмысливать.
Диапазон свечи
Диапазон свечи вычисляется как разница между максимумом и минимумом каждой закрытой свечи. Поддерживаются два связанных показателя диапазона:
- базовый диапазон, вычисляемый по InpLookbackBars;
- сравнение для сжатия, при котором средний недавний диапазон сопоставляется с непосредственно предшествующим окном той же длины.
double CandleRange(int shift) { return iHigh(_Symbol, _Period, shift) - iLow (_Symbol, _Period, shift); } double AvgRange(int start, int count) { double sum = 0; int n = 0; for(int i = start; i < start + count && i < Bars(_Symbol, _Period); i++) { double r = CandleRange(i); if(r > 0) { sum += r; n++; } } return (n > 0 ? sum / n : 0); }
Такой двойной подход позволяет советнику выявлять и относительное сжатие, и аномальное расширение, не опираясь на фиксированные пороги в пунктах или пипсах.
Показатель Closing Location Value (CLV)
Closing Location Value показывает, где внутри диапазона свечи находится ее закрытие, и вычисляется по формуле:
CLV = (2 × Close - High - Low) / (High - Low)
double CandleCLV(int shift) { double h = iHigh (_Symbol, _Period, shift); double l = iLow (_Symbol, _Period, shift); double c = iClose(_Symbol, _Period, shift); if(h <= l) return 0.0; return (2.0 * c - h - l) / (h - l); }
В рамках этой реализации CLV выполняет две описательные функции. Во-первых, абсолютное значение CLV последней закрытой свечи служит фильтром силы для расширения, не позволяя ошибочно относить к нему широкие свечи, закрывающиеся близко к середине диапазона. Во-вторых, среднее значение CLV на коротком окне дает меру направленного уклона, используемую при оценке структуры тренда. CLV рассматривается строго как структурный признак.
Структура свингов и структурная оценка
Максимумы и минимумы свинга определяются с помощью симметричного сравнения слева и справа, задаваемого параметром InpSwingLeftRight. Советник находит два последних максимума свинга и два последних минимума свинга в пределах ограниченного окна поиска.
bool IsSwingHigh(int shift, int lr) { double mid = iHigh(_Symbol, _Period, shift); for(int i = 1; i <= lr; i++) if(mid <= iHigh(_Symbol, _Period, shift + i) || mid <= iHigh(_Symbol, _Period, shift - i)) return false; return true; } bool IsSwingLow(int shift, int lr) { double mid = iLow(_Symbol, _Period, shift); for(int i = 1; i <= lr; i++) if(mid >= iLow(_Symbol, _Period, shift + i) || mid >= iLow(_Symbol, _Period, shift - i)) return false; return true; }
По этим четырем точкам вычисляется компактная оценка свинга: последний свинг сравнивается с предыдущим как по максимумам, так и по минимумам. Показатель растет, когда структура смещается вверх, и снижается, когда она смещается вниз. Этот показатель не используется для оценки величины движения или импульса; он нужен только для того, чтобы определить, согласована ли структура.
int Sign(double v) { if(v > 0) return 1; if(v < 0) return -1; return 0; } double ComputeSwingScore(int prevHigh, int lastHigh, int prevLow, int lastLow) { double score = 0; score += Sign(iHigh(_Symbol, _Period, lastHigh) - iHigh(_Symbol, _Period, prevHigh)); score += Sign(iLow (_Symbol, _Period, lastLow) - iLow (_Symbol, _Period, prevLow)); return score; }
Модель состояний и иерархия классификации
После вычисления базовых признаков советник определяет состояние рынка с помощью перечисления из четырех возможных значений:
- тренд (Trend);
- сжатие (Compression);
- расширение (Expansion);
- переходное состояние (Transition).
Логика классификации намеренно выстроена как иерархия, чтобы избежать неоднозначных наложений. Оценка выполняется в следующем порядке:
- расширение (Expansion);
- сжатие (Compression);
- тренд (Trend);
- переходное состояние (Transition).
ENUM_MARKET_STATE ClassifyState(double avgRange, double lastRange, double lastCLV, double recentAvg, double prevAvg, double meanCLV, double swingScore) { // Expansion: abnormal range with decisive close if(lastRange >= avgRange * InpExpansionMult && MathAbs(lastCLV) >= InpCLVStrong) return STATE_EXPANSION; // Compression: relative contraction in recent volatility if(prevAvg > 0 && recentAvg <= prevAvg * InpRangeShrinkRatio) return STATE_COMPRESSION; // Trend: agreement between structure and directional close bias if(MathAbs(meanCLV) >= InpTrendBiasCLV && MathAbs(swingScore) >= InpTrendMinSwingScore) return STATE_TREND; // Transition: mixed or intermediate behavior return STATE_TRANSITION; }
Такой порядок отражает практическую значимость свободы движения цены. Внезапное расширение нужно распознавать сразу, тогда как тренд оценивается только тогда, когда ни сжатие, ни расширение не доминируют.
Условие расширения
Расширение определяется, когда последняя закрытая свеча одновременно показывает аномальный диапазон и уверенное закрытие:
- диапазон последней свечи превышает базовый диапазон в InpExpansionMult раз;
- абсолютное значение CLV этой свечи не меньше InpCLVStrong.
Это сочетание гарантирует, что расширение будет отражать реальное высвобождение энергии движения, а не просто широкую, но нейтральную по закрытию свечу.
Условие сжатия
Сжатие определяется, когда недавняя волатильность сокращается относительно непосредственно предшествующего окна:
Поскольку это относительное сравнение, оно естественным образом адаптируется к разным инструментам и таймфреймам, оценивая рынок относительно его собственного недавнего поведения.
Условие тренда
Тренд оценивается независимо от состояний волатильности и требует согласованности между структурой и поведением цены закрытия:
- абсолютная величина среднего CLV не меньше InpTrendBiasCLV;
- абсолютная величина структурной оценки свинга не меньше InpTrendMinSwingScore.
Это не позволяет делать вывод о тренде только по самому движению и гарантирует, что в базовой структуре будет присутствовать согласованность по направлению.
Условие переходного состояния
Если ни одно из перечисленных условий не доминирует, классификатор возвращает переходное состояние. Переходное состояние отражает смешанное или промежуточное поведение и рассматривается как полноценное описательное состояние, а не как ошибка или признак неопределенности.
Слой визуализации на графике

После завершения классификации советник отображает этот контекст на графике с помощью набора опциональных визуальных элементов. Эти визуальные элементы вызываются последовательно в обработчике OnTick() после полного закрытия новой свечи. Такой подход делает логику выполнения более прозрачной и не вводит лишних уровней абстракции, не нужных для анализа.
Каждый визуальный модуль управляется соответствующим входным флагом, что позволяет включать и отключать отдельные компоненты без влияния на базовую логику классификации.
- Точки свинга отмечают найденные максимумы и минимумы свинга.
- Метки активной структуры показывают соотношения HH/HL или LH/LL для последних свингов.
- Области сжатия показывают ценовой диапазон, занимаемый недавним окном сжатия.
- Блоки истории состояний создают ненавязчивый фон, отражающий историю смены состояний.
- Информационная панель с вертикальной компоновкой сводит показатели состояния, структуры и волатильности в удобочитаемом вертикальном формате.
// Chart visualization executed after state update
DrawSwingDots();
DrawActiveLabels();
DrawCompressionBox();
DrawInfoLines(); Все визуальные компоненты управляются через входные параметры и могут отключаться по отдельности.
Жизненный цикл и очистка
При инициализации советник удаляет все ранее созданные объекты с помощью процедуры очистки по префиксу. Такая же очистка выполняется и при деинициализации, чтобы после перекомпиляции или удаления не оставались лишние метки и прямоугольники.
void DeleteByPrefix(string prefix) { for(int i = ObjectsTotal(0) - 1; i >= 0; i--) { string name = ObjectName(0, i); if(StringFind(name, prefix) == 0) ObjectDelete(0, name); } }
Особенности реализации для устойчивой работы
Наконец, несколько решений в реализации дополнительно повышают стабильность и воспроизводимость:
- все расчеты опираются на стандартные функции ценовых рядов;
- вся логика опирается исключительно на полностью закрытые свечи;
- никакие ордера, алерты и торговые команды не формируются;
- советник работает как описательный аналитический слой в составе более широкого инструментария Price Action.
Тестирование
Тестирование было сосредоточено на достижении корректной работы, а не на метриках производительности. Работу советника оценивали в Тестере стратегий, чтобы подтвердить алгоритмическое поведение на исторических данных, а затем наблюдали на графиках в реальном времени, чтобы проверить визуальную стабильность во время формирования свечей. Особое внимание уделялось тому, чтобы метки состояний, фоновые области и информационный текст обновлялись только после закрытия свечи, сохраняя одинаковое поведение в исторических и текущих условиях. Классификатор состояния рынка оценивали как в Тестере стратегий MetaTrader (визуальный режим), так и при наблюдении за графиком в реальном времени. Тестирование было сосредоточено на корректности работы, гарантиях отсутствия перерисовки и визуальной согласованности. Цель состояла в том, чтобы подтвердить системную работу советника и стабильное отображение контекстной информации как на исторических данных, так и в условиях реального времени.
Визуализация в Тестере стратегий
В режиме визуализации Тестера стратегий советник проходил по историческим данным свеча за свечой. Метки состояния рынка, структурные метки, области сжатия и метрики волатильности обновлялись только после полного закрытия каждой свечи, что подтверждало: вся логика опирается только на завершенные бары.
Смены состояний происходили в одни и те же моменты времени при повторных запусках теста. Зоны сжатия совпадали с периодами пониженной волатильности, состояния расширения появлялись только при наличии аномальных диапазонов и уверенных закрытий, а переходные состояния заполняли промежуточные условия без ретроспективных изменений. Точки свинга и метки структуры (HH, HL, LH, LL) наносились только при наличии достаточного подтверждения и после появления оставались неизменными.

Визуализация в Тестере стратегий – XAUUSD H1
Это поведение подтверждает, что оба режима используют одну и ту же логику оценки, а это принципиально важно.
Поведение на графике в реальном времени
При работе на графиках в реальном времени советник вел себя идентично. Вертикальная информационная панель обновлялась один раз после закрытия каждой свечи и без мерцания или последующих изменений отражала текущее состояние рынка, структурную направленность и показатели волатильности. Области сжатия расширялись и сжимались в реальном времени по мере изменения условий волатильности, а блоки истории состояний создавали ненавязчивый фоновый журнал предыдущих классификаций.

График в реальном времени – EURUSD M5
Метки структуры свинга корректировались только при формировании новых подтвержденных свингов, а ранее нанесенная структура ретроспективно не изменялась. На разных инструментах и таймфреймах классификатор сохранял четкое разделение между состоянием волатильности, структурным состоянием и визуальным представлением.
Результаты проверки
В обеих средах тестирования последовательно наблюдались следующие характеристики:
- классификация состояния рынка основана на правилах и не перерисовывается;
- визуальные элементы после отрисовки остаются стабильными;
- поведение на исторических данных и в реальном времени идентично;
- торговая логика отсутствует.
Эти результаты подтверждают, что классификатор состояния рынка работает так, как задумано. Это делает модуль подходящим для интеграции в более широкий процесс анализа Price Action, где понимание состояния рынка требуется до применения дискреционных или систематических стратегий.
Заключение
В этой статье были представлены архитектура и реализация модуля классификации состояния рынка на языке MQL5, входящего в инструментарий для анализа Price Action. Цель состояла в том, чтобы предложить систему для описания текущего поведения цены. Объединяя анализ относительной волатильности, структурную оценку свингов и иерархическую модель классификации, советник различает состояния сжатия, перехода, расширения и тренда без опоры на индикаторы, оптимизацию или торговую логику.
Получившийся инструмент работает как контекстный слой и помогает понять, остается ли цена сжатой, находится ли она в переходном состоянии или уже в свободном расширении, а также присутствует ли направленная структура. Такое отделение состояния от направления укрепляет дисциплину анализа и помогает избежать неверной интерпретации Price Action, когда условия не согласованы. Как и другие компоненты инструментария, этот модуль намеренно носит описательный характер. Его ценность состоит в том, что он повышает понимание текущей рыночной ситуации и дает стабильную аналитическую основу, поверх которой дискреционные или систематические решения можно применять отдельно.
Перевод с английского произведен MetaQuotes Ltd.
Оригинальная статья: https://www.mql5.com/en/articles/20996
Предупреждение: все права на данные материалы принадлежат MetaQuotes Ltd. Полная или частичная перепечатка запрещена.
Данная статья написана пользователем сайта и отражает его личную точку зрения. Компания MetaQuotes Ltd не несет ответственности за достоверность представленной информации, а также за возможные последствия использования описанных решений, стратегий или рекомендаций.
Нейросети в трейдинге: Принятие торговых решений с учётом неопределённости (Модули прогнозирования и планирования)
Переосмысливаем классические стратегии (Часть 18): Алгоритмический поиск свечных паттернов
Алгоритм оптимизации кита-белухи — Beluga Whale Optimization (BWO)
Разработка динамического мультивалютного советника (Часть 7): Карта межпарных корреляций для фильтрации сделок в реальном времени
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования