Архив рубрики: Статьи участников

Модуль сереализации/десереализации и печати таблиц Lua

Автор записи: TGB
1 звезда2 звезды3 звезды4 звезды5 звезд (Голосов 19, среднее: 2,95 из 5)
Загрузка...

Сереализация таблицы Lua (со всеми ее, возможно, многоуровневыми вложенностями и перекрестными ссылками) это представление ее в виде строки. Десереализация это обратная операция – восстановление таблицы из строки.

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

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

--

В модуле реализовано два варианта сереализации/десереализации таблиц Lua:

1) Сереализация/десереализация (функции tbl_to_string и string_to_tbl) таблиц частного вида со следующими ограничениями:

- ключи и поля таблицы только типа : table (простые, не метатаблицы), booleannumberstring;

- все внутренние элементы таблицы (ключи и поля) типа table (ссылки на них) должны быть уникальными (в пределах таблицы с учетом всех ее вложенностей).

2) Сереализация/десереализация (функции tbl_to_str  и str_to_tb ) таблиц общего вида (при условиях,  детально рассмотренных далее в описании модуля), элементами (ключами и полями) которых могут быть любые Lua-типы (включая метатаблицы и ссылки на functionthread, userdata). Связи между элементами таблиц могут быть произвольными.

Кроме того, в модуле реализована функция печати любых Lua-данных, в том числе произвольных таблиц в удобном для анализа виде (со всеми вложенностями и перекрестными связями, включая метатаблицы, а также ссылки на functionthread, userdata).

----

В представленном скрипте-тесте выполняется сереализация/десереализация глобальной таблицы Lua _G, хранящей стандартные и подключаемые пакеты скрипта, все его переменные без спецификации local и т.д. Там же приведены примеры  сереализации/десереализации более простых таблиц, например:

local t1 = {5, 't1'}

local tbl_str = {1, 2

, { 3, 4, {5}, [t1] = '[t1]' }

, [ { {}, '[8]' } ] = {'Простой пример'}

}

------------------------------------------------------

Смотреть полностью...

Модуль реализации интерфейса обработки событий QUIK с использованием очередей событий

Автор записи: TGB
1 звезда2 звезды3 звезды4 звезды5 звезд (Голосов 11, среднее: 3,09 из 5)
Загрузка...

В существующих (на момент 15.10.21) версиях QUIK, его основной (и единственный) служебный поток обслуживания скриптов пользователя запускает их на выполнение (по команде из меню <Загруженные скрипты>). Этот же служебный поток, транслирует скриптам пользователя события, возникающие в QUIK, запуская все функции обратного вызова (колбеки), всех запущенных на исполнение его скриптов. Таким образом, в каждом работающем скрипте пользователя существует его поток main, а все его колбеки запускаются в отдельном, (единственном) служебном потоке QUIK.
Существуют два вида колбеков:
1) колбеки обслуживающие события фондового рынка;
2) колбеки обслуживающие события, возникающие в созданных пользователем таблицах QIUK.
То, что служебный поток QUIK один обслуживает колбеки всех, запущенных на исполнение скриптов пользователя, является проблемой: если функции колбеков некоторого скрипта выполняются долго, или в них возникают длительные блокировки, то перестают обслуживаться колбеки остальных, работающих скриптов пользователя. Кроме того, в скриптах пользователя необходимо учитывать факт параллелизма выполнения потока main и служебного потока QUIK, выполняющего колбеки. То есть, заниматься, сложным для непрофессионала, параллельным программированием.
Из, всего выше сказанного, можно сделать вывод о том, что: в том виде, как он представлен, в текущий момент времени, интерфейс обработки событий в QLua «сырой» для использования его «широким кругом» пользователей.
Для устранения выше озвученных проблем разработчиком QUIK рекомендуется использовать потокобезопасные очереди для передачи параметров, запус-каемых колбеков, потокам main, в которых должны выполняться функции реакции на такие колбеки (документ «Использование Lua в Рабочем месте QUIK»).
Как это можно реализовать, в удобном и эффективном для пользователя виде, представлено ниже в виде:
1) кода модуля even_handling_module.lua ;
2) шаблона использования этого модуля.
Особенности реализации модуля even_handling_module.lua:
1) код модуля написан на «чистом» QLua;
2) очереди передачи параметров колбеков в скриптах пользователя в его потоки main (в разных скриптах это разные потоки) потокобезопасные и при этом они реализованы без использования синхронизации;
3) при реализации записи/чтения очередей, количество операций (на языке Lua) < 6 и не зависит от текущего размера очередей.
Выше перечисленные особенности реализации модуля even_handling_module.lua обеспечивают минимальное влияние на служебный поток QUIK того, что выполняется в скриптах пользователя, а также удобство использования модуля в скриптах пользователя.
Детальное описание использования модуля even_handling_module.lua приведено в его коде и коде шаблона, описывающего схему обработки событий QUIK.
Для подключения модуля к шаблону его надо сохранить в файле под именем even_handling_module.lua в папку хранения кода запуска QUIK (info.exe).
Коды модуля и скрипта-примера его использования:

Смотреть полностью...

Индикатор экстремум

Автор записи: kalikazandr
1 звезда2 звезды3 звезды4 звезды5 звезд (Голосов 6, среднее: 3,67 из 5)
Загрузка...

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

жми

 

Операционная система разработки многопоточных роботов торговли ценными бумагами в QUIK «OS_Quesha»

Автор записи: TGB
1 звезда2 звезды3 звезды4 звезды5 звезд (Голосов 8, среднее: 3,13 из 5)
Загрузка...

OS_Quesha представляет собой специализированную операционную систему реального времени (с характеристиками, часть из которых будет детально представлены в конце статьи), реализованную в среде QUIK. Она обеспечивает разработку многопоточных торговых роботов для QUIK версий 7…, установленных в Windows 10 (32 , 64 р). С ее помощью могут быть решены сложные задачи эффективного использования многопроцессорности современных ПК с целью повышения скорости обработки данных в роботах, разрабатываемых на языке QLua и C++. OS_Quesha обеспечивает в языке программирования QLua, изначально отсутствующий в нем, параллелизм выполнения его, взаимодействующих между собой, функций в рамках одной его инсталляции. Кроме того, средства OS_Quesha решают и иные существенные задачи, возникающие при разработке торговых роботов, в том числе, обеспечивают устойчивость их функционирования при сбоях аппаратуры и программ.
OS_Quesha запускается в QUIKе в виде обычного QLua-скрипта. При этом, в рамках процесса QUIK, она разворачивается в виде нескольких, эффективно взаимодействующих между собой, потоков, количество которых определяется ее настройками. Ее реализация внутри процесса QUIK обеспечивает тесную интеграцию с ним, а значит высокую скорость взаимодействия с ним, недостижимую при межпроцессорном взаимодействии. Для пользователя OS_Quesha представлена формой диалога, запускаемой в отдельном потоке. Из OS_Quesha доступен весь программный интерфейс QUIK, существующий для скриптов QLua. Наличие работающего шаблона TS_QUIK.lua (в виде исходного кода на языке QLua), демонстрирующего применение средств OS_Quesha и ее компактность, обеспечивают низкий порог вхождения при ее использовании.Смотреть полностью...

Библиотека lua_share: обмен данными между скриптами и приложениями

Автор записи: toxa
1 звезда2 звезды3 звезды4 звезды5 звезд (Голосов 13, среднее: 3,92 из 5)
Загрузка...

ОПИСАНИЕ:
Библиотека предназначена для обмена данными между lua-скриптами, работающими в разных процессах, а так же в
одном процессе, но в разных lua-машинах. Прежде всего, она будет полезна пользователям терминала QUIK.

Комплект состоит из библиотеки lua_share.dll и файла lua_share_boot.lua. Для корректной работы оба файла должны
находиться в одном каталоге. Если файл lua_share_boot.lua отсутствует, то библиотека ведет себя несколько иначе,
но тоже работает, о чем ниже. Для межпроцессного взаимодействия в комплект так же входит IPC-сервер под названием
lua_share_server.exe и lua-скрипт lua_share_server.lua.
Смотреть полностью...

Благодарность

Автор записи: Jon
1 звезда2 звезды3 звезды4 звезды5 звезд (Голосов 9, среднее: 3,67 из 5)
Загрузка...

Уважаемые создатели данного ресурса!

Хочу поблагодарить Вас за данный сайт и ту информацию которая здесь представлена.. С уверенностью могу заявить что это один из самых информативных сайтов по данное теме. В частности по языку Lua и его применению в Quik для создания торговых систем.  Информация,  которая представлена на этом сайте,  в полном объеме отражает тот необходимый минимум для начала изучения вопроса создания мтс. Очень понравились оперативные и профессиональные ответы на вопросы . Удачи Вам!

Отсылка транзакций из С++ без использования Lua кода.

Автор записи: AndreyKrivcov
1 звезда2 звезды3 звезды4 звезды5 звезд (Голосов 5, среднее: 5,00 из 5)
Загрузка...

Доброго времени Суток.

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

ПРЕДУПРЕЖДЕНИЕ:
1) Код НЕ потокобезопасный и по этому требуется использовать разделяемые ресурсы для работы со стеком Луа (если проект многопоточный).

2) Предоставляется "Как Есть" и не несу не какой ответственности за Ваше использование кода

3) Если найдете недочеты или баги, то просьба сообщить тут. (поправим)

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

2) Вызывается функция std::string sentTransaction (Ttransaction &T) - принимающая в себя сформированную таблицу. Данная функция заносит в Луа все необходимые данные, вызывает lua_call и получает в качестве ответа сообщение об ошибке которое возвращает стандартная ф-ция lua_call.

Иными словами функционал таблицы и функции максимально схож с функционалом таблицы и функции из руководства пользователя луа.

Далее пойдет реализация:

Ttransactions.h

Теперь реализация данного заголовочного файла:

Ttransaction.cpp

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

Пример использования таблицы транзакций

 

Обмен данными между DLL (C/C++) и приложением QT Creator (C++)

Автор записи: NewDracon
1 звезда2 звезды3 звезды4 звезды5 звезд (Голосов 6, среднее: 4,33 из 5)
Загрузка...

Для начала объясню, почему я выбрал для связки с QUIK'ом именно QT и зачем нужен этот "велосипед". Дело в том, что захотелось побольше графических возможностей, а если использовать Visual Studio С++ (а не C#), то готовых компонентов для "рисования" графиков практически нет. А C# или java в сравнению с QT С++ будут уступать в скорости, которая  необходима для тестирования стратегий. (Последнее спорно, но, по моему мнению, все же C++ "ближе" к процессорному языку, и код тестов QT в будущем можно будет перенести на unix)

И тут начались грабли... Если заходил со стороны прямой компиляции LUA для QT, не хотел подключаться QUIK (написанный на MVSC). Затем я попробовал создать DLL на MVSC и подключиться динамически к ней из QT, но export'ы DLL просто не виделась в QT. И тут я наткнулся на замечательную статью Обмен данными между DLL (C/C++) и приложением C# посредством Memory Mapped File (MMF). Ниже привожу мою адаптацию данной статьи на QT Ctreator. При этом использовалась среда Visual Studio 2017 С++ для написания DLL и среда QT Creator 5.3 с компилятором MinGW 4.8.

Смотреть полностью...

Таблица "Портфель" в QUIKе

Автор записи: ram555
1 звезда2 звезды3 звезды4 звезды5 звезд (Голосов 3, среднее: 5,00 из 5)
Загрузка...

Представляю таблицу для портфельных инвестиций.  Цвет строки меняется если Прибыль%<>5%. Обновление каждые 5 сек. Показаны только бумаги с лимитом Т0, для недопущения дублирования. Если хотите, чтоб были бумаги только с лимитом Т2, замените в двух местах «limitKind<1» на «limitKind>1»

Для её создания необходимо:
1. Создать файл «tablePortfolio.txt» в папке «C:\QUIK\Scripts». Если папки нет, создать её.
2. Скопировать туда код скрипта
3. Сохранить, выбрав кодировку «ANSI», иначе вместо русских букв могут быть кракозябры.
4. Сменить расширение файла с ".txt" на ".lua"
5. Запустить скрипт командой Сервисы-> Lua  скрипты-> Добавить (выбрать файл tablePortfolio.lua) -> Запустить

Код скрипта

ПОСТАНОВКА И СНЯТИЕ STOP-ОРДЕРА В QLUA(LUA)

Автор записи: ram555
1 звезда2 звезды3 звезды4 звезды5 звезд (Голосов 5, среднее: 4,20 из 5)
Загрузка...

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

Самая распространенная ошибка начинающего программиста отправка в SendTransaction в STOP_ORDER_KEY  trans_id стоп-ордера

Робот выставляет стоп-заявку на покупку по определенной цене, затем через 2 секунды снимает её.

Также в коде имеются следующие фишки:

  • Запись удобочитаемого лог-файла.  Записи с интервалом <=1 сек. группируются в пул. Между пулами - пустая строка. После остановки скрипта в файл добавляется двойная линия.
  • Функция преобразования числа в строку с удалением точки и нулей правее нее для отправки этой строки в SendTransaction
  • Функция, возвращающая Entry или Exit в зависимости от trans_id принадлежности транзакций к входу или выходу
Код скрипта

В итоге получается текстовый  лог-файл, удобный для чтения человеком, с которого можно считать данные программой (например на  C#) и подбить статистику

Log.txt

Если у Вас появились какие-то вопросы, задайте их в комментариях под статьей !!!