Вячеслав + (Все сообщения пользователя)

Выбрать дату в календареВыбрать дату в календаре

Страницы: 1 2 След.
Рыночная заявка для клиентского счета запрещена
 
Как отследить в Lua ситуацию, что торговля по определённым (или всем) инструментам запрещена?



В терминале кнопки для выставления транзакций заблокированы, т. е. терминал знает, что торговля по этому инструменту запрещена.
Как определить это в Lua?

sendTransaction возвращает ошибку
'Указанная транзакция по указанному классу не найдена: "CETS".'
тестирую на транзакции:
Скрытый текст
Оповещение при вылете Lua скрипта
 
Описывал один из способов здесь. Работает только при ошибках Lua.
https://forum.quik.ru/messages/forum10/message13797/topic1499/#message13797
Падает квик на win2012R2
 
Цитата
http://rgho.st/79ncxqxW7
Подскажите, а чем его читают?
В Windows Debugger'е.

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

C:\Users\Administrator\Documents\Terminals\bcsquik\QuikNTConne­ctor.dll
C:\Program Files (x86)\NinjaTrader 7\bin\NinjaTrader.Client.dll

обращайтесь к их разработчикам.

Я не сотрудник ARQA, но не думаю, что они вам скажут что-то другое.

Стек потока, который пораждает исключение:
Код
STACK_TEXT:  
WARNING: Stack unwind information not available. Following frames may be wrong.
01a4f1f4 6399c270 163d5d88 07c373f0 07c37370 qlua+0x4bf5b
01a4f228 6398f34b 07c37370 162e5258 07c37370 qlua+0x4c270
01a4f23c 6395576b 07c37370 639f586c 00000008 qlua+0x3f34b
01a4f370 63988d39 05b1b66a 07c30edc 162e5258 qlua+0x576b
01a4f3a0 63978067 03c22f70 162dccc0 016e0310 qlua+0x38d39
01a4f3bc 639baca0 00000001 000080d4 162e5258 qlua+0x28067
01a4f3d4 013bb4a9 00000001 000080d4 162e5258 qlua+0x6aca0
01a4f408 013bb606 09e0a8b0 00000001 000080d4 info+0x44b4a9
01a4f440 01173765 00000000 00000001 000080d4 info+0x44b606
01a4f464 6cb72cf5 000080d4 162e5258 00000400 info+0x203765
01a4f48c 6cb72d79 03c22f70 016e0310 00000400 wt_de+0x2cf5
01a4f4a8 011bf167 03c22f70 016e0310 00000400 wt_de+0x2d79
01a4f4bc 0122d066 65f2b359 0000000f 00000001 info+0x24f167
01a4f598 750f8e71 007708b4 00000915 00000000 info+0x2bd066
01a4f5c4 750f90d1 0122cc70 007708b4 00000915 user32!_InternalCallWinProc+0x2b
01a4f658 750f9333 0122cc70 00000000 00000915 user32!UserCallWinProcCheckWow+0x18e
01a4f6bc 750f9529 0212f990 00000000 00000915 user32!DispatchClientMessage+0x1ae
01a4f6fc 77270596 01a4f714 00000000 01a4ff50 user32!__fnDWORD+0x49
01a4f730 7510d57c 01a4fca0 00000000 00000000 ntdll!KiUserCallbackDispatcher+0x36
01a4f758 012311be 01a4fca0 00000000 00000000 user32!GetMessageA+0x4c
01a4fed0 0155b4c4 00f70000 00000000 01b1300e info+0x2c11be
01a4ff60 74a57c04 ff00e000 74a57be0 102a4561 info+0x5eb4c4
01a4ff74 7728ab8f ff00e000 13ad0a91 00000000 kernel32!BaseThreadInitThunk+0x24
01a4ffbc 7728ab5a ffffffff 77270003 00000000 ntdll!__RtlUserThreadStart+0x2f
01a4ffcc 00000000 0155b517 ff00e000 00000000 ntdll!_RtlUserThreadStart+0x1b

Без вашей qlua.dll разобрать, что за вызовы там происходят, невозможно.
PHP в качестве скриптового языка для QUIK, Добавьте пожалуйста PHP в качестве скриптового языка для QUIK
 
Цитата
Андрей написал:
Знаю что Вы очень заняты, и у Вас очень много важных дел.
Тем не менее сохраняю надежду на вашу доброту и милость.

Почему бы Вам не добавить в качестве скриптового языка PHP.
А не этот недоязык LUA, который чисто по недоразумению стал таким популярным.

Тем более что готовые решения уже есть нужно только DLL откомпилировать.
Работы на пару недель всего то.
Вы можете либо сами добавить поддержку PHP, либо заказать разработку DLL, которая будет связывать Lua и PHP специально под свои нужды у профессионального разработчика. Благо, QLua позволяет подгружать любые DLL.

Задача добавления самого PHP нецелесообразна потому, что (Q)Lua уже предоставляет достаточную гибкость в разработке. То, что Вы не знаете Lua -- это не проблема Lua. Разводить зоопарк поддерживаемых языков в QUIK тоже особого смысла нет. В QUIK'е даже отказались от дальнейших улучшений QPILE, вожможно, по этой же причине.

QLua API бы ещё чуть-чуть доработать... но это уже лирика.
Размер стека
 
Цитата
s_mike@rambler.ru написал:
Меня же интересует, в частности, вложенность натив луа функций, в том числе рекурсии. Рекурсия в 20 уровней - это слишком грустно.
То, что LUA_MINSTACK = 20 ничего не значит, т.к. LUA_MINSTACK - это минимальный выделенный размер стека Lua на момент вызова пользовательской Си-функции.

Цитата
Sergey Gorokhov написал:
8000
Не совсем.

Согласно https://www.lua.org/source/5.0/llimits.h.html
Количество вложенных в друг друга функций (и Си-функций и Lua-функций) в Lua - это LUA_MAXCALLS = 4096, из них может быть только LUA_MAXCCALLS = 200 вызовов пользовательских Си-функций (всякие SearchItems и т.п.)
Значение констант INTERVAL_NN
 
timber,
можно и поискать по форуму:
https://forum.quik.ru/messages/forum10/message14511/topic1598/#message14511
помогите исправить ошибку attempt to index field(a nil value), при запуске скрипта если стакан не полный то вылезает ошибка attempt to index field(a nil value)
 
Алекс Лепс,
можно увидеть весь код целиком? Странно то, что 20 раз в цикле Вы запрашиваете getQuoteLevel2("SPBFUT","NKZ6") ...
Редакторы для QLUA Notepad++ vs SciTe
 
Использую https://www.sublimetext.com/
Очень доволен. Отладку выполняю без отладчика -- отладочной печатью.
Порядок работы со списком инструментов при безостановочной работе Quik'а и Lua-скрипта
 
Сейчас я работаю с данными при помощи Subscribe_Level_II_Quotes и Unsubscribe_Level_II_Quotes.
При этом подписка на данные переносится на следующий день. (т.е. я не отписаваюсь в обработчике OnDisconnected)
  1. В какой момент нужно проверять, что таблица всех инструментов обновилась (добавились новые, удалились старые)? В момент начала выполнения обработчика OnConnected таблица инструментов уже обновлена?
  2. Что делать с подписками по Subscribe_Level_II_Quotes на удаленные инструменты?
Робот у меня может непрерывно работать в нескольких месяцев.
QUIK FIX примеры использования
 
Цитата
Нет это не одно и тоже. Это два совершенна разных продукта, но выполняющие одну роль. Грубо говоря, если не вдаваться в подробности, то FIX Client Connector это урезанная версия QUIK FIX Adapter.  В частности одной из "урезанных" функций является отсутствие xml схем.  Это представлена по той ссылке которую Вы привели:
Ок. А где мне .xml-схему для FIX Client Connector найти? У брокера запрашивать отдельно?

Цитата
Кстати этот файл и есть описание протокола.
Ок. Спасибо
QUIK FIX примеры использования
 
Еще пара вопросов:
  • для Вас QUIK FIX Adapter и FIX Client Connector - это одно и то же? Мы с Вами об одном инструменте говорим?
  • в дистрибутиве, который получил я не было ни одного .xml-файла, получается мне его у брокера нужно отдельно запрашивать? (ниже список файлов, которые у меня уже есть)
Цитата
\Changes in FIX Client Connector Program Interface 3.28.pdf
\data\
\data\SystemInfo.xml
\datdir\
\datdir\acnt.dat
\datdir\alerts.dat
\datdir\alltrades.dat
\datdir\classes.dat
\datdir\info.log
\datdir\negdeals.dat
\datdir\negreports.dat
\datdir\negtrades.dat
\datdir\orders.dat
\datdir\par.dat
\datdir\sec.dat
\datdir\stoporders.dat
\datdir\trades.dat
\datdir\trans.dat
\dwevs.dll
\FIX_Client_Connector_program_interface.pdf
\FIX_Client_Connector_program_interface_eng.pdf
\FIX_Client_Connector_program_interface_protocol.pdf
\FIX_Client_Connector_program_interface_protocol_eng.pdf
\FIXClientConnector.exe
\FixClientConnector.ini
\import\
\import\FIXClientConnector.err
\import\FIXClientConnector.log
\import\OrderHistory.data
\import\orders.data
\import\storage.data
\import\storage.data.buf
\import\trades.data
\logdir\
\logdir\QuikApi.log
\msvcp100.dll
\msvcr100.dll
\PS.dll
\pubring.txk
\qmail.dll
\QRYPTO.CFG
\qrypto32.dll
\Qrypto32_Pr.dll
\QuikApi.dll
\QuikApi.ini
\randseed.bin
\readme_fcc_3.28.txt
\readme_fcc_3.28_eng.txt
\SecProv.dll
\secring.txk
\wt_de.dll
\wt_dtcp.dll
\Изменения в Программном интерфейсе  FIX Client Connector 3.28.pdf

P.S. SystemInfo.xml - это не схема.
Ошибки вычисления с плавающей точкой в LUA., LUA не может правильно посчитать 124.4 - 124.3? - Да ладно?!
 
Уже спрашивал подобное.
https://forum.quik.ru/messages/forum10/message15026/topic1654/#message15026
Это проблема не Quik'а, а операций с плавающей точкой, и актуально это для всех низкоуровневых языков программирования
Подскажите пожалуйста, где взять нормальную документацию по qlua?
 
Николай Камынин,
А зачем нужно изучать руководство по QPILE? Навскидку, что там есть, чего нет в документации QLua?
QUIK FIX примеры использования
 
Цитата
FIX Client Connector

Основано на единственном варианте реализации FIX-протокола и имеет заданную схему трансляции FIX-сообщений.

ARQA Technologies не проводит кастомизаций и не осуществляет интеграцию QUIK с внешними приложениями с использованием данного решения.
Где эта XML схема трансляции?
Или я что-то пропустил?
QUIK FIX примеры использования
 
Сергей,
можно поподробнее рассказать про XML схемы для подключения QUIKFIX
https://arqatech.com/ru/products/quik/modules/integration-solutions/fix-software-interfaces/ ?
Где их брать?
QUIK FIX примеры использования
 
Пока основные нерешённый для меня вопросы, это:
QUIK FIX примеры использования
 
Я имею ввиду примеры FIX сообщений, чтобы можно было написать простого работающего робота, который, например, получал список инструментов и выдавал ордер на покупку какого-нибудь из них по фиксированной цене и объёму, заданному в коде, чтобы затем расширять функционал, зная, что базовые функции уже работают и если проблемы и будут, то не в коде, а в конфигурации.

Конечно же не QuikFast (опечатался). Я имел ввиду QuickFAST - библиотеку с открытым исходным кодом для работы с FIX - https://www.ociweb.com/products/quickfast/

Кстати, где почитать про диалект FIX'а для QUIKFIX? Какие есть отличия от стандарта? (на случай, если примера найти не удатся).
QUIK FIX примеры использования
 
Здравствуйте.

Есть ли у вас примеры использования QUIK FIX, например, основанные на QuikFast?

Если вы используете QUIK FIX, с помощью каких инструметов вы с ним общаетесь? Какие открытые библиотеки (C++) используете?

P.S. Ответы на эти вопросы мне очень помогут в изучении общения с брокером по FIX в целом и общения с QUIK FIX в частности.
Как создать свою форму (окно) и разместить на ней элементы формы (чекбокс, список, кнопка, поле для ввода и тд), Создание новых элементов интерфейса
 
_sk_,
Не так сложно написать отдельную .dll, которая будет создавать отдельный Lua-поток и запускать его в новом системном потоке.
НО! Этот созданный поток нужно будет аккуратно завершать перед выходом из main, т. к. Quik о нём ничего знать не будет.
Вот поэтому вопрос: действительно ли нужен такой функционал?
не проходит вызов ds:Size из С++, в Lua работает, в C++ возвращается 0
 
Ну, если DS на стеке, что ж Вы его в аргументах вызова lua_pcall не учитываете?
И порядок элементов на стеке у Вас неправильный. Должно быть { Size, DS } а не { DS, Size }

Похожий пример смотрите здесь: https://forum.quik.ru/messages/forum10/message14511/topic1598/#message14511
Сделки на FORTS автоматически закрылись в конце торговой сессии
 
Egor Zaytsev,
можно ли изменить у уже выстааленной заявки дату экспирации?
есть ли для этой транзакции эквивалент с параметрами на английском языке?
Окно сообщений (пожелание)
 
Stanislav Tvorogov,
Спасибо!
Окно сообщений (пожелание)
 
Можно ли сделать так, чтобы при переключении сообщений в окне сообщений (вперёд-назад), окно сообщений не меняло своих размеров?
Снятие лимитной заявки. Какие callback'и будут вызываться?
 
Stanislav Tvorogov,
можно ли к транзакции на удаление ордера указать комментарий? Если да, то как это сделать?
CLIENT_CODE = "//comment" не работает: в broker_ref приходит пустая строка.
Какое максимальное количество знаков после запятой может содержать min_price_step?
 
На второй вопрос уже нашёл ответ.
Код
local info = getSecurityInfo("SPBFUT", "MMM6");
message(info.scale, 1);
Два других вопроса остаются в силе.
Какое максимальное количество знаков после запятой может содержать min_price_step?
 
getSecurityInfo возрващает поле min_price_step с типом number.
Некоторые инструменты имеют min_price_step 0.05.
Число 0.05 не имеет точного представления в типе number (double).
Код
local info = getSecurityInfo("SPBFUT", "MMM6");
message(string.format("%.20f", info.min_price_step), 1);  -- см. 3 последние цифры
Отсюда возникают вопросы:
1. Планируется ли менять тип min_price_step с number на string.
2. Регламентировано ли (и где) максимальное число значащих цифр после запятой для min_price_step.
3. Те же вопросы для любой переменной типа number c вещественной частью, возвращаемой через QLua API (пока столкнулся только с min_price_step).


Почему это важно:
Например, проверка на кратность цены вида ↓ работать не будет
Код
price = "235.7"
min_price_step = 0.5
assert(math.fmod(tonumber(price), min_price_step) == 0, "некратная цена");
Полностью ли выполнена заявка?
 
Вопрос в тему:
На практике кто-нибудь сталкивался с тем, что сумма всех qty > запрашиваемого объёма.
Я имею ввиду, всегда ли гарантировано хватает точности Lua-типа number (или Си типа double) для хранения значения объёма
(и проведения с этим значением поэтапного вычитания - вычисление невыполненного объёма)?
Изменение полей лимитной заявки
 
Вопрос скорее относится к выдаче заявок, а не конкретно к Lua, хотя реализовывать этот функционал планируется через Lua.

Можно ли изменить
  • объём
  • цену
  • лимитную заявку сконвертировать в заявку, выполняемую по рыночной цене
  • направление Buy на Sell и Sell на Buy
у уже выставленной лимитной заявки, зная её order_num? И если да, то как это сделать?
Есть у кого рабочий пример работы getFuturesHolding( )?
 
Цитата
Николай Бехтерев написал:
while Index >= 0 do
У вас Index внутри цикла может принять значение 0, следовательно в вызов getItem вы передадите -1, что неправильно.
Советую заменить условие на строгое Index > 0
или заменить получение последнего индекса
Код
Index = getNumberOf("stop_orders")-1
или использовать for с обратным шагом
Код
function main()
   local counter = 0;
   local key;
   for i=getNumberOf("stop_orders")-1,0,-1 do
      local item = getItem("stop_orders", i)
      if item.sec_code = "SiM6" and item.withdraw_time == 0 then
         key = item.order_num
         counter = counter + 1
         if counter >= 2 then
            message("ERROR",3)
         end
      end
   end
end
Вызов lua_CFunction из С++
 
dj.lexus,
Читайте внимательно документацию. У Вас сейчас есть всё для того (и книга и google), чтобы писать правильный код.
Также отладочной печатью в контрольных точках можно понять, после какой операции "падает" программа, а с помощью отладочной печати значений lua_gettop(L) - что происходит со стеком Lua во время выполнения.
Или наймите программиста / консультанта, который сделает это за Вас.

Перечитайте ещё раз документацию к luaL_ref.
Снятие лимитной заявки. Какие callback'и будут вызываться?
 
Цитата
Stanislav Tvorogov написал:
Например, если заявка была выставлена с другого сервера.
Можно поподробней описать эту ситуацию? Что значит "с другого сервера"?
Значит ли это тоже что и "с другого терминала подключённого к этому же счёту"?
Вызов lua_CFunction из С++
 
Цитата
dj.lexus написал:
Как же сохранить ссылку на таблицу, чтобы она "не потерялась" до конца работы программы?
Также можно хранить ссылку в глобальной переменной Lua - см. lua_setglobal(L, "myDS");
Вызов lua_CFunction из С++
 
Кстати, учтите, если Вы будете вызывать Ваши Си функции из разных потоков - поток main и поток callback'ов - то Вам нужно будет обеспечивать синхронный доступ к Вашим глобальным переменным. Можно с помощью std::mutex / std::recursive_mutex.
Вызов lua_CFunction из С++
 
А idx уже можно хранить в глобальной переменной в DLL, т. к. это int.
Вызов lua_CFunction из С++
 
Цитата
dj.lexus написал:
Получается, нужно знать индекс элемента, который требуется положить в стек. Как же сохранить ссылку на таблицу, чтобы она "не потерялась" до конца работы программы? Или не перепуталась со ссылкой на другой источник данных.
Если между вызовами Си функций из Lua, то можно сохранить это значение в LUA_REGISTRYINDEX - это специальная таблица, видимая только из Си и хранящая важную информацию (удалять из неё что-то не своё точно не надо). См. API
  • idx = luaL_ref(L, LUA_REGISTRYINDEX)
  • luaL_unref(L, LUA_REGISTRYINDEX, idx)
  • lua_rawgeti(L, LUA_REGISTRYINDEX, idx)
Цитата
dj.lexus написал:
говорит "table"
Значит таблица.
Вызов lua_CFunction из С++
 
Цитата
dj.lexus написал:
Видимо, я не до конца понимаю организацию стека Lua.
Рекомендую к прочтению книгу "Roberto Ierusalimschy - Programming in Lua - 2013". В своё время потратил на неё неделю, и не жалею.

Цитата
dj.lexus написал:
Правильно ли я понял, что таблица DS существует, пока указатель на неё хранится в стеке?

Немного подкорректирую Ваш вопрос:
Цитата
Правильно ли я понял, что значение DS существует, пока оно хранится в стеке?
Да. Это правильно.

Само значение, кроме того, можно скопировать (например, в качестве значения одного из ключей другой таблицы; lua_pushvalue как раз копирует значение). Таблицы на стеке хранятся в виде ссылок на содержимое таблиц, т.е. при таком копировании сами элементы таблицы не копируются - копируется только ссылка на таблицу.

За освобождение памяти выделенной под Lua-таблицы, userdata и строки отвечает сборщик мусора.
Освобожение памяти обычно происходит позже удаления всех ссылкок на таблицу / userdata / string.

Кстати, а Вы уверены, что DS - это таблица? Что говорит
Код
message(type(DS),1);
?

Если DS - это таблица, то QLUA API в этом месте сделано немного кривовато, т. к. DS можно бы было сразу сделать userdata, чтобы Си код обработки методов DS выглядел лаконичней и чуть производительней.
Вызов lua_CFunction из С++
 
  • Перед "return 0;" на стеке останутся лежать DS и С ( который = DS:C(1) ).
  • Можно стек не чистить, если myfunction вызывалась из Lua-кода.
  • Если планируете на стеке хранить много аргументов ( > LUA_MINSTACK), то гляньте документацию к lua_checkstack.
Вызов lua_CFunction из С++
 
dj.lexus,
Код
int myfunction(lua_State* L) {
   // DS = CreateDataSource("SPBFUT", "RIM6", INTERVAL_M1); // Работает

   lua_getglobal(L, "CreateDataSource");
   lua_pushstring(L, "SPBFUT");
   lua_pushstring(L, "RIM6");
   lua_getglobal(L, "INTERVAL_M1");
   lua_call(L, 3, 1);

   // результат на стеке
   int DS = lua_gettop(L);

   // C = DS:C(1); // Не получается
   lua_getfield(L, DS, "C");
   lua_pushvalue(L, DS);
   lua_pushnumber(L, 1);
   lua_call(L, 2, 1);

   // результат на стеке
   int C = lua_gettop(L);

   // DS:Close(); // Не получается
   lua_getfield(L, DS, "Close");
   lua_pushvalue(L, DS);
   lua_call(L, 1, 0);

   // В Lua 
   // obj:func(param);
   // это то же самое что
   // obj.func(obj, param);

        // как-то так
   return 0;
}
Вызов lua_CFunction из С++
 
Цитата
dj.lexus написал:
Я пытаюсь запустить из С++ функцию, ссылку на которую возвращает другая функция.
Код
  lua_CFunction  Close Handle;

//Создаём источник данных

lua_getglobal(L,  "CreateDataSource" );
lua_pushstring(L, class_code); //class_code
lua_pushstring(L, sec_code); //sec_code
lua_pushinteger(L, interval); //interval
lua_call(L,  3 ,  2 );

 if (lua_istable(L, 1 ))
{
   lua_push nil (L);
    while  (lua_next(L,  1 )  !  =   0 )
   {
       if (strcmp(lua_tostring(L,  -  2 ),  "Close" )  =  =   0 ) //Проверяем название поля
      {
          Close Handle  =  lua_tocfunction(L,  -  1 );
      }

      lua_pop(L,  1 );
   }
}

bool err  =  lua_isstring(L, 2 );

//Закрываем источник данных

 if ( Close Handle)
{
   lua_pushcfunction(L,  Close Handle);
   lua_call (L,  0 ,  1 );
    if (lua_isboolean(L,  1 ))
   {
      result  =  lua_toboolean(L,  1 )
   }
}
 return  result;  

Источник данных не закрывается. Может, кто сталкивался с подобной проблемой? В чём ошибка?
Напишите, что Вы хотите выполнить на Lua - помогу перевести на С++.
Снятие лимитной заявки. Какие callback'и будут вызываться?
 
Stanislav Tvorogov, т.е. TRANS_ID - это номер новой транзакции на отмену заявки с номером ORDER_KEY. Понятно.
std::recursive_mutex и cинхронизация потоков в Lua
 
Цитата
Вячеслав написал:
в созданном системном потоке в рамках main_lua_thread вызывается Lua-функция main. Без установки обработчиков ошибок это выглядит так: lua_getglobal(main_lua_thread, "main"); lua_pcall(main_lua_thread, 1, 0, 0);
Нет функции редактирования, поэтому исправляюсь:
lua_pcall(main_lua_thread, 0, 0, 0);
Как сделать простое чтение из файла?
 
Да что ж за день сегодня такой...
Код
-- открываете файл
local f = io.open("myfile.txt", "r"); -- или "rb" если хочется читать в "бинарном" режиме
-- читаете
message(f:read("*l"),1)
Как сделать простое чтение из файла?
 
Хотя немного наврал.

Из книги "Roberto Ierusalimschy - Programming in Lua - 2013"
Цитата
The io.read function reads strings from the current input file. Its arguments
control what to read:
“*a” reads the whole file
“*l” reads the next line (without newline)
“*L” reads the next line (with newline)
“*n” reads a number
num reads a string with up to num characters
Код
-- открываете файл
local f = io.open("myfile.txt", "r"); -- или "rb" если хочется читать в "бинарном" режиме
-- читаете
message(io.read("*l"),1)
деталей не знаю, нужно пробовать.
Как сделать простое чтение из файла?
 
Сразу комплексное решение:
https://forum.quik.ru/messages/forum10/message13789/topic1501/#message13789

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

Из документации info.chm / Раздел 6 / Импорт транзакций / Формат .tri-файла / Примеры строк
Цитата
Снятие заявки с номером 503983
CLASSCODE=TQBR; SECCODE=RU0009024277; TRANS_ID=5; ACTION=KILL_ORDER;  ORDER_KEY=503983;
Вопросы:
  • правильно ли, что ORDER_KEY - это то же значение, что и TRANS_ID переданное в sendTransaction ?
  • где используется передаваемый TRANS_ID (или ORDER_KEY, если я их спутал) ?
  • какие callback'и будут вызваны, если снимаемая заявка существует ?
  • по каким причинам существующая заявка не может быть снята ?
проверка статуса стопзаявки по битовым флагам, доступ к таблице "stop_orders"
 
Цитата
Роман Романов написал:
["STOP_ORDER_KEY"] = tostring(_NUMBER)
Имхо, надежней
Код
["STOP_ORDER_KEY"] = string.format("%d", _NUMBER)
т.к. tostring имеет обыкновение возвращать числа вещественной форме 0.00000
Вопрос по синтаксису Lua на пару строчек, Встретил в справочнике такое вот:
 
Николай Бехтерев,
Код
-- во-первых, Lua-функции могут возвращать несколько значений. К этому привыкаешь не сразу.
function f()
  return 1, "test", 5;
end

-- во-вторых все результаты одной функции можно перенаправить в другую
local f = io.open("log.log", "w+");
f:write(f())
-- выведет "1test5" ( то же самое, что и вызов io:write(1,"test",5); )

-- в-третьих, для обработки ошибок связанных с открытием файлов и не только, в Lua есть специальная функция assert
local f = assert(io.open("log.log", "w+"));
-- её алгоритм эквивалентен следующему:
function assert_alg(success, message)
    if not success then
        error(message);
    end
end

-- также assert удобно использовать для проверки правильности программы
assert(qty > 0, "Объём должен быть больше 0");
-- в случае, если условие ложно, выведелся ошибка "Объём должен быть больше 0"
Про ф-цию error() подробно я писал здесь: https://forum.quik.ru/messages/forum10/message13841/topic1225/#message13841
QUIK (версия 7.0.1.5), function OnTrade(trade), трехкратный вызов на одно событие.
 
Цитата
тот самый написал:
проще и безопасней, в таком случае, передавать параметры в строковом типе и если параметра нет - ставить "" - т.е. ничего не ставить.
присваивая же "nil" в LUA. Может получится так, что сборщик мусора - совсем избавится от этого параметра (честно говоря, давно не проверял - но, уже писалось кажется об этом).
Не не не не. Старатель знает, что пишет. И сборщик мусора тут не при чём. Любая Lua-таблица может быть проиндексирована любым значением в качестве индекса (кроме nil). В результате вы получите nil в случае, если ключ в таблице отсутствует или значение ключа. Поэтому код
Код
function OnTrade(trade)
    message(tostring(trade.aadfadfafdaf), 1);
end
не затрагивает сборщик мусора и абсолютно безопасен, хоть и бессмысленен.
std::recursive_mutex и cинхронизация потоков в Lua
 
Цитата
тот самый написал:
Цитата
Вячеслав   написал:
Да, создаются 2 системных потока, да, в каждом из них выполняется lua_pcall
Всегда, при разговоре на эту тему - разделяйте понятия:
системный поток - это НЕ LUA-поток, а поток ОС
LUA-поток - это не поток ОС. LUA-поток - сродни корутинам.

В самой LUA - никакие системные потоки - не создаются

Ок, разделяю:
Есть системный поток (основной поток процесса info.exe). При запуске Lua-скрипта:
  • создаётся lua_State *global = luaL_newstate();
  • выполняется код Lua-скрипта (по-простому - всё что вне декларций функций)
  • вызывается OnInit(имя_файла_скрипта)
  • создаётся новый Lua поток lua_State *main_lua_thread = lua_newthread(global);
  • созданный Lua-поток помещается в LUA_REGISTRYINDEX (luaL_ref), чтобы он не разрушался, и чтобы иметь возможность вызывать callback'и в основном Lua-потоке global.
  • создаётся новый системный поток
  • в созданном системном потоке в рамках main_lua_thread вызывается Lua-функция main. Без установки обработчиков ошибок это выглядит так: lua_getglobal(main_lua_thread, "main"); lua_pcall(main_lua_thread, 1, 0, 0);
  • в процессе работы всё просто. Когда терминал хочет вызвать callback, он выполняет: lua_getglobal(global, "OnQuote"); lua_push...  lua_pcall(global, *кол-во аргументов*, 0, *обработчик ошибок*); в случае ошибки, предполагаю, что терминал принудительно останавливает новый системный поток и останавливает выполнение скрипта. В этом случае возможна утечка памяти/ресурсов (ресурсов, например, если были загружены .dll с помощью require).
  • когда в новом системном потоке происходит выход из ф-ции lua_pcall, новый системный поток завершается
  • выполняется закрытие lua_close(global). main_lua_thread Lua-поток разрушится сам, т.к. он хранится в REGISTRYINDEX в global lua_State.
Цитата
тот самый написал:
1. по понятным причинам, не ручаюсь на 100% но, код работы с коллбеками, завязан на отдельный LUA-поток в контексте одной виртуальной машины. Другой поток (и физический и LUA-поток) - это, ещё один коллбек - функция "main".
Таким образом, никаких проблем там - уже давно не возникает.
Можно ещё разок. Я не понял, что Вы имеете ввиду.


Цитата
тот самый написал:
2. любой доступ к глобальным переменным - обёрнут критическими секциями. Это уже было сказано Михаилом Булычевым. Строго говоря, такие вопросы Вам - и надо ему задавать, а не "бодаться" с другими.
Случайно нет ссылки на то, что этот человек сказал и кто этот человек?


Цитата
Николай Камынин написал:
все решается с помощью одного event,
функций sinsert  и sremove
и использованием глобальных переменных.
Мне сложно Вам отвечать, т.к., возможно, Вы либо не понимаете, как устроен многопоточный доступ к Си данным lua_State, либо, в чём отличие Event (созданного с помощью CreateEvent) от критической секции (мьютекса).
std::recursive_mutex и cинхронизация потоков в Lua
 
Цитата
которые как раз и вызывают функции из lapi.c
имеется ввиду, что функции из lapi.c вызывают внутренние функции в библиотеке Lua, и их же вызывает luaV_execute напрямую. Например, lua_settable вызывает luaV_settable, которую напрямую (через макрос) вызывает luaV_execute.
Страницы: 1 2 След.
Наверх