Обновы ATcl 1.09b + ByBitCharts 1.03

Обновы ATcl 1.09b + ByBitCharts 1.03

10 апреля 2024, 09:44
Maxim Kuznetsov
0
35

Два релиза для закрытия багов и чтобы дать себе выходной. Вкратце :

проблемы ATcl с новым билдом MetaTrader решены,

ByBitCharts умеет отдавать большие стаканы и (потенциально) даже с историей.
В дальнейшем так-же будет передаваться лента сделок. 

И можно будет получать мгновенный оперативный снимок 1-2 минуты:
истории сделок, история тиков, история стаканов, по отдельности или всё вместе.

ByBitCharts 

Освоил Bandicam, так-что начну с видео:


в подвале терминала показывается скорость с которой индикатор успевает читать, агрегировать (на видео по 100 пунктов) и отображать стакан, причём через объекты чарта. 

Стаканы транслируются максимально возможной глубины - для SPOT 200 уровней, для LINEAR 500 уровней. Учтите, уровень это не пункт. Уровень это уровень :-) Не все возможные пункты заполняются лимитками и образуют уровень.
Так что например для SPOT стакан покрывает от 200 до 300 пунктов.

Объёмы выведены в целых числах - объём переведён в "шаг изменения объёма". Параметр можно взять из спецификации инструмента, это известный SYMBOL_VOLUME_STEP. Связано с тем что во первых у инструментов нет такой настойки как (образно) VOLUME_DIGITS, во вторых для совместимости с volume_real структуры MqlRates - оно не любит малых значений (вообще лучше целые, хоть и в double), и наконец DoubleToString плохо себя повёл в perf-тестах.

В подвале видна скорость обработки и вывода таких стаканов - для SPOT 200 уровней Ask + столько-же Bid, 60-70 микросекунд, для LINEAR  по 500 уровней 250-300 микросек. На мой взгляд очень неплохо. Учитывая, что они отдаются из отдельного треда, сразу после приёма и разборки json, до всяких очередей и пропихивания в CustomBookAdd/CustomRatesUpdate то совсем хорошо. Можно даже скальпить и арбитражить

ATcl

На днях была не вполне приятная ситуация, с нового релиза MetaTrader перестали работать библиотечные вызовы _putenv в DLL, а возможно и ещё какие-то тоже. А библиотека, с первого выпуска выпуска (на sourceforge впервые засветилась 6 лет назад), использовала _putenv чтобы правильно настроить рабочие переменные окружения перед запуском интерпретатора tcl. Теперь значительная часть этих настроек делается инсталлятором или должна быть сделана пользователем самостоятельно. Раньше было автоматически :-(

Для корректной работы ATcl должны быть выставлены следующие переменные окружения:

обратите внимание, что TCL_LIBPATH и TCLLIBPATH - через пробел, без запятых и всяких точка-с-запятой

и теперь важно, чтобы c:/ATcl/bin был в перечне поиска %PATH%, то есть присутствовал в ней а лучше вообще одним из первых (помятуя прежнее - раньше это была опция, на выбор, по желанию)

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

@echo off

SET ATCL_HOME=c:/ATcl
SET TCL_LIBRARY=c:/ATcl/lib/tcl8.6
SET TCLLIBPATH="c:/ATcl/lib/tcl8.6 c:/ATcl/lib"
SET TCL_LIBPATH="c:/ATcl/lib/tcl8.6 c:/ATcl/lib"
SET PATH="c:/ATcl/bin;%PATH%"

start "" /B terminal64.exe /portable

Для удобства, текущий ByBitCharts включен в состав ATcl и ставится вместе с ним. Если что, то его можно найти в каталоге c:/ATcl/DataDir

Ещё из весьма полезных штучек комплекта ATcl

Сервис ATcl Watch - в отдельном окошке показывает текущие котировки и состояние счёта с детализацией по инструментам. На мой взгляд просто на голову удобнее стандартного окна. Без него уже как без рук

Скрипт-панель для парного открытия MajorsTrade


Повесить скрипт на hot-key и очень удобно. Код открыт, поставьте свои формулы рассчёта объёмов по вкусу.

и конечно консоль интерпретатора - советник TkCon

необходимая вещь для ознакомления с tcl и взаимодействием с ByBitCharts

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

Из крейзи-проб вплоть до генерации кода C, и сразу-же его использовании..

То есть много всего полезного и любопытного

Установка ATcl

Инсталлятор можно взять на sourceforge: https://sourceforge.net/projects/mt-atcl/

Или у меня с yandex-disk: https://disk.yandex.ru/d/AiAu6E0azx29Mg

С инсталлятором всё довольно просто, next-next-next :-) Единственный вопрос может быть deploy - если галочку поставить, то инсталлятор сам найдёт все MetaTrader`ы и положит в них нужную файлы. Если не ставить то придётся самому скопирать файлы (достаточно MQL5) из c:/Atcl/DataDir в каталог данных нужного терминала.

В случае если у вас уже установлен ATcl (или другой дистр. tcl/tk) или не хотите скачивать и запускать довольно-таки большой инсталлятор, то вот отдельное обновление DLL и библиотек ATcl, и ByBitCharts. Фалы из архифов просто скопировать в каталог данных терминала:

DLL и библиотеки ATcl : https://disk.yandex.ru/d/bZhNIZ7fOqX8Tw

ByBitCharts: https://disk.yandex.ru/d/yD8HmZd6abuNNw

Проверка установки

1. Вызовете графический интерпретатор из командной строки : нажать Win+R и набрать wish

Должно появится два окошка: окно для ввода команд интепретатора и начальное окно приложения.


Если не сработало и как-то ругалось, проверьте что c:/ATcl/bin добавлен в пути %PATH% . Теперь для корректной работы он обязательно там должен быть.

2. Запустите MetaTrader и на любом графике запустите скрипт ATcl/env 

Не забудьте разрешить запуск DLL в терминале и в свойствах скрипта !

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

если какие-то странные ошибки, то скорее всего неверно указаны переменные в окружении тиап TCLLIBPATH о которых выше сказано. Поставьте их корректно и перезапустите терминал

Далее главное: запуск ByBitCharts

В сервисах и запустите сервис Crypto/ByBitCharts и так-же Crypto/ByBitSync

После этого можно нажать Ctrl+U и выбрать символы из Custom/ByBit/linear (или spot - от параметра запуска), для обзора рынка.

В этом чарте запускаем индикатор Crypto/TradePanel (ранний-ранний прототип, сейчас просто рисует стакан). Только поставьте AGGREGATE пунктов 100, а то цифры будут сливаться


PROPOSAL, получение данных от ByBitCharts

Иллюстративно : Давайте там-же запустим советник ATcl/TkCon - командная консоль Tcl.

И в ней последовательно введём команды (# это мои комментарии, их не надо вводить): 

# требуется пакет Thread
# для взаимодействия между тредами (и экспертами/скриптами/сервисами)

package require Thread

# посмотрим какие переменные "расшарены" 
tsv::names ByBit_*

# посмотрим какие есть "поля" у любой на выбор
tsv::array names ByBit_linear_BTCUSDT

# в поле с именем "100" (от 100msc) ByBitCharts складывает максимальные стаканы (ВСЕ).
# предполагается формат { стаканы предыдущего фрагмента } { стаканы текущего фрагмента }
# можем получить :-) будет много данных
tsv::get ByBit_linear_BTCUSDT 100


Вот и научились получать данные :-)

Индикатор который ранее запустили, ровно точно так-же получает и успевает обработать стакан за 200-220 mcs (на скриншоте внизу)

Итого предложение следующее:

* для обмена данными используется ThreadSharedVariables https://www.tcl-lang.org/man/tcl8.6/ThreadCmd/tsv.htm это как глобальные переменные терминала, только современные :-) два уровня именования, разные варианты использования/доступа и хранить можно что угодно, не только единичные double

* каждому инструменту соответсвует одноимённая переменная

* поля(ключи) этих переменных имеют числовые имена. Со строками в MQL не вполне хорошо, а если числа, то можно использовать switch при разборе снепшота состояния.

* так-же по причине mql, в данных по мере возможности избегаются строки, то есть используются числа которые можно кастовать в double и обратно. Опять-же это для ускорения разбора данных

* каждое поле содержит список минимум из двух элементов, сейчас 2-х {записи предыдущего фрагмента} { записи текущего фрагмента } строго в порядке поступления. Сейчас тестируется фрагменты по минуте, но интервалы возможно будут уменьшены, а число фрагментов увеличено.

* для того чтобы получить всё достаточно объеденить фрагменты (например в массиве), для того чтобы получить самую последнюю достаточно взять последний элемент последнего фрагмента. И на стороне отправителя удобно формировать и с памятью/скорость нормально.

* можно одним махом,атомарно получать оперативную историю конкретных данных (например все тики, не менее чем за минуту): tsv::get ByBit_linear_BTCUSDT 1

* и так-же атомарно можно получить снепшот всего состояния символа (все данные, тики, стаканы, ленту) : tsv::array get ByBit_linear_BTCUSDT

* поле "1" будет содержать тики. (1 - это макс.частоты в ByBit 1ms) ; Для ByBit тики формирую на основе стакана глубиной 1, то есть спреда и ленты сделок.

  Каждый тик это список, максимально близкий к MqlTick:
  { time bid ask last volume time_msc flags volume      ask_volume bid_volume tickCounter } 
  то есть начало списка абсолютно такое-же, только volume двоится - тут нет нереального объёма, используется одно и то-же значение - объём последней сделки. 
  флаги соответсвуют ENUM_TICK_FLAGS 
  и три дополнительных поля - ask_volume - объём минимального ask в стакане, bid_volume - объём максимального bid
  tickCounter - инкрементный счётчик тиков

* поле "7" будет содержать ленту сделок. (7 - от просто так. надо было дать какой-то номер) 

  Соответсвующих структур в MQL нет, просто список :

 { time_msc price volume flags tradeCounter }
 flags - TICK_BUY или TICK_SELL , показывает тейкер купил или продал
 tradeCounter - счётчик трейдов

* поле "10" будет содержать "рабочий" стакан (10 - от частоты в ByBit 10msc)
 глубиной минимально покрывающий допустимой в MetaTrader, в нём похоже ограничение на 20-25 уровней.
 Структура, :
 { time_msc { { ask1 volume1 ask2 volume2 .... } { bid1 volume1 bid2 volume2 ...} } bookCounter }
 То есть время, дамп стакана, счётчик стаканов.
 дамп стакана состоит из двух частей - аски и биды, где подряд попарно идут "цена" "объём". ЦЕНЫ НЕ СОРТИРОВАНЫ, это снимок хеш-массива

* поле "100" ( 100 - от частоты в ByBit 100msc)
  будет содержать максимально глубокий неагрегированный стакан. Формат такой-же как 10
  В ByBit - для linear, inverse - 500 уровней, для spot 200

* поле 60 (от 60 сек)
  будет содержать M1 и основывается на MqlRates
  { time open high low close 0 0 volume     start time_msc }

  то есть тиковый объём и спред я не заполняю,
  и дополняю два поля - время открытия свечи в милисек. ( а оно не ровно time*1000)
  и время генерации (последнего изменения)

Сейчас в таком виде передаются данные "большого" стакана, то есть поле "100", производительности вроде-бы хватает :-)
примеры доступа разбора соотв. в коде индиктатора Crypto/TradePanel 
и в тестовом скрипте Crypto/Book_Decode

на уровне tcl (для иллюстрации, он просто компактнее) получение и разбор полного снепшота выглядит вот так :

Вы сможете получать и обрабатывать данные, даже раньше меня :-) Они формируются прямо сразу после приёма и парса json

Но событий набирается очень много. К примеру, от одного инструмента, в не самое активное время, без M1 и "10" (10-ms стакана):

уже больше 1000 событий. Ориентируйтесь на то что будет 1500-2000  







Файлы:
Поделитесь с друзьями: