Так, разобрался. Был какой-то глюк в базе. Почему-то не хватало прав именно на update, хотя все права были даны. Но вот почему quik нигде ни разу не ругнулся и не выдал ошибки, это странно.
Данные загружаются в Oracle. Посмотрел сейчас во всех sql-операторах в базе (sel ect * fr om v$sql ...). Оператора "UPD ATE TRADE.QUIK_CURRENT_TABLE_PARAMS SE T ..." там вообще нет. А это значит что из QUIK-а update вообще не поступал ни разу.
Quik 7.14.1.7 Пытаюсь экспортировать таблицу параметров по ODBC. Но данные в таблицу только вставляются, но не обновляются. Т.е. если нажать "Прекратить вывод", а затем "Начать вывод", то в таблицу всё запишется правильно, но потом записи не обновляются. В логе тоже ничего криминального не вижу:
Добрый день. Вопрос не совсем по quik, но буду благодарен, если кто-нибудь мне поможет. Для анализа данных хочу написать свою программу, которая по нажатию кнопки будет отправлять свечу OHLC в metastock. При каждом нажатии кнопки должна появляться следующая свеча. Так сказать имитация онлайн торгов.
Ну и вопрос, как подключиться к metastock из своей программы ? Как это делает Quik ? Может можно как-то задействовать файлы winros.exe и iwr.dll из своей программы ? Может есть где-то какая-нибудь документация ? Направьте, пожалуйста меня в нужном направлении.
Дмитрий написал: Нет, в корне диска D, т.е. даже не на системном диске.
Странно. у меня и на 7 и на 10 работает правильно. Не под админом. Стоял и в корне С и Д. Вообще квик не требует админских прав. (если не стоит в с:\програмфилес)
Цитата
Дмитрий написал: На компьютере уральский часовой пояс.
Это сколько? Может поставить московский? и настроить восстановление с 09-00 по 23-50
У меня на 7 тоже всё нормально работало без админских прав. Потом 7 обновил до 10 через центр обновления Windows. Тоже всё нормально работало. Потом вышел из строя жёсткий диск и установил 10 на голое железо. Вот тут и начались проблемы. Видать при обновлении с 7 до 10 унаследовались все необходимые права от 7. А при полной установке 10 - нет.
Дмитрий написал: А значит речи об автозагрузке программы при старте Windows быть не может, либо придётся мудрить с планировщиком заданий и прочие костыли.
Вопрос на засыпку: квик стоит в ProgramFiles?
Нет, в корне диска D, т.е. даже не на системном диске.
Дмитрий написал: Запустил от имени администратора. Вроде работает. Прошу указать, какие права нужны и как исправить, чтобы работало как обычно. Проблема появилась после установки на компьютер "с нуля" ОС Windows 10. Сначала была Windows 7, на которой Quik работал нормально. Потом Windows 7 через Центр обновления обновилась до Windows 10. После этого также всё работало нормально, видимо все права и настройки унаследовались от предыдущей Windows 7. Но потом вышел из строя HDD и я установил Windows 10 уже "с нуля" без всяких обновлений. Тут и начались проблемы. Скажите где, как и какие права надо дать. На Windows 10 я единственный пользователь - администратор.
Добрый день,
Достаточно зайти в свойства ярлыка рабочего места QUIK (правой кнопкой мыши по ярлыку->свойства) и на вкладке "Совместимость" установить флаг "Выполнять эту программу от имени администратора".
Я понимаю, что этого достаточно. но во-первых - это не правильно для такой системы как Quik и это является ошибкой и недоработкой, во-вторых, всё равно придётся подтверждать привилегии администратора при каждом запуске в отдельном окне. А значит речи об автозагрузке программы при старте Windows быть не может, либо придётся мудрить с планировщиком заданий и прочие костыли.
Запустил от имени администратора. Вроде работает. Прошу указать, какие права нужны и как исправить, чтобы работало как обычно. Проблема появилась после установки на компьютер "с нуля" ОС Windows 10. Сначала была Windows 7, на которой Quik работал нормально. Потом Windows 7 через Центр обновления обновилась до Windows 10. После этого также всё работало нормально, видимо все права и настройки унаследовались от предыдущей Windows 7. Но потом вышел из строя HDD и я установил Windows 10 уже "с нуля" без всяких обновлений. Тут и начались проблемы. Скажите где, как и какие права надо дать. На Windows 10 я единственный пользователь - администратор.
Quik, версия 7.2.1.5. Работает круглосуточно не выключаясь. В меню "Соединения" стоит "Восстанавливать связь автоматически через 5 секунд с 11-00 до 02-00". На компьютере уральский часовой пояс. Ставил и с 11 до 23. Каждое утро соединения нет. Приходится каждое утро нажимать на ключик и вводить заново логин и пароль. Даже после начала торгов и после 11-00 местного времени. Торгуют роботы. Если с утра к компьютеру не подойти и не нажать на ключик, то quik так и не соединится. Брокер ПСБ. Специально соединение никто никогда не разрывает.
В последнем вопросе имелось ввиду: Можно ли при завершении потока делать lua_unref(L, thread_L_ref); в самОм новом-созданном потоке, т.е. внутри функции потока myThread(LPVOID param) ?
Дмитрий пишет: Добрый день. Перечитал старый форум, но внятного ответа так и не нашёл. Наверняка уже многие делали то же, что и я, и многие ещё будут делать. Поэтому хочу уточнить один важный момент. Есть Lua - скрипт, в котором подключается своя библиотека на c++. В этой библиотеке создаётся несколько потоков.Например, 1 поток будет отправлять заявки в Quik, другой поток будет читать таблицу параметров, ещё несколько потоков будут подписываться на ТВС и перебирать все сделки через CreateDataSource (а их может быть миллионы). В общем каждый поток будет одновременно запускать какие-то Lua-функции. А Lua - стек у нас только один. Вопрос: нужно ли синхронизировать эти потоки и гарантировать вызов lua функций из dll в одно время только однажды ? Если да, то получается, что пока какой-то поток, например перебирает все сделки в цикле (миллион), то заявки отправлять нельзя ? Параметры читать нельзя ? Все задачи будут ждать завершения какого-то одного потока ? А если нужно одновременно в разных потоках вызвать CreateDataSource, каждый со своим инструментом, и одновременно их записывать в какие-либо массивы ?
Добрый день. Я бы настоятельно советовал Вам посмотреть в сторону coroutine в Lua. Уверен, что их возможности полностью покроют описанные Вами задачи. Но если желание наплодить потоков в своей библиотеке непреодолимо, то рекомендации ниже: 1. Линкуйте свою библиотеку с qlua.dll 2. Если пункт два вызывает вопросы, то убедитесь что в папке с терминалом (там же, где лежит info.exe и qlua.dll) присутствует файл lua5.1.dll собранный нами. Проверить это можно в свойствах файла:
3.Для каждого отдельного потока, который работает с Lua перед его запуском необходимо проделать примерно следующее:
4. При завершении работы поток не должен вызывать lua_close(thread_L), это приводит к закрытию всей Lua для скрипта. 5. для того чтобы сборщик мусора при завершении все корректно убрал необходимо сделать:
Код
lua_unref(L, thread_L_ref);
Вроде все. Но я бы все таки настоятельно рекомендовал использовать Lua coroutine
А что такое в коде "callbackCode" ? По описанию функции там должен быть lua_State. Какой подставлять - L или thread_L_stack ?
И можно ли при завершении потока делать thread_L_stack в самОм новом-созданном потоке, т.е. внутри функции потока myThread(LPVOID param) ?
Для того чтобы получить все сделки сессии, обычно, мы должны открыть набор данных через CreateDataSource, пройти в цикле по этому набору данных и забрать всё что там есть. И дальше забирать все вновь поступающие сделки в OnAllTrade. А что будет если мы запустили quik в середине дня. За пол дня было совершено, допустим 100 000 сделок. Как известно, эти 100 000 сделок в наборе данных появляются не сразу, а только начинают загружаться с сервера quik. В итоге при переборе всех сделок в цикле мы будем иметь в наборе данных только, допустим 10 000 сделок. Так вот, остальные 90 000 старых сделок придут в OnAllTrade ?
Допустим в Lua-скрипте есть функция, которая должна передать таблицу в функцию в dll на с++
Код
function OnQuote(class, sec )
if class =="SPBFUT" and sec == "RIZ2" then
ql2 = getQuoteLevel2(class, sec)
local i = 5
func_in_dll(i, gl2)
end
end
Теперь функция в самой dll:
Код
[/CODE][CODE]int func_in_dll(lua_State *L) {
Код
int i = luaL_checkinteger(L, 1);
-- как теперь получить таблицу ql2 ?
return 0;
}
Так как получить таблицу ? Как работать с её элементами. В частности, в данном примере, в таблицу gl2 вложены ещё 2 таблицы: bid и offer. Как с ними работать в c++ ?
Допустим, если взять FORTS, то при вводе заявки на покупку надо указать максимально возможную цену. И заявка будет исполнена по ближайшей самой лучшей цене. В чём тогда смысл галки "рыночная", если эта заявка в любом случае исполнится по лучшей цене.
Допустим, начали читать таблицу Orders и в эту же секунду приходит изменение заявок в OnOrder. Имеем две версии одной и той же заявки. Как узнать, какая из них актуальная и последняя ? То же самое касается и стоп-заявок.
Допустим есть у меня Lua-скрипт. В нём отправляется заявка, далее ждём результат в OnTransReply. Вопрос: в OnTransReply в моём скрипте гарантированно придёт только информация о моей последней отправленной заявке в этом же скрипте ? Либо что-то ещё ? Когда я буду ждать ответа в OnTransReply, может ли туда прилететь что-то ещё ? Например от других, параллельно работающих Lua-скриптов, которые также отправляют заявки ? Либо от trc-файлов, библиотеки trans2quik.dll или ручного ввода заявки ?
Запускаем эту функцию в цикле 100000 раз. Если передаваемый lua_State *L не из main, то quik падает в неожиданных и разных местах кода. Если в функции не обращаться к полям CreateDataSource, то всё работает нормально и lua_State *L значения не имеет.
Дмитрий пишет: Месяцвозился с проблемой. При обращении к функции CreateDataSource из внешней dll периодически падал quik. В цикле 100000 раз обращался к полю Size(). Причём падал совершенно в разных местах и воспроизвести однозначно проблему не получалось. Слинковал dll с qlua.dll падения прекратились, но quik просто стал намертво зависать. В ходе манипуляций выяснил, что обращаться к полям CreateDataSource нужно по стеку (lua_state), полученному из функции main, а например, не в каком-нибудь OnInit(). Сохранил указатель lua_state *L в функции main и падения квика прекратились. Ничего тут не спрашиваю, просто предупреждаю. Ребята, имейте это ввиду, чтобы не мучались.
Добрый день. Сообщите версию терминала, на которой проводили исследования.
n=getNumberOf('all_trades') for i=0,n-1 do L = getItem('all_trades', i) L = L.sec_code ..';'..L.trade_num..';'..L.flags..';'..L.price..';'..L.qty..';'..os.date("%Y-%m-%d;%H:%M:%S", os.time(L.datetime)) end
Месяцвозился с проблемой. При обращении к функции CreateDataSource из внешней dll периодически падал quik. В цикле 100000 раз обращался к полю Size(). Причём падал совершенно в разных местах и воспроизвести однозначно проблему не получалось. Слинковал dll с qlua.dll падения прекратились, но quik просто стал намертво зависать. В ходе манипуляций выяснил, что обращаться к полям CreateDataSource нужно по стеку (lua_state), полученному из функции main, а например, не в каком-нибудь OnInit(). Сохранил указатель lua_state *L в функции main и падения квика прекратились. Ничего тут не спрашиваю, просто предупреждаю. Ребята, имейте это ввиду, чтобы не мучались.
Добрый день. Собственно вопрос в названии темы. Допустим подписаны на получение всех сделок либо через CreateDataSource, либо путём ручного открытия таблицы всех сделок по необходимым инструментам. Насколько я понимаю, функция OnAllTrade получает только новые сделки, поступающие с сервера. А как получить уже поступившие сделки с начала сессии или дня ? В CreateDataSource нет номера сделки и её направления (покупка/продажа). Как тогда отличить сделки в CreateDataSource от того, что насобирали в OnAllTrade, чтобы исключить дубли ? Если никак, то можно хотя бы полностью прочитать как-то открытую таблицу всех сделок ?
Добрый день. Перечитал старый форум, но внятного ответа так и не нашёл. Наверняка уже многие делали то же, что и я, и многие ещё будут делать. Поэтому хочу уточнить один важный момент. Есть Lua - скрипт, в котором подключается своя библиотека на c++. В этой библиотеке создаётся несколько потоков.Например, 1 поток будет отправлять заявки в Quik, другой поток будет читать таблицу параметров, ещё несколько потоков будут подписываться на ТВС и перебирать все сделки через CreateDataSource (а их может быть миллионы). В общем каждый поток будет одновременно запускать какие-то Lua-функции. А Lua - стек у нас только один. Вопрос: нужно ли синхронизировать эти потоки и гарантировать вызов lua функций из dll в одно время только однажды ? Если да, то получается, что пока какой-то поток, например перебирает все сделки в цикле (миллион), то заявки отправлять нельзя ? Параметры читать нельзя ? Все задачи будут ждать завершения какого-то одного потока ? А если нужно одновременно в разных потоках вызвать CreateDataSource, каждый со своим инструментом, и одновременно их записывать в какие-либо массивы ?