nikolz написал: но если использовать атомарные операции то можно сказать и потоконезависимость. Так как никакие потоки вообще никак не обнаруживают друг друга.
Потоконезависимость можно трактовать как thread local переменные, т.е. в каждом потоке свои непересакающиеся значения. Что явно не то, что нам бы хотелось.
nikolz написал: хотел сравнить со своим решением. у меня библиотека в 3 раза меньше.(43кБ)
В зависимости от версии компилятора и режима сборки размер легко может отличаться на 2 порядка, так что это вообще не показатель без уточнения всех нюансов сборки. Вот только к чему оно?
Я выкладываю сборки в таком варианте, чтобы не возникало никаких проблем с использованием или доустановкой каких-то библиотек. Но это дело вкуса
Определение входящих остатков по инструментам на начало торговой сессии, Проблемы при определении входящих остатков по инструментам открытых позиций на начало торговой сессии
Определение входящих остатков по инструментам на начало торговой сессии, Проблемы при определении входящих остатков по инструментам открытых позиций на начало торговой сессии
Когда речь идёт про сделку, то сделка происходит в определённом режиме торгов, что соответствует определённому классу на сделке. Когда же мы говорим про как таковой инструмент - то нет никакого класса. Вот есть у вас 5 облигаций - они у вас сами по себе, они не относятся к классу. Их модно просто сложить в тумбочку. Какой у тумбочки класс? Никакого. А вот если вы их вознамеритесь продать на бирже, то на сделке продажи будет класс. Но к остатки ваших облигаций класс никакого отношения не имеет.
Так что не понятно что означает "определить у какому классу относятся остатки"
Заметил, что на этом форуме практически перестали появляться новые сообщения. Да и тусуются буквально 5 шт. старожилов. Почему? куда всё ушло? Люди перестали пользоваться QUIK? Для роботов все переехали на другую платформу? какую? Любители-лудоманы вовсе убежали с биржи рынка? совсем или перебежали на другую? какую?
Это настолько общие ошибки, что по ним нельзя назвать никакой конкретики. Где-то обращаетесь за пределы выделенной памяти. Как вариант - индекс в массиве выходит за границы.
А то то, что при этом остаётся рабочим QUIK - это прям я очень удивлен и восхищен разработчиками квика! Это круто
Сборщик мусора удаляет не используемые переменные Lua Если же присваивать строку разной длины одной переменной - то разумеется память сразу захватывается/освобождается. Иначе никакой памяти не напасешься
С другой стороны, если вы получаете путь к скрипту через getScriptPath, то зачем потом добавляете полный путь?? В итоге у вас получится некорректный путь к файлу
Пишите текстовый файл и не парьте себе мозги. Текстовый файл проще отлаживать (можно глазами посмотреть), проще поддерживать. На скорость в общей инфраструктуре работы терминала это не повлияет совершенно.
Судя по картинкам - у вас слабенький комп и не хватает GDI ресурсов. Тёмная тема в самом деле съедает больше ресурсов, т.к. квку приходится все это великолепие отрисовывать самостоятельно, Windows темные темы рисовать не умеет, а вот светлый интерфейс - Windows рисует сама
Ну и ещё там рядом есть. Если они штатном добавили поддержку Win кодировки - то и вовсе круто, по сути это была единственная основная проблема, которую решал своей библиотекой
Графиков в смысле отображения торговых данных - встроенных там, конечно, нет
Serge123 написал: Вернее, транслятор ошибку не выдаёт, но для выделения флагов в C придётся преобразовать тип flags к (u)int64_t, что выглядит не очень красиво...
Это половые трудности того, кто зачем-то пытается делать роботов на Си вместо Lua.
Хочешь по-взрослому - и страдай тогда по-взрослому, не плачь ;)
Serge123 написал: Поясните, почему в таблицах Квика orders, trades, ... переменная flags, хранящая битовые флаги, имеет тип NUMBER (что в переводе на C значит double), а не INTEGER?
Потому что в Lua5.1, которая изначально была прикручена в quik, тип number мог быть либо int, либо double. В зависимости от параметров сборки. Одновременно int и double там не существовало. Для QLua выбрали вариант сборки с double, по понятным причинам.
Serge123 написал: Я несколько лет назад перешёл с Дельфи 7 на си под 64 бит и gcc, теперь неохота сидеть на 2-х стульях.
dll для 64 бит Lua можно отлично делать на Lazarus или современных версиях Delphi, которые научились компилить под x64. Удобно и приятно я бы даже сказал.
Цитата
Serge123 написал: Теперь меня интересует, как получать в длл таблицы от луа и разбирать их, напр., таблицу заявок и обезличенных сделок.
Информации об API в Lua очень много, почитайте. Хотя, если честно, я бы рекомендовал писать и отлаживать алгоритмы на Lua. Это намного проще. И только если будут выявляться какие-то узкие места в производительности - что-то выносить в dll. Сидеть копаться в Си-коде для работы с таблицами Lua - достаточно занудно. Сложного там ничего нет, API очень простое и понятное, но надо постоянно помнить про все нюансы; к тому же то, что в Lua пишется кратко просто и естественно (типа обращения к таблице по ключ) в Си шном API делается в несколько "команд". Короче краткости там и наглядности - никакой. Так то не совсем мне понятно зачнем это. Ну кроме выпендрёжа "а у меня весь робот на Си!".
Судя по тому, что в указанном скрипте используется только w32 библиотека могу предположить, что вы используете данную библиотеку не с той версией Lua, в которой запускаете скрипты.
Не понятно мне только почему вы спрашиваете здесь, а не там :)
Занимательно, что на хабре так и не появились комментарии. Весьма редкий случай.
Статья описывает организацию серверной части QUIK у брокера. Лично я не встречал столько подробного описания в открытых источниках ранее. Какую пользу могут вынести роботописатели в терминале QUIK - не очень понимаю. Ну кроме понимания, что "всё не просто"
Сергей С. написал: Да, руками тоже задержка при первой покупке бумаги.
Подумал еще вот что уточнить: скрипт ваш в это время работает или нет? при ручном выставлении заявки Если работает - то отключить и проверить выставление руками
А бел Lua скрипта, если руками выставить заявку - изменение в таблице лимитов по бумагам происходит тоже только через 5 секунд? Или эта проблема только в скрипте?
Alexander написал: Я вот бегло посмотрел это. Там пишете, что: "Мне всегда хотелось иметь под рукой консольный аналог lua.exe прямо в папке с QUIK, да еще такой, чтобы можно было выполнять непосредственно скрипты, предназначенные для QUIK,т.е. с возможностью вызова функций QLua."Но я что-то не понял, а откуда там такая функциональность?
Начну с того, что это лишь набросок, который сильно в жизнь пока не пошел. Поэтому что сделано - только то и сделано. Про функциональность - а какая "такая"? тут бы уточнить. Разумеется, я не предполагал, что запущенный через qlua.exe скрипт будет получать информацию из QUIK и отправлять биржевые транзакции. Во всяком случае на тот момент, когда всё это затевалось.
Хотелось просто иметь возможность запускать Lua-скрипт для отладки какого-то алгоритма или какой-то функции. Потом этот отлаженный функционал использовать уже в реальных торговых скриптах.
Однако, если запустить скрипт написанный для QLua в штатном lua.exe, то скрипт вовсе не будет работать, т.к. он в любом случае использует некоторые функции, которые добавлены в QLua. Та же message. Если используется в скрипте - он будет тупо ломаться. А менять постоянно print / message не очень-то удобно.
Вот такие задачи и ставились при написании этой штуковины, не более.
Цитата
Alexander написал: далее в цикле читаются аргументы переданные вместе с именем файла и пишутся в созданную в стеке таблицу и далее создаётся глобальная переменная и ей присваивается эта таблица
Эта функциональность сделана просто по аналогии с lua.exe, это к QLua уже не имеет отношения.
Цитата
Alexander написал: Так же там написали функцию const char *luaL_tolstring(lua_State *L, int idx, size_t *len), зачем? Она же уже есть в Lua.
Но ведь там даже комментарий есть и условная компиляция. luaL_tolstring появилась только в последних версиях Lua, а qlua.exe делался с возможностью компиляции под разные версии Lua, включая 5.1 и 5.2 И так как luaL_tolstring ну очень удобная - я перенес себе ее исходники.
Ну вот какого ответа вы ждёте? Очевидно, что такой функциональности в QUIK нет.
Сделать можно , если наладить связь между процессами а) QUIKа, с одной стороны б) и собранным вами запускаемым exe-шикном, который будет уметь подхватывать Lua скрипты и выполнять их.
При нажатии кнопки "Запустить" (скрипт) он именно выполняется интерпретатором Lua, предварительно переводится в байт-код. Весь полностью код.
Наверное не все помнят, но привычная нам запись
Код
function MyFunc()
{
}
на самом деле синтаксический сахар. Фактически же это означает (и эквивалентно) MyFunc = function () { }
т.е. определяется глобальная переменная с именем MyFunc, которой присваивается значение с типом "функция". (Да вы сами посмотрите через type()) А чтобы переменной присвоить значение - скрипт надо выполнить.
Ziveleos написал: давно интересовал этот вопрос: какая разница между body и OnInit, и зачем он вообще нужен?
Выше в этой ветке давно же уже написано: из так называемого body не все функции QLua корректно работают (во всяком случае на такое натыкались ранее; речь про разные хитрые функции типа создание DataSource или чего-то такого; изменилось ли что-то с тех пор - не знаю, если найти на форуме на что именно жаловались - то можно проверить) В то же время на момент выполнения OnInit() уже точно любые функции QLua будут работать корректно. Плюс бонусом передается путь до скрипта, если он требуется.
Т.е. вообще говоря, OnInit() QUIK вызывает так сказать осознанно, когда все готово и известно, что такая функция в скрипте определена. Но вот чтобы узнать какие callback-функции в скрипте определены - QUIK (да и вообще Lua) вынужден весь скрипт полностью выполнить, это определит для Lua имеющиеся в скрипте функции, про них станет известно. И, разумеется, при этом выполняется тот самый код, который написан мне функций и который я когда-то назвал [BODY] в своей документации описания QLua. И термин этот прижился, так теперь все его и использ0уют.
Вот и вся разница. Чем пользоваться - да все равно. Если ваш инициализирующий код корректно работает в [BODY] вам такой стиль нравится - то и замечательно. Если хочется чего-то этакого - пользуйтесь OnInit(), если так вам удобнее понимать лдогику собственного скрипта. Скорее вопрос привычек, короче. Ну за исключением нюанса вызова некоторых функций. Но если вы с таким нюансом не сталкиваетесь - значит либо вы такие функции не используете, либо QUIK этот момент давно починил.
Еще раз. Выполнение [BODY} - чисто технический момент. Т.е. QLua сначала просто выполняет Lua-скрипт, при этом - главное - в глобальной области видимости для Lua-машины появляются определенные в скрипте callback-функции. После этого QLua уже может узнать какие callback-функции определены в скрипте и после знает какие callback-функции надо вызвать, т.к. они есть, а какие не надо, т.к. их нет. Вот и все, вот и весь "секрет". А то, что при этом выполняется остальной код, расположенный вне функций - просто неизбежность, никакого глубокого смысла в том нет.