English 中文 Español Deutsch 日本語
preview
Как создать торговый журнал с помощью MetaTrader и Google Sheets

Как создать торговый журнал с помощью MetaTrader и Google Sheets

MetaTrader 5Примеры |
431 13
Sara Sabaghi
Sara Sabaghi

Содержание

Концепция

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


Введение

Система торговых журналов Google Sheets (или «Google Таблицы») служит незаменимым ресурсом для трейдеров всех уровней, облегчающим организованное отслеживание их торговой деятельности. Если вы хотите добиться успеха в качестве дневного трейдера, ведение торгового журнала очень значимо. Невозможно улучшить то, чего не измерить. Система позволяет пользователям придерживаться структурированного подхода к своим сделкам, предлагая информацию, имеющую решающее значение для оценки и повышения эффективности работы. Доступность и простота использования данной системы повышаются благодаря функциям совместной работы Google Sheets, позволяющим трейдерам делиться своими журналами или запрашивать отзывы коллег. Используя данную систему, трейдеры могут развивать дисциплину, отслеживать свои психологические факторы и, в конечном счете, повышать свои шансы на успех на финансовых рынках.

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

Мы расскажем, как автоматически отправлять пользовательские данные по протоколу HTTP POST в Google Sheet. Мы также узнаем, как можно прочитать или  получить их с помощью HTTP-запроса в MetaTrader.



Доступные решения

Для реализации торгового журнала нам необходимо перенести наши торговые данные в базу данных для последующего анализа.  С другой стороны, нам нужно иметь доступ к этой базе данных, загружать информацию и использовать её. Эта база данных может быть в любой форме, например, файл Excel, файл в формате CSV, сервер  MySQL  или  Microsoft SQL, файл в формате  JSON  или  даже  любой  обычный текстовый файл, где нужные данные сохраняются построчно. В зависимости от того, к какому типу относится ваша база данных, дизайн и разработка вашей системы различаются.

У нас есть несколько типов решений.

  1. Google Sheets: Ведение торгового журнала можно упростить с помощью Google Sheets. Это простой в использовании интерфейс для мониторинга важных показателей, таких как сделки, точки входа и выхода, прибыли и убытки, а также торговые заметки. Используя общедоступный торговый журнал Google Sheet, трейдеры могут систематизировать свои сделки и собирать статистику, чтобы извлечь уроки из своего опыта. Кроме того, Google Sheets позволяет настраивать журнал таким образом, чтобы трейдеры могли адаптировать его к своим конкретным стратегиям.
  2. Торговые журналы с использованием Python и интерфейса прикладной программы:  Для трейдеров, желающих иметь более сложное решение, автоматизация торгового журнала с использованием Python и приложения Google Sheets может значительно упростить ввод и анализ данных. Такая автоматизация позволяет обновлять данные в режиме реального времени и снижает вероятность человеческой ошибки. Извлекая данные с торговых платформ и автоматически заполняя Google Sheet, трейдеры могут больше сосредоточиться на анализе, а не на ручном вводе данных. Это решение особенно эффективно для тех, кто часто торгует и нуждается в точном и своевременном анализе результатов.
  3. Онлайн торговые журналы:  Различные онлайн торговые журналы сочетают простоту использования и доступность веб-приложений с функциями, позволящими трейдерам регистрировать в логе свои сделки без необходимости вручную управлять электронной таблицей. Однако, за подписку взимается плата. Эти платформы часто оснащены встроенными аналитическими инструментами, способными помочь трейдерам выявлять паттерны в их торговом поведении, потенциально приводя к принятию более обоснованных решений.

Мы выбираем Google Sheets в качестве нашей базы данных на основе Excel по двум ключевым причинам: Во-первых, это приложение является простым и легкодоступным для понимания. Во-вторых, Google Sheets по своей сути является онлайн-базой данных, доступ к которой можно получить из любого места и с любого компьютера, просто перейдя по ссылке. Чтобы сделать данные доступными онлайн, нет необходимости создавать дополнительную инфраструктуру.


Что такое Google spreadsheet (электронная таблица Google)

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

Основными функциями и преимуществами использования Google Sheets являются:

  • Файлы автоматически сохраняются на Google Диске, что делает их доступными с любого устройства, подключенного к Интернету.
  • Множество пользователей могут работать с одним и тем же файлом одновременно и мгновенно видеть изменения друг друга.
  • Установка программного обеспечения не требуется; для этого требуется только браузер и учетная запись в Google.
  • Пользователи могут импортировать и экспортировать данные в таких форматах, как Excel, CSV и PDF.
  • Редактор поддерживает широкий спектр функций для анализа данных, аналогичных Excel.
  • Google sheets поддерживает скрипты. Функция автоматизации также доступна с помощью API-решений.

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


Интерфейс прикладной программы Google spreadsheet (электронная таблица Google)

Интерфейс прикладной программы Google Sheets - это интерфейс RESTful, позволяющий считывать и изменять данные электронной таблицы. Наиболее распространенные способы использования этого API включают в себя следующие задачи:

  • Создание электронных таблиц
  • Чтение и запись значений ячеек электронной таблицы
  • Обновление форматирования электронной таблицы
  • Управление связанными таблицами

Использование API для Google Sheets требует выполнения сложных действий и наличия учетной записи Google Developer Account стоимостью 300 долларов США.

Но на этом мы не заканчиваем, мы предоставляем вам простое и бесплатное решение. Давайте разберемся шаг за шагом:


Создание новой таблицы Google Sheet

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

    • ticket: Тикет. Здесь будет сохранен уникальный идентификатор для каждой сделки.
    • order: Ордер. В этом столбце будет отслеживаться, является ли сделка ордером на покупку или продажу.
    • symbol: Символ, мы запишем торговый инструмент, такой как валютные пары, например, EURUSD или GBPJPY.
    • openprice: Здесь будет храниться цена, по которой открыта сделка.
    • sl: Соответствует значению стоп-лосса, установленному для сделки
    • tp:Соответствует значению тейк-профита, установленному для сделки
    • close: В этом столбце будет указано, была сделка закрыта или нет.
    • lot: Здесь вы зафиксируете размер лота, который представляет собой объем сделки.
    • opentime: В этом столбце будет указано точное время открытия сделки.

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

spreadsheet initiate


Создание с использованием Google Apps Script

Чтобы добавить функциональность в Google Sheet, следующим шагом будет создание Google Apps Script. Google Apps Script позволяет писать пользовательский код, который автоматизирует задачи и подключает сервисы Google, делая его идеальным инструментом для привязки вашей электронной таблицы к внешним платформам.

Для этого:

  • В своих таблицах Google Sheets нажмите на меню “Extensions” вверху.
  • В выпадающем меню выберите “Apps Script”. Это действие откроет новую вкладку, которая приведет вас к интерфейсу Google Apps Script, где можно писать и редактировать код для автоматизации взаимодействия с вашей таблицей.
  • После открытия редактора Apps Script вы увидите пустой редактор скриптов. Рекомендуется дать вашему проекту осмысленное название, чтобы его было легко идентифицировать в будущем.
  • Можно назвать его как-нибудь типа “мой первый журнал” или “моя функция списка сделок”, как вам больше нравится.
  • После открытия редактора Google Apps Script и названия вашего проекта, следующим шагом будет изменение скрипта путем удаления отображаемого по умолчанию кода.  По умолчанию Google Apps Script включает в себя простой шаблон функции с именем  “myFunction”, который нам не понадобится для нашего проекта.

App Script

Итак, удалите эту функцию по умолчанию, затем скопируйте и вставьте приведенную ниже функцию и замените функцию по умолчанию вашим пользовательским скриптом, приведенным ниже:

// Original code from https://github.com/jamiewilson/form-to-google-sheets
const sheetName = 'Sheet1'
const scriptProp = PropertiesService.getScriptProperties();

function initialSetup() {  
const activeSpreadsheet = SpreadsheetApp.getActiveSpreadsheet();
scriptProp.setProperty('key', activeSpreadsheet.getId());
}

function doPost (e) {  
  const lock = LockService.getScriptLock();
  lock.tryLock(10000);
  
  try {    
    const doc = SpreadsheetApp.openById(scriptProp.getProperty('key'));    
    const sheet = doc.getSheetByName(sheetName);
    const headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0];
    const nextRow = sheet.getLastRow() + 1;
    const newRow = headers.map(function(header) {      
      return header === 'Date' ? newDate() : e.parameter[header];
    })
 
    sheet.getRange(nextRow, 1, 1, newRow.length).setValues([newRow]);

    return ContentService      
      .createTextOutput(JSON.stringify({ 'result': 'success', 'row': nextRow }))
      .setMimeType(ContentService.MimeType.JSON);
  }
  catch (e) {
    return ContentService
      .createTextOutput(JSON.stringify({ 'result': 'error', 'error': e }))
      .setMimeType(ContentService.MimeType.JSON);
  }
  finally {
    lock.releaseLock();
  }}

Спасибо  Джейми Уилсону (Jamie Wilson) за то, что мы использовали его код (form-to-google-sheets) для нашего проекта

Теперь перед переходом к следующему шагу сохраните проект. Файл (File) > иконка Сохранить (Save)

Данная функция является частью редактора Google Apps Script, который подключает Google Form или внешний запрос HTTP POST к Google Sheet, позволяя динамически сохранять данные в таблице.

Ниже приведена разбивка компонентов функции:

sheetName: это глобальная переменная, которая ссылается на нашу новую электронную таблицу, созданную ранее. Имя таблицы по умолчанию - “sheet1” .

scriptProp: Используется для сохранения свойств, относящихся к конкретному сценарию, через службу PropertiesService в Google Apps Script, обеспечивая постоянное хранение таких значений, как идентификатор электронной таблицы.

initialSetup: С помощью этой функции мы извлекаем текущую активную электронную таблицу Google Spreadsheet, используя SpreadsheetApp.getActiveSpreadsheet(), затем сохраняем уникальный идентификатор электронной таблицы в свойствах скрипта, используя scriptProp.setProperty('key', activeSpreadsheet.getId()). Это позволяет другим частям скрипта позже получить доступ к электронной таблице по идентификатору.

doPost, - наша основная функция, которая обрабатывает входящие HTTP POST-запросы, сопоставляя полученные данные с таблицей Google Sheet. Сначала она получает блокировку, чтобы предотвратить проблемы с одновременной записью, затем извлекает целевую электронную таблицу по сохраненному идентификатору и идентифицирует корректную таблицу. Функция считывает заголовки из первой строки, чтобы сопоставить входящие данные с соответствующими столбцами, добавляет данные в следующую доступную строку и обрабатывает заголовок “Date (Дата)”, автоматически вставляя текущую дату. Она возвращает сообщение об успешном выполнении в формате JSON, если операция завершена, или сообщение об ошибке, если возникают какие-либо проблемы, и, наконец, снимает блокировку.



Запуск функции настройки

Поскольку этот скрипт не проверен Google, прежде чем вы сможете продолжить он выдаст предупреждение.  Это стандартная процедура для непроверенных скриптов.

Для надлежащего исполнения этой функции и настройки Google Apps Script, выполните следующие действия:

  1. Нажмите на значок запуска Run рядом со значком сохранения Save.
  2. Появится модальное окно с надписью “Требуется авторизация (Authorization required)”. Нажмите на “Просмотреть разрешения (Review permissions)”, чтобы перейти к следующему экрану, где нужно будет авторизовать скрипт для доступа к вашей учетной записи в Google.
  3. Выберите учетную запись Google, которую вы хотите использовать с этим скриптом. Это учетная запись, которая предоставит необходимые разрешения.
  4. На следующем экране можно видеть сообщение о том, что “Google не проверил это приложение (Google hasn’t verified this app)”.  Это обычное предупреждение для скриптов, не прошедших процедуру верификации в Google. Чтобы продолжить, нажмите на кнопку “Дополнительно (Advanced)”.
  5. После нажатия кнопки Advanced вы увидите опцию ”Перейти к проекту без названия (небезопасно) (Go to Untitled project (unsafe)". Это сообщение указывает на то, что, хотя скрипт не проверен, вы по-прежнему разрешаете ему доступ к своей учетной записи в Google. Для продолжения нажмите на эту ссылку.
  6. Наконец, вам будет предложено предоставить разрешения для скрипта. Просмотрите запрашиваемые разрешения и нажмите кнопку “Разрешить (Allow)”, чтобы разрешить скрипту взаимодействовать с вашим Google Sheet и другими сервисами Google.

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


Для этого:

  1. Для открытия интерфейса управления триггером, на странице редактора Google Apps Script, на левой боковой панели, нажмите “Триггеры” (Triggers).  Данный раздел позволяет настроить, когда и как должен выполняться ваш скрипт.
  2. На странице триггеров нажмите на кнопку “Добавить триггер” (Add Trigger). Эта кнопка обычно обозначается значком “плюс” (+) или явно обозначается как "Добавить триггер» (Add Trigger).
  3. Появится новое диалоговое окно, в котором можно настроить параметры вашего триггера. В ответ на HTTP POST-запрос, для активации вашей функции (do Post) необходимо настроить триггер.
  4. В качестве источника события выберите “Из веб-приложения” (From the web app) или “Веб-приложение” (Web app) (точный вариант может варьироваться в зависимости от обновлений интерфейса Google Apps Script).
  5. Из выпадающего меню выберите функцию, которую вы хотите запустить. В данном случае выберите doPost.
  6. Выберите, какое развертывание следует выполнить:  Head
  7. Выберите источник события:  From spreadsheet
  8. Установите тип события на “При отправке формы” (On form submit). Такая конфигурация позволяет запускать ваш скрипт в ответ на HTTP POST-запрос, отправленный на URL веб-приложения.

Затем нажмите СОХРАНИТЬ (SAVE). Если для этого требуются разрешения, вы должны принять их в своей учетной записи в Google.


Публикация проекта в виде веб-приложения

Теперь нам нужно опубликовать проект, нажав синюю кнопку "Развернуть" (Deploy) на странице приложения и выбрав "Новое развертывание" (New Deployment) из выпадающего списка.

Затем нажмите на значок “Выбрать тип” (Select type) и выберите  "Веб-приложение» (Web app).

В появившейся форме выберите следующие опции:

  • Описание:  Это может быть все, что угодно. Просто сделайте его дескриптивным.
  • Web app → Исполнить как:  Я
  • Web app → Кто имеет доступ:  Любое лицо

После этого нажмите «Развернуть» (Deploy).

Важно:  На следующей появившейся странице скопируйте URL веб-приложения. Мы используем эту ссылку в нашем проекте. Ваша ссылка будет выглядеть примерно так:

Ссылка на проект: https://script.google.com/macros/s/AfycbxWxYnDPsdvsvsdvdv236545OfgVnadvkvsASDCV6541scsSDHNfnqPeVkyH5A-r5eDhg/exec


Как разместить (записать) данные в электронные таблицы Google

HTTP POST это метод, используемый протоколом HTTP для отправки данных от клиента серверу. Обычно он используется при отправке данных в форме на веб-сайтах. Вы видите их много в Интернете, точно так же, как форму входа в систему на веб-сайте MQL.

Данные передаются в теле запроса, в отличие от метода GET, где данные передаются по URL-адресу. При использовании метода post   данные не отображаются в URL-адресе, что делает его немного более безопасным, а размер отправляемых данных не ограничен и позволяет отправлять большие файлы или данные.

Просто для тестирования нашей функции sheet script мы создаем простую  HTML-форму, которая используется для сбора тестовых данных и отправки их на сервер для обработки. Для метода отправки форм должно быть установлено значение POST.

Приведенная ниже базовая HTML-форма содержит:

Action (действие): должно быть установлено ссылкой на проект (Из предыдущих шагов по выполнению публикации)

Method (метод): Это метод размещения формы, который может быть использован в методе GET или POST.

При написании скрипта нашего приложения в Google sheet с помощью метода post, мы используем post для отправки данных в Google.

input (ввод): включены все типы данных, которые мы хотим отправить.

Вот окончательная HTML-форма:

<!DOCTYPE html>
<htmllang="en">
<head>
<metacharset="UTF-8">
</head>
<body>
<form method="post" action="https://script.google.com/macros/s/AfycbxWxYnDPsdvsvsdvdv236545OfgVnadvkvsASDCV6541scsSDHNfnqPeVkyH5A-r5eDhg/exec">
<input type="number" size="20" name="ticket" placeholder="ticket">
<input type="text" size="20" name="order" placeholder="order">
<input type="text" size="20" name="symbol" placeholder="symbol"><br>
<input type="number" step="0.00001" size="20" name="openprice" placeholder="openprice">
<input type="number" step="0.00001" size="20" name="sl" placeholder="stoploss">
<input type="number" step="0.00001" size="20" name="tp" placeholder="takeprofit"><br>
<input type="number" step="0.00001" size="20" name="close" placeholder="close price">
        <input type="number" step="0.01" size="20" name="lot" placeholder="volume">
        <input type="datetime-local" size="20" name="opentime" placeholder="opentime">
<input type="submit" value="post">
</form>
</body>
</html>

Скопируйте и вставьте этот текст в локальный текстовый файл и переименуйте формат файла в HTML-файл. Следующим образом:  “newfile.html”

Также замените адрес действия формы на адрес ссылки на ваш проект электронной таблицы.

Теперь нам легко удалось отправить нужные данные в Google sheet.

Заполните форму, нажмите "Опубликовать" и дождитесь обновления вашей электронной таблицы Google.


Html form to Google Sheets

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

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


Как читать электронные таблицы Google и получать к ним доступ с помощью метода HTTP

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

Откройте Google sheet, найдите свою созданную ранее таблицу, и откройте её.

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

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

https://docs.google.com/spreadsheets/d/1rYNuscaYWtRu_65W-fPnascNTYHwcU-3fWiNQ4asTBHQo/edit

Выделенный жирным шрифтом текст - это ваш идентификатор таблицы

Нам нужен этот идентификатор, чтобы прочитать таблицу в формате JSON.

Ссылка для доступа: https://docs.google.com/spreadsheets/d/{YOUR_SHEET_ID}/gviz/tq?tqx=out:json&tq&gid='+gid

{YOUR_SHEET_ID} - идентификатор вашей электронной таблицы, который можно найти в URL-адресе вашей таблицы.

Скопируйте идентификатор из URL-адреса таблицы и замените {YOUR_SHEET_ID}  на  Ссылку доступа. Ссылка доступа будет выглядеть следующим образом:

https://docs.google.com/spreadsheets/d/1rYNuscaYWtRu_65W-fPnascNTYHwcU-3fWiNQ4asTBHQo/gviz/tq?tqx=out:json&tq&gid='+gid

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

Вот результат:

google.visualization.Query.setResponse(
{
    "version": "0.6",
    "reqId": "0",
    "status": "ok",
    "sig": "529900317",
    "table":
    {
        "cols": [
        {
            "id": "A",
            "label": "ticket",
            "type": "number",
            "pattern": "General"
        },
        {
            "id": "B",
            "label": "order",
            "type": "string"
        },
        {
            "id": "C",
            "label": "symbol",
            "type": "string"
        },
        {
            "id": "D",
            "label": "openprice",
            "type": "number",
            "pattern": "General"
        }],
        "rows": [
        {
            "c": [
            {
                "v": 5.64123564E8,
                "f": "564123564"
            },
            {
                "v": "buy"
            },
            {
                "v": "EURUSD"
            },
            {
                "v": 1.2215,
                "f": "1.2215"
            },
            {
                "v": 1.21,
                "f": "1.21"
            },
            {
                "v": 1.23,
                "f": "1.23"
            },
            {
                "v": 0.0,
                "f": "0"
            },
            {
                "v": 0.01,
                "f": "0.01"
            },
            {
                "v": "Date(2024,8,11,18,27,0)",
                "f": "2024-09-11 18:27"
            }, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
            {
                "v": null
            }]
        },
        {
            "c": [
            {
                "v": 123123.0,
                "f": "123123"
            },
            {
                "v": "sell"
            },
            {
                "v": "USDJPY"
            },
            {
                "v": 147.22,
                "f": "147.22"
            },
            {
                "v": 147.44,
                "f": "147.44"
            },
            {
                "v": 146.0,
                "f": "146"
            },
            {
                "v": 0.0,
                "f": "0"
            },
            {
                "v": 0.02,
                "f": "0.02"
            },
            {
                "v": "Date(2024,8,4,20,43,0)",
                "f": "2024-09-04 20:43"
            }, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
            {
                "v": null
            }]
        }],
        "parsedNumHeaders": 1
    }
});

Он содержит все названия столбцов, номера и значения. Все приведенные выше данные относятся только к 2 строкам сведений о позиции.

Мы используем этот JSON-файл для чтения таблицы в нашем советнике.

Давайте перейдем к самой интересной части истории - автоматической реализации всего, о чем мы говорили, в платформе Metatrader


Реализация и обновление инструментов для нашего торгового журнала с помощью MetaTrader

Для реализации торгового журнала Google Sheet с помощью MetaTrader, в процессе участвуют следующие этапы.

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

Затем используем Google Apps Script, чтобы таблица могла взаимодействовать с внешними системами посредством HTTP-запросов. И это мы уже делали ранее.

Теперь в MetaTrader мы напишем пользовательский советник, который отправляет торговые данные (такие как символ, объем и тип ордера) в Google Sheet, используя функцию WebRequest и протокол HTTP POST. Таблица действует как облачная база данных и позволяет нам отслеживать, хранить и обмениваться сделками в режиме реального времени на разных счетах и в разных местах.


Создание советника для публикации данных

Нам нужен советник для отправки информации о позициях и ордерах в Google sheet.

Итак, нам надо записать главную часть в наш код.

  1. Функция, выполняющая эту задачу, проверяет открытые  позиции  и отложенные ордера на счете в MetaTrader. Мы называем её “OrderList”.
  2. Функция с задачей отправки данных  OrderList в нашу таблицу Google посредством функции WebRequest. Мы называем её “UpdateDatabase.


Получение списка текущих ордеров и позиций

Наша функция “OrderList” может иметь следующую структуру:

void OrderList {
   for(int conter = PositionsTotal() - 1; conter >= 0; conter -= 1)
   {
      const ulong ticket = PositionGetTicket(conter);
      if(ticket == 0 || !PositionSelectByTicket(ticket)) continue;
      string   symbol      =  PositionGetString(POSITION_SYMBOL);
      int      order_type  =  PositionGetInteger(POSITION_TYPE);
      double   volume      =  PositionGetDouble(POSITION_VOLUME);
      double   open_price  =  PositionGetDouble(POSITION_PRICE_OPEN);
      datetime open_time   =  PositionGetInteger(POSITION_TIME);
      double   stop_loss   =  PositionGetDouble(POSITION_SL);
      double   take_profit =  PositionGetDouble(POSITION_TP);      
      // Send trade details via WebRequest
      UpdateDatabase(symbol, order_type, volume, open_price, stop_loss, take_profit, ticket, open_time);
   }
} 

а для MQL4 код мог бы иметь следующий вид:

void OrderList {
   // Loop through all open trades
   for(int conter = OrdersTotal() - 1; conter >= 0; conter -= 1) {
      if(OrderSelect(conter, SELECT_BY_POS, MODE_TRADES)) {
         // Collect trade data
         int      ticket      =  OrderTicket();
         string   symbol      =  OrderSymbol();
         int      order_type  =  OrderType();
         double   volume      =  OrderLots();
         double   open_price  =  OrderOpenPrice();
         datetime open_time   =  OrderOpenTime();
         double   stop_loss   =  OrderStopLoss();
         double   take_profit =  OrderTakeProfit();
         // Send trade details via WebRequest
         UpdateDatabase(symbol, order_type, volume, open_price, stop_loss, take_profit, ticket, opentime);
      }
   }
}

Этот код функции содержит цикл, начинающийся с 0 до общего количества открытых ордеров OrdersTotal() или  PositionsTotal().

Каждый цикл выбирает позицию или ордера из списка ордеров MetaTrader, а затем выбирает их с помощью функции  OrderSelect.

Затем мы считываем нужную информацию с помощью  PositionGetString, PositionGetDouble и PositionGetInteger.

Все подробности, которые нужны в отношении других данных, можно найти здесь Торговые функции на MQL4 и Торговые функции на MQL5.


Отправка данных списка ордеров в Google Sheet

После получения информации обо всех ордерах из функции предварительного просмотра “OrderList”,  нам понадобится другая функция под названием  “UpdateDatabase” , чтобы перенести данные OrderList в нашу таблицу.

Информация о позиции, такая как символ, тип ордера, объем, цена открытия, стоп-лосс, тейк-профит и номер тикета в качестве вводных данных функции, затем преобразуется в отформатированную строку. Затем эти данные отправляются с помощью HTTP POST-запроса посредством функции WebRequest(). Если запрос выполнен успешно, она подтверждает, что торговые данные отправлены; если нет, то выводится сообщение об ошибке.

void SendTradeData(string orderSymbol, int orderType, double orderVolume, double openPrice, double stopLoss, double takeProfit, ulong orderTicket, datetime openTime)
{ 
   // Database url. Replace with your own url
   string url  = "https://script.google.com/macros/s/AfycbxWxYnDPsdvsvsdvdv236545OfgVnadvkvsASDCV6541scsSDHNfnqPeVkyH5A-r5eDhg/exec";
   int   digit = (int)SymbolInfoInteger(orderSymbol,SYMBOL_DIGITS);
   string datastring = "?
                  +"&ticket="+string(orderTicket)
                  +"&order="+string(orderType)
                  +"&symbol="+string(orderSymbol)
  +"&openprice="+DoubleToString(openPrice,digit)
                  +"&sl="+DoubleToString(stopLoss,digit)
                  +"&tp="+DoubleToString(takeProfit,digit)
                  +"&close=0"
  +"&lot="+DoubleToString(orderVolume,2)
  +"&opentime="+(string)openTime;   

   int   res;     // To receive the operation execution result
   char  data[];  // Data array to send POST requests  
   char  result[];
   //--- Create the body of the POST request for authorization
   ArrayResize(data,StringToCharArray(datastring,data,0,WHOLE_ARRAY,CP_UTF8)-1);
   ResetLastError();
   res=WebRequest("POST", url, NULL, 0, data, result, str);
   string responsestring   = CharArrayToString(result, 0, 0, CP_UTF8);
   Print(responsestring);
   if(res == -1)
      Print("Error in WebRequest: ", GetLastError());
   else
      Print("Trade data sent: ", data);
}

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

URL-адрес является общедоступным URL-адресом нашей таблицы .

Затем создаем строковую переменную  “datastring в формате метода GET.

С помощью функции  StringToCharArray мы сохраняем строку в массиве с таким именем  data.

Функция WebRequest запускается в следующей строке с помощью метода POST, “url”, нашего массива “data  и строки ответа, хранящейся в переменной  “result”.

Затем преобразуем массив ответа в строку “responsestring”  для вывода в логах вкладки MetaTrader Expert.


Простой анализ нашего списка сделок

Каждый раз при открытии и оформлении ордера, ваша таблица будет обновляться,  и можно анализировать все данные с помощью диаграммы Google sheet analytics.

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

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

https://docs.google.com/spreadsheets/d/1rYcRJKzVWtRu_65W-fPnQgODSzTU-3fWiNQHZz3P2Qo/edit?usp=sharing


Заключение

В настоящей статье нами подробно описан процесс создания торгового журнала с помощью Google Sheets и мы связали его с MetaTrader для автоматического отслеживания данных. Мы рассмотрели настройку Google Sheet, добавление заголовков и использование Google Apps Script для отправки торговых данных с помощью HTTP POST-запросов. Такая система экономит время и уменьшает количество ошибок, упрощая отслеживание сделок в режиме реального времени.

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

Мы подготовили для вас необходимые коды для двух версий MetaTrader 4 и 5.

Если у вас есть какие-либо вопросы или идеи, оставляйте свои комментарии. 

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

Прикрепленные файлы |
Последние комментарии | Перейти к обсуждению на форуме трейдеров (13)
heremita
heremita | 9 окт. 2024 в 13:12

Здравствуйте, я очень неопытен во всем этом, поэтому заранее прошу прощения.

Я не могу заставить его работать.

Вот шаги, которые я предпринял.

- Я создал копию вашего журнала в google sheets.

- Я скачал и запустил предоставленный вами скрипт mt5.

- Я вставил ссылку на свой журнал в google sheet в скрипт.

Никаких сделок в моем журнале не появилось.

Что я делаю не так?

Спасибо!

Sara Sabaghi
Sara Sabaghi | 11 окт. 2024 в 10:31
heremita #:

Здравствуйте, я очень неопытен во всем этом, поэтому заранее прошу прощения.

Я не могу заставить его работать.

Вот шаги, которые я предпринял.

- Я создал копию вашего журнала в google sheets.

- Я скачал и запустил предоставленный вами скрипт mt5.

- Я вставил ссылку на свой журнал в google sheet в скрипт.

Никакие сделки не появляются в моем журнале.

Что я делаю не так?

Спасибо!

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

В предыдущем комментарии размещен код, относящийся к Apps Script. Используйте его внимательно.

Этот код: https: //github.com/jamiewilson/form-to-google-sheets

Выполните шаги "Создание нового листа Google" и "Как разместить (записать) данные в электронных таблицах Google" еще раз. Если вы не справились с этими шагами, вы не сможете перейти к следующим шагам.

Весь код и МОЙ ЖУРНАЛ являются образцом. Вы должны выполнить все шаги самостоятельно.

heremita
heremita | 10 апр. 2025 в 08:52
Sara Sabaghi #:

Коды Google Sheet и программы, входящей в состав Metatrader, чувствительны к малейшим изменениям. Необходимо соблюдать все заглавные и строчные буквы.

В предыдущем комментарии размещен код, относящийся к Apps Script. Используйте его осторожно.

Этот код: https://github.com/jamiewilson/form-to-google-sheets

Выполните шаги "Создание нового листа Google" и "Как разместить (записать) данные в электронных таблицах Google" еще раз. Если вы не справились с этими шагами, вы не сможете перейти к следующим шагам.

Весь код и МОЙ ЖУРНАЛ являются образцом. Вы должны выполнить все шаги самостоятельно.

Здравствуйте, Сара,

Наконец-то у меня появилось время разобраться в этом вопросе.

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

App Scritp работает, когда я ввожу данные вручную в html. Код Mt5 (который я скачал отсюда) не дает мне ни ошибок, ни предупреждений - я аккуратно вставил в него URL своего веб-приложения.

Chatgpt посоветовал добавить URL моего App Script в советнике"Allow WebRequest for listed URL." Но это не помогло.


Я заметил, что проблема в том, что когда я применяю советник к графику, он выглядит активным в правом верхнем углу, но если я посмотрю на эксперта в нижнем окне, он НЕ говорит "Expert Advisor Initialized" (как это обычно бывает с другими советниками).


Есть ли что-нибудь еще, что я могу попробовать? Я бы очень хотел использовать это.

Большое спасибо

heremita
heremita | 11 апр. 2025 в 05:24

EDIT:

После множества настроек с помощью AI, а также добавления других параметров, мне удалось заставить его работать! ДА! Мне это нравится. Спасибо.

Sara Sabaghi
Sara Sabaghi | 14 мая 2025 в 17:14
heremita #:

EDIT:

После множества настроек с помощью AI, а также добавления других параметров, мне удалось заставить его работать! ДА! Мне это нравится. Спасибо.

Я счастлив и рад, что эта статья оказалась для вас полезной.

Ваши старания достойны похвалы. Ведь в этой работе было действительно много деталей и нюансов.

Удачи.

Компьютерное зрение для трейдинга (Часть 2): Усложняем архитектуру до 2D-анализа RGB-изображений Компьютерное зрение для трейдинга (Часть 2): Усложняем архитектуру до 2D-анализа RGB-изображений
Компьютерное зрение для трейдинга, как работает и как разрабатывается по шагам. Создаем алгоритм распознавания RGB-изображений графиков цен с механизмом внимания и двунаправленным LSTM-слоем. В результате получаем рабочую модель прогнозирования цены евро-доллара с точностью до 55% на валидационном участке.
Алгоритм верблюда — Camel Algorithm (CA) Алгоритм верблюда — Camel Algorithm (CA)
Алгоритм верблюда, разработанный в 2016 году, моделирует поведение верблюдов в пустыне для решения оптимизационных задач, учитывая факторы температуры, запасов и выносливости. В данной работе представлена еще его модифицированная версия (CAm) с ключевыми улучшениями: применение гауссова распределения при генерации решений и оптимизация параметров эффекта оазиса.
Нейросети в трейдинге: Обобщение временных рядов без привязки к данным (Mamba4Cast) Нейросети в трейдинге: Обобщение временных рядов без привязки к данным (Mamba4Cast)
В этой статье мы знакомимся с фреймворком Mamba4Cast и подробно рассматриваем один из его ключевых компонентов — позиционное кодирование на основе временных меток. Показано, как формируется временной эмбеддинг с учётом календарной структуры данных.
Машинное обучение и Data Science (Часть 30): Тандем из сверточных (CNN) и рекуррентных (RNN) нейросетей для прогнозирования фондового рынка Машинное обучение и Data Science (Часть 30): Тандем из сверточных (CNN) и рекуррентных (RNN) нейросетей для прогнозирования фондового рынка
В этой статье мы рассмотрим динамическую интеграцию сверточных нейронных сетей (CNN) и рекуррентных нейронных сетей (RNN) для задач прогнозирования фондового рынка. Для этого соединим способность CNN извлекать закономерности и эффективность RNN в обработке последовательных данных. Давайте посмотрим, как такая мощная комбинация может повысить точность и эффективность торговых алгоритмов.