English Deutsch 日本語
preview
MetaTrader и Google Таблицы через PythonAnywhere: Руководство по безопасному потоку данных

MetaTrader и Google Таблицы через PythonAnywhere: Руководство по безопасному потоку данных

MetaTrader 5Интеграция |
70 2
Ramesh Maharjan
Ramesh Maharjan

Введение

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

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

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

Эта статья предназначена для трейдеров и разработчиков, которые ищут способы передавать свои данные в облачные решения или хранилища. В статье я объясню, как использовать бесплатные и безопасные инструменты, такие как ключи сервисных аккаунтов Google и прокси-сервер, размещенный на защищенной бесплатной веб-платформе PythonAnywhere.



Зачем нужны Google Таблицы и ключ сервисного аккаунта?

Google Таблицы — очень ценное решение, поскольку оно работает в облаке, а сохраненные там данные доступны в любое время и из любого места. Поэтому трейдеры могут получать доступ к торговым и сопутствующим данным, экспортированным в Google Таблицы, и выполнять дальнейший анализ для будущей торговли в любое время, где бы они ни находились. Мы можем использовать инструменты анализа данных Google Таблиц и даже интегрировать их с другими инструментами, например Google Data Studio или TradingView. Кроме того, другие трейдеры и помощники могут совместно работать с таблицами, добавляя свой анализ и точки зрения.

Я опубликовал приложение утилита Info Exporter MT5 в MQL5 Маркет, которое можно бесплатно скачать и использовать; оно применяет возможности Google Apps Script для передачи данных из MetaTrader в Google Таблицы.

Хотя Apps Script бесплатен и прост в использовании, он недостаточно безопасен: опубликованный URL общедоступен, поэтому любой, у кого есть этот URL, может читать скрипт и записывать в него данные для доступа к таблицам. Существуют и другие подходы, например федерация идентификации рабочих нагрузок и Google Sheets API но они либо сложны в использовании, либо платные, либо имеют ограниченный бесплатный доступ.

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

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



Зачем нужен прокси-сервер на pythonanywhere.com?

В MetaTrader нет прямой интеграции с Google Таблицами и их API. Поэтому прокси-сервер — лучший вариант для передачи данных в Google Таблицы. Использование облачного решения, такого как PythonAnywhere, дает нам доступность, масштабируемость, безопасность и надежность. Доступность — потому что сервис доступен даже тогда, когда наши компьютеры выключены. Масштабируемость — потому что любой пользователь со ссылкой может использовать его, если укажет действительный идентификатор электронной таблицы. Безопасность — потому что платформа хорошо протестирована и управляется квалифицированными инженерами. Надежность — потому что мы всегда можем рассчитывать на ее сервисы, даже в бесплатной версии.

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

продление срока действия на pythonanywhere.com

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

Мы также получаем доступ к базе данных MySQL, которую можно использовать вместе с нашим API-сервисом для хранения или кэширования информации. Кроме того, доступны функции планирования задач: можно создавать cron-задачи, которые будут выполняться в заданное время суток, чтобы не запускать их вручную. Нам доступны инструменты создания, редактирования и удаления файлов, веб-интерфейс для просмотра файлов журнала ошибок, средства защиты сайта, создания virtualenv и многие другие инструменты.

Я постарался охватить всю необходимую информацию о создании, редактировании и размещении прокси-сервера на pythonanywhere.com в видео в котором создаю идентичный прокси-сервер, используемый в этой статье.



Диаграмма потока данных 

Концепция потока данных в этом процессе передачи достаточно проста для понимания. MetaTrader выступает источником данных, где находятся данные, необходимые для тщательного анализа и принятия прибыльных торговых решений; эти данные передаются на прокси-сервер, размещенный на облачной платформе pythonanywhere.com. Прокси-сервер записывает полученные данные в авторизованную Google Таблицу, используя пакеты аутентификации Google и учетные данные, созданные из ключа сервисного аккаунта Google. Более наглядно этот процесс показан на следующей диаграмме.

поток данных из MetaTrader на прокси-сервер и в таблицы

Это один из бесплатных и безопасных способов передачи данных из MetaTrader в Google Таблицы. Прокси-сервер получает доступ только к авторизованным таблицам — независимо от того, размещен он локально или на проверенной и безопасной облачной платформе, такой как PythonAnywhere. 



Процесс создания ключа сервисного аккаунта 

Google Cloud Console содержит множество богатых по возможностям функций, которые бесплатны и очень полезны. Google Service Accounts — одна из них. Раздел Service Accounts находится в IAM & Admin, как показано ниже:

сервисные аккаунты в IAM & ADMIN

Перед переходом к управлению сервисными аккаунтами убедитесь, что вы создали проект или выбрали один из существующих проектов. Страница сервисных аккаунтов выглядит так, как показано ниже; кнопка Create service account находится в верхней строке.

страница сервисных аккаунтов с кнопкой создания

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

создание Key ID сервисного аккаунта

Кнопка Add key дает возможность создать ключ и скачать учетные данные в формате JSON или P12. Выберите формат JSON — файл будет загружен автоматически и затем будет использоваться на прокси-сервере для аутентификации.

Следующий шаг — включить Sheets API для проекта. Он находится в разделе APIs & Services, как показано ниже; там нужно найти Google Sheets API и включить его.

включение Sheets API

страница выбора для включения Google Sheets API

Последний шаг — добавить созданный выше email сервисного аккаунта в список пользователей, которым предоставлен доступ к таблице, используемой прокси-сервером для передачи данных. 

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



Программа прокси-сервера 

Если вы посмотрели видео, которыми я поделился в разделе о прокси-сервере на pythonanywhere.com, то вам будет проще понять код, который я объясню ниже. Мы напишем простое Flask-приложение, которое будет обновлять Google Таблицу с помощью функций пакета Google Auth и учетных данных ключа сервисного аккаунта.

Прежде всего импортируем в программу необходимые функции библиотек

from flask import Flask, request, jsonify
from google.oauth2 import service_account
from googleapiclient.discovery import build

Указанные выше библиотеки нужно установить с помощью pip если они не установлены в вашей системе или виртуальном окружении. Я также объяснял это в своих видео.

Далее нужно создать объект фреймворка Flask, чтобы позднее в наших программах создавать API-эндпоинты (GET, POST, PUT, DELETE), маршруты и многое другое. Это делает следующая строка.

app = Flask(__name__)

Следующий шаг — указать расположение JSON-файла учетных данных, который был скачан при создании ключа сервисного аккаунта. Также можно задать область доступа (scope), чтобы ограничить ее только нужными объектами, то есть таблицами. Затем на основе учетных данных и области доступа создается объект credentials, который будет использоваться при инициализации клиента Google API.

SERVICE_ACCOUNT_FILE = 'service_account.json'
SCOPES = ['https://www.googleapis.com/auth/spreadsheets']
credentials = service_account.Credentials.from_service_account_file(
    SERVICE_ACCOUNT_FILE, scopes=SCOPES
)

Следующий шаг — определить POST API с именем "update-sheet".

@app.route('/update-sheet', methods=['POST'])
def update_sheet():

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

data = request.json
sheet_id = data['sheet_id']
data_range = data['range']
values = data['values'] 

В приведенном выше коде request — это объект Flask, содержащий информацию, переданную клиентом в POST-запросе, включая JSON-данные. Этот код извлекает идентификатор электронной таблицы, диапазон листа и значения, которые нужно записать в таблицу.

Далее инициализируем пакет клиента Google API, передав созданный выше объект credentials.

service = build('sheets', 'v4', credentials=credentials)

Этот объект service используется для обновления электронной таблицы, определенной извлеченным выше sheet_id.

result = service.spreadsheets().values().update(spreadsheetId=sheet_id, range=data_range, valueInputOption='RAW', body={'values': values}).execute()

Приведенный выше код указывает сервису клиента Google API выполнить обновление электронной таблицы переданными значениями в указанном диапазоне. Полный код с append API приложен для дальнейшего изучения; в нем вы найдете дополнительный append API, а также код проверки имени листа и создания листа, если он не существует. При желании можно добавить больше API-эндпоинтов, например delete и другие.


Программа MetaTrader 

Фактическая программа mq5 содержит экспорт информации о терминале, информации о счете, истории сделок и истории ордеров, а также блок входных параметров, где пользователи могут выбрать, какую информацию передавать. Я объясню код только для информации о счете. Ниже приведена функция, в которой мы используем заголовочный файл AccountInfo.mqh для извлечения данных счета и форматирования этих данных в строковый массив. Затем он используется в функции StringToCharArray для создания массива char, необходимого сетевой функции WebRequest. 

#include <Trade\AccountInfo.mqh>
string GetAccountInfo() {
   CAccountInfo accountInfo;
   string account_info = "[\"symbol\", \"name\", \"currency\", \"company\", \"balance\", \"credit\", " +
      "\"profit\", \"equity\", \"margin\", \"login\", \"trade_mode\", \"leverage\", \"limit_orders\", \"margin_mode\"]";
   StringAdd(account_info, StringFormat(
      ", [\"%s\", \"%s\", \"%s\", \"%s\", \"%f\", \"%f\", \"%f\", \"%f\", \"%f\", \"%d\", \"%d\", \"%d\", \"%d\", \"%d\"]",
      Symbol(),
      accountInfo.Name(), accountInfo.Currency(), accountInfo.Company(),
      accountInfo.Balance(), accountInfo.Credit(), accountInfo.Profit(), accountInfo.Equity(), accountInfo.Margin(),
      accountInfo.Login(), accountInfo.TradeMode(), accountInfo.Leverage(), accountInfo.LimitOrders(),
      accountInfo.MarginMode()
   ));
   return account_info;
}

Приведенная выше функция подготавливает только данные информации о счете. В полном приложенном коде ProxyExport.mq5 есть еще три функции для подготовки данных о терминале, истории сделок и истории ордеров. После подготовки данных мы передаем их в следующую функцию WriteToGoogleSheet, где выполняются дополнительные операции со строками и вызывается SheetExporter.

void WriteToGoogleSheet(string terminalInfos, string historicalDeals, string historicalOrders, string accountInfos) {
   if(terminalInfos != NULL) {
      StringReplace(terminalInfos, "\\", "/");
      SheetExporter(terminalInfoName, terminalInfos);
   }
   if(historicalDeals != NULL) {
      SheetExporter(historyDealsName, historicalDeals);
   }
   if(historicalOrders != NULL) {
      SheetExporter(historyOrdersName, historicalOrders);
   }
   if(accountInfos != NULL) {
      SheetExporter(accountInfoName, accountInfos);
   } 
}

void SheetExporter(string sheetName, string data) {
   string headers = "Content-Type: application/json\r\n";
   char postData[], result[];
   string responseHeaders;
   string jsonDataWithSheetName = StringFormat("{\"spreadSheetId\": \"%s\", \"sheetName\": \"%s\", \"data\": [%s]}", spreadSheetId, sheetName, data);
  
   // Convert to char array
   StringToCharArray(jsonDataWithSheetName, postData, 0, StringLen(jsonDataWithSheetName), CP_UTF8);
   
   // Send POST request
   int res = WebRequest("POST", proxyServerUrl, headers, 5000, postData, result, responseHeaders);
   
   // Check response
   if(res != 200) {
     Alert("Account Infos not exported to Google Sheets returned error ", res, " and get last error is ", GetLastError());
   }
}

Функция SheetExporter добавляет spreadSheetId и sheetName к данным в JSON-строке, которая отправляется на прокси-сервер. Важно помнить, что URL прокси-сервера нужно добавить в раздел "Разрешить WebRequest для следующих URL:" в меню Сервис -> Настройки. Тот же URL прокси-сервера нужно вставить в следующее поле входных параметров.

выбор параметров при запуске скрипта в MetaTrader

 

Демонстрация потока данных 

Следуйте процессу, который я описал выше в разделе "Процесс создания ключа сервисного аккаунта", чтобы создать ключ сервисного аккаунта и скачать JSON-файл, необходимый для авторизации прокси-сервера в электронной таблице, куда вы хотите экспортировать данные MetaTrader. Затем вы можете либо развернуть собственный прокси-сервер, либо использовать pythonanywhere.com или любую другую удобную вам платформу для выполнения кода service_accounts_proxy.py и размещения update API. Помните, что код можно изменять под свои потребности.

Последний шаг — скомпилировать код ProxyExport.mq5 и запустить ex5 на графике. Вы получите параметры выбора данных для экспорта, а также поля ввода для API и идентификатора электронной таблицы; без них экспорт не будет работать.

Я постарался показать весь процесс создания учетных данных ключа сервисного аккаунта, включения Google Sheets для сервисного аккаунта и предоставления доступа к Google Таблице email-адресу сервисного аккаунта.

сервисные аккаунты в консоли и предоставление доступа к Google Таблицам

В следующей GIF-анимации я постарался показать все необходимые действия на pythonanywhere.com, которые нужно выполнить.

шаги, которые нужно выполнить на pythonanywhere

Также я постарался показать все шаги, которые нужно выполнить в MetaEditor и MetaTrader, чтобы экспорт заработал. В следующей GIF-анимации показана автоматическая передача информации MetaTrader в Google Таблицу в реальном времени.

экспорт из MetaTrader на прокси-сервер и в таблицу


Торговая аналитика с помощью Google Таблиц

У меня есть следующие исторические торговые данные, экспортированные в Google Таблицу. Я включил только 9 строк.

таблица истории сделок

Здесь значение Pips рассчитывается как (Exit Price - Entry Price) * multiplier, где multiplier равен 100 для пар с JPY и 10000 для остальных. Значение Profit рассчитывается как Pips * Lot Size * 10, а Cumulative Profit — как (previous Cumulative Profit + current Profit).

В соответствии с тем, как я написал код, имя приведенного выше листа — History_Deals. Вы можете изменить его под свои потребности. Затем мы можем создать еще один лист, назвать его matrices и создать метки и формулы, как показано ниже.

Метки Формулы
Всего сделок
=COUNTA(History_Deals!A2:A)
Прибыльные сделки
=COUNTIF(History_Deals!K2:K,">0")
Убыточные сделки
=COUNTIF(History_Deals!K2:K,"<0")
Процент прибыльных сделок
=FIXED(B2/A2 * 100, 2)
Процент убыточных сделок
=FIXED(C2/A2 * 100, 2)
Средняя прибыль
=FIXED(AVERAGEIF(History_Deals!K2:K,">0"), 2)
Средний убыток =FIXED(AVERAGEIF(History_Deals!K2:K,"<0"), 2)
Соотношение риск/прибыль
=FIXED(F2/ABS(G2), 2)
Математическое ожидание
=FIXED((D2/100*F2)-(E2/100*G2), 2)
Общая прибыль
=SUM(History_Deals!K2:K)
Профит-фактор
=SUMIF(History_Deals!K2:K,">0")/ABS(SUMIF(History_Deals!K2:K,"<0"))
Максимальная просадка
=MIN(History_Deals!L2:L)-MAX(FILTER(History_Deals!L2:L,History_Deals!L2:L<MIN(History_Deals!L2:L)))

Кратко объясню метрики, использованные в таблице выше.

  • Всего сделок — это общее количество успешно завершенных сделок. Чем больше это число, тем надежнее и точнее статистика.
  • Прибыльные сделки — это количество сделок, закрытых с прибылью. Это число показывает количество ваших правильных решений.
  • Убыточные сделки — это количество сделок, закрытых с убытком. Это число показывает количество ваших неправильных решений.
  • Процент прибыльных сделок — это доля прибыльных закрытий, а процент убыточных сделок — доля сделок, закрытых с убытком. Важно помнить, что высокий Win Rate не всегда означает прибыльность. Трейдеры могут быть прибыльными при правильном соотношении риск/прибыль даже с Win Rate 30–40%.
  • Средняя прибыль и средний убыток показывают, сколько вы зарабатываете, когда правы, и сколько теряете, когда ошибаетесь. Стратегию следует строить так, чтобы средний убыток всегда оставался низким.
  • Соотношение риск/прибыль — это отношение средней прибыли к среднему убытку. Цель трейдера — поддерживать его выше 1. Золотое правило — держать его в диапазоне от 1,5 до 2:1.
  • Математическое ожидание — это средняя прибыль на сделку. Например, если значение равно 20, то за 100 сделок вы получите 2000.
  • Общая прибыль — это сумма всех прибылей и убытков. 
  • Профит-фактор — показатель общей прибыльности. Трейдерам следует стремиться держать его выше 1,5.
  • Максимальная просадка — это наибольшее падение накопленной прибыли от ее пика. Трейдерам следует стремиться сделать ее как можно меньше.

После применения всех формул получаем следующую таблицу.

Всего сделок Прибыльные сделки Убыточные сделки Процент прибыльных сделок Процент убыточных сделок Средняя прибыль Средний убыток Соотношение риск/прибыль Математическое ожидание Общая прибыль Профит-фактор Максимальная просадка
9 7 2 77.78 22.22 285.71 -400.00 0.71 311.11 1200 2.5 200

Мы можем оценить устойчивость и последовательность нашей торговли, построив линейный график накопленной прибыли, как показано ниже: перейдите в Insert → Chart → Line Chart, выберите накопленную прибыль по вертикальной оси и дату закрытия по горизонтальной оси.

график equity

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

круговая диаграмма прибыльных и убыточных сделок

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

эффективность пар на столбчатой диаграмме

В Google Таблицах можно делать множество подобных вещей.


Заключение

Трейдеры могут использовать это решение, чтобы без лишних усилий и безопасно передавать свои данные MetaTrader в Google Таблицу и получать пользу от инструментов визуализации Google Таблиц. Это решение позволяет экспортировать данные MetaTrader в Google Таблицы для ведения журнала или дальнейшего анализа, используя свободно доступные средства. В статье показано, как развернуть собственный прокси-сервер, в том числе на облачных решениях вроде pythonanywhere.com. Облачные решения всегда безопасны и масштабируемы. Здесь также предпринята попытка модульно организовать программу MetaTrader, чтобы обеспечить гибкость выбора и упростить добавление новых функций, например данных журнала тестера стратегий для дальнейшего анализа и многого другого.

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

Я приложил исходный код прокси-сервера и скрипта MetaTrader.

Имя файла Описание
service_accounts_proxy.py Это простое Flask-приложение с update и append API.
ProxyExport.mq5 Это приложение MetaTrader с выбором данных для экспорта.

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

Прикрепленные файлы |
ProxyExport.mq5 (9.99 KB)
Последние комментарии | Перейти к обсуждению на форуме трейдеров (2)
Chioma Obunadike
Chioma Obunadike | 28 авг. 2025 в 09:30
Можно выполнять те же функции на MQL, зачем использовать Python?
Ramesh Maharjan
Ramesh Maharjan | 29 авг. 2025 в 05:05
Chioma Obunadike #:
Можно выполнять те же функции на MQL, зачем использовать Python?

Можем ли мы использовать библиотеки google, как я использовал в python-сервере, в MQL? Если это возможно, то поделитесь, пожалуйста, ссылкой на то, как это можно сделать на MQL. Буду благодарен за новый способ.

Повышение эффективности торговли с использованием Smart Money Concepts (SMC): OB, BOS и FVG Повышение эффективности торговли с использованием Smart Money Concepts (SMC): OB, BOS и FVG
Повысьте эффективность торговли с помощью Smart Money Concepts (SMC), объединив блоки ордеров (Order Blocks, OB), пробой структуры (Break of Structure, BOS) и разрывы справедливой стоимости (Fair Value Gaps, FVG) в одном мощном советнике. Выбирайте автоматическое исполнение или работайте с отдельной концепцией SMC для более гибкой и точной торговли.
CRUD-операции в Firebase с использованием MQL CRUD-операции в Firebase с использованием MQL
В этой статье представлено пошаговое руководство по освоению CRUD-операций (Create, Read, Update, Delete — создание, чтение, обновление и удаление) в Firebase с акцентом на Realtime Database и Firestore. Вы узнаете, как использовать методы Firebase SDK для эффективного управления данными в веб- и мобильных приложениях: от добавления новых записей до запросов, изменения и удаления элементов. Также рассмотрены практические примеры кода и лучшие подходы к структурированию и обработке данных в реальном времени, что помогает разработчикам создавать динамические и масштабируемые приложения на гибкой NoSQL-архитектуре Firebase.
Моделирование рынка: Первые шаги на SQL в MQL5 (IV) Моделирование рынка: Первые шаги на SQL в MQL5 (IV)
Многие люди склонны недооценивать SQL или даже вообще не использовать его, потому что не до конца понимают, как он на самом деле работает. При выполнении запросов к базе данных SQL мы не всегда ищем универсальный ответ, а в некоторых случаях нам нужен очень конкретный и практичный ответ. Если создать базу данных с надлежащей структурой и моделью данных, в неё можно будет интегрировать практически любые типы информации.
Торговые инструменты MQL5 (Часть 22): Построение гистограммы и функции вероятностной массы (PMF) биномиального распределения Торговые инструменты MQL5 (Часть 22): Построение гистограммы и функции вероятностной массы (PMF) биномиального распределения
В этой статье разрабатывается интерактивный график на MQL5 для биномиального распределения, объединяющий гистограмму смоделированных исходов с теоретической функцией массы вероятности. Он реализует расчеты среднего значения, стандартного отклонения, коэффициента асимметрии, коэффициента эксцесса, процентилей и доверительных интервалов, а также настраиваемые темы и метки, поддерживает перетаскивание, изменение размера и изменение параметров в реальном времени. Используйте его для оценки ожидаемых выигрышных сделок, вероятных просадок и доверительных диапазонов при проверке торговых стратегий.