делаем Dash-Board

21 ноября 2024, 01:03
Maxim Kuznetsov
0
80

Вкратце, как сделать себе красивый dash-board и понакуралесть всяких алертов. Кратко но много картинок :-)

---

вводная - в MetaTrader есть SQLite, в нём можно сохранять данные. А в том большом мире за пределами терминала, средств для визуализации данных воз и маленькая тележка :-) 

Одно из самых популярных, известных и доступных - Grafana (https://grafana.com/). Она умеет строить деш-борды (визуализовать данные) и при этом из разных источников, и что немаловажно - имеет программируемые алерты которые можно слать почти куда угодно.

Ставим Grafana

Графану берём на оф.сайте:

не забыв указать что OSS (то есть не Enterprise) и Windows.

следуем официальной-же инструкции, надеюсь читать умеете: https://grafana.com/docs/grafana/latest/setup-grafana/installation/windows/

наверняка пригодится NSSM https://nssm.cc/ у меня так он must-have на любом windows-хосте. 

запускаем, первый вход (у grafana кстати броузерный интерфейс и можно потом его наружу высунуть из дали пользоваться)

у меня grafana на 3000 порту, у вас может быть на другом. Не помню точно, отчего у меня 3000 :-) так склалось

Переходим к базам

Самое наверное важное - расположение баз. Так вот лучше их размещать в каталоге COMMON. В FILES только если вы используете волшебный ключик /portable . И лучше чтобы в путях не попадались не-латинские буквы и пробелы.

то есть базы будут лежать в %APPDATA%/MetaQuotes/Terminal/Common/Files . Сделайте там отдельный каталог для порядка и держите базы там.

Используем [COMMON] для того чтобы было проще указывать внешним программам, где лежат данные. 

И ещё важный момент - разделение данных. Как-бы и кто не говорил про скорость SQLite, но он файловый и файловые блокировки его затормаживают. Поэтому лучше разделять данные на те которые часто изменяются (где частые DELETE/REPLACE) и имеют ограниченный объём и все остальные (те которые могут быть большими, постоянно дополняются, но потом изменяются редко).

В первую группу попадают всякие оперативные данные, стейты, текущие цены и такое подобное. Эту группу лучше держать в отдельных базах и вообще на RAM-диске. То есть сделать доп.каталог например RAM и перенаправить его на ram-disk. Бекап-рестор при включении/выключении доверить скриптам или опциям софта рам-диска. 

Во вторую история чего-бы то ни было, логи, журналы. Просто большие данные.  Лежат как положится. На рам-диск они уже не влезают. Но из-за того что REPLACE/DELETE там редкий, работать будут нормально.

Такого раздела боятся не надо, всегда  в SQL можно дать команды : ATTACH (https://www.sqlite.org/lang_attach.html) и работать с двумя базами как с одной общей схемой. 

Пишем данные

Уже можете набрасывать свои данные, или можете воспользоваться готовым сервисом : https://www.mql5.com/ru/market/product/127036 (для демок, тестов это бесплатно. для реала чуть дороже) )

SyncDB следуя вышеуказанным рекомендациям пишет две базы :

 * db/{server}.{account}.history.db - торговая история в стиле mt4

 * db/ram/ {server}.{account}.trade.db - текущая ситуация, открытые ордера/позы и цены. Попадает на рам-диск

сразу можно проверить, запустить сервис, открыть любой SQL-тулз и посмотреть. Я использую dbeaver :

котировочки идут, если указать Refresh то прямо даже красиво обновляются :-) 

тут-же можно посмотреть что с прочими таблицами/базами

Возвращаемся в Grafana

В меню Connections ищём SQLite (а там много всего, придётся поискать)

найдя SQLite нажимаем кнопочку Install Plugin (один раз)
и затем Add Connection. Остаётся только придумать разумное имя и указать ПОЛНЫЙ_ПУТЬ_К_БАЗЕ_ДАННЫХ, без кавычек. 

базы у нас две и соединений будет два. Сначала одно, потом второе

дальше идём на вкладку Explore и начинаем строить всякие запросы к данным. Когда результат понравится - нажимаем кнопку Add и добавляем в деш-борд

запрос который на скриншоте можете скопи-пастить, это профит/лосс по счёту, он-же почти график баланса (если в WHERE добавить 'BALANCE' будет совсем он)

SELECT unixepoch(closeTime) as time, SUM(profit+swap+commission) OVER (
    ORDER BY closeTime
    ROWS BETWEEN 
    UNBOUNDED PRECEDING 
    AND CURRENT ROW)  as pl
FROM History
WHERE type in ('BUY','SELL')

как надоест, можно переходить в деш-борды, расставлять плитки по вкусу, оформлять графики/таблицы.

И так постепенно получается средство для мониторинга своих счетов. Почти мини-терминал, но с компонентами на свой вкус. 

Что-то многовато картинок получилось :-) Но по другому наверное и не получится, там всё мышкой тыкается, ничего писать ненадо, только настройки

И картинка на затравку :-)