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

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

Страницы: 1
Вывод данных из quik во внешнюю программу, API, DDE, ODBC, .txt.
 
Но если это вопрос безопасности, анонимности или прочий значимый повод, то конечно лучше оставить реестр чистым. Я просто не в курсе данных вещей, а мою проблему можно решить и другим путем. Спасибо.
Вывод данных из quik во внешнюю программу, API, DDE, ODBC, .txt.
 
Спасибо за ответы.
Подскажите, как можно определить факт установки торгово-информационнго терминала Quik? Хотелось бы найти разумный способ определения пути к исполняемому файлу info.exe. Имеется установленный Quik, но незадача, записи в \HKEY_CURRENT_USER\SOFTWARE\ - нет. Можно, конечно, осуществить поиск по всем разделам и дискам, но это уже крайний случай, либо ввести путь вручную. Есть ли запись в реестре windows с параметром пути к info.exe? Если нет, то можно было бы добавить информацию при установке приложения, стандартная практика.
Вывод данных из quik во внешнюю программу, API, DDE, ODBC, .txt.
 
Добрый день. Есть такие величины как время сервера, дата сервера. Можно ли как-то передать эти данные через DDE обмен. Под «время сервера, дата сервера» понимается отсчет биржей начала торговой сессии и её конца, а также время и дата, которые указываются при заключении сделки. Т.е. в этом случае нужна таблица, в которой бы содержались поля с текущей датой. Что скорее все маловероятно. Lua скрипт на данный момент не рассматриваются. Может у ПО сервера биржи есть опция по синхронизации времени с внешним сервером точного времени - time provider. Если в этом случае настроить синхронизацию с тем же сервисом, то можно косвенно обеспечить получение времени и даты сервера биржи. Или это не надежный вариант?
Вывод данных из quik во внешнюю программу, API, DDE, ODBC, .txt.
 
Цитата из руководства.
Цитата
nMode. Тип: Long. Признак того, идет ли начальное получение сделок или нет, возможные значения: «0» – новая сделка, «1» – идет начальное получение сделок, «2» – получена последняя сделка из начальной рассылки;
Каким образом отличается "новая сделка" от "начального получения сделок"? Это как-то связано с вызовом функции start_trade, start_order? Например: если не сразу была оформлена подписка на получение инструментов через subscribe_order,
start_order, но до этого момента были получены в терминал заявки от сервера, то в момент первого вызова callback для order эти заявки будут считаться начальной рассылкой. Поправьте, если где-то напутал.
Вывод данных из quik во внешнюю программу, API, DDE, ODBC, .txt.
 
Спасибо за ответы.

Параметр nMode в order_status_callback и trade_status_callback. Что понимается под новой заявкой, как определяется, что заявка именно новая, а не начальная рассылка?

Есть ли строгая очередность вызова функций transaction_reply_callback order_status_callback, trade_status_callback при выполнении заявки? Т.е. order_status_callback и trade_status_callback не будут вызваны пока не будет вызвана transaction_reply_callback, после вызова transaction_reply_callback будет вызвана order_status_callback, но никак не trade_status_callback, если идет обновление иформации о сделке, то сначала вызывается order_status_callback затем trade_status_callback и т.п.
Вывод данных из quik во внешнюю программу, API, DDE, ODBC, .txt.
 
Цитата
В связи с чем, рекомендуем использовать актуальные версии ПО.
Для торгового терминала, какая версия считается актуальной в плане отсутствия ошибок? Понятно, что нужно смотреть по списками изменений, если сложно, то ладно, устанавливай последнюю. Но вопрос в том, что система поддержки ПО отличается от стандартной, выпуск заплаток происходит одновременно с обновлением функционала.

Какая версия 32-битной библиотеки считается актуальной? Или актуальна только версия trans2quik 1.3 для х64? Устраняются ли ошибки в 32-ой версии?
И где посмотреть интерфейс функций версии 1.2? В версии руководства 6.17 все я так понял заточено под dll 1.3. В списке изменений терминала для версии 7.0 имеется ссылка на новую библиотеку, по всей видимости, имеется ввиду версия 1.3, которая работает только с версиями терминала 7.0 и выше, и «старая» версия библиотеки, по всей видимости – это версия 1.2. Будет ли старая версия работать со всеми версиями терминала или есть какие-то ограничения?
Цитата
вполне нормальный тип данных, даже в MSDN о нем написано.
В MSDN есть тип данных unsigned_int64, но нет упоминания о insigned_int64.
Вывод данных из quik во внешнюю программу, API, DDE, ODBC, .txt.
 
Цитата
  Да, но только если частичное исполнение произошло сразу же в момент выставления заявки.
Если частичное исполнение произошло позже, то ловить изменения следует в заявках TRANS2QUIK_ORDER_STATUS_CALLBACK.
Что подразумевается под: «сразу же в момент выставления заявки» и «если частичное исполнение произошло позже»? Понимаю так: «сразу же в момент выставления заявки» - т.е. в момент после отправки заявки через, например, send_async_transaction и до вызова transaction_reply_callback происходит частичное исполнение заявки на сервере, и в transaction_reply_callback функция transaction_reply_balance(которая имеется только в версии dll 1.3) возвращает значение меньшее, чем количество лотов, выставленное при отправке транзакции на сервер. А под «если частичное исполнение произошло позже» понимаю то, что частичное выполнение заявки произошло после возврата функции из send_sync_transaction, либо после вызова transaction_reply_callback, в случае асинхронной отправки транзакции. Так это или нет?
Цитата
Это не правда, кто Вам такое сказал?
Чистая гипотеза. Может, плохо читал manual.
Цитата
  На самом деле Ваш вопрос не связан с программированием и TRANS2QUIK в частности. Это банальные основы торговли.
Цена это за сколько был куплен или продан один лот.
Объем вычисляется по формуле
Для акций формула такая:
«Объем» = «Цена» * «Количество» * «Размер лота»,
Цитата
  Наверно, все же это цена акции исходя из формулы: «Объем» = «Цена» * «Количество» * «Размер лота».
Все-таки определение параметра в order_status_callback «dPrice – цена заявки» не совсем информативно. Более понятно – «цена инструмента в заявке», или на худой конец, «цена указанная в заявке». Тоже относится и к trade_status_callback. Приходится догадываться, что же имеется в виду.

В документации Quik в объявлениях на те же функции order_status_callback и trade_status_callback в качестве типа данных параметра указан _int64 nBalance и _int64 nQty. Библиотеку использую версии 1.2. Т.е. 32-ух битную. Хотя возникает справедливое замечание по поводу того, почему бы не получить 32-ую версию с полным функционалом версии 1.3. Может, конечно, в этом есть какие-то сложности, но переходить на ОС 64 бита для использования версии 1.3. Вот возвращаясь к, язык программирования использую не СИ, int64 в прямом виде не доступен, но есть эквивалент. Используя эквивалент int64, получаю app crash при вызове order_status_callback и trade_status_callback. Явно неправильный формат стэка. Глядя в пример на VBA, вижу тип данных long(т.е. для VBA это 32 бита) вместо аналога int64. Т.е. для СИ, на мой взгляд, объявление должно выглядеть для 32-ой библиотеки как: long int nBalance или int nBalance или dword nBalance. Как это более логично. Возможно, что документация на quik описана с прицелом на 64-ую ОС и версию dll 1.3 . Но с 32-ой величиной все выполняется без ошибки. Какой фактически используется в данном случае тип данных? Опять же тип данных dNumber, dOrderNum - insigned_int64, может сбить с толку. Если это стандартный тип данных, то какой-то странный. Если используется псевдоним типа данных, то какой стандартный тип данных за ним стоит, тоже вопрос. Такие нюансы могут привести к трудноопределяемым ошибкам, которые как бы не пришлось вылавливать на стадии тестирования или ещё хуже регулярной работе.

Вот ещё такой вопрос возник. В order_status_callback и trade_status_callback приходит несколько одинаковых вызовов, два или три. Где-то читал, что данная практика является вариантом нормы, после внесения некоторых изменений в порядок работы. В принципе, это не было бы для меня проблемой, если бы не частичное исполнение сделки. Как обрабатывать информация в trade_status_callback – не понятно. Например:

Оформляем заявку на покупку 3 лотов. Заявка частично исполняется, приобретается один лот, в order приходит три вызова(или не приходит и приходит только один вызов не количество частичных исполнений?), с информацией dPrice – цена акции, dValue – общая стоимость, в данном случае одного лота, nBalance – неисполненный остаток – 2 лота. Следом ещё два таких же сообщения, которые можно проигнорировать. Что видим в trade. dPrice – цена инструмента, dValue – количество сделки, в данном случае один лот, nQty – количество сделки, т.е. один лот. Далее получаем ещё два вызова с такими же данными. Игнорируем их. Следом идет ещё один вызов, т.е. уже 4-ый по счёту, но уже не дубль, а реальная сделка с опять же реализованным одним лотом(т.е. количество не реализованных лотов в заявке равно одному). И параметры этой сделки точь в точь повторяют оные в трех предыдущих. Как отличить дубль от реального трейда? Либо: 1. Один вызов на один трейд, 2. Четкая последовательность и количество дублей. Т.е. известно, что дубли идут только после реального трейда, и их количество равно именно двум, не больше, не меньше, 3. Либо присылать в каждом последующем трейде общее количество купленных лотов. Т.е. nQty в trade_status_callback не 1, 1 – как в примере выше, а уже 1, 2(1+1=2).

Такого рода проблема возникает именно при появлении возможности частичного исполнения заявки. Если бы она исполнялась строго полностью, то паразитные вызовы не имеют значения, их можно игнорировать. Понятно, что можно указать
в execution_condition= fill or kill, но это менее гибко, чем put in queue. Хотелось бы определить четкий вариант действий в данной ситуации, но в руководстве об этом ни слова, соответственно уверенности тоже никакой, только уровень догадок
и предположений.
Вывод данных из quik во внешнюю программу, API, DDE, ODBC, .txt.
 
Есть опция исполнения заявки «поставить в очередь» или «put in queue». Я так понимаю, если заявка исполняется частично, то вызывается функция transaction_reply_callback с обновленным значение quantity, как минимум обновляется количество лотов. Например: есть гипотетическая первоначальная заявка с количеством лотов = 3, присвоенный мной transId=208, orderNum, присвоенный сервером Quik, есть значение transaction_reply_ballance = 0. Что из всего этого изменится, а что останется прежним, когда заявка будет исполняться частично. Если по первоначальной заявке продано два лота из трех, то сервере выставляется новая заявка, вызывается transaction_reply_callback, параметр qauntity = 1, transId, orderNum – не понятно чему равны или определяются сервером при регистрации(orderNum понятно, что задается только сервером, но останется ли он тем же или изменится - вопрос. Хотя по логике, должен измениться), transaction_reply_ballance = 1. Как в transaction_reply_callback идентифицировать какая именно заявка была частично реализована. По моим представлениям, в данном случае, должен сохранится либо transId, либо orderNum, либо и то и другое.

Для решения этой задачи, возможно, можно использовать trade_status_callback, в которой есть две величины: dOrderNum - номер заявки породившей сделку, trans2quik_trade_transid – возвращает transid, заявки породившей сделку. Если первоначальная заявка дробится, то в trade_status_callback какими будут значения dOrderNum и transid? Транс ид будет равен 208, как в предыдущем абзаце, т.е. присвоенный мной? А dOrderNum будет равен ордер наму до частичного исполнения заявки?
Цитата
А что именно не понятно из имеющегося описания?  
В частности интересует суммарная комиссия по
сделке, если такую величину можно получить. И, например, зависимость между величинами:
TS_COMMISSION = EXCHANGE_COMMISSION + SYSTEM_COMMISSION + BROKER_COMMISSION.
Цитата
Они там есть. Быть может у Вас версия устаревшая. Проверьте этот момент.  
Да, действительно, версия 1.2. В версии 1.3 все это есть.
Где-то читал, что версия 1.3 под х64 ОС. Возможна ли её работа под управлением 32-битной оболочки?
Вывод данных из quik во внешнюю программу, API, DDE, ODBC, .txt.
 
Спасибо за ответы.
Цитата
Sergey Gorokhov написал:
Цена это за сколько был куплен или продан один лот.

Наверно, все же это цена акции исходя из формулы: «Объем» = «Цена» * «Количество» * «Размер лота».

Из trade_status_callback можно вызвать функции:
double __stdcall TRANS2QUIK_TRADE_TS_COMMISSION (intptr_t nTradeDescriptor) – возвращает величину суммарной комиссии по сделке;

double __stdcall TRANS2QUIK_TRADE_EXCHANGE_COMMISSION (intptr_t nTradeDescriptor) – возвращает величину комиссии за торги по сделке;

double __stdcall TRANS2QUIK_TRADE_TRADING_SYSTEM_COMMISSION (intptr_t nTradeDescriptor) – возвращает величину комиссии за технический доступ по сделке;

double __stdcall TRANS2QUIK_TRADE_BROKER_COMMISSION (intptr_t nTradeDescriptor) – возвращает сумму комиссии брокера;

Есть ли более подробная информация о значении возвращаемых величин?

И если вернуться к _trans2quik_transaction_reply_balance, то как она, и 4 выше перечисленные функции вызывается. Их нет в библиотеке trans2quik.
Вывод данных из quik во внешнюю программу, API, DDE, ODBC, .txt.
 
Подскажите ещё, пожалуйста. В функцию TRANS2QUIK_TRADE_STATUS_CALLBACK передаются параметры: dPrice – цена сделки, dValue – объём сделки, nQty – количество сделки. Чем цена сделки отличается от объёма сделки, и в чем выражается? Количество сделки - это количество лотов в сделке? Цена сделки учитывает все комиссии?
Цитата
Sergey Gorokhov написал:
Это не исполненный остаток в заявке.
Например при снятии заявки, которая была частично исполнена, будет указано не исполненное количество.
В чем выражается не исполненный остаток? В денежных единицах, в количестве лотов, в количестве акций?
Вывод данных из quik во внешнюю программу, API, DDE, ODBC, .txt.
 
Добрый день. Подскажите, пожалуйста. Функция _trans2quik_transaction_reply_balance в transaction_reply_callback возвращает остаток. Остаток что она возвращает?
Можно ли одновременно организовать advise loop для двух таблиц quik по DDE? Есть ли ещё способы вывода данных во внешнюю программу из таблицы кроме DDE, ODBC и текстового файла? В частности интересует получение данных о состоянии клиентского портфеля. Спасибо.
Send_async_transaction. Отправка транзакций.
 
Удалось разобраться, в чем проблема, теперь заявки отправляются.

Возникли ещё вопросы:
  1. Можно ли отправлять синхронные, асинхронные транзакции, если нет подключения квика к интеренету?
  2. Чем лимитирована минимальная и максимальная цена на инструмент? Где эти ограничения можно посмотреть?
Send_async_transaction. Отправка транзакций.
 
Добрый день. Подскажите, пожалуйста. Пытаюсь отправить транзакцию используя send_async_transaction. Передаю в качестве транзакшон стринг: "ACTION=NEW_ORDER; TRANS_ID=208; CLASSCODE=TQBR; SECCODE=SBER; ACCOUNT=L01-00000F00; CLIENT_CODE=000000454294; TYPE=L; OPERATION=B; QUANTITY=1; PRICE=141;". Использую quik-junior. В обработке внешних транзакций счётчик полученных транзакций увеличивается на 1, но при этом счётчик отправленных на сервер транзакций остается без изменений. Dll к программе, которая вызывает send_async_transaction подключена, квик с сервером соединен, торговая сессия стартовала. При это сама функция возвращает ноль, что соответствует успеху. Обработка внешних транзакций включена. При запуске квик выдает ошибку: «StartVotal.dll. Загруженный модуль не совместим с данной версией клиентского места. Код ошибки 2.». Но, не смотря на данное сообщение, работу с торговой системой продолжить можно.

Версия квика 7.0.0.289.
Версия dll 1.2.

Спасибо за совет.
Не подписываемся на инструменты, когда Квик не в сети
 
По идее, эти функции получают данные о заявках и сделках клиента. Если в таблицах заявок и сделок имеются записи, полученные с сервера, когда подключение присутствовало, то почему бы их не передать в dll, даже если подключение отсутствует на данный момент. Из документации это не следует, может просто плохо читал. Извиняюсь, если что не так.
Не подписываемся на инструменты, когда Квик не в сети
 
QUIK clients support, было бы неплохо постепенно вносить изменения в документацию по мере выявления таких нюансов.
Сложности, замечания по работе с trans2quik.dll.
 
Цитата
С помощью функции TRANS2QUIK_SUBSCRIBE_ORDERS можно получить информацию о собственных заявках, из таблицы заявок.
Для запуска процесса получения информации по заявкам нужно также вызвать функцию TRANS2QUIK_START_ORDERS.
Вот ответ на мой вопрос. Может кому-то поможет.
Сложности, замечания по работе с trans2quik.dll.
 
Добрый день. Возник такой концептуальный вопрос. Подключаю dll к квик, подключено. Проверяю подключение квика с Интернетом, подключено. Вроде все нормально. Далее, вызываю функцию subscribe_orders, затем start_orders(orders_status_callback). subscribe_orders возвращает успех. По start_orders не определить, успешно ли завершена функция, но завершена, управление возвращено в вызывающую процедуру. В orders_status_callback – тишина. Что за данные должны поступать в эту процедуру после start_orders? Данные котировок по инструментам? Почему-то ничего нет, но в графике цена – объем в самом квике идет обновление данных по поводу торгов. Кок сделать так, что trans2quik.dll получала эти данные, которые обновляются в квике, как написано чуть выше. Пример с sample_excel тоже не дал это информации.
Сложности, замечания по работе с trans2quik.dll.
 
Цитата
Sergey Gorokhov написал:
У Вас как то не корреткно указано
Код
          MsgBox TRANS2QUIK_CONNECT(strPathToExe, lngExtendedErrorCode, strErrorMessage, lngErrorMessage  Size  )
  


Попробуйте как-то так:
Код
         
Dim pnExtendedErrorCode As Long
Dim lpstrErrorMessage As String  *   250 
Const dwErrorMessage Size   =   250 
    FunctionResult  =  TRANS2QUIK_CONNECT("E:\FinamJunior\", pnExtendedErrorCode, lpstrErrorMessage, dwErrorMessage Size )
  
Все, разобрался. Поменял в объявлении функции byval на byref, заработало. Извиняюсь за нелепую ошибку. Теперь возвращает 0, т.е. success. Спасибо за помощь.  
Сложности, замечания по работе с trans2quik.dll.
 
Цитата
Код
'Option Explicit
Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
Private Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, ByVal lpProcName As String) As Long
Private Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long

Private Const TRANS2QUIK_DLL_NOT_CONNECTED As Long = 7
Private Const TRANS2QUIK_DLL_CONNECTED As Long = 8


Private Declare Function TRANS2QUIK_CONNECT Lib _
    "C:\TRANS2QUIK.dll" Alias "_TRANS2QUIK_CONNECT@16" (ByVal lpcstrCnnectionParamsString As String, ByVal pnExtendedErrorCode As Long, _
    ByVal lpstrErrorMessage As String, ByVal dwErrorMessageSize As Long) As Long



Private Declare Function TRANS2QUIK_IS_DLL_CONNECTED Lib _
    "C:\Documents and Settings\-\Ðàáî÷èé ñòîë\Automatic\Quik Junior\TRANS2QUIK.dll" Alias "_TRANS2QUIK_IS_DLL_CONNECTED@12" (ByVal pnExtendedErrorCode As Long, _
    ByVal lpstrErrorMessage As String, ByVal dwErrorMessageSize As Long) As Long


Private Sub Form_Load()
    Dim lngLibHandle As Long
    Dim lngDllConnectionStatus As Long, lngExtendedErrorCode As Long, strErrorMessage As String, lngErrorMessageSize As Long
    
'    lngLibHandle = LoadLibrary("C:\Documents and Settings\-\Ðàáî÷èé ñòîë\Automatic\Quik Junior\TRANS2QUIK.dll")
    
'    MsgBox GetProcAddress(lngLibHandle, "_TRANS2QUIK_IS_DLL_CONNECTED@12")
    
    
'    FreeLibrary lngLibHandle
    
    
    
    
    lngDllConnectionStatus = TRANS2QUIK_IS_DLL_CONNECTED(lngExtendedErrorCode, strErrorMessage, lngErrorMessageSize)
'    TRANS2QUIK_CONNECT ee, "", er
    If lngDllConnectionStatus = TRANS2QUIK_DLL_NOT_CONNECTED Then
        Dim strPathToExe As String
        
        strPathToExe = "E:\FinamJunior"
        MsgBox TRANS2QUIK_CONNECT(strPathToExe, lngExtendedErrorCode, strErrorMessage, lngErrorMessageSize)
        
    End If
'    MsgBox lngDllConnectiomStatus
    
    End
End Sub 

Sergey Gorokhov
написал:
Приведите пример кода где вы объявляете функцию и где вызываете
Сложности, замечания по работе с trans2quik.dll.
 
Цитата
Sergey Gorokhov написал:
Здравствуйте,
1. Вопрос к сожалению не понятен.
2. Использовать следует только те функции которые описаны в документации. Какого-либо секретного документа не существует.
3. Проверьте включена ли обработка внешних транзакций в терминале.

1. По первому вопросу, например, если вызвать функцию по имени TRANS2QUIK_CONNECT, то такой функции в библиотеке нет. Возникает ошибка, связанная с тем, что функция не найдена. Вызываю функцию под псевдонимом _TRANS2QUIK_CONNECT@16. Она в библиотеке присутствует, но возвращает ошибку 14. Может я вызываю не ту функцию. Какую тогда нужно вызвать, чтобы установить соединение dll с quik.
2. Обработка внешних транзакций в терминале включена.  
Сложности, замечания по работе с trans2quik.dll.
 
Добрый день. Возникли определенные вопросы по работе с инструментарием trans2quik.dll. Версия файла 1.2.0.3. Версия Quik 7.8.1.21.
  1. В руководстве по quik, в шестой главе, описаны названия функции и прототипы функций на c++. Почему нельзя было написать в руководстве имена функций, так как они именуются в dll. Иначе нельзя вызвать требуемую функцию, её просто нет.
  2. В руководстве есть описание 18-ти функции. В библиотеке их 68 шт. Есть ли где-то описание на остальные функции? Или они только для служебных нужд dll?
  3. При вызове функции TRANS2QUIK_CONNECT возвращаемое функцией значение = 14, что соответствует константе wrong input params. Первый параметр при вызове функции СИ строка “E:\QuikJunior”, далее: указатель на long, указатель на строку, указатель на long. Почему не получается успешно выполнить функцию не понятно.
Буду признателен за помощь. PS. : Обращаюсь к библиотеке из VB6.0
Страницы: 1
Наверх