С 1 марта, когда торги начались в 7 утра, каждый раз вижу, что в начале торгов Квик как бы зависает и не получает данные по стакану и сделкам. В течение секунд 15-ти эти данные оказываются потерянными. Возможно, это связано с потоком мелких сделок, но до 1 марта я этого не замечал. Это у меня одного так?
Сегодня перед началом торгов жулики заспамили стакан заявками по 1 акции (ВТБ ликвидность), так что не было видно лучшей цены на покупку и продажу. Как это выглядит с точки зрения биржевых понятий? На это имеет смысл жаловаться в мосбиржу или с этим только в "Спортлото"?
Сейчас обновил версию на 11.4.0.54 и заметил, что соединение с брокером разорвалось 50 мин. назад, Интернет есть, а Квик не пытается восстановить соединение. Настройки по проверке связи стандартные. Прошлая версия сегодня пыталась восстановить соединение при обрыве.
Сервер точного времени ntp1.stratum2.ru, по которому я ставлю часы, уже 2-й день выдаёт ошибки при замере времени: ошибка: 0x800705B4. Что случилось, и как исправить? Пока пользуюсь сервером из СПб, но там задержка сети может отличаться от московской.
Хочется узнать, имеет ли смысл написать книжку по работе в Quik: настройка, основы программирования на Lua и в Си на примерах получения котировок и обезличенных сделок по заданным тикерам, использование функций Lua и QLua?
Смотрю, какое-то старьё по сходным темам на распродаже: ozon.ru/search/?text=книга+торговый+терминал+quik ozon.ru/category/skalping-treyding/
То ли книжки плохо покупают, потому что скачивают ворованные в pdf, то ли программировать для домохозяек и пенсионеров сложно. Поэтому толстые книжки писать неохота...
Можно ли будет найти рекламодателей (за рекламу в книжке автор тоже что-то получает)?
Описание: Функция предназначена для получения значений параметров таблицы «Купить/Продать». Функция возвращает таблицу Lua с параметрами из таблицы QUIK «Купить/Продать», означающими возможность купить либо продать указанный инструмент «sec_code» класса «class_code», указанным клиентом «client_code» фирмы «firmid», по указанной цене «price». Если цена равна «0», то используются лучшие значения спроса/предложения. Таблица параметров
Дополнительные таблицы: Таблица параметров Параметр Тип Описание is_margin_sec STRING Признак маржинальности инструмента. Возможные значения: «0» – не маржинальная; «1» – маржинальная;
is_asset_sec STRING Принадлежность инструмента к списку бумаг, принимаемых в обеспечение. Возможные значения: «0» – не принимается в обеспечение; «1» – принимается в обеспечение;
Карина, эти файлы, что на вашем скриншоте, у меня имеются. Почему-то qrypto.cfg в окошке Шифрование прописан маленькими буквами, а на диске его имя имеет большие буквы, а в каталоге бэкапа буквы у него маленькие. Как это понять? Думаю, для программ под виндовс это не должно иметь значения.
Karina Dmitrieva написал: Serge123 , для того, чтобы проверить корректность пути к RSA-ключу необходимо отключиться от сервера, тогда настройки в меню Система / Настройки / Основные настройки, раздел Программа / Шифрование будут доступны (см. скриншот).
Отключился от сервера, но эти настройки не стали доступны. Вижу в этой вкладке то же, что приводил вчера, редактирование недоступно. Скриншот вы приложить забыли...
Сообщил об этом в чате и приложил им скриншот, который взял отсюда. Операторша написала: нужно проверить, корректность пути к ключам (Система/настройки/.../программа/шифрование) и прописать путь. У меня в этой вкладке справа написано:
Шифровать с пом. СКЗИ Qrypto32 Текущее состояние СКЗИ Активно Настройки по умолчанию: <пустое поле ввода>
Все эти поля ввода нельзя редактировать. Я не разбирался с тем, что всё это значит, но до вчерашнего дня я много работал с сервером quik.vtb.ru, хотя, с ним были иногда проблемы и приходилось переходить на другой сервер.
У меня одна учётная запись, настраивал давно и настройка по умолчанию. Вчера я звонил в службу поддержки и сказал об этом, а сегодня вновь увидел ту же картинку: сервер2 (quik.vtb.ru) сразу после ввода пароля выдал вышеприведённую картинку, а сервер1 (с цифрами в графе IP адрес) сразу залогинил меня.
Операторша по общему телефону поддержки ВТБ сказала, что передаст моё обращение технарям, но у меня в этом есть сомнения. Поэтому сейчас попробую повторить это сообщение через чат в ВТБ инвестициях на анроиде. Но тут также могут быть сомнения, что сообщение дойдёт до технарей, т.к. нагрузка на поддержку высокая. Возможно, придётся написать на имейл самих технарей об этом.
Только что разлогинился, поменял сервер на прежний, при попытке залоргиниться получил то же сообщение. Ничего не делал и через 3 сек. получил обычное сообщение, что соединение установлено...
В 9:50 выставил заявку в квике, перезагрузился для отмены алгоритма Нейгла, опять запускаю квик, на ввод пароля получаю сообщение, что у меня какие-то неправильные ключи и что-то не то с авторизацией, и так 2 раза.
А что было бы, если бы я попытался залогиниться в 4-й раз? Я, наверно, попал бы на блокировку аккаунта?
А волатильность сейчас высокая, может потребоваться срочно снять заявку (так оно и случилось), а то при её выполнении я стану должен брокеру хорошую сумму, а цена может пойти ещё ниже... Я методом тыка выбрал дополнительный сервер у брокера для связи и тогда только смог залогиниться.
Вопрос: что это была за ерунда такая?
Иногда я для подстраховки держу запущенную торговую программу на телефоне, но особого спокойствия всё равно не чувствую...
Ну, и если где-то в Квике есть сумма акций в заявках по всем ценам в стакане, то это число тоже должно быть int64. А также числа акций в стаканах ( а может быть, и в выставляемых заявках: а вдруг кто-то выставит заявку на покупку UINT_MAX + 1 акций?)
В таблице "Текущие торги" в столбце "Кол. спрос" вижу отрицательное число акций, при этом в стакане в строке по цене лучшей покупки это число выводится нормально и если его сложить с модулем числа в столбце "Кол. спрос", то получается > 4 млрд (> UINT_MAX). Когда в стакане в этой строке число акций становится < 2 млрд., в таблице торгов это значение совпадает со значением в стакане.
Вывод очевиден: в этой таблице Квика (а, возможно, и в других) количества акций для покупки/продажи хранятся в типе int (32 бита со знаком (на фига ещё и со знаком?)), поэтому происходит переполнение разрядной сетки.
Хочу предупредить, что я в стакане по этой акции на moex по лучшей цене покупки видел заявок в сумме > 3.5 млрд., поэтому сразу меняйте тип этих чисел на int64 (т.к. Lua не понимает uint64).
nikolz написал: могу лишь рассказать как я решил эту проблему.
К сожалению, в этом ответе не сказано о решении этой проблемы... А именно: как в main (которая сидит в dll) обработать таблицу alltrade, если при завершении работы OnAllTrade (которая тоже сидит в dll) стек её вызова (в котором сидит ссылка на табл. alltrade) должен очиститься? Я вижу такие костыли: - запретить сборку мусора (до 18:45). - dll из OnAllTrade как-то связывается с Lua и Lua дублирует ссылки на alltrade в массив локальных переменных области видимости этого файла lua. Потом dll как-то даёт знать, что каким-то из этих переменных можно присвоить nil. Как это сделать, пока не знаю. М.б. это делается через (light)userdata, но я с этим не связывался.
Как из Си заставить Lua продублировать ссылку на таблицу, если эта ссылка сидит в стеке? Как из Си вызвать скрипт Lua, чтобы он получил этот стек вызова OnAllTrade? Иначе придётся коллбэки делать на Lua и только main на Си, а этого не хочется из-за какой-то потери скорости.
Тут возникла новая проблема: если обработчик OnAllTrade на Си уже не будет обрабатывать этот вызов, а будет что-то записывать в очередь и делать выход, то как гарантировать, что память под таблицу alltrade не будет освобождена до обработки этой таблицы в функции main, которая тоже находится в dll? Совсем отключить сборку мусора, или есть что-то ещё?
Насколько я понял, т.к. в моём случае параметр dwFlags у CreateEventA равен 0, то ResetEvent не требуется. Похоже, когда Виндовс по установленному коллбэком флагу события запускает main, то Виндовс сбрасывает этот флаг, поэтому в принципе возможна потеря возникновения события. Ясно что события не буферизуются. Ожидание множества событий тут по-моему не очень подходит, т.к. main должна отрабатывать при возникновении хотя бы одного события.
Такую книжку Рихтера (только в синей ламинированной обложке) я купил давно, тогда я ещё не программировал на Си. Пока что меня не интересует общая теория семафоров, светофоров и шлагбаумов: я сейчас конкретно переписываю скрипт с Луа на Си dll, отвлекаться на эксперименты неохота. Пока у меня обработка событий на Си происходит в коллбэках и я собираюсь перенести её в main с использованием очереди и объектов событий, как это у меня работает в Луа.
Насколько я понял, надо использовать параметр lpName в CreateEventA: коллбэки создают события со своими именами. Осталось уточнить: что будет, если оба коллбэка успеют создать события, а main ещё не запустилась для их обработки. Не будет ли потеряно второе событие?
и оба коллбэка OnAllTrade и OnQuote почти одновременно выдали
Код
SetEvent(evt)
При вторичной выдаче SetEvent(evt) эта установка события не выполнится? Теперь вызывается main и начинает их обрабатывать событие: она проверяет и обрабатывает общую очередь от обоих коллбэков. Это правильная работа с событиями?
Как надо по-минимуму изменить параметры CreateEventA, WaitForSingleObject и SetEvent, чтобы main знала, какой именно коллбэк выдал SetEvent(evt)?
nikolz написал: dll проще и быстрее отлаживать не в КВИКЕ, а в SCITE
Имеется в виду текстовый редактор https://ru.wikipedia.org/wiki/SciTE ? Не пойму, как в нём можно отлаживать dll для Quik, я пока что привык к консольному редактору Фара, в качестве отладки вывожу значения переменных в файл, как делали деды и прадеды...
Заметил такие сюрпризы с форматом %g: Число 10000.2345 выводится в виде 10000.2 Число 100000.2345 выводится в виде 100000 Формат %f работает без ошибок, но с правыми нулями.
В OnAllTrade получаю цену акции, а она там имеет тип double (в отличие от getQuoteLevel2, где она в виде строки). По какому сишному формату для printf можно вывести double без правых незначащих нулей, если неизвестно, сколько значащих цифр в дробной части? Формат %g это делает, есть ли там есть риск, что он может вывести число с экспонентой? Неужели в си это невозможно? Я с пом. поиска ответа не нашёл. А скрипт на Lua просто берёт и выводит это, как мне надо. Как он это делает, вручную удаляет в строке правые нули? https://learn.microsoft.com/ru-ru/cpp/c-runtime-library/format-specification-syntax-printf-and-wprin...
Спасибо, теперь ясно, почему память под скрипт уменьшалась.
А если короткой строке что-то присвоить, то алгоритм сложнее: она, как я заметил, заносится в стринг буфер, и если какой-то строке присваивается короткое значение, то в этом стринг буфере ищется по хэшу такая же строка и, если найдена, оживляется, а если такая строка не находится, то тогда создаётся новая.
Вы имели в виду, что, когда я длинной строке присваиваю "", то она сразу удаляется (вызывается free()), минуя сборщик мусора, и пересоздаётся (c выделением 56 байтов через malloc())?