
Подробная информация о торговле на основе объема: Выход за рамки графиков OHLC
Введение
В области технического анализа трейдеры исторически полагались на колебания цен в качестве основного показателя рыночной активности. В этой работе представлена уникальная методология, сочетающая продвинутый математический анализ объема с методами машинного обучения, с акцентом на то, как паттерны объема могут обеспечить более глубокое понимание динамики рынка. Мы предлагаем сложную систему, которая превосходит традиционные методы технического анализа, объединяя нейронные сети 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; } } }
Эта функция отслеживания прибыли:
- Определяет текущий торговый день
- Рассчитывает реализованную прибыль от закрытых сделок
- Добавляет нереализованную прибыль от открытых позиций
- Поддерживает ежедневное отслеживание прибыли по множеству сделок
- Помогает соблюдать ежедневные лимиты убытка
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; }
Функция трейлинг-стопа:
- Перебирает все открытые позиции
- Рассчитывает прибыль в пунктах для каждой позиции
- Обновляет уровни стоп-лосса в зависимости от прибыли
- Реализован механизм трейлинга для фиксации прибыли
- Обрабатывает позиции на покупку и продажу по-разному
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 выявлять сложные паттерны в последовательности объемов, что помогает определить, сохранятся ли наблюдаемые тенденции в объеме.
Основная торговая логика:
- Проверяет формирование новых баров
- Проверяет ежедневные лимиты убытка
- Обновляет информацию по сделке
- Выполняет анализ объема
- Генерирует прогнозы LSTM, если они включены
- Принимает торговые решения на основе множества факторов
- Открывает позиции при совпадении условий
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 } } }
Расчеты технических индикаторов:
- Настройка буферов данных для значений индикаторов
- Копирование данных индикаторов из хэндлов
- Обновление локальных массивов новыми значениями
- Ведение данных индикаторов для принятия решений
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-минутный таймфрейм.
Большая оптимизация может привести к получению лучших результатов в больших парах, а нехватка времени не способствует расширению настоящей статьи. Настоятельно рекомендую провести большую оптимизацию для каждой пары и надеюсь, что некоторые пользователи добавят комментарии с новыми возможными настройками в комментариях.
Передовые методы
Подтверждение тренда
Высокий объем продаж во время роста цен указывает на сильную поддержку рынка и вероятное продолжение тренда. И наоборот, большой объем продаж во время снижения цен отражает сильное давление со стороны продавцов и подтверждает негативную тенденцию. Низкий объем во время движения цены предупреждает о слабых или неустойчивых тенденциях, часто сигнализируя о ложных пробоях или манипуляциях.
Подтверждение пробоя
Пробои на больших объемах подтверждают уверенность рынка, что приводит к устойчивым изменениям цен. Пробои на малых объемах часто приводят к ложным сигналам, таким как "бычьи ловушки" или "медвежьи ловушки", и, скорее всего, не срабатывают. Резкие скачки объема во время пробоев убедительно подтверждают это движение и указывают на надежную поддержку рынка.
Дивергенция объемов
Дивергенция объемов, при которой тренды цены и объема отличаются друг от друга, сигнализирует о потенциальных разворотах или слабости трендов. Падающий объем при росте цен указывает на ослабление восходящего тренда, в то время как падение объема при снижении цен предполагает снижение давления со стороны продавцов и возможное достижение дна рынка. В сочетании с другими индикаторами, эти паттерны могут помочь определить поворотные моменты.
Заключение
Объединяя современные методы машинного обучения с традиционным анализом объемов, основанный на объемах Торговый советник предлагает современный метод алгоритмической торговли. Система демонстрирует эффективный подход к исследованию рынка и совершению сделок, используя нейронные сети 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
Предупреждение: все права на данные материалы принадлежат MetaQuotes Ltd. Полная или частичная перепечатка запрещена.
Данная статья написана пользователем сайта и отражает его личную точку зрения. Компания MetaQuotes Ltd не несет ответственности за достоверность представленной информации, а также за возможные последствия использования описанных решений, стратегий или рекомендаций.





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