Alexander написал: Какой алгоритм контроля применить посоветует техподдержка? Уж куда проще то? Мой алгоритм подойдёт? Или можно его упростить, например - вообще не использовать OnTrade()? Достаточно проверить OnOrder() где баланс = 0? Сейчас использую и то и то. А надо ли?
Вы можете протестировать Ваши алгоритмы, проанализировать и выбрать более эффективный для Вас. Протестировать можно на учебном сервере QUIK Junior.
Не смогли воспроизвести данную проблему на нашем примере API_Tester_DLG_x64.exe, TRANS2QUIK_ORDER_STATUS_CALLBACK срабатывает на изменение статуса заявки с аналогичными параметрами. Проверьте, пожалуйста, воспроизводится ли у Вас проблема с TRANS2QUIK_ORDER_STATUS_CALLBACK на нашем примере API_Tester_DLG_x64.exe.
Alexander написал: Вопросы:1) Возможен ли вызов OnTransReply() на мою поданную заявку с моим TRANS_ID, с trans_reply.trans_id == 0, nil, "0", "" или же trans_reply.trans_id всегда содержит номер заявки? Этот номер заявки измениться не может?2) OnTransReply() вызывается только один раз?3) Возможен ли случай, когда сначала первой будет вызов OnOrder(), а потом уже вызов OnTransReply()? Вроде бы как-то один раз такое проскочило, когда скрипт вылетел с ошибкой исполнения. Но точно не помню, возможно было и так, даже скорее всего так, что был вызов только OnTrade(), а OnTransReply() не вызвался, хотя по факту заявка выставилась. Из-за этого дублирую сохранение номера заявки не только в OnTransReply(), но и в OnOrder().4) Могу ли я быть уверен, что имея самый первый OnOrder() c order.balance == 0, последующие OnOrder() не изменят значение order.balance?5) Могут ли приходить сначала OnTrade() без trade.price, а потом с trade.price? От этого зависит какие именно я могу использовать вызовы OnTrade(), т.е. нужно ли вообще проверять установлено ли в них поле trade.price, или это поле заполнено ценой всегда и не меняется в следующих вызовах?6) Могу ли я быть уверен, что имея самый первый OnTrade() с ценой исполнения trade.price, последующие OnOrder() не изменят значение trade.price? 7) Могу ли я с учётом своего алгоритма контроля исполнения использовать только самые первые вызовы OnOrder(), OnTrade(), OnTransReply(), отфильтровывая все последующие, где я фактически смотрю только на изменение баланса в заявке и жду появления сделки с номером заявки?8) Может быть вообще как-то по другому изменить алгоритм контроля исполнения заявки(приход сделки)? Какой алгоритм контроля посоветуют разработчики с учётом всех этих многочисленных вызовов?
1. Всегда содержит trans_id и этот параметр не меняется. 2. Да. 3. Возможен. В связи с тем, что различные биржи предоставляют интерфейс подключения к своим системам по разным протоколам и разным схемам, в некоторых заявки и сделки доставляются разными не синхронизированными потоками, также не нужно исключать факт потери пакетов. Таким образом возможны ситуации, когда первым будет вызван OnOrder(). 4. Если пришёл OnOrder с balance = 0 - значит заявка исполнилась полностью, т.е. сделки на всё количество в заявке, и что дальше происходит с balance в OnOrder по данной заявке не важно. 5. Да, данный параметр не меняется в последующих вызовах. 6. Да, данный параметр не меняется в последующих вызовах. Если речь об одной заявке и только об одной сделке по ней - то цена не должна меняться. Если же по заявке может быть заключено больше одной сделки - то у каждой сделки может быть своя цена, которая может быть выгоднее цены в заявке. 7. Нет. 8. К сожалению, посоветовать какой-либо алгоритм контроля исполнения заявки мы не можем. Как уже верно заметил выше nikolz - общая рекомендация для сделок и заявок - не "затачивать" алгоритм на определенный порядок вызова OnOrder/OnTrade и их количество.
Попробуйте так: message("hi") message - функция отображает сообщения в терминале QUIK. Возвращает «nil» при ошибке выполнения или при обнаружении ошибки во входных параметрах. В остальных случаях возвращает «1». Подробнее в Руководстве пользователя Qlua/ Сервисные функции/ message
Опишите более подробно Вашу ситуацию, возникают какие-либо ошибки? Также уточним, что если под "отложенным ордером" Вы подразумеваете условную заявку, то TRANS2QUIK_ORDER_STATUS_CALLBACK не подойдет, так как в текущей версии trans2quik нельзя подписаться на события по стоп-заявкам.
Мы обнаружили вероятную причину возникновения описанной в данном обращении проблемы и исправим ее в одной из ближайших версий ПО. Приносим извинения за доставленные неудобства.
В первую очередь рекомендуем использовать функцию обратного вызова TRANS2QUIK_TRANSACTION_REPLY_CALLBACK. Кроме нее, состояние исполнения заявки можно отслеживать с помощью функции обратного вызова TRANS2QUIK_ORDER_STATUS_CALLBACK.
s_mike@rambler.ru написал: Данные загружаются на каждый из них с сервера независимо. Просчет индикаторов никак не синхронизирован с процессом загрузки данных в индикатор
Действительно, такое поведение вероятно, Вам следует проработать алгоритм для обработки таких ситуаций или искать другой для решения Вашей задачи.
Пробовали ли Вы перезаказать данные (Система - Заказ данных - Перезаказать данные) и пересоздать таблицу? Если пробовали и информация не появилась, то в таком случае по данному вопросу рекомендуем обратиться к Вашему брокеру.
Сергей написал: Всё ясно - не работает таблица Купить/Продать.
Уточните, как проявляется проблема? Не отображаются данные, либо отображаются, но они некорректные, просьба прояснить этот момент. Также пришлите, пожалуйста, скриншот данной таблицы.
Просьба описать проблему подробнее, если возникает какая-либо ошибка, пришлите, пожалуйста, скриншот данной ошибки, также просьба прислать код скрипта для анализа.
скрипт Qpile отказывается работать с кодами опциона в названии которых присутствует точка, ошибка Standalone identifier in an expression, не получается запустить скрипт, работающий с опционом в названии которых присутсвует точка, но все работает с соседними страйками
s_mike@rambler.ru написал: Этой ошибке 100 лет. понятно, что вам лень, но вы бы написали скрипт из 3 строчек на qpile сами и убедились. Нельзя так публично проявлять наплевательское отношение.
Не смогли воспроизвести проблему на актуальной версии терминала(см. скриншот).
скрипт Qpile отказывается работать с кодами опциона в названии которых присутствует точка, ошибка Standalone identifier in an expression, не получается запустить скрипт, работающий с опционом в названии которых присутсвует точка, но все работает с соседними страйками
Вероятнее всего проблема в том, что данных для этих свечей не существует. Дело в том, что у всех индикаторов в одном окне диаграммы имеется общее пространство позиций для свечек с единой сплошной нумерацией без пропусков. Как раз это пространство и используется в getCandlesByIndex, getNumCandles. Функция CandleExist позволяет проверить существует ли свечка для конкретного инструмента.
Если Вы построите графики в разных окнах, то Ваш пример будет работать корректно.
Boris написал: Не нашёл в документации как необходимо организовать создание таблицы средствами lua - для того чтобы можно было использовать встроенные в quik функции сортировки и фильтров по столбцу ?Где об этом можно прочитать ?
В Руководстве пользователя Qlua/ Функции для работы с таблицами Рабочего места QUIK. Для всех таблиц, созданных с помощью скриптов на языке Lua, поддержаны данные возможности.
Цитата
Boris написал: Ни дату, время ни числа в созданной lua таблице не отсортировать ?
Вы можете задавать соответствующий тип данных в колонке(QTABLE_DATE_TYPE, QTABLE_INT_TYPE), в таком случае сортировка будет корректной.
В Руководстве пользователя Qlua/ Приложения приведен пример скрипта на языке Lua для создания таблицы в Рабочем месте QUIK, демонстрация сортировки есть в "Приложение 2. Примеры сортировки в таблицах"
Kolossi написал: Конечно, доступ к таблице "Состояние счета" средствами QLua.
Ваше пожелание зарегистрировано. Мы постараемся рассмотреть его и сообщить Вам результаты анализа. Впоследствии, по результатам анализа, будет приниматься решение о реализации пожелания в будущих версиях ПО.
Цитата
Kolossi написал: К стати хотел спросить, а чем "балансовая стоимость" отличается от "цены приобретения" ? Или это одно и тоже просто таблицы делали разные разные люди со своими терминами в голове?
"Балансовая стоимость" - это суммарная оценка стоимости позиций по ценам приобретения (по значению параметра Баланс. цена).
"Баланс. цена" - средневзвешенная цена открытия позиции, с учетом валюты цены приобретения. Для спот-рынка – соответствует значению параметра «Цена приобретения» в таблице «Позиции по инструментам». Для срочного рынка – соответствует значению параметра «Эффект. цена поз.» в таблице «Позиции по клиентским счетам».
Подробнее в Руководстве пользователя/ Раздел 3. Просмотр информации/ 3.5 Состояние счета.
Kolossi написал: А как насчет получения средней цены покупки по инструменту, точнее параметра "Балансовая цена" в таблице Состояние счета?
К сожалению, средствами QLUA данную таблицу не получить.
Однако параметры данной таблицы формируются на основе позиций клиента, которые отражены в соответствующих таблицах терминала, к которым в свою очередь можно получить доступ средствами QLUA. Подробное описание полей Таблицы "Состояние счёта" находится в Руководство пользователя QUIK v.9.7zip, 14.6 МБ -> Раздел 3. Просмотр информации -> 3.5 Состояние счета.
Сергей написал: "FRACTALS.lua:32: attempt to perform arithmetic on a nil value"
Ошибка говорит о том, что на 32 строке происходит арифметическая операция со значением nil(lua пытается выполнить операцию nil + 100). Вероятно ConvertValue(Settings,H(Out1)) возвращает nil, попробуйте добавить в код обработку данного случая.
Да, действительно, если к терминалу привязан один код клиента, то он автоматически подставляется в транзакцию. Однако для того, чтобы однозначно подать заявку по необходимому торговому счету и коду клиента, их следует явным образом указать в транзакции.
Как уже было сказано, с данным вопросом Вам нужно обратиться к Вашему брокеру.
Старатель написал: И зачем опять эти танцы с бубном? Универсальный формат должен поддерживаться на уровне терминала. Если уж сделали два формата транзакций, так делайте, чтобы терминал принимал оба, вне зависимости от текущей региональной настройки.
Как уже было сказано выше, в этом месте не планируется изменение логики.
Ошибка биржевая. Означает, что кода клиента нет на бирже. С данным вопросом Вам нужно обратиться к Вашему брокеру, в свою очередь брокер может построить отчет по транзакциям по данному коду клиента и проверить соответствие транзакций отправленных с помощью trans2quik(отвергнутые транзакции) и успешных попыток с рабочего терминала Quik. Также возможно, что на стороне брокера есть настройка, при которой для отправки транзакций к коду клиента необходимо добавлять слэш, попробуйте вот так: CLIENT_CODE=ххххх/
Игорь М написал: Алексей, пользуясь случаем оставлю здесь ещё пожелание: Добавьте ещё один параметр в таблице метки, типа user_id или user_hint, используя который пользователь смог бы идентифицировать метку. Kolossi выше написал, что он сохраняет UID метки в файл и затем удаляет при повторном запуске. Я тоже в подобных случаях удаляю старые при повторном запуске терминала. Не знаю, что за UID Kolossi сохраняет, но label_id для этих целей не годятся, и поэтому приходится выдумывать разное экзотическое для идентификации: где-то использую время, где-то цвета, а где-то редкий шрифт, и потом при запуске удаляю все метки с определенным шрифтом, например. Существование дополнительного параметра в таблице существенно бы облегчило данную задачу.
Ваше пожелание зарегистрировано. Мы постараемся рассмотреть его и сообщить Вам результаты анализа. Впоследствии, по результатам анализа, будет приниматься решение о реализации пожелания в будущих версиях ПО.
Михаил Е написал: Как я в обычном языке программирования C++/C# создам вам переменную на кириллице, да ещё с пробелом? Никак не создам!
Извиняемся, здесь не очень Вас поняли, вы можете создать переменную, в которой будет храниться строка на кириллице.
Цитата
Михаил Е написал: Кстати, даже по русски эти транзакции не работают, sendTransaction со следующим текстом ставит заявку как будто переносить заявку не указано
Поля транзакции должны быть описаны в универсальном формате. Как уже было сказано выше получить пример можно так: поместить транзакцию в карман транзакций, сохранить ее в tri файл, далее полученный результат использовать в своем скрипте. Выше Вы уже привели пример транзакции в таком формате.
Цитата
s_mike@rambler.ru написал: При этом нет возможности узнать, какой язык установлен в терминале и сформировать транзакцию на нужном языке
Можем зарегистрировать пожелание на доработку функционала в этом месте. Регистрируем?
Действительно в описанных в вашем обращении ситуациях метод OnCalculate срабатывает не один раз. Данная ошибка будет исправлена в одной из очередных версий программы. Приносим извинения за причиненные неудобства.
nikolz написал: Метод OnCalculate обязательно срабатывает два раза на для всей истории свечей в следующих случаях1) Когда первый раз загружается индикатор на график2) Когда вносятся изменения в settings уже загруженного индикатора
Проблема изучается. Постараемся в ближайшее время дать ответ.
Александр М написал: Присоединяюсь к Старателю, в новых версиях QUIK (от 8.13 и выше), по DelLabel метки не удаляются в колбеке OnDestroy, хотя должны, а удалять их по DelAllLabels нельзя, т.к. на 1 графике может быть много индикаторов со своим набором меток.
Мы зарегистрировали пожелание на доработку. Мы постараемся рассмотреть его и сообщить Вам результаты анализа. Впоследствии, по результатам анализа, будет приниматься решение о реализации пожелания в будущих версиях ПО.
Михаил Е написал: Мне очень хотелось бы, чтобы для описания данных элементов выставления заявкииспользовались поля из фиксированного формата импорта транзакций.Либо какие-то существующие поля, либо завести новые поля, дополнительно.
К сожалению, в данном месте изменения не планируются.
Цитата
Михаил Е написал: Чтобы эту информацию можно было легко передавать в коде (например .lua скриптов)
Само использование кириллицы в коде Lua скрипта не должно создавать каких-либо проблем, т.к. это всего лишь ключи полей Lua-таблицы. Можете переключить интерфейс терминала на английский, и тогда в коде Lua скрипта можно будет задавать данные поля транзакции на латинице.
Вы можете продолжать использовать Ваши индикаторы, для этого нужно выбрать версию 5.3 Lua-машины в пункте меню: Система -> Настройки -> Основные настройки (F9) -> Lua скрипты(см. скриншот).
Идентификатор должен быть строкой, попробуйте так: getLinesCount("ischBB").
Функция CreateDataSource работает исключительно со свечками, полученными с сервера QUIK, а также реагирует на их изменение. Функция getCandlesByIndex так же предназначена для получения информации о свечках, однако для успешного доступа должен быть открыт нужный график.
Существует два формата файлов импорта транзакций: фиксированный и универсальный. В справке QUIK Раздел 6. Совместная работа с другими приложениями/Импорт транзакций/ Фиксированный формат файла импорта транзакций, описан формат и примеры, которые Вы можете использовать при подаче транзакций. Поля, которые не описаны, можно получить в универсальном формате. Например, поместить транзакцию в карман транзакций, сохранить ее в tri файл и полученный результат использовать в своем скрипте.
В Вашем случае необходимо использовать универсальный формат, выше Вы привели пример транзакции в таком формате. Если мы поняли Вас не правильно, просьба сообщить.
Действительно, в момент загрузки WND или TAB файлов в которых существуют окна графиков в которых дублируются идентификаторы, проверка идентификаторов на уникальность не осуществляется. Данная проблема будет устранена в одной из очередных версий ПО.
Рекомендуем использовать таблицу trades, параметр price. Например: getItem('trades', index).price. Также можно использовать функцию обратного вызова OnTrade - Функция вызывается терминалом QUIK при получении сделки или при изменении параметров существующей сделки. Подробнее в Руководстве пользователя Qlua/ Функции обратного вызова/ OnTrade/
s_mike@rambler.ru написал: В документации на Квик написано, что если указать метке цену и время, то там она и выставиться.щас! как водится, врут. Достаточно включить в терминале режим показа графиков в локальном времени и все, приехали. в лучшем случае метка показывается не там где надо, в худшем не показывается вообще. Зависит от смешения локального времени от Москвы.
Проблема изучается. Постараемся в ближайшее время дать ответ.
Действительно, в Quik имеется такая особенность функционала, после потери связи с сервером или базой, терминал не переподключается к БД. Можем зарегистрировать пожелание на то, чтобы терминал пытался переподключиться к СУБД. Регистрируем?
Старатель написал: При добавлении / удалении индикатора возникают ошибки:ЦитатаFunction OnChangeSettings: ACCESS VIOLATION at address 000007FC524B89CCACCESS VIOLATION at address 000007FC524B89CC
Действительно, в ПО QLUA есть ошибка вызова методов ParamRequest и CancelParamRequest из Lua скрипта индикатора. Мы исправим её в очередном обновлении ПО.
green_X5 написал: Да, пожалуйста, зарегистрируйте. "Возможность настройки вертикального сдвига (по оси цены) индикаторов в их параметрах". Желательно в процентах. Шаг сдвига не хуже 0.1%.
Ваше пожелание зарегистрировано. Мы постараемся рассмотреть его и сообщить Вам результаты анализа. Впоследствии, по результатам анализа, будет приниматься решение о реализации пожелания в будущих версиях ПО.
Цитата
green_X5 написал: А также рассмотреть возможность дублирования (или копирования) нового экземпляра индикатора из меню клика правой мышкой по ранее установленному на графике с копией параметров. И, хорошо бы, дублирование индикатора при его вертикальном перетаскивании если ранее зажата клавиша Контрол (супер удобно).
Ваше пожелание зарегистрировано. Мы постараемся рассмотреть его и сообщить Вам результаты анализа. Впоследствии, по результатам анализа, будет приниматься решение о реализации пожелания в будущих версиях ПО.
Функционала, соответствующего Вашему описанию, в терминале действительно нет. Можем зарегистрировать пожелание от Вас на его добавление, регистрируем ?
TGB написал: Если написанное мною в комментарии #177 правильное, то причина понятна и понятно как ее можно исправить. Пусть разработчик QUIK объяснит, в чем я ошибаюсь.
Действительно, это допустимое поведение, как уже сказали выше, таблица сделок обновляемая. Таблица обновляется столько раз сколько обновит ее сервер. Связано это с тем, что в самой сущности сделки есть параметры которых нет на бирже, при установке/изменении значений этих параметров как раз и происходит повторная отправка данных. И как уже сказал Nikolay, можно использовать для контроля сделок - brokerref.
Не получилось воспроизвести проблему, просьба прислать нам на quiksupport@arqatech.com архив Вашего рабочего места QUIK без ключей pubring.txk и secring.txk, если они там присутствуют. Дополнительная просьба в письме укажите, пожалуйста, ссылку на данную ветвь форума.