English 中文 Español Deutsch 日本語 Português
preview
Разработка инструментария для анализа движения цен (Часть 10): Внешние библиотеки (II) VWAP

Разработка инструментария для анализа движения цен (Часть 10): Внешние библиотеки (II) VWAP

MetaTrader 5Торговые системы |
475 4
Christian Benjamin
Christian Benjamin

Введение

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

В этой статье представлен мощный инструмент, созданный на основе концепции средневзвешенной по объему цены (Volume Weighted Average Price, VWAP) для предоставления точных торговых сигналов. Использование расширенных библиотек Python для вычислений повышает точность анализа, что приводит к получению высокоэффективных сигналов VWAP. Начнем с изучения стратегии, затем углубимся в основную логику кода MQL5 и обсудим результаты.


Стратегия

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

VWAP = ∑(количество торгуемых активов × цена актива) / общий объем торгов в определенный день

Формула VWAP

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

Стратегия VWAP

Рис 1. Стратегия VWAP

Давайте рассмотрим логику этой системы. Сначала мы рассмотрим идеи, представленные на диаграмме ниже, а затем дадим им подробное объяснение.

Логика советника

Рис 2. Логика системы

Советник VWAP предназначен для мониторинга графиков и бесперебойного взаимодействия с Python для продвинутого анализа рынка. Он отправляет рыночные данные в Python и регистрирует полученные торговые сигналы на вкладке "Эксперты" MetaTrader 5. В качестве основного индикатора стратегия использует средневзвешенную по объему цену (VWAP) для предоставления точной и применимой на практике аналитики. Ниже приведено подробное описание стратегии:

1. Сбор данных

Советник собирает исторические рыночные данные (цену и объем) за последние 150 свечей. Он гарантирует достоверность данных (например, отсутствие пропущенных или нулевых значений). Данные сохраняются в виде CSV-файла для отслеживания и отправляются на сервер Python для анализа.

2. Анализ Python

Скрипт Python рассчитывает VWAP, используя полученные данные, и использует расширенные библиотеки для точных вычислений. Основные вычисления и анализ выполняются двумя библиотеками: Pandas и NumPy. Pandas облегчает обработку данных, скользящие средние значения и кумулятивные вычисления, в то время как NumPy управляет числовыми операциями, включая условную логику и векторизованные вычисления. Вместе они обеспечивают эффективную и точную обработку для анализа временных рядов данных.

Анализ включает в себя:

  • Расчет VWAP: определяет среднюю цену, взвешенную по объему, за выбранный период времени.
  • Генерация сигналов: предоставляет торговые сигналы (например, покупка/продажа) на основе взаимосвязи между текущей ценой и уровнями VWAP.
  • Пояснения: каждый сигнал включает текстовое пояснение, объясняющее причину его возникновения.

3. Подтверждение сигнала

Советник вводит механизм подтверждения:

Сигналы обновляются только в том случае, если они появляются последовательно в течение нескольких интервалов (например, 2 периода подтверждения).

Это снижает количество ложных срабатываний и повышает надежность сигнала.

4. Вывод и оповещения

Сигналы отображаются как:

  • Оповещения: уведомления в реальном времени для немедленного принятия трейдером мер.
  • Сообщения журнала: выводятся на терминал советника для проверки.

В будущих версиях на графике могут быть добавлены графические аннотации для лучшей визуализации.

Python 
MQL5 
Эффективно обрабатывает большие наборы данных. Отслеживает рынок и интегрируется с графиком в реальном времени
Использует надежные библиотеки для расширенных вычислений и моделирования Предлагает немедленные оповещения и уведомления
Обеспечивает лучшую точность и гибкость стратегий на основе VWAP
Использование VWAP на MQL5 помогает выделить ключевые уровни поддержки и сопротивления рынка. Это позволяет трейдерам принимать решения на основе реакции рынка на VWAP, который часто выступает в качестве сильной точки опоры для движения цен.


Основная логика

1. Советник MQL5 

Инициализация: настройка советника

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

int OnInit()
{
   Print("VWAP Expert initialized.");
   return(INIT_SUCCEEDED);
}

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

Деинициализация: очистка после остановки советника

Деинициализация происходит при удалении советника с графика или при закрытии MetaTrader. Функция OnDeinit() вызывается для очистки любых ресурсов, которые были выделены или инициализированы во время OnInit(). Здесь он просто выводит сообщение о том, что советник находится в процессе деинициализации. Это хорошая практика, позволяющая убедиться, что все ресурсы или процессы, которые мог использовать советник, закрыты должным образом, чтобы предотвратить утечки памяти или запуск ненужных фоновых процессов.

void OnDeinit(const int reason)
{
   Print("VWAP Expert deinitialized.");
}

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

Сбор рыночных данных (свечи)

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

Затем данные форматируются как строка CSV, что крайне важно, поскольку они будут отправлены на сервер Python для дальнейшей обработки. Цикл повторяется в обратном порядке от последней свечи, чтобы гарантировать, что мы захватываем последние рыночные данные, а данные форматируются стандартным образом с использованием StringFormat().

int totalBars = iBars(Symbol(), Period());
if (totalBars < numCandles)
{
   Print("Error: Not enough candles on the chart to collect ", numCandles, " candles.");
   return;
}

for (int i = numCandles - 1; i >= 0; i--)
{
   datetime currentTime = iTime(Symbol(), Period(), i);
   if (currentTime == 0) continue;

   double high = iHigh(Symbol(), Period(), i);
   double low = iLow(Symbol(), Period(), i);
   double close = iClose(Symbol(), Period(), i);
   double open = iOpen(Symbol(), Period(), i);
   long volume = iVolume(Symbol(), Period(), i);

   if (high == 0 || low == 0 || close == 0 || volume == 0)
   {
      Print("Skipping invalid data at ", TimeToString(currentTime, TIME_DATE | TIME_MINUTES));
      continue;
   }

   csvData += StringFormat("%s,%.5f,%.5f,%.5f,%.5f,%ld\n",
                           TimeToString(currentTime, TIME_DATE | TIME_MINUTES),
                           high, low, open, close, volume);
}

iBars():

iBars() извлекает общее количество баров (свечей), доступных на графике для текущего символа и таймфрейма. Советник проверяет, есть ли по крайней мере numCandles доступных баров. В противном случае он выводит сообщение об ошибке и возвращается из функции, предотвращая дальнейший сбор данных.

Цикл for:

Цикл for выполняет итерации в обратном порядке от самого последнего бара (numCandles - 1) к самому старшему бару (0), собирая необходимое количество свечей.

iTime(), iHigh(), iLow(), iOpen(), iClose(), iVolume():

Эти функции извлекают соответствующие данные о цене для каждой свечи. iTime() получает временную метку, iHigh() получает максимальную цену, iLow() получает минимальную цену и т.д.

Проверка данных:

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

Форматирование строки:

StringFormat() используется для форматирования данных свечи в строку CSV. Каждое поле разделяется запятой, а временная метка форматируется в читаемую строку с помощью TimeToString().

Запись данных в CSV-файл

После сбора данных следующим шагом будет их запись в CSV-файл. Это важно, поскольку мы хотим сохранить собранные данные локально перед отправкой их на сервер Python. Функция FileOpen() открывает файл в режиме записи, а FileWriteString() записывает в него отформатированные CSV-данные. После записи данных файл закрывается, чтобы завершить процесс и гарантировать отсутствие потери данных.

Файл CSV сохраняется в каталоге MQL5\\Files — специальном каталоге в MetaTrader, который используется для хранения файлов, к которым платформа имеет доступ. Это гарантирует, что файл можно будет легко восстановить при необходимости.

string fileName = StringFormat("%s_vwap_data.csv", Symbol());
string filePath = "MQL5\\Files\\" + fileName;
int fileHandle = FileOpen(filePath, FILE_WRITE | FILE_CSV | FILE_ANSI);
if (fileHandle != INVALID_HANDLE) {
    FileWriteString(fileHandle, csvData);
    FileClose(fileHandle);
} else {
    Print("Failed to open file for writing: ", filePath);
}

Запись данных в CSV-файл — это способ локального хранения информации для будущего анализа. Использование FILE_CSV обеспечивает сохранение данных в стандартизированном формате, что делает их совместимыми с другими системами, такими как Python. Обработка ошибок здесь гарантирует, что если файл не может быть открыт, советник корректно обработает проблему и выведет сообщение об ошибке.

Отправка данных на сервер Python для анализа VWAP

Теперь собранные данные готовы к отправке на сервер Python для анализа. Это делается с помощью функции WebRequest(), которая позволяет советнику делать HTTP-запросы. Данные CSV преобразуются в массив символов (StringToCharArray()) и отправляются на сервер посредством POST-запроса. Заголовки указывают, что отправляемый контент представляет собой CSV-файл, а ответ сервера сохраняется в массиве результатов.

Параметр тайм-аута установлен на 5000 миллисекунд (5 секунд), что гарантирует, что запрос не будет зависать слишком долго, если сервер не отвечает.

char data[];
StringToCharArray(csvData, data); 

string headers = "Content-Type: text/csv\r\n";
char result[];
string resultHeaders;
int timeout = 5000;

int responseCode = WebRequest("POST", pythonUrl, headers, timeout, data, result, resultHeaders);

HTTP POST здесь используется, потому что это лучший способ отправить данные на сервер без изменения URL. WebRequest() обеспечивает связь с сервером Python, на котором выполняется вся трудоемкая работа (т. е. вычисления VWAP). Тайм-аут гарантирует, что советник не зависнет, если сервер не отвечает, что обеспечивает бесперебойную работу.

Обработка ответа от сервера Python

После отправки данных нам необходимо обработать ответ от сервера Python. Вот тут-то и происходит настоящее волшебство: сервер Python анализирует данные и выдает торговый сигнал на основе VWAP (средневзвешенной по объему цены). Ответ возвращается в формате JSON, и мы используем вспомогательную функцию ExtractValueFromJSON(), чтобы извлечь соответствующие значения (VWAP и пояснение) из ответа.

Если ответ успешный (код HTTP 200), мы анализируем необходимую информацию и продолжаем торговую логику. Если ответ содержит достоверные данные, мы можем приступить к генерации нового сигнала.

// Check if the request was successful
if (responseCode == 200) {
    string response = CharArrayToString(result); // Convert the result array to a string
    Print("Server response: ", response);  // Print the server's response

    // Validate if the required data is present in the response
    if (StringFind(response, "\"vwap\":") == -1 || StringFind(response, "\"signal_explanation\":") == -1) {
        Print("Error: Invalid response from server. Response: ", response);
        return;
    }

    // Extract individual data points from the JSON response
    string vwap = ExtractValueFromJSON(response, "vwap");
    string explanation = ExtractValueFromJSON(response, "signal_explanation");
    string majorSupport = ExtractValueFromJSON(response, "major_support");
    string majorResistance = ExtractValueFromJSON(response, "major_resistance");
    string minorSupport = ExtractValueFromJSON(response, "minor_support");
    string minorResistance = ExtractValueFromJSON(response, "minor_resistance");

    // If valid data is received, update the signal
    if (vwap != "" && explanation != "") {
        string newSignal = "VWAP: " + vwap + "\nExplanation: " + explanation
                           + "\nMajor Support: " + majorSupport + "\nMajor Resistance: " + majorResistance
                           + "\nMinor Support: " + minorSupport + "\nMinor Resistance: " + minorResistance;

        // Confirm the signal and handle the response further
        if (newSignal != lastSignal) {
            signalConfirmationCount++; // Increment confirmation count
        }

        if (signalConfirmationCount >= confirmationInterval) {
            lastSignal = newSignal;  // Set the new signal
            signalConfirmationCount = 0;  // Reset the count
            Print("New VWAP signal: ", newSignal);
            Alert("New VWAP Signal Received:\n" + newSignal); // Alert user of the new signal
        }
    }
} else {
    Print("Error: WebRequest failed with code ", responseCode, ". Response headers: ", resultHeaders);
}

Правильная обработка ответа имеет решающее значение для интерпретации анализа сервера. Функция ExtractValueFromJSON() гарантирует, что мы извлекаем только необходимые нам данные (VWAP и пояснение сигнала) из потенциально большого ответа JSON. Если ответ недействителен или ожидаемые данные не найдены, важно обработать ошибки и избегать реагирования на неверные сигналы.

Подтверждение сигнала и отображение торгового сигнала

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

Как только сигнал подтвержден, мы обновляем переменную lastSignal и отображаем сигнал пользователю через Alert(). Затем советник ждет следующего действительного сигнала, прежде чем снова сработать.

// Confirm the signal multiple times before updating
if (newSignal != lastSignal)
{
    signalConfirmationCount++;  // Increment the confirmation count
}

// Once the signal has been confirmed enough times
if (signalConfirmationCount >= confirmationInterval)
{
    // Update the last signal and reset confirmation count
    lastSignal = newSignal;
    signalConfirmationCount = 0;  // Reset the count after confirmation

    // Display the new signal in the log and via an alert
    Print("New VWAP signal: ", newSignal);  // Print to the log
    Alert("New VWAP Signal Received:\n" + newSignal);  // Display alert to the user
}

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

2. Python

Скрипт предназначен для предварительной обработки данных, расчета VWAP и соответствующих показателей, генерации сигналов и возврата значимой информации в советник для принятия решений. Это включает определение основных и второстепенных уровней поддержки/сопротивления, а также пояснения VWAP и сигналов. Давайте выполним следующие шаги:

Подготовка и предварительная обработка данных

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

# Ensure critical columns have no missing values
df = df.dropna(subset=['volume', 'high', 'low', 'open', 'close'])

# Convert 'date' column to datetime
df.loc[:, 'date'] = pd.to_datetime(df['date'])

# Handle zero volume by replacing with NaN and dropping invalid rows
df.loc[:, 'volume'] = df['volume'].replace(0, np.nan)
df = df.dropna(subset=['volume'])

# Check if data exists after filtering
if df.empty:
    print("No data to calculate VWAP.")
    return pd.DataFrame()

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

Расчет VWAP и дополнительные показатели

Скрипт рассчитывает VWAP (средневзвешенную по объему цену) и дополнительные показатели, такие как типичная цена, средняя цена, средний объем и уровни поддержки/сопротивления.

# Calculate VWAP and additional metrics
df.loc[:, 'typical_price'] = (df['high'] + df['low'] + df['close']) / 3
df.loc[:, 'vwap'] = (df['typical_price'] * df['volume']).cumsum() / df['volume'].cumsum()
df.loc[:, 'avg_price'] = df[['high', 'low', 'open', 'close']].mean(axis=1)
df.loc[:, 'avg_volume'] = df['volume'].rolling(window=2, min_periods=1).mean()
df.loc[:, 'major_support'] = df['low'].min()
df.loc[:, 'major_resistance'] = df['high'].max()
df.loc[:, 'minor_support'] = df['low'].rolling(window=3, min_periods=1).mean()
df.loc[:, 'minor_resistance'] = df['high'].rolling(window=3, min_periods=1).mean()

  • Расчет VWAP: VWAP рассчитывается как кумулятивная сумма типичной цены, взвешенной по объему, деленная на кумулятивный объем.
  • Типичная цена: Типичная цена рассчитывается как среднее значение максимальной, минимальной цены и цены закрытия за каждый период.

Поддержка и сопротивление

  • Основная поддержка: самое низкое значение в диапазоне низких цен (за весь период).
  • Основное сопротивление: максимальное значение при высоких ценах.
  • Второстепенная поддержка/сопротивление: скользящие средние минимальных и максимальных цен за 3 периода.

Генерация и анализ сигналов

Эта часть рассчитывает рыночную тенденцию и генерирует торговые сигналы на основе положения VWAP относительно цены закрытия. Здесь также приводятся пояснения этих сигналов.

# Calculate strength and generate signals
df.loc[:, 'strength'] = np.where(
    (df['high'] - df['low']) != 0,
    np.abs(df['close'] - df['open']) / (df['high'] - df['low']) * 100,
    0
)

# Generate Buy/Sell signals based on VWAP
df.loc[:, 'signal'] = np.where(
    df['close'] > df['vwap'], 'BUY',
    np.where(df['close'] < df['vwap'], 'SELL', 'NEUTRAL')
)

# Signal explanation
df.loc[:, 'signal_explanation'] = np.where(
    df['signal'] == 'BUY',
    'The price is trading above the VWAP, indicating bullish market tendencies.',
    np.where(
        df['signal'] == 'SELL',
        'The price is trading below the VWAP, indicating bearish market tendencies.',
        'The price is trading at the VWAP, indicating equilibrium in the market.'
    )
)

Расчет силы: При этом сила рынка рассчитывается с использованием разницы между ценами закрытия и открытия относительно максимального и минимального диапазона. Более высокое значение указывает на более сильное движение.

Генерация сигнала

  • BUY: Цена закрытия выше VWAP.
  • SELL: Цена закрытия ниже VWAP.
  • NEUTRAL: Цена закрытия равна VWAP.
  • Signal Explanation (объяснение сигнала): На основе сигнала формируется текстовое пояснение, указывающее рыночные тренды (бычьи, медвежьи или нейтральные).

Окончательный ответ и вывод

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

# Return data with major and minor support/resistance levels included
return df[['date', 'vwap', 'signal', 'signal_explanation', 'entry_point', 'major_support', 'major_resistance', 'minor_support', 'minor_resistance']].iloc[-1]

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


Результаты

Я предоставлю ответы с обеих сторон: со стороны MQL5 и со стороны Python. Прежде чем это сделать, я хочу подчеркнуть важность того, чтобы сначала был запущен скрипт Python. Чтобы узнать больше о создании и запуске скрипта Python, обязательно ознакомьтесь с моей предыдущей статьей. Чтобы обеспечить бесперебойную связь между MetaTrader 5 и сервером, добавьте адрес HTTP к настройкам вашего MetaTrader 5. Откройте "Сервис" > "Настройки", включите "Разрешить WebRequest" и введите адрес сервера. Инструкцию см. в GIF-изображении ниже.

Webrequest

Рис. 3. Настройка веб-запросов

Давайте посмотрим на ответы Python и MQL5.

  • Записи Python в командной строке

Received data: date,high,low,open,close,volume
2025.01.22 15:00,8372.10000,8365.60000,8368.90000,8367.80000,3600
2025.01.22 16:00,8369.00000,8356.60000,8367.90000,8356.80000,3600
2025.01.22 17:00,8359.00000,8347.800...
Calculating VWAP...
127.0.0.1 - - [28/Jan/2025 22:07:59] "POST /vwap HTTP/1.1" 200 -

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

  • Журнал советника MetaTrader 5
2025.01.28 22:07:59.452 VWAP (Step Index,H1)    VWAP Expert initialized.
2025.01.28 22:07:59.513 VWAP (Step Index,H1)    CSV file created: MQL5\Files\Step Index_vwap_data.csv
2025.01.28 22:07:59.777 VWAP (Step Index,H1)    Server response: {
2025.01.28 22:07:59.777 VWAP (Step Index,H1)      "entry_point": 8356.202504986322,
2025.01.28 22:07:59.777 VWAP (Step Index,H1)      "major_resistance": 8404.5,
2025.01.28 22:07:59.777 VWAP (Step Index,H1)      "major_support": 8305.0,
2025.01.28 22:07:59.777 VWAP (Step Index,H1)      "minor_resistance": 8348.0,
2025.01.28 22:07:59.777 VWAP (Step Index,H1)      "minor_support": 8341.699999999999,
2025.01.28 22:07:59.777 VWAP (Step Index,H1)      "signal": "SELL",
2025.01.28 22:07:59.777 VWAP (Step Index,H1)      "signal_explanation": "The price is trading below the VWAP, indicating bearish market tendencies.",
2025.01.28 22:07:59.777 VWAP (Step Index,H1)      "vwap": 8356.202504986322
2025.01.28 22:07:59.777 VWAP (Step Index,H1)    }

Советник MQL5 успешно получил ответ от Python и записал его в журнал Experts MetaTrader 5. Давайте рассмотрим ответ анализа и посмотрим, насколько он согласуется с графиком MetaTrader 5.

Результаты

Рис 4. Отображение сигнала

Давайте рассмотрим, как отреагировал рынок после срабатывания сигнала, как показано на графике ниже.

Реакция рынка

Рис. 5. Реакция рынка


Заключение

После успешной настройки системы VWAP крайне важно отслеживать направление рынка и использовать уровни VWAP для подтверждения. Уровень VWAP пользуется популярностью на рынке и часто выступает в качестве ключевой зоны поддержки или сопротивления. Кроме того, важно выбрать правильный таймфрейм, соответствующий вашей торговой стратегии. Более короткие таймфреймы, такие как M1–M15, фиксируют внутридневные движения, M30 сочетает точность с более широкой перспективой, H1–H4 раскрывают многодневные тренды, а дневные/недельные графики дают представление о долгосрочной динамике рынка. Адаптация подхода к соответствующему таймфрейму обеспечивает лучшее соответствие торговым целям.

Дата Название инструмента  Описание Версия  Обновления  Примечания
01/10/24 Chart Projector Скрипт для наложения эффекта призрака на движение цены за предыдущий день. 1.0 Первоначальная версия Первый инструмент в Lynnchris Tools Chest
18/11/24 Analytical Comment Предоставляет информацию за предыдущий день в табличном формате, а также прогнозирует будущее направление рынка. 1.0 Первоначальная версия Второй инструмент в Lynnchris Tools Chest
27/11/24 Analytics Master Регулярное обновление рыночных показателей каждые два часа  1.01 Вторая версия Третий инструмент в Lynnchris Tools Chest
02/12/24 Analytics Forecaster  Регулярное обновление рыночных показателей каждые два часа с интеграцией с Telegram 1.1 Третья версия Инструмент номер 4
09/12/24 Volatility Navigator Советник анализирует рыночные условия с помощью полос Боллинджера, RSI и ATR. 1.0 Первоначальная версия Инструмент номер 5
19/12/24 Mean Reversion Signal Reaper  Анализирует рынок и генерирует сигналы, используя стратегию возврата к среднему  1.0  Первоначальная версия  Инструмент номер 6 
9/01/2025  Signal Pulse  Анализирует несколько таймфреймов 1.0  Первоначальная версия  Инструмент номер 7 
17/01/2025  Metrics Board  Панель с кнопками для анализа  1.0  Первоначальная версия Инструмент номер 8 
21/01/2025 External Flow Аналитика с помощью внешних библиотек 1.0  Первоначальная версия Инструмент номер 9 
27/01/2025 VWAP Взвешенная по объему средняя цена   1.3  Первоначальная версия  Инструмент номер 10 


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

Прикрепленные файлы |
VWAP.py (3.89 KB)
VWAP.mq5 (6.99 KB)
Последние комментарии | Перейти к обсуждению на форуме трейдеров (4)
Isuru Weerasinghe
Isuru Weerasinghe | 31 янв. 2025 в 10:45
Вы показали, что этот код работает в бэктестинге, но я получаю эту ошибку HTTP Code: -1 | Error: 4014 . Согласно документации, это "Функция не разрешена для вызова ".

Christian Benjamin
Christian Benjamin | 31 янв. 2025 в 10:51
Isuru Weerasinghe бэктестинге, но я получаю эту ошибку HTTP Code: -1 | Error: 4014 . Согласно документации, это "Функция не разрешена для вызова ".

Мои извинения. Вам необходимо импортировать библиотеки для бэктестинга, такие как Backtrader, BT или VectorBT, в скрипт Python. Без них бэктестинг будет невозможен.
Too Chee Ng
Too Chee Ng | 30 мая 2025 в 15:19
Спасибо за статью.
Можем ли мы провести бэктест(оптимизацию) " советника с поддержкой WebRequest " на MetaTrader с облачными агентами?
Too Chee Ng
Too Chee Ng | 30 мая 2025 в 15:45
Too Chee Ng провести бэктест(оптимизацию) " советника с поддержкой WebRequest " на MetaTrader с облачными агентами?

По моим наблюдениям:

- Использование WebRequest() на облачных агентах (удаленная сеть MQL5.com) не разрешено.

- В отличие от облачных агентов MetaTrader (которые блокируют внешнюю связь), агенты локальной сети разрешены

Нейросети в трейдинге: Обучение глубоких спайкинговых моделей (Окончание) Нейросети в трейдинге: Обучение глубоких спайкинговых моделей (Окончание)
В данной статье показана практическая реализация фреймворка SEW ResNet средствами MQL5 с акцентом на прикладное применение в торговле. Двойной Bottleneck даёт возможность одновременно анализировать унитарные потоки и межканальные зависимости, не теряя градиентов при обучении. Спайковые активации с адаптивными порогами и гейты повышают устойчивость к шуму и чувствительность к новизне рынка. В тексте приведены детали реализации и результаты тестов.
Автоматизация торговых стратегий на MQL5 (Часть 11): Разработка многоуровневой системы сеточной торговли Автоматизация торговых стратегий на MQL5 (Часть 11): Разработка многоуровневой системы сеточной торговли
В настоящей статье мы разрабатываем советник многоуровневой системы сеточной торговли с использованием MQL5, уделяя особое внимание архитектуре и алгоритмам, лежащим в основе стратегий сеточной торговли. Мы изучим внедрение многоуровневой сетевой логики и методов управления рисками для работы в изменяющихся рыночных условиях. Наконец, приведём подробные объяснения и практические советы, которые помогут вам в создании, тестировании и совершенствовании автоматической торговой системы.
Создание самооптимизирующихся советников на MQL5 (Часть 5): Самоадаптирующиеся торговые правила Создание самооптимизирующихся советников на MQL5 (Часть 5): Самоадаптирующиеся торговые правила
Правилам безопасного использования индикатора не всегда легко следовать. Спокойные рыночные условия могут неожиданно приводить к появлению на индикаторе значений, которые не будут считаться торговым сигналом, что приведет к упущенным возможностям для алгоритмических трейдеров. В статье рассматривается потенциальное решение проблемы, а также создание торговых приложений, способных адаптировать свои торговые правила к имеющимся рыночным данным.
От начального до среднего уровня: Индикатор (II) От начального до среднего уровня: Индикатор (II)
В этой статье мы рассмотрим, как реализовать расчет скользящей средней и какие меры предосторожности следует предпринять при выполнении данного расчета. Мы также поговорим о перегрузке функции OnCalculate, чтобы знать, когда и как работать с той или иной моделью.