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

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

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

Введение

В период волатильности рынка в 2020 году на фоне кризиса, связанного с пандемией COVID-19, трейдеры обращались к различным техническим инструментам, чтобы оценить, когда может произойти восстановление. Некоторые даже экспериментировали с временными зонами Фибоначчи, чтобы определить потенциальные поворотные моменты на основе исторического поведения цен. Хотя соответствие прогнозов Фибоначчи и крупных отскоков все еще остается предметом дискуссий, эти инструменты предложили одну из нескольких схем для навигации в неопределенной среде, когда правительства начали внедрять меры стимулирования, а экономики постепенно возобновляли работу.

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

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


Концепция

Коррекция Фибоначчи основана на соотношениях, полученных из последовательности, введенной Леонардо Фибоначчи в XIII веке, и широко используется в техническом анализе для определения потенциальных уровней поддержки и сопротивления, где может произойти разворот цены. Сочетание коррекции Фибоначчи с VWAP (Volume Weighted Average Price, средневзвешенной по объему ценой) дает нам более надежный торговый инструмент, поскольку VWAP объединяет данные как о цене, так и об объеме, отражая истинное настроение и ликвидность рынка. Такая интеграция улучшает процесс принятия решений, подтверждая ключевые зоны разворота с помощью объемных данных, сокращая количество ложных сигналов и предлагая динамичную перспективу поведения рынка.

Система TrendMap представляет собой фреймворк генерации торговых сигналов, который интегрирует MQL5 (советник MetaTrader 5) с аналитическим сервером на базе Python. Система обрабатывает уровни коррекции Фибоначчи, VWAP и ценовые данные для генерации торговых сигналов (покупка или продажа). 

  • Если VWAP ниже уровня Фибоначчи 50% (середина цены), генерируется сигнал на покупку.
  • Если VWAP выше уровня Фибоначчи 50% (середина цены), генерируется сигнал на продажу.

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

  • Fib 0 - 0%
  • Fib 1 - 24%
  • Fib 2 - 38%
  • Fib 3 - 50%
  • Fib 4 - 62%
  • Fib 5 -  79%
  • Fib 6 - 100%

Fib 3 представляет собой уровень коррекции 50%, и мы видим, что VWAP находится выше этого уровня, что указывает на потенциальный разворот. Следовательно, формируется сигнал на продажу. Я также обвёл уровни, где цена взаимодействует как с уровнями Фибоначчи, так и с VWAP.

CONCEPT

Рис 1. Цена против Фибоначчи и VWAP

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

Система работает по таймерному принципу, обеспечивая периодические обновления, а также регистрируя и отслеживая изменения на рынке. Этот скрипт настраивает сервер Flask, который принимает рыночные данные от советника MQL5, обрабатывает их и возвращает торговый сигнал.

Когда советник отправляет данные JSON, содержащие VWAP, уровни коррекции Фибоначчи, максимумы/минимумы колебаний и данные о ценах, скрипт оценивает, находится ли VWAP ниже или выше средней цены диапазона колебаний, чтобы найти сигнал на покупку и продажу. В то же время он генерирует график Matplotlib с отображением VWAP, уровней Фибоначчи и ценовых данных, сохраняя само изображение. Для большей плавности отображение проводится в отдельном потоке.

Все события регистрируются для отслеживания, и сервер работает на 127.0.0.1:5110. Давайте рассмотрим блок-схему ниже, чтобы получить полное представление о процессе.

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

Рис 2. Блок-схема


Основные функции

Советник MQL5

В этой части мы рассмотрим основные функции, лежащие в основе нашего советника Fibonacci-VWAP на MQL5. Цель состоит в том, чтобы:

  1. Рассчитать уровни коррекции Фибоначчи, используя максимумы и минимумы колебаний
  2. Определить VWAP (средневзвешенную по объему цену) для подтверждения тренда
  3. Отправить рыночные данные в Python, который выполнит более глубокий анализ и вернет сигнал на покупку/продажу.
  4. Нарисовать сигнальные стрелки на графике, как только будут выполнены все условия.

Давайте разберем эти цели шаг за шагом.

1. Обновление индикаторов Фибоначчи и VWAP

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

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

void UpdateIndicators()
  {
   CalculateFibonacciLevels(InpTimeFrame, InpNumBars, g_SwingHigh, g_SwingLow, g_FibLevels);
   g_VWAP = CalculateVWAP(InpTimeFrame, InpNumBars);
   Print("Updated Indicators: SwingHigh=" + DoubleToString(g_SwingHigh, Digits()) +
         ", SwingLow=" + DoubleToString(g_SwingLow, Digits()) +
         ", VWAP=" + DoubleToString(g_VWAP, Digits()));
  }

2. Отправка рыночных данных в Python

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

string BuildJSONPayload()
  {
   string jsonPayload = "{";
   jsonPayload += "\"symbol\":\"" + Symbol() + "\",";
   jsonPayload += "\"timeframe\":\"" + EnumToString(InpTimeFrame) + "\",";
   jsonPayload += "\"swingHigh\":" + DoubleToString(g_SwingHigh, Digits()) + ",";
   jsonPayload += "\"swingLow\":" + DoubleToString(g_SwingLow, Digits()) + ",";
   jsonPayload += "\"vwap\":" + DoubleToString(g_VWAP, Digits()) + ",";

   jsonPayload += "\"fibLevels\":[";
   for(int i = 0; i < 7; i++)
     {
      jsonPayload += DoubleToString(g_FibLevels[i], 3);
      if(i < 6) jsonPayload += ",";
     }
   jsonPayload += "],";

   jsonPayload += "\"priceData\":[";
   for(int i = 0; i < InpNumBars; i++)
     {
      jsonPayload += DoubleToString(iClose(Symbol(), InpTimeFrame, i), Digits());
      if(i < InpNumBars - 1) jsonPayload += ",";
     }
   jsonPayload += "]}";

   return jsonPayload;
  }

3. Взаимодействие с Python и получение сигналов

На этом этапе выполняется HTTP-запрос, отправляющий полезную нагрузку JSON в скрипт Python. Затем сервер Python проанализирует данные и вернет ответ, содержащий сигнал на покупку или продажу. HTTP-запрос построен таким образом, что обрабатывает как отправку данных, так и получение ответов, проверяя наличие ошибок в ходе процесса. Если запрос выполнен успешно (на что указывает код ответа 200), ответ анализируется, и соответствующий сигнал (купить, продать или удержать) извлекается из данных JSON, возвращаемых Python. Это позволяет советнику MQL5 интегрировать внешнюю вычислительную мощность в процесс принятия решений, обеспечивая более надежные торговые сигналы.

string SendDataToPython(string payload)
  {
   string headers = "Content-Type: application/json\r\n";
   char postData[];
   StringToCharArray(payload, postData);
   char result[];
   string resultHeaders;
   int resCode = WebRequest("POST", InpPythonURL, headers, InpHTTPTimeout, postData, result, resultHeaders);
   
   if(resCode == 200)
     {
      string response = CharArrayToString(result);
      Print("HTTP Response: " + response);
      string signal = ParseSignalFromJSON(response);
      return signal;
     }
   else
     {
      Print("Error: WebRequest failed with code " + IntegerToString(resCode));
      return "";
     }
  }

4. Отображение сигналов покупки/продажи на графике

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

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

void DrawSignalArrow(string signal)
  {
   int arrowCode = 0;
   color arrowColor = clrWhite;

   string lowerSignal = MyStringToLower(signal);
   if(lowerSignal == "buy")
     {
      arrowCode = 233;  // Upward arrow
      arrowColor = clrLime;
     }
   else if(lowerSignal == "sell")
     {
      arrowCode = 234;  // Downward arrow
      arrowColor = clrRed;
     }
   else
     {
      Print("Invalid signal: " + signal);
      return;
     }

   string arrowName = "SignalArrow_" + IntegerToString(TimeCurrent());
   ObjectCreate(0, arrowName, OBJ_ARROW, 0, TimeCurrent(), iClose(Symbol(), PERIOD_CURRENT, 0));
   ObjectSetInteger(0, arrowName, OBJPROP_ARROWCODE, arrowCode);
   ObjectSetInteger(0, arrowName, OBJPROP_COLOR, arrowColor);
   ObjectSetInteger(0, arrowName, OBJPROP_WIDTH, 2);
  }

Скрипт Python

1. Построение VWAP и Фибоначчи vs цена

Функция plot_vwap_fib_vs_price() визуализирует движение цены, VWAP и уровни коррекции Фибоначчи. Она используется для понимания взаимосвязи между этими тремя показателями. Функция принимает следующие параметры:

  • symbol - анализируемый актив 
  • vwap - рассчитанная средневзвешенная по объему цена
  • swingHigh и swingLow - высокие и низкие точки, используемые для расчета уровней коррекции Фибоначчи
  • fibLevels - уровни коррекции Фибоначчи (значения по умолчанию включают распространенные уровни коррекции, такие как 0.236, 0.382 и т.д.)
  • price_data - серия Pandas, содержащая данные о ценах с течением времени

Разбивка функции:

  • Построение графика ценовых данных: функция начинается с построения графика ценовых данных с течением времени, используя sns.set для стиля и ax.plot для визуализации
  • Построение уровней Фибоначчи: для каждого уровня Фибоначчи, указанного в списке, функция вычисляет соответствующую цену и рисует горизонтальную линию с помощью ax.axhline
  • Отображение VWAP: VWAP отображается в виде желтой горизонтальной линии
  • Сохранение графика: график сохраняется с отметкой времени, чтобы избежать перезаписи предыдущих графиков.

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

def plot_vwap_fib_vs_price(symbol: str, vwap: float, swingHigh: float, swingLow: float, fibLevels: list, price_data: pd.Series) -> str:     sns.set(style="whitegrid")     fig, ax = plt.subplots(figsize=(7.5, 5), dpi=100)     ax.plot(price_data.index, price_data.values, label="Price", color='blue', marker='o', markersize=4)     for level in fibLevels:         level_price = swingLow + (swingHigh - swingLow) * level         ax.axhline(y=level_price, linestyle='--', linewidth=1.5, label=f'Fib {level*100:.1f}%: {level_price:.5f}')          ax.axhline(y=vwap, color='yellow', linestyle='-', linewidth=2, label=f'VWAP: {vwap:.5f}')     ax.set_title(f'VWAP & Fibonacci vs Price for {symbol}')     ax.set_xlabel('Time Index')     ax.set_ylabel('Price')     ax.legend()     filename = f"vwap_fib_plot_{symbol}_{datetime.datetime.now().strftime('%Y%m%d_%H%M%S')}.png"     plt.savefig(filename)     plt.close(fig)     return filename

2. Маршрут Flask для сигнала и анализа

Функция get_signal() - это основной маршрут, который обрабатывает запросы POST и отвечает за получение рыночных данных, выполнение анализа и возврат торговых сигналов. Данные отправляются по этому маршруту в виде полезной нагрузки JSON из MQL5.

Разбивка функции:

  • Получение данных: функция получает рыночные данные в необработанном формате, декодирует их и преобразует в объект JSON.
  • Извлечение данных: ключевые точки данных, такие как символ, swingHigh, swingLow, vwap, fibLevels и priceData извлекаются из входящего JSON.
  • Отображение: запускает новый поток, который вызывает функцию построения графика для создания визуального представления рыночных условий (VWAP и Фибоначчи).
  • Генерация сигнала: сигнал на покупку/продажу генерируется путем сравнения VWAP со средней точкой между максимумом и минимумом колебания. Если VWAP ниже средней точки, формируется сигнал на покупку, в противном случае — на продажу.
  • Ответ: Возвращается ответ со сгенерированным сигналом (Buy, Sell или None) и пояснением.

Логика генерации сигнала проста, но эффективна:

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

@app.route('/getSignal', methods=['POST']) def get_signal():     try:         # Get the raw data from the request         raw_data = request.data.decode('utf-8').strip()         logging.debug("Raw data received: " + raw_data)         # Parse JSON         decoder = json.JSONDecoder()         data, idx = decoder.raw_decode(raw_data)         if idx != len(raw_data):             logging.error(f"Extra data found after valid JSON: index {idx} of {len(raw_data)}")         logging.info("Data received from MQL5: " + json.dumps(data, indent=2))     except Exception as e:         logging.error("Error parsing JSON: " + str(e))         return jsonify({"signal": "None", "error": str(e)})     try:         # Extract parameters         symbol = data.get('symbol', 'Unknown')         swingHigh = float(data.get('swingHigh', 0))         swingLow = float(data.get('swingLow', 0))         vwap = float(data.get('vwap', 0))         fibLevels = data.get('fibLevels', [0.236, 0.382, 0.5, 0.618, 1.618])  # Default levels if not provided         # Convert priceData list into a pandas Series         price_data = pd.Series(data.get('priceData', []))         # Start thread for visualization         threading.Thread(target=plot_vwap_fib_vs_price, args=(symbol, vwap, swingHigh, swingLow, fibLevels, price_data)).start()         # Determine signal based on VWAP & Fibonacci         mid_price = np.mean([swingHigh, swingLow])         if vwap < mid_price and price_data.iloc[-1] < swingLow + (swingHigh - swingLow) * 0.382:             signal = "Buy"         elif vwap > mid_price and price_data.iloc[-1] > swingLow + (swingHigh - swingLow) * 0.618:             signal = "Sell"         else:             signal = "None"         explanation = f"Signal: {signal} based on VWAP and Fibonacci analysis."     except Exception as e:         logging.error("Error processing data: " + str(e))         signal = "None"         explanation = "Error processing the signal."     # Build response     response = {         "signal": signal,         "explanation": explanation,         "received_data": data     }     logging.debug("Sending response to MQL5: " + json.dumps(response))     return jsonify(response)

В коде процесс генерации сигнала учитывает как VWAP, так и Фибоначчи, при этом логика явно полагается на оба, чтобы определить, генерировать ли сигнал на покупку или продажу. Сигнал на покупку или продажу напрямую зависит от выравнивания уровней VWAP и Фибоначчи. Например:

  • Сигнал на покупку: когда VWAP находится ниже средней точки и цена приближается к уровню поддержки (коррекции Фибоначчи), это сильный сигнал на покупку.
  • Сигнал на продажу: если VWAP находится выше средней точки, а цена находится на уровне сопротивления Фибоначчи, сигнал на продажу сильнее.


Прочие функции

Советник MQL5

  • Вспомогательные функции

Начнем со вспомогательных функций. Это своего рода небольшие инструменты в нашем наборе инструментов, которые упрощают нашу последующую работу. Например, функция BoolToString преобразует значение "истина/ложь" в строку (true или false), чтобы при регистрации или отображении этих значений их можно было легко прочитать. Также имеется функция CharToStr, которая принимает код символа (беззнаковый short) и преобразует его в строку — удобная функция, когда вам нужно работать с текстовыми данными. Окончательно MyStringToLower просматривает заданную строку символ за символом, преобразуя все заглавные буквы в строчные. Это особенно полезно, когда вы хотите сравнивать строки, не беспокоясь о различиях регистра. Код:

//+------------------------------------------------------------------+ //| Helper: Convert bool to string                                   | //+------------------------------------------------------------------+ string BoolToString(bool val)   {    return(val ? "true" : "false");   } //+------------------------------------------------------------------+ //| Helper: Convert ushort (character code) to string                | //+------------------------------------------------------------------+ string CharToStr(ushort ch)   {    return(StringFormat("%c", ch));   } //+------------------------------------------------------------------+ //| Helper: Convert a string to lower case                           | //| This custom function avoids the implicit conversion warning.     | //+------------------------------------------------------------------+ string MyStringToLower(string s)   {    string res = "";    int len = StringLen(s);    for(int i = 0; i < len; i++)      {       ushort ch = s[i];       // Check if character is uppercase A-Z.       if(ch >= 'A' && ch <= 'Z')          ch = ch + 32;       res += CharToStr(ch);      }    return res;   }

По сути, эти функции помогают обеспечить единообразие обработки текста и данных во всем советнике.

  • Инициализация и очистка

Далее следуют процедуры инициализации и очистки. Подумайте об этом как о подготовке сцены перед началом спектакля и уборке после него. В функции OnInit советник начинает с вывода приветственного сообщения. Затем он устанавливает таймер, используя EventSetTimer (что критически важно для периодических задач), и вызывает InitializeFibonacciArray для предварительной загрузки наших уровней Фибоначчи. Кроме того, он записывает текущее время для управления последующими обновлениями. Если таймер не работает, советник немедленно останавливается, чтобы предотвратить дальнейшие проблемы. Функция OnDeinit ызывается, когда советник удаляется с графика. Он останавливает таймер с помощью EventKillTimer и указывает причину. Вот как это выглядит:

//+------------------------------------------------------------------+ //| Expert initialization function                                   | //+------------------------------------------------------------------+ int OnInit()   {    Print("FibVWAP No-Trade EA initializing...");    if(!EventSetTimer(InpTimerInterval))      {       Print("Error: Unable to set timer.");       return(INIT_FAILED);      }    InitializeFibonacciArray();    g_LastUpdateTime = TimeCurrent();    Print("FibVWAP No-Trade EA successfully initialized.");    return(INIT_SUCCEEDED);   } //+------------------------------------------------------------------+ //| Expert deinitialization function                                 | //+------------------------------------------------------------------+ void OnDeinit(const int reason)   {    EventKillTimer();    Print("FibVWAP No-Trade EA deinitialized, reason code: " + IntegerToString(reason));   } //+------------------------------------------------------------------+ //| Initialize Fibonacci levels array                                | //+------------------------------------------------------------------+ void InitializeFibonacciArray()   {    g_FibLevels[0] = 0.000;    g_FibLevels[1] = 0.236;    g_FibLevels[2] = 0.382;    g_FibLevels[3] = 0.500;    g_FibLevels[4] = 0.618;    g_FibLevels[5] = 0.786;    g_FibLevels[6] = 1.000;   }

Тщательно настраивая и демонтируя нашу среду, мы обеспечиваем бесперебойную работу советника.

  • Периодическое выполнение и обработка событий

Теперь давайте посмотрим, как EA управляет своими задачами во время выполнения. Функция OnTimer играет здесь ключевую роль. Она срабатывает с интервалами, определяемыми пользователем (определяются InpTimerInterval). Каждый раз при срабатывании таймера советник обновляет свои индикаторы, создает полезную нагрузку JSON, отправляет ее на нашу конечную точку Python и обрабатывает любой возвращенный сигнал. Если появляется новый сигнал, советник даже рисует стрелку на графике. В то время как OnTick вызывается при каждом обновлении рынка (или тика), мы используем функцию только для вызова MainProcessingLoop, чтобы интенсивная обработка не происходила на каждом тике, а только с контролируемыми интервалами. Такая конструкция помогает поддерживать эффективность советника. Код:

//+------------------------------------------------------------------+ //| Expert timer function: periodic update                           | //+------------------------------------------------------------------+ void OnTimer()   {    UpdateIndicators();    string payload = BuildJSONPayload();    Print("Payload sent to Python: " + payload);    string signal = SendDataToPython(payload);    if(signal != "")      {       if(signal != g_LastSignal)         {          g_LastSignal = signal;          Print("New signal received: " + signal);          Comment("ML Signal: " + signal);          // Draw an arrow on the chart for the new signal.          DrawSignalArrow(signal);         }       else         {          Print("Signal unchanged: " + signal);         }      }    else      {       Print("Warning: No valid signal received.");      }    UpdateChartObjects();   } //+------------------------------------------------------------------+ //| Expert tick function                                             | //+------------------------------------------------------------------+ void OnTick()   {    MainProcessingLoop();   } //+------------------------------------------------------------------+ //| Main processing loop: can be called from OnTick                  | //+------------------------------------------------------------------+ void MainProcessingLoop()   {    datetime currentTime = TimeCurrent();    if(currentTime - g_LastUpdateTime >= InpTimerInterval)      {       UpdateChartObjects();       g_LastUpdateTime = currentTime;      }   }

Такая настройка гарантирует, что наш советник будет выполнять обновления с нужной скоростью, не перегружаясь каждым тиком.

  • Управление объектами графика

Визуальная обратная связь имеет большое значение в торговле, и именно здесь вступает в дело наше управление объектами графика. Функция DrawChartObjects отвечает за отрисовку визуальных элементов на графике, таких как горизонтальные линии, представляющие наши уровни Фибоначчи и VWAP. Сначала она очищает все предыдущие объекты, чтобы избежать беспорядка, а затем создает новые объекты с соответствующими цветами, стилями и текстовыми метками. Вспомогательная функция UpdateChartObjects просто вызывает DrawChartObjects чтобы сохранить модульность, а ExtendedProcessing доступна, если нам потребуется выполнить какие-либо дополнительные обновления или действия по отладке. Вот как выглядит код:

//+------------------------------------------------------------------+ //| Draw objects on the chart for visual indicator levels            | //+------------------------------------------------------------------+ void DrawChartObjects()   {    string objPrefix = "FibVWAP_";    // Remove previous objects with the given prefix.    ObjectsDeleteAll(0, objPrefix);    double range = g_SwingHigh - g_SwingLow;    for(int i = 0; i < 7; i++)      {       double levelPrice = g_SwingLow + range * g_FibLevels[i];       string name = objPrefix + "FibLevel_" + IntegerToString(i);       if(!ObjectCreate(0, name, OBJ_HLINE, 0, 0, levelPrice))          Print("Error creating object: " + name);       else         {          ObjectSetInteger(0, name, OBJPROP_COLOR, clrDeepSkyBlue);          ObjectSetInteger(0, name, OBJPROP_STYLE, STYLE_DOT);          ObjectSetString(0, name, OBJPROP_TEXT, "Fib " + DoubleToString(g_FibLevels[i]*100, 0) + "%");         }      }    string vwapName = objPrefix + "VWAP";    if(!ObjectCreate(0, vwapName, OBJ_HLINE, 0, 0, g_VWAP))       Print("Error creating VWAP object.");    else      {       ObjectSetInteger(0, vwapName, OBJPROP_COLOR, clrYellow);       ObjectSetInteger(0, vwapName, OBJPROP_STYLE, STYLE_SOLID);       ObjectSetString(0, vwapName, OBJPROP_TEXT, "VWAP");      }   } //+------------------------------------------------------------------+ //| Periodically update chart objects                                | //+------------------------------------------------------------------+ void UpdateChartObjects()   {    DrawChartObjects();   } //+------------------------------------------------------------------+ //| Extended processing: additional updates and chart redraw         | //+------------------------------------------------------------------+ void ExtendedProcessing()   {    Print("Extended processing executed.");    UpdateChartObjects();   }

  • Дополнительные служебные функции
Наконец, давайте рассмотрим служебные функции. Они поддерживают наш советник за кулисами. Функция CharArrayToString принимает массив символов (часто получаемых из веб-запросов) и преобразует его в пригодную для использования строку. LogDebugInfo выводит сообщения с меткой времени, что позволяет отслеживать активность советника с течением времени, что очень полезно при отладке. PauseExecution позволяет остановить работу советника на определенное количество секунд, что может быть полезно, если вам нужно замедлить работу, чтобы понаблюдать за поведением во время тестирования. Вот код этих утилит:

//+------------------------------------------------------------------+ //| Convert char array to string                                     | //+------------------------------------------------------------------+ string CharArrayToString(const char &arr[])   {    string ret = "";    for(int i = 0; i < ArraySize(arr); i++)       ret += CharToStr(arr[i]);    return(ret);   } //+------------------------------------------------------------------+ //| Custom logging function for detailed debug information           | //+------------------------------------------------------------------+ void LogDebugInfo(string info)   {    string logMessage = TimeToString(TimeCurrent(), TIME_DATE|TIME_SECONDS) + " | " + info;    Print(logMessage);   } //+------------------------------------------------------------------+ //| Additional utility: Pause execution (for debugging)              | //+------------------------------------------------------------------+ void PauseExecution(int seconds)   {    datetime endTime = TimeCurrent() + seconds;    while(TimeCurrent() < endTime)      {       Sleep(100);      }   }

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

Скрипт Python

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

import datetime   import json   import logging   import threading   import numpy as np   import pandas as pd   import pandas_ta as ta   import matplotlib.pyplot as plt   import seaborn as sns   from flask import Flask, request, jsonify  

Библиотека Назначение Как используется в системе
datetime Управление временем Используется для обозначения времени сохраненных торговых графиков и событий журнала. Каждый раз, когда мы создаем график, мы прикрепляем к нему временную метку, чтобы отслеживать различные рыночные условия с течением времени.
json Обмен данными Поскольку наша система взаимодействует с MQL5, мы отправляем и получаем данные в формате JSON. Этот модуль помогает нам кодировать и декодировать сообщения JSON между Python и MQL5.
logging Отладка и мониторинг Отслеживает системные события. Используется для регистрации каждого шага — момента получения сигнала, его обработки или возникновения ошибки — что упрощает отладку.
threading Запуск задач в фоновом режиме При создании графика VWAP-Фибоначчи мы запускаем его в отдельном потоке, чтобы гарантировать, что сервер остается отзывчивым и не задерживает отправку сигналов обратно в MQL5.
numpy Количественные вычисления Мы используем NumPy, чтобы быстро и эффективно рассчитать среднюю цену и выполнить другие математические операции. Скорость имеет значение при обработке рыночных данных в реальном времени.
pandas Обработка данных Поскольку рыночные данные структурированы в строки и столбцы (как электронная таблица), pandas позволяет легко хранить, сортировать и обрабатывать эти данные для анализа.
pandas_ta Технические индикаторы Хотя это и не является основной частью нашей текущей системы, но позволяет использовать дополнительные инструменты технического анализа, если это потребуется в будущем.
matplotlib.pyplot Графики и визуализация Основа нашего визуального анализа. Мы используем его для построения графиков движения цен, уровней VWAP и зон коррекции Фибоначчи.
seanborn Улучшенный стиль графика Помогает сделать наши графики визуально привлекательными, облегчая выявление трендов и ключевых уровней.
flask  Взаимодействие между MQL5 и Python  Делает возможным обмен сигналами в реальном времени. Flask создает API, который позволяет нашему MQL5-советнику мгновенно отправлять ценовые данные и получать торговые сигналы. 
  • Инициализация сервера Flask (if __name__ == '__main__')
Этот блок инициализирует и запускает веб-сервер Flask, позволяя советнику MQL5 взаимодействовать со скриптом Python посредством HTTP-запросов.

Как это работает:
  • Сервер привязывается к порту 5110
  • Работает в режиме отладки для регистрации и устранения неполадок в реальном времени
  • Гарантирует, что сервер не будет автоматически перезапускаться без необходимости (use_reloader=False)

if __name__ == '__main__':     port = 5110     logging.info(f"Starting Flask server on 127.0.0.1:{port} (debug mode ON)")     app.run(host="127.0.0.1", port=port, debug=True, use_reloader=False)


Результаты

Чтобы протестировать систему, начните с запуска скрипта Python, чтобы активировать порт и сервер для подключения. Если вы не уверены, как запустить скрипт, обратитесь к этой статье. Как только сервер активируется, запустим MQL5-советник. Теперь давайте рассмотрим результаты после успешного запуска системы.

Логи командной строки

2025-02-06 12:45:32,384 DEBUG: Sending response to MQL5: {"signal": "Sell", "explanation": "Signal: Sell based on VWAP and Fibonacci analysis.", "received_data": {"symbol": "EURUSD", "timeframe": "PERIOD_H1", "swingHigh": 1.05331, "swingLow": 1.02099, "vwap": 1.03795, "fibLevels": [0.0, 0.236, 0.382, 0.5, 0.618, 0.786, 1.0], "priceData": [1.03622, 1.03594, 1.03651, 1.03799, 1.03901, 1.03865, 1.03871, 1.0392, 1.03951, 1.04025, 1.03974, 1.03986, 1.04041, 1.04017, 1.04049, 1.04072, 1.04156, 1.04197, 1.04181, 1.04223, 1.04224, 1.04079, 1.04192, 1.04147, 1.04251, 1.04039, 1.04039, 1.04026, 1.0385, 1.03778, 1.03786, 1.03796, 1.03845, 1.03734, 1.03786, 1.03714, 1.0378, 1.03786, 1.03854, 1.03817, 1.03811, 1.03767, 1.03784, 1.03801, 1.03593, 1.03404, 1.03254, 1.03223, 1.0335, 1.03386, 1.03344, 1.03115, 1.03067, 1.02932, 1.0306, 1.03147, 1.0322, 1.03221, 1.03178, 1.03281, 1.0342, 1.03441, 1.02955, 1.02846, 1.02785, 1.02795, 1.02761, 1.03162, 1.0251, 1.0264, 1.02577, 1.02522, 1.02438, 1.0231, 1.02436, 1.02249, 1.02431, 1.02404, 1.02265, 1.02216, 1.02235, 1.02377, 1.02314, 1.0247, 1.02504, 1.03583, 1.03733, 1.03763, 1.03698, 1.042, 1.03998, 1.03964, 1.03687, 1.03822, 1.03825, 1.03759, 1.03765, 1.03836, 1.03845, 1.0404, 1.03946, 1.03888, 1.03875, 1.0385, 1.03897, 1.03884, 1.03867, 1.03969, 1.03873, 1.03885, 1.04076, 1.0428, 1.0425, 1.0417, 1.04197, 1.04314, 1.0428, 1.04562, 1.04033, 1.03918, 1.04007, 1.04076, 1.04217, 1.04239, 1.04139, 1.0422, 1.04191, 1.04253, 1.0423, 1.042, 1.04259, 1.04247, 1.04216, 1.04209, 1.04105, 1.04164, 1.042, 1.04213, 1.04157, 1.04194, 1.04013, 1.03878, 1.0404, 1.04016, 1.04037, 1.04038, 1.04244, 1.04161, 1.04372, 1.04403, 1.04386, 1.04374, 1.0434, 1.04272, 1.04304, 1.04272, 1.04286, 1.04301, 1.04315, 1.0435, 1.04264, 1.04279, 1.04262, 1.04241, 1.04314, 1.04249, 1.04203, 1.04234, 1.0425, 1.04352, 1.04252, 1.04342, 1.04376, 1.04364, 1.04336, 1.04291, 1.04336, 1.04378, 1.04453, 1.0437, 1.04886, 1.04916, 1.04881, 1.04926, 1.04849, 1.04888, 1.04908, 1.04992, 1.05094, 1.05199, 1.05212, 1.0513, 1.05054, 1.04888, 1.04875, 1.04571, 1.04591, 1.0463, 1.04633, 1.04686]}} 2025-02-06 12:39:32,397 INFO: 127.0.0.1 - - [06/Feb/2025 12:39:32] "POST /getSignal HTTP/1.1" 200 - 2025-02-06 12:39:32,805 DEBUG: VWAP & Fibonacci vs Price graph saved as vwap_fib_plot_EURUSD_20250206_123932.png

Логи MQL5

2025.02.06 12:45:32.331 FIBVWAP (EURUSD,M5)     Fib Level 0 (0%): 1.02099 2025.02.06 12:45:32.331 FIBVWAP (EURUSD,M5)     Fib Level 1 (24%): 1.02862 2025.02.06 12:45:32.331 FIBVWAP (EURUSD,M5)     Fib Level 2 (38%): 1.03334 2025.02.06 12:45:32.331 FIBVWAP (EURUSD,M5)     Fib Level 3 (50%): 1.03715 2025.02.06 12:45:32.331 FIBVWAP (EURUSD,M5)     Fib Level 4 (62%): 1.04096 2025.02.06 12:45:32.331 FIBVWAP (EURUSD,M5)     Fib Level 5 (79%): 1.04639 2025.02.06 12:45:32.332 FIBVWAP (EURUSD,M5)     Fib Level 6 (100%): 1.05331 2025.02.06 12:45:32.332 FIBVWAP (EURUSD,M5)     Updated Indicators: SwingHigh=1.05331, SwingLow=1.02099, VWAP=1.03795 2025.02.06 12:45:32.332 FIBVWAP (EURUSD,M5)     Payload sent to Python: {"symbol":"EURUSD","timeframe":"PERIOD_H1","swingHigh":1.05331,"swingLow":1.02099,"vwap":1.03795,"fibLevels":[0.000,0.236,0.382,0.500,0.618,0.786,1.000],"priceData":[1.03583,1.03594,1.03651,1.03799,1.03901,1.03865,1.03871,1.03920,1.03951,1.04025,1.03974,1.03986,1.04041,1.04017,1.04049,1.04072,1.04156,1.04197,1.04181,1.04223,1.04224,1.04079,1.04192,1.04147,1.04251,1.04039,1.04039,1.04026,1.03850,1.03778,1.03786,1.03796,1.03845,1.03734,1.03786,1.03714,1.03780,1.03786,1.03854,1.03817,1 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)     HTTP Response: { 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)       "explanation": "Signal: Sell based on VWAP and Fibonacci analysis.", 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)       "received_data": { 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)         "fibLevels": [ 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           0.0, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           0.236, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           0.382, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           0.5, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           0.618, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           0.786, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.0 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)         ], 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)         "priceData": [ 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.03583, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.03594, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.03651, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.03799, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.03901, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.03865, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.03871, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.0392, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.03951, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.04025, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.03974, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.03986, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.04041, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.04017, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.04049, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.04072, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.04156, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.04197, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.04181, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.04223, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.04224, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.04079, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.04192, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.04147, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.04251, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.04039, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.04039, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.04026, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.0385, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.03778, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.03786, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.03796, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.03845, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.03734, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.03786, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.03714, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.0378, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.03786, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.03854, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.03817, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.03811, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.03767, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03784, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03801, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03593, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03404, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03254, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03223, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.0335, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03386, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03344, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03115, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03067, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.02932, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.0306, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03147, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.0322, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03221, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03178, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03281, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.0342, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03441, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.02955, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.02846, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.02785, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.02795, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.02761, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03162, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.0251, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.0264, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.02577, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.02522, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.02438, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.0231, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.02436, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.02249, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.02431, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.02404, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.02265, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.02216, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.02235, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.02377, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.02314, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.0247, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.02504, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03583, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03733, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03763, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03698, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.042, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03998, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03964, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03687, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03822, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03825, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03759, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03765, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03836, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03845, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.0404, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03946, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03888, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03875, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.0385, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03897, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03884, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03867, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03969, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03873, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03885, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04076, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.0428, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.0425, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.0417, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04197, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04314, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.0428, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04562, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04033, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03918, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04007, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04076, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04217, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04239, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04139, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.0422, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04191, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04253, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.0423, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.042, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04259, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04247, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04216, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04209, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04105, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04164, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.042, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04213, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04157, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04194, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04013, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03878, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.0404, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04016, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04037, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04038, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04244, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04161, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04372, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04403, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04386, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04374, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.0434, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04272, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04304, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04272, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04286, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04301, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04315, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.0435, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04264, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04279, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04262, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04241, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04314, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04249, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04203, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04234, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.0425, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04352, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04252, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04342, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04376, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04364, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04336, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04291, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04336, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04378, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04453, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.0437, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04886, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04916, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04881, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04926, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04849, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04888, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04908, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04992, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.05094, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.05199, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.05212, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.0513, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.05054, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04888, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04875, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04571, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04591, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.0463, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04633, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04686 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)         ], 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)         "swingHigh": 1.05331, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)         "swingLow": 1.02099, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)         "symbol": "EURUSD", 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)         "timeframe": "PERIOD_H1", 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)         "vwap": 1.03795 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)       }, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)       "signal": "Sell" 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)     }

График VWAP-Fibonacci vs. Price также был построен и сохранен в том же каталоге, что и скрипт Python. Этот график помогает визуализировать, как цена взаимодействует с уровнями VWAP и Фибоначчи.

MATPLOTLIB

Рис. 3. График Matplotlib

На рисунке ниже MQL5-советник на графике MetaTrader 5 регистрирует и отображает ответ от сервера Python. На графике показаны два сигнала на покупку, обозначенные стрелками, которые также регистрируются на вкладке "Эксперты". Мы видим, что рынок последовал за направлением этих сигналов, подтвердив их достоверность. Я решил просмотреть график М1 для более четкого анализа.

B300

Рис 4. Тестирование на индексе Boom 300


Заключение

Созданная система весьма полезна для трейдеров. Помимо предоставления сигналов, он позволяет наглядно визуализировать, как цена взаимодействует с уровнями Фибоначчи и VWAP во время генерации сигнала. Визуализация достигается двумя способами: Python строит график, используя библиотеку Matplotlib, в то время как MQL5-советник отображает линии VWAP и Фибоначчи непосредственно на графике для лучшего анализа. Это улучшенное визуальное представление может помочь трейдерам принимать обоснованные решения.

Дата Название инструмента  Описание Версия  Обновления  Примечания
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/25  Signal Pulse  Анализирует несколько таймфреймов 1.0  Первоначальная версия  Инструмент номер 7 
17/01/25  Metrics Board  Панель с кнопками для анализа  1.0  Первоначальная версия Инструмент номер 8 
21/01/25 External Flow Аналитика с помощью внешних библиотек 1.0  Первоначальная версия Инструмент номер 9 
27/01/25 VWAP Взвешенная по объему средняя цена   1.3  Первоначальная версия  Инструмент номер 10 
02/02/25  Heikin Ashi  Сглаживание тренда и идентификация сигналов разворота  1.0  Первоначальная версия  Инструмент номер 11
04/02/25  FibVWAP  Генерация сигнала с помощью анализа Python  1.0  Первоначальная версия  Инструмент номер 12

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

Прикрепленные файлы |
server.py (4.53 KB)
FIBVWAP.mq5 (17.22 KB)
Последние комментарии | Перейти к обсуждению на форуме трейдеров (2)
linfo2
linfo2 | 21 мар. 2025 в 18:52
Спасибо Крису за все ваши идеи и публикации, безусловно, полезный материал. Для этой статьи. чтобы заставить его работать, мне нужно сделать некоторые настройки, подходящие для моего окружения, после перепроверки Разработка инструментария анализа ценовых действий (часть 9): Внешний поток - MQL5 Статьи, которые могут быть полезны другим

1 обновите скрипты, чтобы они использовали ваш адрес или локальный хост 127.0.0.1

2 в опциях инструментов web request url добавьте используемый адрес

4 убедитесь, что все части Python установлены

установить matplotlib

pip install pandas

pip установите Flask seaborn и Numpty, если необходимо

3 Запустите приложение flask на этом адресе, запустив файл python с адресом, который вы используете

Christian Benjamin
Christian Benjamin | 22 мар. 2025 в 14:59
linfo2 #:
Спасибо Крису за все ваши идеи и публикации, безусловно, полезный материал. Для этой статьи. чтобы заставить его работать, мне нужно сделать некоторые настройки, подходящие для моего окружения, после перепроверки Разработка инструментария анализа ценовых действий (часть 9): Внешний поток - MQL5 Статьи, которые могут быть полезны другим

1 обновите скрипты, чтобы они использовали ваш адрес или локальный хост 127.0.0.1

2 в опциях инструментов web request url добавьте используемый адрес

4 убедитесь, что все части Python установлены

установить matplotlib

pip install pandas

pip установите Flask seaborn и Numpty, если необходимо

3 Запустите приложение flask на этом адресе, запустив файл python с адресом, который вы используете

Здравствуйте, linfo2
Вы абсолютно правы в отношении дополнительных примечаний, которые вы предоставили. Большое спасибо вам🔥.
От новичка до эксперта: Создание подробных торговых отчетов с помощью советника Reporting EA От новичка до эксперта: Создание подробных торговых отчетов с помощью советника Reporting EA
В настоящей статье мы подробно рассмотрим усовершенствование деталей торговых отчетов и отправку окончательного документа по электронной почте в формате PDF. Это знаменует собой прогресс по сравнению с нашей предыдущей работой, поскольку мы продолжаем изучать, каким образом использовать возможности MQL5 и Python для создания и планирования торговых отчетов в наиболее удобных и профессиональных форматах. Присоединяйтесь к нам в этой дискуссии, чтобы узнать больше об оптимизации формирования торговых отчетов в экосистеме MQL5.
Математические модели в сеточных стратегиях Математические модели в сеточных стратегиях
В этой статье мы рассмотрим применение математики к сеточным стратегиям. Мы разберем основные принципы работы стратегии, её преимущества и недостатки. Вы узнаете, как построить торговую сетку, задавать оптимальные параметры и эффективно управлять рисками.
Нейросети в трейдинге: Адаптивное восприятие рыночной динамики (Энкодер) Нейросети в трейдинге: Адаптивное восприятие рыночной динамики (Энкодер)
В статье представлена комплексная архитектура Энкодера STE-FlowNet, объединяющая стековую память, рекуррентную обработку и корреляционный механизм для извлечения скрытых рыночных зависимостей. Показано, как эти модули последовательно интегрируются в единую вычислительную цепочку, способную осуществлять разносторонний анализ временных рядов.
Искусство ведения логов (Часть 5): Оптимизация обработчика с помощью кэширования и ротации Искусство ведения логов (Часть 5): Оптимизация обработчика с помощью кэширования и ротации
В этой статье мы улучшим библиотеку логов путем добавления форматтеров в обработчики, класса CIntervalWatcher для управления циклами выполнения, оптимизации с кэшированием и ротацией файлов, тестов производительности и практических примеров. Благодаря этим улучшениям мы получим эффективную, масштабируемую и адаптируемую систему ведения логов к различным сценариям разработки.