Дмитрий (Все сообщения пользователя)

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

Страницы: 1
Вывод по ODBC - не обновляются данные
 
Так, разобрался. Был какой-то глюк в базе. Почему-то не хватало прав именно на update, хотя все права были даны. Но вот почему quik нигде ни разу не ругнулся и не выдал ошибки, это странно.
Вывод по ODBC - не обновляются данные
 
Данные загружаются в Oracle. Посмотрел сейчас во всех sql-операторах в базе (sel ect * fr om v$sql ...). Оператора "UPD ATE TRADE.QUIK_CURRENT_TABLE_PARAMS SE T ..." там вообще нет. А это значит что из QUIK-а update вообще не поступал ни разу.
Вывод по ODBC - не обновляются данные
 
Создал первичный ключ. Ничего не изменилось.
Вывод по ODBC - не обновляются данные
 
Quik 7.14.1.7
Пытаюсь экспортировать таблицу параметров по ODBC. Но данные в таблицу только вставляются, но не обновляются. Т.е. если нажать "Прекратить вывод", а затем "Начать вывод", то в таблицу всё запишется правильно, но потом записи не обновляются.
В логе тоже ничего криминального не вижу:
Цитата
Цитата
07/03/18 14:43:21.122 [TID=1600] Sleep, table = QUIK_CURRENT_TABLE_PARAMS
Цитата
07/03/18 14:43:21.228 [TID=10820] Add_new_data, table = QUIK_CURRENT_TABLE_PARAMS,new_seqnumber_to_write = 8677, write_operation_type = UPD ATE DATA, sql query = UPD ATE TRADE.QUIK_CURRENT_TABLE_PARAMS SET TIME_CHANGE='12:43:21' WHERE INSTRUMENT='RTS-9.18 [FORTS: Фьючерсы]'
Цитата
07/03/18 14:43:21.228 [TID=1600] Wake up, table = QUIK_CURRENT_TABLE_PARAMS
Цитата
07/03/18 14:43:21.229 [TID=1600] After ExistData, table = QUIK_CURRENT_TABLE_PARAMS, ExistNewDataForExport = TRUE SQL statement = "UPDATE TRADE.QUIK_CURRENT_TABLE_PARAMS SE T TIME_CHANGE='12:43:21' WHERE INSTRUMENT='RTS-9.18 [FORTS: Фьючерсы]'"
Цитата
07/03/18 14:43:21.229 [TID=1600] Poke Data, table = QUIK_CURRENT_TABLE_PARAMS, henv = 01E8E698, hdbc = 01E8E718, insert_into_table = 01E8EB20, update_table = 06726FC8, delete_from_table = 06727338, hstmt = 06726FC8, SQL statement = "UPDATE TRADE.QUIK_CURRENT_TABLE_PARAMS SE T TIME_CHANGE='12:43:21' WHERE INSTRUMENT='RTS-9.18 [FORTS: Фьючерсы]'"
Цитата
07/03/18 14:43:21.229 [TID=1600]
Цитата
Duration: 0
Цитата
07/03/18 14:43:21.229 [TID=1600]
Цитата
07/03/18 14:43:21.230 [TID=1600] After ExistData, table = QUIK_CURRENT_TABLE_PARAMS, ExistNewDataForExport = FALSE SQL statement = "is absent"
Цитата
07/03/18 14:43:21.230 [TID=1600] Sleep, table = QUIK_CURRENT_TABLE_PARAMS
Экспорт в Metastock из своей программы на C#, C++ ...
 
Добрый день. Вопрос не совсем по quik, но буду благодарен, если кто-нибудь мне поможет.
Для анализа данных хочу написать свою программу, которая по нажатию кнопки будет отправлять свечу OHLC в metastock. При каждом нажатии кнопки должна появляться следующая свеча. Так сказать имитация онлайн торгов.

Ну и вопрос, как подключиться к metastock из своей программы ? Как это делает Quik ? Может можно как-то задействовать файлы winros.exe и iwr.dll из своей программы ? Может есть где-то какая-нибудь документация ? Направьте, пожалуйста меня в нужном направлении.
Каждое утро приходится вводить логин и пароль, Quik не восстанавливает соединение
 
Цитата
Imersio Arrigo написал:
Цитата
Дмитрий   написал:
Нет, в корне диска D, т.е. даже не на системном диске.
Странно. у меня и на 7 и на 10 работает правильно. Не под админом.
Стоял и в корне С и Д.
Вообще квик не требует админских прав. (если не стоит в с:\програмфилес)
Цитата
Дмитрий   написал:
На компьютере уральский часовой пояс.
Это сколько?
Может поставить московский? и настроить восстановление с 09-00 по 23-50
У меня на 7 тоже всё нормально работало без админских прав. Потом 7 обновил до 10 через центр обновления Windows. Тоже всё нормально работало. Потом вышел из строя жёсткий диск и установил 10 на голое железо. Вот тут и начались проблемы. Видать при обновлении с 7 до 10 унаследовались все необходимые права от 7. А при полной установке 10 - нет.
Каждое утро приходится вводить логин и пароль, Quik не восстанавливает соединение
 
Цитата
Imersio Arrigo написал:
Цитата
Дмитрий   написал:
А значит речи об автозагрузке программы при старте Windows быть не может, либо придётся мудрить с планировщиком заданий и прочие костыли.
Вопрос на засыпку: квик стоит в ProgramFiles?
Нет, в корне диска D, т.е. даже не на системном диске.
Каждое утро приходится вводить логин и пароль, Quik не восстанавливает соединение
 
Цитата
Stanislav Tvorogov написал:
Цитата
Дмитрий   написал:
Запустил от имени администратора. Вроде работает. Прошу указать, какие права нужны и как исправить, чтобы работало как обычно.
Проблема появилась после установки на компьютер "с нуля" ОС Windows 10.
Сначала была Windows 7, на которой Quik работал нормально. Потом Windows 7 через Центр обновления обновилась до Windows 10. После этого также всё работало нормально, видимо все права и настройки унаследовались от предыдущей Windows 7. Но потом вышел из строя HDD и я установил Windows 10 уже "с нуля" без всяких обновлений. Тут и начались проблемы.
Скажите где, как и какие права надо дать. На Windows 10 я единственный пользователь - администратор.
Добрый день,

Достаточно зайти в свойства ярлыка рабочего места QUIK (правой кнопкой мыши по ярлыку->свойства) и на вкладке "Совместимость" установить флаг "Выполнять эту программу от имени администратора".
Я понимаю, что этого достаточно. но во-первых - это не правильно для такой системы как Quik и это является ошибкой и недоработкой, во-вторых, всё равно придётся подтверждать привилегии администратора при каждом запуске в отдельном окне. А значит речи об автозагрузке программы при старте Windows быть не может, либо придётся мудрить с планировщиком заданий и прочие костыли.
Каждое утро приходится вводить логин и пароль, Quik не восстанавливает соединение
 
Запустил от имени администратора. Вроде работает. Прошу указать, какие права нужны и как исправить, чтобы работало как обычно.
Проблема появилась после установки на компьютер "с нуля" ОС Windows 10.
Сначала была Windows 7, на которой Quik работал нормально. Потом Windows 7 через Центр обновления обновилась до Windows 10. После этого также всё работало нормально, видимо все права и настройки унаследовались от предыдущей Windows 7. Но потом вышел из строя HDD и я установил Windows 10 уже "с нуля" без всяких обновлений. Тут и начались проблемы.
Скажите где, как и какие права надо дать. На Windows 10 я единственный пользователь - администратор.
Каждое утро приходится вводить логин и пароль, Quik не восстанавливает соединение
 
Есть сообщение в 02:19 "Соединение разорвано".
Каждое утро приходится вводить логин и пароль, Quik не восстанавливает соединение
 
Quik, версия 7.2.1.5. Работает круглосуточно не выключаясь. В меню "Соединения" стоит "Восстанавливать связь автоматически через 5 секунд с 11-00 до 02-00". На компьютере уральский часовой пояс. Ставил и с 11 до 23.
Каждое утро соединения нет. Приходится каждое утро нажимать на ключик и вводить заново логин и пароль. Даже после начала торгов и после 11-00 местного времени.
Торгуют роботы. Если с утра к компьютеру не подойти и не нажать на ключик, то quik так и не соединится.
Брокер ПСБ. Специально соединение никто никогда не разрывает.
Синхронизация потоков в своей dll на с++
 
В последнем вопросе имелось ввиду:
Можно ли при завершении потока делать lua_unref(L, thread_L_ref);  в самОм новом-созданном потоке, т.е. внутри функции потока myThread(LPVOID param) ?
Синхронизация потоков в своей dll на с++
 
Цитата
Michael Bulychev пишет:
Цитата
Дмитрий пишет:
Добрый день. Перечитал старый форум, но внятного ответа так и не нашёл. Наверняка уже многие делали то же, что и я, и многие ещё будут делать. Поэтому хочу уточнить один важный момент.
Есть 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 перед его запуском необходимо проделать примерно следующее:
Код
   DWORD WINAPI myThread(LPVOID param) 
{    
   lua_State  * L  =  (lua_State * )param;  
    ..  ..   
    return   0 ;
}   
 .. . 
//вот тут формируется новый стек Lua для потока
lua_gc(L, LUA_GCSTOP,  0 );  
thread_L_stack  =  lua_newthread(L); 
thread_L_ref  =  luaL_ref( callbackCode, LUA_REGISTRYINDEX); 
lua_pushvalue(callbackCode,  -  1 );  
lua_gc(L, LUA_GCRESTART,  0 );  
 .. .    
CreateThread(NULL,  0 , myThread, (LPVOID) tread_L_stack,  0 , NULL);

  
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)  ?
В OnAllTrade (OnTrade, OnOrders) поступают только новые сделки ?
 
Для того чтобы получить все сделки сессии, обычно, мы должны открыть набор данных через CreateDataSource, пройти в цикле по этому набору данных и забрать всё что там есть. И дальше забирать все вновь поступающие сделки в OnAllTrade. А что будет если мы запустили quik в середине дня. За пол дня было совершено, допустим 100 000 сделок. Как известно, эти 100 000 сделок в наборе данных появляются не сразу, а только начинают загружаться с сервера quik. В итоге при переборе всех сделок в цикле мы будем иметь в наборе данных только, допустим 10 000 сделок. Так вот, остальные 90 000 старых сделок придут в OnAllTrade ?
Помогите принять Lua-таблицу в dll на c++
 
Допустим в 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++ ?
Диапазоны типов данных номеров сделок, заявок, стоп-заявок.
 
Какое может быть максимальное значение у номеров сделок, заявок, стоп-заявок ? Int32, Int64 или double ?
В чём смысл рыночной заявки ?
 
Допустим, если взять FORTS, то при вводе заявки на покупку надо указать максимально возможную цену. И заявка будет исполнена по ближайшей самой лучшей цене. В чём тогда смысл галки "рыночная", если эта заявка в любом случае исполнится по лучшей цене.
Дата снятия стоп-заявки
 
Цитата
s_mike@rambler.ru пишет:
Цитата
Дмитрий пишет:
В таблице stop_orders есть только поле
withdraw_time NUMBER Время снятия заявки

А где дата снятия заявки ? Или под датой всегда подразумевается текущая дата ? А под текущей датой подразумевается текущее время на сервере QUIK ?
Дата снятия заявки есть текущая торговая дата. Снятая условная заявка живет только в течение текущей торговой сессии.
Есть ещё:
Время начала периода действия заявки типа «Тэйк-профит и стоп-лимит»
Время окончания периода действия заявки типа «Тэйк-профит и стоп-лимит»

Эта стоп заявка также действует только в текущей торговой сессии ? И ей нельзя поставить срок истечения "до отмены", как у обычной стоп-заявки ?
Дата снятия стоп-заявки
 
В таблице stop_orders есть только поле
withdraw_time NUMBER Время снятия заявки

А где дата снятия заявки ? Или под датой всегда подразумевается текущая дата ? А под текущей датой подразумевается текущее время на сервере QUIK ?
Какая последняя версия заявки (стоп-заявки) в Orders и OnOrder ?
 
Допустим, начали читать таблицу Orders и в эту же секунду приходит изменение заявок в OnOrder. Имеем две версии одной и той же заявки. Как узнать, какая из них актуальная и последняя ? То же самое касается и стоп-заявок.
Что приходит в OnTransReply ?
 
Допустим есть у меня Lua-скрипт. В нём отправляется заявка, далее ждём результат в OnTransReply.
Вопрос: в OnTransReply в моём скрипте гарантированно придёт только информация о моей последней отправленной заявке в этом же скрипте ? Либо что-то ещё ? Когда я буду ждать ответа в OnTransReply, может ли туда прилететь что-то ещё ? Например от других, параллельно работающих Lua-скриптов, которые также отправляют заявки ? Либо от trc-файлов, библиотеки trans2quik.dll или ручного ввода заявки ?
Внешняя DLL + CreateDataSource + Lua - стек
 
И. сейчас эта функция вызывается из порождённого потока, если стек передан из main, то всё работает.
Внешняя DLL + CreateDataSource + Lua - стек
 
Цитата
Michael Bulychev пишет:
QSubscribeAllTrades вызывается в других потоках порождаемых Вашей DLL?
Да, но также тестировал и в main и в OnInit - разницы нет.
Внешняя DLL + CreateDataSource + Lua - стек
 
Вот функция в Lua скрипте. При первом запуске она подписывается на сделки, при всех последующих просто выводит Size()
Код
tds = {}
function SubscribeAllTrades(classcode, seccode, loadalltradesafternum)    
   local gcsck = GetClassSecCodeKey(classcode, seccode)

   if gcsck == "" then
      return 0
   else         
      if tds[gcsck] == nil then      
         local ds = CreateDataSource(classcode, seccode, INTERVAL_TICK)
         if ds == nil then return 0 end
         ds:SetEmptyCallback()
         sleep(50)
         ds:Close()
         ds = nil
         ds = CreateDataSource(classcode, seccode, INTERVAL_TICK)
         ds:SetEmptyCallback()
         sleep(50)
         ds:Close()
         ds = nil
         ds = CreateDataSource(classcode, seccode, INTERVAL_TICK)
         ds:SetEmptyCallback()   
         tds[gcsck] = ds
         ds = nil
         sleep(100)
      end
      local str = tostring(tds[gcsck]:Size())   
      PrintDbgStr(str)         
      return 1      
   end         
end
 

Вот функция в библиотеке DLL

Код
bool QSubscribeAllTrades(lua_State *L, const string classcode, const string seccode, unsigned int loadalltradesafternum)
{
   lua_getfield(L, LUA_GLOBALSINDEX, "SubscribeAllTrades");
   lua_pushstring(L, classcode.c_str());
   lua_pushstring(L, seccode.c_str());   
   lua_pushnumber(L, loadalltradesafternum);
   lua_call(L, 3, 1);
   long R = (int)lua_tointeger(L, -1);
   lua_pop(L, 1);      
   return (R == 1);
}
 
Запускаем эту функцию в цикле 100000 раз. Если передаваемый  lua_State *L не из main, то quik падает в неожиданных и разных местах кода. Если в функции не обращаться к полям CreateDataSource, то всё работает нормально и  lua_State *L значения не имеет.
Внешняя DLL + CreateDataSource + Lua - стек
 
Цитата
Michael Bulychev пишет:
Цитата
Дмитрий пишет:
Месяцвозился с проблемой. При обращении к функции CreateDataSource из внешней dll периодически падал quik. В цикле 100000 раз обращался к полю Size(). Причём падал совершенно в разных местах и воспроизвести однозначно проблему не получалось. Слинковал dll с qlua.dll падения прекратились, но quik просто стал намертво зависать. В ходе манипуляций выяснил, что обращаться к полям CreateDataSource нужно по стеку (lua_state), полученному из функции main, а например, не в каком-нибудь OnInit(). Сохранил указатель lua_state *L в функции main и падения квика прекратились.
Ничего тут не спрашиваю, просто предупреждаю. Ребята, имейте это ввиду, чтобы не мучались.
Добрый день.
Сообщите версию терминала, на которой проводили исследования.
6.16.1.15
Как получить все сделки из ТВС ?
 
Вроде нашёл.


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
Внешняя DLL + CreateDataSource + Lua - стек
 
Месяцвозился с проблемой. При обращении к функции CreateDataSource из внешней dll периодически падал quik. В цикле 100000 раз обращался к полю Size(). Причём падал совершенно в разных местах и воспроизвести однозначно проблему не получалось. Слинковал dll с qlua.dll падения прекратились, но quik просто стал намертво зависать. В ходе манипуляций выяснил, что обращаться к полям CreateDataSource нужно по стеку (lua_state), полученному из функции main, а например, не в каком-нибудь OnInit(). Сохранил указатель lua_state *L в функции main и падения квика прекратились.
Ничего тут не спрашиваю, просто предупреждаю. Ребята, имейте это ввиду, чтобы не мучались.
Как получить все сделки из ТВС ?
 
Добрый день.
Собственно вопрос в названии темы. Допустим подписаны на получение всех сделок либо через CreateDataSource, либо путём ручного открытия таблицы всех сделок по необходимым инструментам. Насколько я понимаю, функция OnAllTrade получает только новые сделки, поступающие с сервера. А как получить уже поступившие сделки с начала сессии или дня ? В  CreateDataSource нет номера сделки и её направления (покупка/продажа). Как тогда отличить сделки в  CreateDataSource от того, что насобирали в OnAllTrade, чтобы исключить дубли ? Если никак, то можно хотя бы полностью прочитать как-то открытую таблицу всех сделок ?
Синхронизация потоков в своей dll на с++
 
Спасибо. Буду думать как лучше сделать.
Синхронизация потоков в своей dll на с++
 
Добрый день. Перечитал старый форум, но внятного ответа так и не нашёл. Наверняка уже многие делали то же, что и я, и многие ещё будут делать. Поэтому хочу уточнить один важный момент.
Есть Lua - скрипт, в котором подключается своя библиотека на c++. В этой библиотеке создаётся несколько потоков.Например, 1 поток будет отправлять заявки в Quik, другой поток будет читать таблицу параметров, ещё несколько потоков будут подписываться на ТВС и перебирать все сделки через CreateDataSource (а их может быть миллионы). В общем каждый поток будет одновременно запускать какие-то Lua-функции. А Lua - стек у нас только один. Вопрос:
нужно ли синхронизировать эти потоки и гарантировать вызов lua функций из dll в одно время только однажды ? Если да, то получается, что пока какой-то поток, например перебирает все сделки в цикле (миллион), то заявки отправлять нельзя ? Параметры читать нельзя ? Все задачи будут ждать завершения какого-то одного потока ? А если нужно одновременно в разных потоках вызвать CreateDataSource, каждый со своим инструментом, и одновременно их записывать в какие-либо массивы ?
Страницы: 1
Наверх