English 中文 Español Deutsch 日本語
preview
Подробная информация о торговле на основе объема: Выход за рамки графиков OHLC

Подробная информация о торговле на основе объема: Выход за рамки графиков OHLC

MetaTrader 5Примеры |
404 3
Javier Santiago Gaston De Iriarte Cabrera
Javier Santiago Gaston De Iriarte Cabrera

Введение

В области технического анализа трейдеры исторически полагались на колебания цен в качестве основного показателя рыночной активности. В этой работе представлена уникальная методология, сочетающая продвинутый математический анализ объема с методами машинного обучения, с акцентом на то, как паттерны объема могут обеспечить более глубокое понимание динамики рынка. Мы предлагаем сложную систему, которая превосходит традиционные методы технического анализа, объединяя нейронные сети LSTM с производными от объема, основанными на математическом анализе.

Статья разбита на три основных раздела: в первом обсуждается фундаментальная важность анализа объема и его математические основы; во втором рассматривается практическое применение производных от объема и прогнозов LSTM для определения рыночных возможностей; а в третьем объясняется, как анализ расхождения объемов, подтверждение тренда и проверка пробоя могут быть использованы для повышения эффективности торговых решений.


Понимание основной функции объёма

Общее количество акций или контрактов, торгуемых за определенный период времени, называется объемом и является важнейшим показателем активности рынка и ликвидности. В то время как цена показывает направление движения рынка, объем показывает уверенность, стоящую за движением рынка, подчеркивая лежащую в основе силу и долговечность трендов. Это движущая сила, стоящая за движением цен, и она способна поддерживать или противоречить изменениям цен, поскольку значительные изменения цен при большом объеме часто указывают на более высокий уровень доверия рынка, чем при небольшом объеме. Кроме того, паттерны объёма часто предсказывают изменения цен, что делает их ценными ориентирами для трейдеров, понимающих, как их использовать в сочетании с поведением цены и рыночным контекстом.


Почему объем имеет значение

Простой пример:

Критическая важность анализа объема может быть продемонстрирована с помощью сложного математического метода, который выходит за рамки стандартного анализа, предоставляя трейдерам более продвинутую основу для понимания динамики рынка, чем это возможно с помощью только конвенциональных индикаторов. Сосредоточившись только на динамике объемов, независимо от данных OHLC, мы можем получить важную информацию о рынке с помощью математического анализа и машинного обучения, уделяя особое внимание производным от объема и нейронным сетям LSTM. Этот новый метод использует сложные математические идеи для выявления незначительных изменений в торговле и участии на рынке, давая ранние предупреждения о возможных изменениях на рынке до того, как они проявятся в ценовом движении.

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

В этом методе рассматриваются три важные составляющие объема: первая производная (скорость изменения объема), вторая производная (ускорение изменения объема) и прогнозы LSTM на будущий объем, которые подтверждают те же производные объема. Устраняя ценовой шум, этот подход фокусируется исключительно на динамике участия на рынке. 

Советник начинается со стандартных объявлений MetaTrader. Он включает в себя торговую библиотеку для управления ордерами и пользовательскую библиотеку Volume_LSTM для прогнозирования. Свойство indicator_separate_window указывает, что это будет отображаться в отдельном окне, и выделяет три индикаторных буфера для визуализации.
#property copyright "Your Name"
#property version   "1.00"
#property strict
#property indicator_separate_window
#property indicator_buffers 3
#include <Trade\Trade.mqh>
#include <Volume_LSTM.mqh>
CTrade trade;

Параметры организованы в логические группы. Раздел конфигурации LSTM управляет поведением нейронной сети, в то время как параметры входа управляют торговыми правилами. Каждый параметр имеет определенное назначение: параметры LSTM управляют сложностью модели прогнозирования и объемом памяти. Торговые параметры определяют размер позиции и целевые показатели прибыли, а параметры управления рисками устанавливают лимиты убытков и трейлинг-стопы.

input group "Configuración LSTM"
input bool     UseLSTM = true;              
input int      LSTMHiddenSize = 32;         
input int      LSTMLookback = 10;           

input group "Entry Parameters"
input double   Lots = 0.1;         
input double   TPPoints = 100;      
input int      Periods = 4;         
input int      AccelBars = 4;       
input int      MaxBarsInTrade = 2; 
input double   ProfitClose = 15;    
input double   MaxDailyLoss = -25; 
input double   TrailingStart = 5;  
input double   TrailingStep = 5;

Эта функция вычисляет скорость изменения объема (первая производная) и ускорение изменения объема (вторая производная). Он изменяет существующие производные для сохранения истории, вычисляет новую первую производную как разницу между текущим и предыдущим объемом, вычисляет новую вторую производную как изменение в первых производных и предоставляет информацию о динамике и ускорении объема.

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

void CalculateDerivatives() {
    for(int i = 0; i < ArraySize(volumes)-1; i++) {
        firstDerivative[i] = firstDerivative[i+1];
        secondDerivative[i] = secondDerivative[i+1];
    }

    firstDerivative[ArraySize(volumes)-1] = volumes[ArraySize(volumes)-1] - volumes[ArraySize(volumes)-2];
    secondDerivative[ArraySize(volumes)-1] = firstDerivative[ArraySize(volumes)-1] - firstDerivative[ArraySize(volumes)-2];
}

Эти функции управляют жизненным циклом торговли, TrackNewTrade фиксирует новые позиции в первый доступный слот,  RemoveTrade очищает запись при закрытии позиций. Обе функции поддерживают целостность системы отслеживания сделок.

void TrackNewTrade(ulong ticket) {
    for(int i = 0; i < ArraySize(openTrades); i++) {
        if(openTrades[i].ticket == 0) {
            openTrades[i].ticket = ticket;
            openTrades[i].openTime = TimeCurrent();
            openTrades[i].barsOpen = 0;
            break;
        }
    }
}

void RemoveTrade(ulong ticket) {
    for(int i = 0; i < ArraySize(openTrades); i++) {
        if(openTrades[i].ticket == ticket) {
            openTrades[i].ticket = 0;
            openTrades[i].openTime = 0;
            openTrades[i].barsOpen = 0;
            break;
        }
    }
}

Эта функция отслеживания прибыли:

  1. Определяет текущий торговый день
  2. Рассчитывает реализованную прибыль от закрытых сделок
  3. Добавляет нереализованную прибыль от открытых позиций
  4. Поддерживает ежедневное отслеживание прибыли по множеству сделок
  5. Помогает соблюдать ежедневные лимиты убытка
double GetDailyProfit() {
    datetime today = StringToTime(TimeToString(TimeCurrent(), TIME_DATE));

    if(lastDayChecked != today) {
        lastDayChecked = today;
        dailyProfit = 0;

        HistorySelect(today, TimeCurrent());
        int deals = HistoryDealsTotal();

        for(int i = 0; i < deals; i++) {
            ulong ticket = HistoryDealGetTicket(i);
            if(ticket > 0) {
                if(HistoryDealGetString(ticket, DEAL_SYMBOL) == _Symbol)
                    dailyProfit += HistoryDealGetDouble(ticket, DEAL_PROFIT);
            }
        }
    }
    
    // Add floating P/L
    double floatingProfit = 0;
    for(int i = PositionsTotal() - 1; i >= 0; i--) {
        ulong ticket = PositionGetTicket(i);
        if(ticket > 0 && PositionSelectByTicket(ticket)) {
            if(PositionGetString(POSITION_SYMBOL) == _Symbol)
                floatingProfit += PositionGetDouble(POSITION_PROFIT);
        }
    }

    return dailyProfit + floatingProfit;
}

Функция трейлинг-стопа:

  1. Перебирает все открытые позиции
  2. Рассчитывает прибыль в пунктах для каждой позиции
  3. Обновляет уровни стоп-лосса в зависимости от прибыли
  4. Реализован механизм трейлинга для фиксации прибыли
  5. Обрабатывает позиции на покупку и продажу по-разному
void ApplyTrailingStop(double point) {
    for(int i = PositionsTotal() - 1; i >= 0; i--) {
        ulong ticket = PositionGetTicket(i);
        if(ticket <= 0) continue;

        if(PositionSelectByTicket(ticket)) {
            double openPrice = PositionGetDouble(POSITION_PRICE_OPEN);
            double currentPrice = PositionGetDouble(POSITION_PRICE_CURRENT);
            double currentSL = PositionGetDouble(POSITION_SL);
            long posType = PositionGetInteger(POSITION_TYPE);

            // Calculate and update trailing stop
            double profitPoints;
            if(posType == POSITION_TYPE_BUY) {
                profitPoints = (currentPrice - openPrice) / point;
                if(profitPoints >= TrailingStart) {
                    double newSL = openPrice + (profitPoints - TrailingStep) * point;
                    if(currentSL < newSL || currentSL == 0) {
                        trade.PositionModify(ticket, newSL, PositionGetDouble(POSITION_TP));
                    }
                }
            }
            // Similar logic for SELL positions
        }
    }
}

Показывая ускорение или замедление торговой активности, вторая производная объема предоставляет еще более подробную информацию. Положительное значение для этого второго производного является убедительным свидетельством растущей динамики рынка, поскольку показывает, что объем растет, причем ускоряющимися темпами. Поскольку это указывает на быстро растущий интерес участников рынка, такое увеличение объема часто происходит перед заметными изменениями на рынке. Мы предоставляем надежную основу для прогнозирования поведения рынка, объединяя эти производные с прогнозами будущих объемов с помощью нейронной сети LSTM. Наше исследование получило дополнительный уровень подтверждения благодаря способности LSTM выявлять сложные паттерны в последовательности объемов, что помогает определить, сохранятся ли наблюдаемые тенденции в объеме.

Основная торговая логика:

  1. Проверяет формирование новых баров
  2. Проверяет ежедневные лимиты убытка
  3. Обновляет информацию по сделке
  4. Выполняет анализ объема
  5. Генерирует прогнозы LSTM, если они включены
  6. Принимает торговые решения на основе множества факторов
  7. Открывает позиции при совпадении условий
void OnTick() {
    static datetime lastBar = 0;
    datetime currentBar = iTime(_Symbol, PERIOD_CURRENT, 0);

    if(lastBar == currentBar) return;
    lastBar = currentBar;

    if(GetDailyProfit() < MaxDailyLoss) {
        CloseAllPositions();
        return;
    }

    // Update and calculate
    UpdateTradesInfo();
    CheckTimeBasedClose();
    
    if(!CanTrade()) return;

    // Volume analysis and LSTM prediction
    // ... volume calculations ...
    
    if(UseLSTM && volumePredictor != NULL) {
        // LSTM prediction logic
        // ... prediction calculations ...
    }

    CalculateDerivatives();
    
    // Trading decisions based on calculations
    if(consecutiveAccel >= AccelBars) {
        if((!UseADX && !UseOBV) || ConfirmLongSignal()) {
            // Open buy position
        }
    }
    else if(consecutiveAccel <= -AccelBars) {
        if(!UseADX && !UseOBV || ConfirmShortSignal()) {
            // Open sell position
        }
    }
}

Расчеты технических индикаторов:

  1. Настройка буферов данных для значений индикаторов
  2. Копирование данных индикаторов из хэндлов
  3. Обновление локальных массивов новыми значениями
  4. Ведение данных индикаторов для принятия решений
void CalculateADX() {
    if(!UseADX) return;

    double adx_buffer[];
    double plusdi_buffer[];
    double minusdi_buffer[];
    ArraySetAsSeries(adx_buffer, true);
    ArraySetAsSeries(plusdi_buffer, true);
    ArraySetAsSeries(minusdi_buffer, true);

    CopyBuffer(adx_handle, MAIN_LINE, 0, ArraySize(adx_main), adx_buffer);
    CopyBuffer(adx_handle, PLUSDI_LINE, 0, ArraySize(adx_plus), plusdi_buffer);
    CopyBuffer(adx_handle, MINUSDI_LINE, 0, ArraySize(adx_minus), minusdi_buffer);

    ArrayCopy(adx_main, adx_buffer);
    ArrayCopy(adx_plus, plusdi_buffer);
    ArrayCopy(adx_minus, minusdi_buffer);
}

Каждый компонент работает совместно, создавая комплексную торговую систему, которая сочетает в себе анализ объемов, прогнозы LSTM и традиционные технические индикаторы, сохраняя при этом надежные методы управления рисками.

Файл Volume_LSTM.mqh реализует нейронную сеть с долгой кратковременной памятью (LSTM), специально разработанную для прогнозирования объемов торгов.

Код начинается с фундаментальной Matrix2D структуры, обрабатывающей 2D-матричные операции:

struct Matrix2D {
    double values[];
    int rows;
    int cols;
    
    void Init(int r, int c) {
        rows = r;
        cols = c;
        ArrayResize(values, rows * cols);
        ArrayInitialize(values, 0);
    }
    // ... other methods
}

Ячейка LSTM реализована как комплексная структура:

struct LSTMCell {
    double forget_gate[];
    double input_gate[];
    double cell_state[];
    double output_gate[];
    double hidden_state[];
    
    Matrix2D Wf;  // Forget gate weights
    Matrix2D Wi;  // Input gate weights
    Matrix2D Wc;  // Cell state weights
    Matrix2D Wo;  // Output gate weights
    
    double bf[];  // Forget gate bias
    double bi[];  // Input gate bias
    double bc[];  // Cell state bias
    double bo[];  // Output gate bias
    
    int hidden_size;
    int input_size;
};

Реализация включает в себя стандартные функции активации нейронной сети:

double Sigmoid(double x) {
    return 1.0 / (1.0 + MathExp(-x));
}

double Tanh(double x) {
    return (MathExp(x) - MathExp(-x)) / (MathExp(x) + MathExp(-x));
}

Веса инициализируются с использованием варианта инициализации Xavier/Glorot:

void InitializeWeights() {
    double scale = MathSqrt(2.0 / (lstm.input_size + lstm.hidden_size));
    
    // Initialize weight matrices
    lstm.Wf.Init(lstm.hidden_size, lstm.input_size);
    lstm.Wi.Init(lstm.hidden_size, lstm.input_size);
    // ... other initializations

    // Random initialization with scaling
    for(int i = 0; i < lstm.hidden_size; i++) {
        for(int j = 0; j < lstm.input_size; j++) {
            lstm.Wf.Set(i, j, (MathRand() / 32768.0 - 0.5) * scale);
            // ... other weight initializations
        }
    }
}

Реализация включает в себя нормализацию данных:

void NormalizeVolumes() {
    volume_mean = 0;
    double sum_squared = 0;
    
    // Calculate mean
    for(int i = 0; i < ArraySize(historical_volumes); i++) {
        volume_mean += historical_volumes[i];
    }
    volume_mean /= ArraySize(historical_volumes);
    
    // Calculate standard deviation
    for(int i = 0; i < ArraySize(historical_volumes); i++) {
        sum_squared += MathPow(historical_volumes[i] - volume_mean, 2);
    }
    volume_std = MathSqrt(sum_squared / ArraySize(historical_volumes));
    
    // Normalize volumes
    if(volume_std == 0) volume_std = 1;  // Prevent division by zero
    for(int i = 0; i < ArraySize(historical_volumes); i++) {
        historical_volumes[i] = (historical_volumes[i] - volume_mean) / volume_std;
    }
}

Основная логика прогнозирования:

double PredictNextVolume() {
    if(!is_initialized) return 0;
    
    double input1 = historical_volumes[ArraySize(historical_volumes)-1];
    
    // LSTM forward pass
    for(int h = 0; h < lstm.hidden_size; h++) {
        double ft = 0, it = 0, ct = 0, ot = 0;
        
        // Calculate gates
        for(int i = 0; i < lstm.input_size; i++) {
            ft += lstm.Wf.Get(h, i) * input1;
            it += lstm.Wi.Get(h, i) * input1;
            ct += lstm.Wc.Get(h, i) * input1;
            ot += lstm.Wo.Get(h, i) * input1;
        }
        
        // Apply gates and calculate states
        lstm.forget_gate[h] = Sigmoid(ft + lstm.bf[h]);
        lstm.input_gate[h] = Sigmoid(it + lstm.bi[h]);
        double c_tilde = Tanh(ct + lstm.bc[h]);
        lstm.cell_state[h] = lstm.forget_gate[h] * lstm.cell_state[h] + 
                            lstm.input_gate[h] * c_tilde;
        lstm.output_gate[h] = Sigmoid(ot + lstm.bo[h]);
        lstm.hidden_state[h] = lstm.output_gate[h] * Tanh(lstm.cell_state[h]);
    }
    
    // Calculate final prediction
    double prediction = 0;
    for(int h = 0; h < lstm.hidden_size; h++)
        prediction += lstm.hidden_state[h];
    prediction /= lstm.hidden_size;
    
    return prediction * volume_std + volume_mean;  // Denormalize
}


Результаты

EURUSD, это результаты для пары EURUSD за 30-минутные периоды времени. Ниже показаны параметры  Setting_eurusd.set

Настройки

График

Тестирование на истории

GBPUSD за 30-минутный таймфрейм.

GBPUSD settings.set

График

Тестирование на истории

Большая оптимизация может привести к получению лучших результатов в больших парах, а нехватка времени не способствует расширению настоящей статьи. Настоятельно рекомендую провести большую оптимизацию для каждой пары и надеюсь, что некоторые пользователи добавят комментарии с новыми возможными настройками в комментариях.


Передовые методы

Подтверждение тренда

Высокий объем продаж во время роста цен указывает на сильную поддержку рынка и вероятное продолжение тренда. И наоборот, большой объем продаж во время снижения цен отражает сильное давление со стороны продавцов и подтверждает негативную тенденцию. Низкий объем во время движения цены предупреждает о слабых или неустойчивых тенденциях, часто сигнализируя о ложных пробоях или манипуляциях.

Подтверждение пробоя

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

Дивергенция объемов

Дивергенция объемов, при которой тренды цены и объема отличаются друг от друга, сигнализирует о потенциальных разворотах или слабости трендов. Падающий объем при росте цен указывает на ослабление восходящего тренда, в то время как падение объема при снижении цен предполагает снижение давления со стороны продавцов и возможное достижение дна рынка. В сочетании с другими индикаторами, эти паттерны могут помочь определить поворотные моменты.


Заключение

Объединяя современные методы машинного обучения с традиционным анализом объемов, основанный на объемах Торговый советник предлагает современный метод алгоритмической торговли. Система демонстрирует эффективный подход к исследованию рынка и совершению сделок, используя нейронные сети LSTM для прогнозирования объемов в дополнение к традиционным техническим индикаторам, таким как ADX и OBV.

Многоуровневый подход советника к управлению рисками, включающий в себя строгие ежедневные лимиты убытков, динамические трейлинг-стопы и тщательное отслеживание позиций, является его сильной стороной. Такой акцент на управлении рисками, наряду с регулируемыми параметрами входа и гибким управлением сессиями, дает трейдерам гибкий инструмент, который может адаптироваться к различным рыночным ситуациям, соблюдая при этом дисциплинированные торговые процедуры.

Наиболее важным является то, что специальная гибридная система создается путем объединения анализа производных объема с прогнозами LSTM. Благодаря такой комбинации советник может распознавать изменения на рынке до того, как они полностью материализуются, а проверка обычных индикаторов помогает сократить количество ложных сигналов. Модульная структура кода также делает возможными будущие улучшения и упрощение обслуживания.

Однако пользователи должны знать, что из-за сложности системы перед реальным развертыванием необходимо провести тщательное бэк-тестирование и настройку параметров. Несмотря на свою мощь, компонент LSTM требует больших вычислительных мощностей и соответствующих обучающих данных. Несмотря на эти вопросы советник является полезным инструментом для трейдеров, которые хотят автоматизировать свои основанные на объемах методы торговли благодаря их приверженности сочетанию передовых технологий с проверенными концепциями торговли.

Я надеюсь, что эта статья будет полезна для рассмотрения использования OHLCV, а не только цен.


Название файла Описание
MQL5/Profiles/Tester/Setting_eurusd.set Настройка входных данных, на примере валютной пары EURUSD
MQL5/Profiles/Tester/GBPUSD_settings.set
Настройка входных данных, на примере валютной пары GBPUSD
MQL5/Experts/Volume_high_low_difference_LSTM.mq5 Советник для использования на примерах
MQL5/Include/Volume_LSTM.mqh Включите mqh-файл. Не забудьте изменить путь в советнике, указав место хранения


Перевод с английского произведен MetaQuotes Ltd.
Оригинальная статья: https://www.mql5.com/en/articles/16445

Прикрепленные файлы |
Volume_LSTM.mqh (14.91 KB)
Setting_eurusd.set (3.28 KB)
Последние комментарии | Перейти к обсуждению на форуме трейдеров (3)
Taiwo Kolawole
Taiwo Kolawole | 25 нояб. 2024 в 19:54
Вы просто гений. Я искал подход такого уровня анализа с объемами. Не рассматривали ли вы возможность использования индикаторов зигзага для направления цены и немного индикаторов спроса и зоны дисконта? Попробую сделать это, если позволит время.
Javier Santiago Gaston De Iriarte Cabrera
Javier Santiago Gaston De Iriarte Cabrera | 27 нояб. 2024 в 10:47
TaiKingFX индикаторов зигзага для направления цены и немного индикаторов спроса и зоны дисконта? Попробую сделать это, если позволит время.

Привет, спасибо! Не очень уверен в гене... но нашел это интересным. Я сделаю статью с индикатором зигзаг и объемами. Я также буду продолжать с другими стратегиями с использованием объемов. Переезд страны и потребуется некоторое время, чтобы работать больше.

Javier Santiago Gaston De Iriarte Cabrera
Javier Santiago Gaston De Iriarte Cabrera | 17 дек. 2024 в 18:56
TaiKingFX индикаторов зигзага для направления цены и немного индикаторов спроса и зоны дисконта? Попробую сделать это, если позволит время.

Привет, я потратил несколько дней на изучение объема и ZigZag, и получил только безубыточные результаты ... Возможно, в будущем я потрачу больше времени на их изучение, но сейчас я не чувствую, что этого достаточно для написания статьи. Пожалуйста, попробуйте сами и поправьте меня, если это хороший косяк ;) (что я нашел интересным, так это ADX с ZigZag ... Я могу написать статью с этим... только начал...) ... Я обещаю, что в будущем я снова проверю объем с ZigZag.

Автоматизация торговых стратегий с помощью MQL5 (Часть 1): Система Profitunity (Торговый хаос Билла Вильямса) Автоматизация торговых стратегий с помощью MQL5 (Часть 1): Система Profitunity (Торговый хаос Билла Вильямса)
В данной статье мы исследуем систему Profitunity авторства Билла Вильямса, подробно разобрав ее ключевые составляющие и уникальный подход к торговле в хаотичных условиях рынка. Мы продемонстрируем читателям реализацию системы на языке программирования MQL5, делая акцент на автоматизации ключевых индикаторов и сигналов для входа/выхода. Наконец, мы протестируем и оптимизируем стратегию, детально анализируя ее эффективность в различных рыночных сценариях.
Взаимная информация как критерий для поэтапного отбора признаков Взаимная информация как критерий для поэтапного отбора признаков
В настоящей статье мы представляем реализацию поэтапного отбора признаков на MQL5, основанную на взаимной информации между оптимальным набором предикторов и целевой переменной.
Эволюционная стратегия адаптации ковариационной матрицы — Covariance Matrix Adaptation Evolution Strategy (CMA-ES) Эволюционная стратегия адаптации ковариационной матрицы — Covariance Matrix Adaptation Evolution Strategy (CMA-ES)
Исследуем один из самых интересных алгоритмов без градиентной оптимизации, который учится понимать геометрию целевой функции. Рассмотрим классическую реализацию CMA-ES с небольшой модификацией — заменой нормального распределения на степенное. Детальный разбор математики алгоритма, практическая реализация и честный анализ: где CMA-ES непобедим, а где его лучше не применять.
Трейдинг с экономическим календарем MQL5 (Часть 2): Создание новостной панели Трейдинг с экономическим календарем MQL5 (Часть 2): Создание новостной панели
В этой статье мы создадим практичную новостную панель с использованием экономического календаря MQL5 для улучшения нашей торговой стратегии. Начнем с проектирования макета, уделив особое внимание ключевым элементам, таким как названия событий, важность и время, а затем перейдем к настройке в MQL5. Наконец, мы внедрим систему сортировки для отображения только самых актуальных новостей, предоставляя трейдерам быстрый доступ к важным экономическим событиям.