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

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

Страницы: Пред. 1 2 3 4 5 6 7 След.
status == 15 в OnTransReply
 
Вопрос к Тех. поддержке:
Странная типизация результата
 
Цитата
kroki написал:
если результат влезает в +-2^54
поправлю, в ±2^53, если быть более точным
status == 15 в OnTransReply
 
Цитата
kroki написал:
Когда-то сам пытался спросить  вот здесь , в итоге сделал вывод, что 15 никто никогда не видел.  Мой робот его тоже пока не встречал...
Пока что я выяснил следующее...

Появились эти новые статусы «14», «15» и «16» начиная с версии Quik 7.6.0. Описаны в «Руководстве пользователя Quik» (info.chm), «Раздел 3. Просмотр информации», подразделы «Таблица транзакций» и «Таблица транзакций \ Настройка таблицы».

Перечитал описание несколько раз, но ясности это не прибавило. Например, у меня в Quik'е если создать эту таблицу транзакций, то там из действий есть только пункт ««Оповещение по статусу транзакции»», а должны быть ещё два пункта «Новая заявка» и «Контроль дополнительных ограничений». Вот как раз через этот пункт «Контроль дополнительных ограничений» и должен открываться некий диалог, где можно нажимая кнопки «Да» и «Нет» разрешить или отменить транзакцию. И это должно привести к получению OnTransReply со статусами «15» и «16» соответственно. Возможно я пытался в нерабочее время, попробую снова когда будет торговая сессия.

Самое интересное, что в описании «Таблица транзакций \ Настройка таблицы» фильтра «Статус» сказано, что «Успешные» это транзакции со статусами «3», «15» и  «16», а все остальные статусы соответственно «Отвергнутые». То-есть, логика видимо такая, что отвергнутая пользователем транзакция тоже успешная, так как была кем-то обработана... но для целей скрипта такая трактовка не годится, так как успешная транзакция это та, которая оставляет после себя заявку, с которой дальше можно работать, а если транзакция отвергнута пользователем со статусом «16», то в рамках Lua скрипта это всё равно ошибочная транзакция.

Мне стало любопытно, и я просканировал все диалоги из lang_res.dll (ресурсная библиотека Quik), но кроме диалога настройки таблицы транзакций не нашёл больше никакого, где спрашивали бы о «Контроле дополнительных ограничений». Но эти «дополнительные ограничения» упоминаются во множестве строковых ресурсов, видимо Quik должен выбрасывать общее окно, как при подтверждении ввода заявки, и там можно отвечая «Да» и «Нет» сгенерировать эти самые статусы «15» и «16»... вообщем, пока непонятно, ни где эти дополнительные ограничения ставить, ни как отвечать на транзакции попавшие под эти ограничения.

То-есть, на текущий момент остаюсь при том же мнении, что успешность необходимо проверять двойным условием на статусы «3» и «15»...
status == 15 в OnTransReply
 
Как правильно проверять успешность обработки транзакции?

Сейчас делаю так:
1. ответы со статусом «0» и «1» об успешной отправке и получении транзакции сервером — игнорирую
2. ответ со статусом «3» о выполнении транзакции — считаю успешной обработкой транзакции
3. ответы со статусами «>=2, но кроме 3» о разных ошибках и прочем — считаю ошибкой при обработке транзакции

Меня смущает код «15», по документации он описан как «транзакция принята после нарушения дополнительных ограничений».
В каких случаях и для каких типов транзакций он приходит? Для NEW_ORDER, для KILL_ORDER или для обоих?

Соответственно, нужно ли проверять успешность обработки транзакции двойным условием на оба кода «3» и «15»?
Код
if status == 3 or status == 15 then
    --транзакция успешно обработана
elseif status >= 2 then
    --ошибка при обработке транзакции
else
    --ответы со статусом «0» и «1» игнорируем
end
Как написать самый простой код, по проверке работы функции OnTransReply()?, Код.
 
Цитата
Андрей написал:
Цитата
icebird   написал:
Коллбэк для того и нужен, чтобы ответ  дождаться .
Вот слово  Дождаться  кажется очень подозрительным, когда работа идет на скорость, то  дождаться  тут как то не очень понятна в принципе. По идее если функция работает по событию на сервере и передает данные в терминал пользователя, то она должна работать на подобии аппаратного прерывания компа, появилась, пришла, в программе прерываются основные процессы и и выполняется эта функция и ждать ничего не нужно, все должно происходить в рабочем порядке. А если такое не возможно и надо все таки  Ждать  ответа от сервера по транзакции (это немного похоже на программное прерывание, но не совсем) , то тогда конечно вы правы и вопросов у меня по этой теме больше нет, спасибо за помощь.
Зайдите на страницу:
https://arqatech.com/ru/support/files/

Там почти в самом низу скачайте:
«Документация по языку LUA в QUIK и примеры zip, 5.6 МБ»
https://arqatech.com/upload/iblock/194/quik_lua.zip

В архиве посмотрите файл «Использование Lua в Рабочем месте QUIK.pdf», там всё подробно расписано со схемами и примерами кода.
Особенно главу «4. Отправка транзакций из Lua скрипта», там пример работы с OnTransReply.
Снятая заявка
 
Цитата
Egor Zaytsev написал:
Цитата
Let_it_go   написал:
Как эту запись не перепутать с отчётом о зарегистрированной заявке?
Можно ориентироваться на параметр flags.
По идее именно для этого и нужен trans_id, по которому определяется ответ на посланную транзакцию. При посылке NEW_ORDER задаётся один trans_id, а при посылке KILL_ORDER другой trans_id. Соответственно ответы приходящие в OnTransReply различаются по этим разным trans_id.
order_num == nil и status == 3 в ответ на NEW_ORDER
 
Цитата
Egor Zaytsev написал:
О  trans_id торговая система ничего не знает, это внутренняя сущность сервера QUIK.
Тем лучше для Quik. Сервер Quik может сохранять trans_id для перевыставленных заявок, а не обнулять его.
Фильтрация транзакций "своего" робота
 
Цитата
Egor Zaytsev написал:
Цитата
Suntor   написал:
Предлагаю разработчикам Quik добавить в систему потокобезопасную функцию выделения новых идентификаторов транзакций.
Код
    NUMBER AllocTransID()    
...и таким образом закрыть этот вопрос раз и навсегда. Можно зарегистрировать это предложение?
Просьба уточнить, как по вашему данная функция решит проблему и что именно она должна сделать?
Данная функция должна выделять уникальный числовой идентификатор транзакции в рамках одной запущенной копии рабочего места Quik.

Скрипт Lua получает вызовы OnTransReply (и других событий) на транзакции посланные из других скриптов Lua, и в целом идущие от:
• Lua
• Trans2quik.dll
• QPILE
• динамическая загрузка транзакции из файла

Если идентификатор транзакции в одном скрипте Lua совпадёт в таким же в другом скрипте Lua, то возникнет путаница, когда чужие ответы будут приняты за свои. Такого быть не должно.
Функция AllocTransID() должна гарантировать уникальность получаемого идентификатора между всеми типами клиентов Quik.
Фильтрация транзакций "своего" робота
 
Предлагаю разработчикам Quik добавить в систему потокобезопасную функцию выделения новых идентификаторов транзакций.
Код
NUMBER AllocTransID()
...и таким образом закрыть этот вопрос раз и навсегда. Можно зарегистрировать это предложение?
Защита кода QLua от компрометации, Есть ли возможность исключить доступ к коду на QLua брокера и разработчиков Quik
 
Цитата
Алексей Ч написал:
Вы его уже пробовали, надеюсь? Да, с ним есть проблемы, но он добавляет 10 Х г...внокода от исходного. Итого 20кб исходного кода превращается 200кб невнятного луатекста
Нет, не пробовал... но суть не в конкретном обфускаторе как таковом, а в самом способе защиты алгоритма. Алгоритм остаётся открытым, его можно вытащить. Причём, по сути, пошаговым рефакторингом обфускаренного кода. Отрезая лишнее и ненужное. Многие сочтут такую работу за удовольствие, и с радостью поработают над вашими 200 КБ превращая их обратно в исходные 20 КБ.. )))

Цитата
Борис Гудылин написал:
Здесь не то, что код в готовом виде, но даже намек или просто привлечение внимания может иметь фатальные последствия для защиты.
Лучше перестраховаться и закруглить дискуссию.
Абсолютно неправильная точка зрения. Безопасность как раз и начинается с открытого обсуждения способов защиты. Специалисты устраивают конференции ежегодные, доклады готовят, а не сидят по домам втихую пряча все свои секреты.

Цитата
kroki написал:
Поэтому если ваш код выполняется терминалом Quik то он по определению  потенциально  скомпромитирован.  Отсюда вывод: нужно выполнять его в другом процессе, с которым QLua будет общаться через, например, named pipes или socket.
Как раз думаю над подобным способом, но только через общую (разделяемую, shared) память процессов. Это наиболее быстрый способ обмена. Делал его 20 лет назад ещё на VS6.0 через директивы компилятора. Но тут речь о том, как бы не городить огород. Хочется оставить Lua в обороте с одной стороны имея возможность прямой загрузки скрипта в Quik, а с другой стороны возможность быстро пересобрать проект в защитной конфигурации. Пока что вижу только реально практически удобный способ с делением кода на две части, как наименее затратный для реализации подобной схемы защиты. Фактически «иерархия конечных автоматов» биржевого протокола и обмена с Quik остаётся в Lua скрипте, а сама торговая стратегия уходит в отдельную DLL с мостом через shared-память.

Цитата
kroki написал:
Можно еще запустить Quik в отдельной виртуальной машине, а робота - вовне, и общаться через сокет.  А то вдруг Quik вообще любые файлы с вашей машины отсылает брокеру - потенциально может ведь :).
Да, может. )))
Единственно что не все файлы, так как такую дисковую активность несложно отследить, и палиться так разработчики Quik'а не станут, я полагаю. Но вот, то что уже загружено в Quik, то-есть сами .lua и .luac файлы без проблем могут передаваться на строну сервера Quik, и отследить такую активность не взломав протокол Quik'а с сервером уже невозможно.
Защита кода QLua от компрометации, Есть ли возможность исключить доступ к коду на QLua брокера и разработчиков Quik
 
Цитата
Michael Bulychev написал:
Цитата
Suntor   написал:
Что же касается связки luac + bin2c, то она не сработает в качестве защиты. Там нет компиляции кода. Там просто упаковка luac кода в секцию данных и с последующим вызовом по указателю.
luac на выходе даст вам как раз байт-код.
Вернулись к началу темы... по кругу ходим. Уже же выяснили что luac не выход. Даже если его просто в редакторе открыть, видно, что все имена сохранены.

Я пробовал свои luac файлы декомпилировать через unluac обратно в lua, результат поразительный. Получил точную копию исходного lua файла. Отличие только в отсутствие комментариев. Даже структура отступов совпала.

То-есть для «вскрытия алгоритма» это более чем достаточно, фактический исходный код как он есть. Уж лучше тогда оставить Lua код с комментариями, в которых хотя бы можно авторские права указать. )))
order_num == nil и status == 3 в ответ на NEW_ORDER
 
Цитата
Egor Zaytsev написал:
Цитата
Suntor   написал:
Фактически это «сделки из ниоткуда»... у них trans_id нулевой, linkedorder нет и order_num новый.
Здесь универсального решения нет.
Надо быть готовым к любому порядку прихода       данных.
Порядок одно, а целостность протокола совсем другое. В данном случае, речь идёт о потери связи между начальными и конечными сообщениями в рамках транзакции.
Ситуация возникает из-за обнуления trans_id для перевыставленных заявок. А также из-за отсутствия в сделках информации об исходной заявке.
Защита кода QLua от компрометации, Есть ли возможность исключить доступ к коду на QLua брокера и разработчиков Quik
 
Цитата
s_mike@rambler.ru написал:
Suntor.

Вы получили всю необходимую информацию, чтобы суметь сформулировать в Гугле поисковую фразу " lua to c".
Детский сад продолжается...

Цитата
Michael Bulychev написал:
Видимо имелась ввиду связка luac + bin2c
Что имелось ввиду мы уже не узнаем, ибо это большая тайна...

Что же касается связки luac + bin2c, то она не сработает в качестве защиты. Там нет компиляции кода. Там просто упаковка luac кода в секцию данных и с последующим вызовом по указателю. А это значит, что обычным Hex редактором (и/или даже 7-Zip архиватором) этот luac можно вытащить обратно.

Возможно всё же есть способ реально спрятать код внутрь DLL, как раз рассчитывал услышать что-то полезное от форумчан, а пока потихоньку пилю тему сам. Все варианты защиты, которые у меня получаются пока очень громоздки и затратны.

Цитата
Борис Гудылин написал:
Публично обсуждать ключевые моменты своей (и не только своей) защиты - просто невероятный абсурд!
Обсуждаем технические моменты, методы, инструменты... никто не просит вываливать свой код в готовом виде. Всё же разные вещи.

Цитата
Борис Гудылин написал:
Как только софт попадает в чужие руки - он обречен. От специалиста нет защиты.
Хоть какая-то защита лучше чем вообще никакой. Тем более что часто отличная защита получается с минимальными издержками, как раз поиск таких решений и есть предмет обсуждений.

Цитата
Алексей Ч написал:
для защиты использую обфускатор  https://github.com/efrederickson/XFuscator . Код на луа сначала "прогоняю" через него, потом пакую в luac.
Обфускатор, в качестве защиты, мало что даёт на самом деле.
Защита кода QLua от компрометации, Есть ли возможность исключить доступ к коду на QLua брокера и разработчиков Quik
 
Цитата
s_mike@rambler.ru написал:
Инструмент, засовывающий любой скрипт луа вовнутрь dll давно написан. Рассказывать подробности не стану.
Детский сад какой-то...
Защита кода QLua от компрометации, Есть ли возможность исключить доступ к коду на QLua брокера и разработчиков Quik
 
Цитата
s_mike@rambler.ru написал:
ну собственно так оно и делается. Все возможности для этого в C API имеются.

если это будет необходимо, пишите, спрячу ваш готовый скрипт в dll, дело на пару минут.
у вас там какая-то DLL-обёртка написана, которая перенаправляет OnOrder, OnTrade и пр. в одноименные вызовы скомпилированного в бинарник Lua-скрипта?
order_num == nil и status == 3 в ответ на NEW_ORDER
 
Цитата
Egor Zaytsev написал:
Добрый день.
Цитата
Возможна ли ситуация, что до начала торговой сессии не придёт OnOrder с новым order_num, а первым придёт в начале новой торговой сессии OnTrade с этим новым order_num? Или гарантируется, что при заменах, OnOrder с новым order_num будет приходить всегда первым и до начала новой торговой сессии?
Да, такая ситуация возможна.
Очень плохая ситуация... если OnOrder с новым order_num потерялся... то все последующие OnTrade невозможно ни к чему привязать, так как старого order_num в них нет.
Фактически это «сделки из ниоткуда»... у них trans_id нулевой, linkedorder нет и order_num новый.
Защита кода QLua от компрометации, Есть ли возможность исключить доступ к коду на QLua брокера и разработчиков Quik
 
Цитата
s_mike@rambler.ru написал:
Цитата
Suntor   написал:
Цитата
    s_mike@rambler.ru   написал:
если вы хотите большей надёжности, наиболее правильный путь это встраивание скрипта на луа  в dll. Этим способом пользуюсь сам.
А можно поподробнее?... и как всё это прикручивается к Quik в конечном счёте.
есть такая штука - lua C Api
не... я понял фразу «встраивание скрипта на луа в dll» буквально, что вы вовнутрь DLL перенесли Lua код как он есть... на подобии двоичной компиляции... а потом это дело прикрутили к Quik...

то-есть, моя мысль состоит в том, чтобы спрятать написанный на Lua скрипт внутрь скомпилированной библиотеки, но при этом код останется тем же, какой можно напрямую запустить через диалог скриптов в Quik...

как бы это сделать по-человечески?...
UTF-8 BOM и QLua скрипты
 
Цитата
s_mike@rambler.ru написал:
lua машина кушает исходный текст в Анси. Использование других кодировок внесёт неопределенность в синтаксический анализатор.

поэтому вариантов 2. Или сменить ide на тот, где можно задать кодировку для типа исходного текста либо обучить idе предварительной транслитерации текста в Анси перед сохранением и дальнейшими действиями над текстом.
Столкнулся с этим же при попытке использования ZeroBrane Studio, которая, насколько я понял, работает исключительно с UTF-8. А Quik наоборот, работает исключительно с Win CP1251, иначе выдаёт ошибку загрузки скрипта.

Как бы их скрестить по-человечески?... кто-то пробовал?
Защита кода QLua от компрометации, Есть ли возможность исключить доступ к коду на QLua брокера и разработчиков Quik
 
Цитата
s_mike@rambler.ru написал:
если вы хотите большей надёжности, наиболее правильный путь это встраивание скрипта на луа  в dll. Этим способом пользуюсь сам.
А можно поподробнее?... и как всё это прикручивается к Quik в конечном счёте.
Лимиты на покупку
 
Цитата
Роман написал:
CalcBuySell(class_code, security, "", account, price, false , false)

и всё работает ...
работает возможно из-за того, что вы для срочного рынка считаете... а для фондового может уже так не сработает...
Лимиты на покупку
 
Цитата
Роман написал:
local value = tonumber(CalcBuySell(class_code, security, null, account, price, false , false))

выводит: bad argument #1 to 'tonumber' (value expected) :(
Цитата
Роман написал:
CalcBuySell(SPBFUT , RIM8 , null, 4000000, 123300 , true, false) возвращает nil
Почему вы везде пишите null вместо nil? В Lua, насколько я понимаю, нет такого ключевого слова как null, поэтому это будет интерпретироваться как некая переменная с именем null, которая не определена и соответственно вместо неё будет подставляться значение nil. То-есть, по сути, пока кто-то случайно не определил null со своим значением, такой код будет работать без ошибок и использование null будет равнозначно nil. Но тем не менее, это всё-таки синтаксическая ошибка, и лучше наверно не стоит так писать...

***
По теме... я ещё не разбирался с функцией CalcBuySell, поэтому не знаю что там за параметр client_code ей требуется... у меня поле с таким именем в OnTransReply, OnOrder и OnTrade точно равно полю account, а в вызове sendTransaction оно задаёт комментарий, который возвращается потом полем brokerref... то-есть полная путаница получается...

Подозреваю, что в вызове CalcBuySell параметр с таким же именем client_code должен задавать значение, которое возвращается в поле uid в OnTransReply, OnOrder и OnTrade, это уже пусть тех. поддержка точно скажет...

Тогда, если это так, то может вытащить это значение оттуда из uid? это так на вскидку, не зная структуры вашего кода...
Таблица заявок
 
Цитата
Egor Zaytsev написал:
Добрый день.

В данном случае будет работать такой вариант:

1-ый день: order_num = 0001, linkedorder = 0001
2-ой день: order_num = 0002, linkedorder = 0001
3-ий день: order_num = 0003, linkedorder = 0002
4-ый день: order_num = 0004, linkedorder = 0003
5-ый день: order_num = 0005, linkedorder = 0004

т.е будет содержать номер заявки за предыдущую торговую сессию.
...до последнего казалось, что linkedorder будет содержать номер самой первой заявки...

Наверно, очевидно, что это совсем не очевидная вещь, и её стоит добавить в документацию... можете зарегистрировать пожелание?
Таблица заявок
 
Цитата
Suntor написал:
А когда несколько дней подряд заявка переносится и её номер меняется через каждый вечерний клиринг несколько раз, то значение linkedorder содержит номер самой первой заявки в самый первый день? или linkedorder  содержит номер заявки за предыдущую торговую сессию?

То-есть, чередование значений такое:
1-ый день: order_num = 0001, linkedorder = 0001
2-ой день: order_num = 0002, linkedorder = 0001
3-ий день: order_num = 0003, linkedorder = 0001
4-ый день: order_num = 0004, linkedorder = 0001
5-ый день: order_num = 0005, linkedorder = 0001

Или такое:
1-ый день: order_num = 0001, linkedorder = 0001
2-ой день: order_num = 0002, linkedorder = 0001
3-ий день: order_num = 0003, linkedorder = 0002
4-ый день: order_num = 0004, linkedorder = 0003
5-ый день: order_num = 0005, linkedorder = 0004
Вроде простой вопрос... неужели никто не может с ходу ответить... или придётся ставить скрипт и ждать три торговых сессии, чтобы это выяснить самому? (((
Ошибка получения параметра "order_num" поля таблицы "orders" через lua_CApi.
 
Цитата
Andrey Perchits написал:
Тем не менее, должен заметить, что проблема до конца не решается. Судя по официальной информации, диапазон поддерживаемых целых чисел ограничен 100 000 000 000 000.   https://www.lua.org/pil/2.3.html
Тогда уже, если развить тему, то число, указанное в документации Lua, не совсем точное. Не знаю почему так.

На самом деле границы диапазона взаимно-однозначного перевода целых чисел между типами double и __int64 составляют:
Код
[±9007199254740992] ([±2^53])
Это чуть более чем в 90 раз больше, чем по документации Lua:
Код
  100,000,000,000,000 (max: lua docs)
9,007,199,254,740,992 (max: double-precision IEEE 754)
То-есть, в строковом представлении число длиной в 15 десятичных цифр точно. (16 цифр неполностью)

Судя по описанию торговой платформы ASTS (Фондовый и Валютный рынки МосБиржи), которое я нашёл,
идентификационный номер заявки в Торговой Системе — поле ORDERNO, имеет тип INTEGER и размер 12.
То-есть задаётся строкой длиной в 12 символов, или соответственно числом длиной 12 цифр.
Что на приблизительно 2-е цифры больше чем максимально-возможное значение 32-хбитного типа int,
но гораздо меньше, чем максимально-возможное точное целочисленное значение типа double:
Код
        4,294,967,296 (2^32) — тип int
9,007,199,254,740,992 (2^53) — тип double
      000,000,000,000        — поле ORDERNO, тип INTEGER, 12 цифр
Так что, получается, что типа lua_Number (от же double) достаточно для точной передачи номера заявки в торговой системе Фондового и Валютного рынков МосБиржи.
Ошибка получения параметра "order_num" поля таблицы "orders" через lua_CApi.
 
Цитата
SG написал:
У вас переполнение типа int. Номера заявок и сделок - это 64-битные целые числа.
SG прав...

ошибка в строчке:
Код
int N = lua_tonumber(L, -1);
добавлю только, что судя по определению:
Код
typedef double lua_Number;
lua_Number lua_tonumber (lua_State *L, int index);
произошло преобразование значения типа double превышающего максимально возможное значение типа int, в результате чего было получено значение INT_MIN из <climits> (limits.h)
Код
#define INT_MIN     (-2147483647 - 1) /* minimum (signed) int value */
Таблица заявок
 
А когда несколько дней подряд заявка переносится и её номер меняется через каждый вечерний клиринг несколько раз, то значение linkedorder содержит номер самой первой заявки в самый первый день? или linkedorder  содержит номер заявки за предыдущую торговую сессию?

То-есть, чередование значений такое:
1-ый день: order_num = 0001, linkedorder = 0001
2-ой день: order_num = 0002, linkedorder = 0001
3-ий день: order_num = 0003, linkedorder = 0001
4-ый день: order_num = 0004, linkedorder = 0001
5-ый день: order_num = 0005, linkedorder = 0001

Или такое:
1-ый день: order_num = 0001, linkedorder = 0001
2-ой день: order_num = 0002, linkedorder = 0001
3-ий день: order_num = 0003, linkedorder = 0002
4-ый день: order_num = 0004, linkedorder = 0003
5-ый день: order_num = 0005, linkedorder = 0004
order_num == nil и status == 3 в ответ на NEW_ORDER
 
Всем ответившим спасибо за предыдущие ответы...

Ещё вопрос по очерёдности OnOrder и OnTrade при замене заявки со сроком действия при переносе через вечерний клиринг на срочке.

По логам, OnOrder для новой заменённой заявки приходит с trans_id == 0, новыми order_num и datetime, и linkedorder равным order_num старой заявки.
Насколько я понимаю, OnTrade также придёт с trans_id == 0, новым order_num, но без linkedorder, так как такого параметра в сделках нет.
Единственный способ связать между собой новые сделки по новой заменённой заявке, это сравнить новый order_num в OnTrade с новым order_num полученным в OnOrder.
Но для этого, OnOrder для новой заменённой заявки должен обязательно прийти первым. По логам вижу, что он пришёл в середине вечернего клиринга вчера.

Возможна ли ситуация, что до начала торговой сессии не придёт OnOrder с новым order_num, а первым придёт в начале новой торговой сессии OnTrade с этим новым order_num?
Или гарантируется, что при заменах, OnOrder с новым order_num будет приходить всегда первым и до начала новой торговой сессии?
Ctrl+Enter
 
Пожалуйста, уберите с формы ответа обработчик Ctrl+Enter как горячую клавишу кнопки «Отправить»... эта комбинация в Skype при редактировании делает перенос на новую строчку. По привычке постоянно нажимаю её, и сообщение сразу же отправляется на форум Quik недописанным. И нет возможности его исправить...
order_num == nil и status == 3 в ответ на NEW_ORDER
 
Сюда же задам ещё два вопроса по поведению OnTransReply, OnOrder и OnTrade, чтобы не плодить темы.

1. Возможна ли ситуация потери одного из вызовов, например при сетевых ошибках, сбоях сервера и т.п... то-есть OnTransReply вообще не приходит, а сразу приходят OnOrder и OnTrade?
2. Возможна ли ситуация изменения порядка прихода вызовов. Например, первым придут несколько OnTrade, за ними OnOrder и в конце OnTransReply, и все разумеется в рамках одного trans_id?
order_num == nil и status == 3 в ответ на NEW_ORDER
 
Цитата
Egor Zaytsev написал:
Добрый день.

За все торговые площадки мы сказать затруднимся, это нужно проверять.
Но направление такое, если в OnTransReply order_num равен null, то и в OnOrder
он может и не быть.

На фондовом, валютном, срочном рынке такой ситуации не должно быть.
Значит ответ: «Да»...
order_num == nil и status == 3 в ответ на NEW_ORDER
 
По документации, поле order_num может быть nil в OnTransReply(trans), а в OnOrder(order) нет.

Возможна ли ситуация, что в ответ на NEW_ORDER придёт успешный OnTransReply(trans) с trans.status == 3 в котором trans.order_num == nil?
То-есть, заявка будет успешно зарегистрирована, но её номер останется неизвестным. И придёт только в поле order.order_num ~= 0 при последующем вызове OnOrder(order) имеющим такой же идентификатор транзакции order.trans_id == trans.trans_id.
Как определить направление операции (Купля/Продажа) в OnTransReply?
 
...и судя по логам, бит номер 17 (0x20000) в флагах транзакций, если нумерация с 0 как в документации по флагам заявок и сделок. Если нумерация с 1, то тогда 18-ый получается.
Как определить направление операции (Купля/Продажа) в OnTransReply?
 
Цитата
Stanislav Tvorogov написал:
За направление отвечает параметр flags 18 бит:
0 - покупка
1 - продажа
Можно уже закладываться на это, не дожидаясь включения в официальную документацию?

Вообще неплохо бы привести этот флаг транзакции в соответствие с таким же флагом в заявках и сделках. Чтобы совпадали по младшим разрядам хотя бы частично по соответствующим признакам операций. И уже после этого его официально задокументировать...
Как определить направление операции (Купля/Продажа) в OnTransReply?
 
OnTransReply(TABLE trans_reply)

В trans_reply есть параметр определяющий направление операции (Купля/Продажа)?
Установка в C:\Program Files\, Сделайте нормальную установку в стандартное место
 
Вроде начало было хорошее, если не придираться к некоторым ошибкам... но последний абзац убил просто:

Цитата
A.T. написал:
Я уже лет 10 работаю только под админом...

Я вам сочувствую.

Цитата
A.T. написал:
...не испытываю никаких неудобств и не пользуюсь антивирусами (что есть сильно раздутое маркетинговое давление и всегда тормознутый компьютер), вовремя обновляюсь и контролирую все сам. Никаких проблем. Правда для этого надо было еще 8 лет потратить, чтобы научиться делать эти самые вирусы и знать тонкости различных операционных систем как и поведение обычных пользователей как свои пять пальцев, но это уже совсем другая история.

А от появления разных эксплойтов, в том числе неопубликованных и тех для которых ещё не выпущены обновления системы, вы как защищаетесь? магией?

П.С. Я вам открою страшную тайну. В клиентских (да вообще во всех) версиях Windows пользователи просто добавляют себя в группу администраторов (делается одной галочкой в настройках), и на этом вся безопасность с блокировкой админской учётки заканчивается.
Пришел OnTransReply с пустым brokerref
 
Цитата
Sergey Gorokhov написал:
Suntor  ,

По данному обращению мы диагностируем проявление исправленной в версии сервера 5.18 ошибки, связанной с трансляцией некоторых полей в таблицу транзакций через серверы доступа.
Проблема исчезнет после обновления серверного ПО у Вашего брокера, до этой версии.
А как между собой соотносятся версии сервера и клиента, который брокер рассылает с этого сервера, они связаны? Номера должны совпадать?

01.03.2018 брокер обновил версию клиента до 7.16.2.5, предыдущая версия клиента скачиваемая с его сервера была 7.14.1.7 в течение как минимум полугода.
По вашим словам у брокера до сих пор версия младше 5.18, а клиента он рассылает последнего 7.16.2.5.
Такая ситуация нормальная? Разве не должно иди обновление в паре (клиент/сервер) одновременно, чтобы версии с обоих сторон соответствовали.
Пришел OnTransReply с пустым brokerref
 
Цитата
Sergey Gorokhov написал:
Suntor  ,
Просьба уточнить время транзакции
Ваш UID и кто брокер.
Пустой brokerref в OnTransReply.

Версия терминала Quik 7.16.2.5, брокер ВТБ, UID 29135 оставил в логах, номер торгового счёта ACCOUNT затёр на всякий случай.
Далее, полная информация по заявке 29666422467 и сделке 1982204382 по ней. Обе прошли в 22:26:51 02.03.2018.

Функция sendTransaction:
Скрытый текст
Функция OnTransReply (пустой brokerref выделил):
Скрытый текст
Таблица заявок:
Скрытый текст
Функция OnOrder:
Скрытый текст
Таблица сделок:
Скрытый текст
Функция OnTrade:
Скрытый текст
Пришел OnTransReply с пустым brokerref
 
Подтверждаю. Посмотрел сейчас логи последние и старые в том числе. В OnTransReply приходит ["brokerref"]="". А в OnOrder и в OnTrade приходит заполненным.

По логам на обоих версиях:
7.14.1.7, проверял 27.02.2018
7.16.2.5, проверял 02.03.2018

Сделки были по SiH8 за обе даты, в обоих направлениях по несколько штук.
Установка в C:\Program Files\, Сделайте нормальную установку в стандартное место
 
Цитата
sting написал:
Обратитесь в Microsoft, пусть он вам сделает удобную (на уровне "пощёлкать") менюшку по настройке прав доступа.;)
Обязательно, завтра же позвоню Биллу Гейтсу, и лично попрошу переделать Windows под мои нужды...

Цитата
sting написал:
Про то как сейчас я знаю. Ответа на мой вопрос не вижу.
Вы спросили, как будут устанавливаться Quik'и от разных брокеров, я вам написал. Перечитайте ещё раз более внимательно.

Цитата
sting написал:
А теперь представьте, что произойдёт если пути пересекутся.
Вы у себя на компьютере нажмите Win+R, и в появившееся окно введите строчку «%APPDATA%», затем нажмите Enter.
В открывшимся окне проводника, увидите длинный список папок от всех программ, которые установлены на вашей машине.
Там в этой папочке можно найти и историю браузеров, и Skype звонков, и даже настройки всяких инструментов Яндекса.
Это такая специальная папка в профиле пользователя, куда пишут рабочие файлы приложения... так устроена система Windows.

Обычный пользователь, об этой папке даже не знает. И глупые вопросы, типа «что произойдёт если пути пересекутся» не задаёт.
Потому что умные люди, которые пишут приложения и разрабатывают операционные система, сами задают все пути и всё конфигурируют.

А вот как раз ситуация, когда сами пользователи начинают настраивать ярлыки какие-то у себя, прописывать какие-то права, вот эта ситуация как раз и неправильная.
И вот именно в этом случае, как раз «пути пересекутся» и «ПО сразу же перестанет работать».

Всё же предлагаю вам хотя бы немного разобраться в теме безопасности ОС и в целом программировании приложений...
Направление прошлой сделки
 
Цитата
Николай Камынин написал:
Рыночная цена - это сленг, означает рыночная заявка  т е заявка покупки или продажи по существующим на рынке ценам.
Такая заявка всегда. это покупка по лучшей цене предложения или продажа по лучшей цене спроcа.
Это очень плохое определение «рыночной цены»... взятое из школьного учебника в самом плохом смысле этого слова.
На ваше определение, следующий вопрос, который можно задать, а что такое «по существующим на рынке ценам»?
Теперь дайте определение, что такое эти самые «существующие на рынке цены»? Это что такое?
И далее, то же самое по «лучшей цене»... она лучшая в каком смысле? где точное определение, где количество, где границы торгового диапазона, ничего нет в вашем определении.

Цитата
Николай Камынин написал:
Под вершиной стакана я понимаю лучшую цену предложения и лучшую цену спроса - спред (линия в стакане) между ними и есть вершина стакана.
Понятно.

Цитата
Николай Камынин написал:
Маркет-мейкеру платит биржа. Сколько и за что вы можете посмотреть на сайте биржи.
Да не платит Маркет-мейкеру ничего биржа. Биржа максимум освобождает маркет-майкера от биржевой комиссии. Но это не плата, как таковая, это всё-таки определённые условия взаимовыгодного сотрудничества двух юр. лиц.

Цитата
Николай Камынин написал:
Поэтому когда рыночная заявка бъет в лучшую цену - спред расширяется, маркет-мейкер (если нет никого)
бьет в противоположную сторону - т е сжимает спред.
Если бы такой Маркет-майкер появился на бирже, то он быстро обанкротился бы... особенно в периоды возрастающей волатильности и резких движений рынка.
Даже если просто посидеть и понаблюдать за парными крупными заявками (Маркет-мейкера) в стакане, то хорошо видно, что при исполнении таких заявок, спред сразу же расширяется в сторону исполнения, а затем смещается в эту же сторону. Маркет-мейкер как бы идёт вместе с рынком в туже сторону. А если он попытается делать движения в противоположную сторону, как вы пишите, то это уже не Маркет-мейкер, а какой-то крупный игрок со своей стратегией.
Установка в C:\Program Files\, Сделайте нормальную установку в стандартное место
 
Цитата
Anastasia Gordienko написал:
На рабочем столе ярлык к запуску QUIK
В свойствах этого ярлыка, в поле «Рабочая папка»;
...
Вас устроит такое решение?
Цитата
Egor Zaytsev написал:
Если все же рабочее место устанавливается в ProgramFiles, то в ярлыке можете прописать рабочую директорию, и рабочие     файлы QUIK будут сохраняться именно там.

К сожалению, у этого способа есть недостаток. А именно, не работает обновление версий из Quik запущенного таким способом.
Выдаёт такую вот «прелесть»:


Понятно почему, потому что Quik запущен под обычным пользователем, и у него нет прав делать запись в системную папку программы в %ProgramFiles(x86)%.
Файлы же скачиваются в папку %APPDATA%\QUIK_ИМЯБРОКЕРА\spool\frontend. В итоге либо вручную делать резервные копии старой версии и вручную переписывать все файлы в %ProgramFiles(x86)%\QUIK_ИМЯБРОКЕРА, либо запускать под администратором Quik на время обновления, что неправильно.

Соответственно. В Quik (или даже в update.exe) необходимо добавить вызов UAC для поднятия привилегий на время обновления программы, с запросом пароля, как это обычно и делается.
Добавьте это к зарегистрированному ранее пожеланию.
Установка в C:\Program Files\, Сделайте нормальную установку в стандартное место
 
Цитата
sting написал:
"Пощёлкайте" Windows или настройте его наконец.
Что вы мне предлагаете «пощёлкать» в Windows?... запускать сетевое приложение под админом, как некоторые горящие головы из тех. поддержки неких брокеров предлагают... за такие советы увольнять надо. А я с эти сталкивался уже не раз. И создаётся впечатление, что в тех. поддержках многих солидных банков работают какие-то недоучившиеся студенты, вообще не имеющие представление о том, что они делают.

Цитата
sting написал:
Разъясните, пожалуйста, как вы предлагаете устанавливать и запускать на одном компьютере Quik от разных брокеров, если по умолчанию всё будет сохраняться в одинаковую для всех Quik директорию?
Легко. Сейчас, когда вы ставите Quik от разных брокеров, то они ставятся в папки с разными именами %ProgramFiles(x86)%\ИМЯБРОКЕРА. То-есть:

%ProgramFiles(x86)%\QUIK_VTB24
%ProgramFiles(x86)%\QUIK_BCS
%ProgramFiles(x86)%\QUIK_FINAM

Туда же засунуты и рабочие файлы, чего делать нельзя. Их нужно переместить в папку %AppData%\ИМЯБРОКЕРА. Чтобы было два набора папок:

%ProgramFiles(x86)%\QUIK_VTB24
%ProgramFiles(x86)%\QUIK_BCS
%ProgramFiles(x86)%\QUIK_FINAM
%AppData%\QUIK_VTB24
%AppData%\QUIK_BCS
%AppData%\QUIK_FINAM

Вот и всё. Именно так это и должно быть по правилам сертификации приложений для Windows с точки зрения безопасности! Ссылки я приводил выше.
И именно так у меня сейчас настроено вручную через ярлыки запуска. А  должно настраиваться по умолчанию без дополнительных действий со стороны  пользователя.
Тем более, что настройка через ярлык — половинчатое решение, и оно не работает при обновлении программы на новую версию. Так как в Quik нет вызова UAC. См. ниже в сообщении.

Цитата
sting написал:
Просьба к разработчикам. Пожалуйста, не делайте по умолчанию запись в одинаковую директорию. По умолчанию оставьте всё как сейчас.
Ну как они по вашему это бы сделали, что за глупости.
Вы сначала разберитесь в теме, что мы тут обсуждаем, а потом делайте категоричные заявления.
Направление прошлой сделки
 
Цитата
Николай Камынин написал:
Есть такое правило на рынке - Рынок двигают рыночные цены.
Т е направление рынка - это направление движения цены. Рыночная цена всегда смещает цену в стакане.
Под «рыночной ценой» вы что здесь имели ввиду?

Цитата
Николай Камынин написал:
Поэтому попробуйте следить за ценой на вершине стакана.
«вершина стакана» — это где?

Цитата
Николай Камынин написал:
Но если рынок не двигают большие деньги ,
то всегда на движение вверх будет ответное движение вниз и наоборот. это делает маркет-мейкер, ему за это деньги платят.
Кто платит деньги маркет-майкеру и как он это делает «ответные движения»? расскажите поподробнее...
Пришел OnTransReply с пустым brokerref
 
Цитата
Sergey Gorokhov написал:
Цитата
Suntor   написал:
и для чего вообще эта строчка кода?
Конкретно в этом примере можно считать этот параметр излишним.
Это просто вводит людей в заблуждение, потому что люди ждут, что значение из этого поля отобразится в таблице заявок в столбце «Комментарий».
Потом сидят ищут в логах таблиц колбэков этот же параметр и не находят, потом идут на форум задавать вопросы, где их ещё сильнее запутывают...

Я уже выяснил, что вместо поля COMMENT, нужно использовать поле CLIENT_CODE при посылке транзакции, и это поле не совпадает с полем CLIENT_CODE в ответах в колбэках, а приходит в виде поля BROKERREF... Это гениально!
Но всё же, могу ли я в Lua послать KILL_ALL_ORDERS c полем COMMENT, чтобы снять группу заявок предварительно отправленных с тем же полем COMMENT?
Пришел OnTransReply с пустым brokerref
 
Цитата
Suntor написал:
Цитата
Suntor   написал:

В вашем примере из документации:   https://arqatech.com/upload/iblock/194/quik_lua.zip  
в примере \quik_lua\examples\test_trans.lua используется поле COMMENT, в которое прямо так и пишется строчка "LUA"

transaction.COMMENT = "LUA ".. tostring(x)
А вы говорите, что в Lua это поле COMMENT вообще игнорируется... зачем тогда такой пример давать? и для чего вообще эта строчка кода?
Пришел OnTransReply с пустым brokerref
 
Цитата
Suntor написал:

В вашем примере из документации:  https://arqatech.com/upload/iblock/194/quik_lua.zip
в примере \quik_lua\examples\test_trans.lua используется поле COMMENT, в которое прямо так и пишется строчка "LUA"

transaction.COMMENT = "LUA ".. tostring(x)
Пришел OnTransReply с пустым brokerref
 
Цитата
Sergey Gorokhov написал:

Цитата
COMMENT - Текстовый комментарий, указанный в заявке.  Используется при снятии группы заявок
А так как через Lua нельзя использовать групповое снятие заявок, то и параметр COMMENT просто игнорируется
Осталось только узнать, что такое «групповое снятие заявок»?... Забавно, что поиск по документации Quik ничего не даёт. А поиск в Яндексе в первой же страницей выдаёт «Групповые заявки в КВИКе — Нет такого»...

А вообще, на уважаемых сайтах есть оценка полезности ответов. Вам бы тоже не мешало бы добавить для обратной связи. Вы бы удивились бы, сколько минус вам бы понаставили за большинство ответов на форуме.

В вашем примере из документации: https://arqatech.com/upload/iblock/194/quik_lua.zip
Направление прошлой сделки
 
Цитата
Борис Гудылин написал:
Правильный ответ - "Цирк, да и только! В ленте мы видим того кто оказался меньшим по объёму".
Да нет никакого цирка... а если есть, то докажите. В ленте вы видите того, кто был последний, а не того, у кого меньший объём.

Цитата
Алексей Ч написал:
"Цирк" легко проверить на таблице сделок и стакану....Либо прочитайте уже наконец инструкцию. Раздел 3. Таблица обезличенных сделок. Там черным по белому написано "«Купля» – заключена сделка путем выставления заявки на покупку против находящейся в торговой системе котировки на продажу;"
Совершенно верно. Тоже самое сформулировано в других терминах. Если в торговой системе уже есть заявка (то-есть она была первой), а ваша приходит после неё (то-есть она была последней), то направление сделки будет по вашей заявке.
Пришел OnTransReply с пустым brokerref
 
Цитата
Egor Zaytsev написал:
При отправке заявки через QUIK код клиента и примечание добавляется в поле BrokerRef
Поле BrokerRef используется для записи кода клиента и комментария.
Для заявок в торговые системы МБ поле так и заполняется, например указываем код клиента 11 и комментарий Test,
то поле BrokerRef будет содержать оба этих значения 11/Test.

Нужно смотреть конкретный пример вашего скрипта, что заполняете, какой ответ приходит.
Всё, я понял откуда приходит это поле brokerref. Нужно либо вручную через окошко Ввод заявки, заполнить поля «Код клиента» и «Поручение» чем-нибудь. Либо из Lua скрипта заполнить поле CLIENT_CODE чем-нибудь при sendTransaction.

Единственно, непонятно куда девается содержимое поля COMMENT при sendTransaction. Я нигде не вижу в колбеках значения из этого поля.
Установка в C:\Program Files\, Сделайте нормальную установку в стандартное место
 
Цитата
Алексей Дуванов написал:
Перенесли папку QUIK на флешку и носите ее на веревочке на шее. всё работает в любой папке
Портабильная версия никакого отношение не имеет к тому, что мы тут обсуждаем. Никто не запрещает настроить Quik на запуск с флешки и на ней же файлы хранить с настройками.

Цитата
Алексей Дуванов написал:
Чего ещё Вам надо?
Чтобы Quik соответствовал минимальным требованиям безопасности для приложений Windows. Когда вас взломают, поймёте это...
Цитата
Egor Zaytsev написал:
Мы не можем заставить брокера собирать дистрибутив в том или ином виде.
Может дать рекомендации,а будет он их выполнять или нет, мы проследить и настаивать не можем.
Настройка хранения рабочих файлов в папке профиля пользователя %AppData%\Quik не имеет отношения ни к брокеру, ни к установщику.
Это настройка, которая должна быть внутри Quik.exe... также как настройка пути к *.wnd файлам.
Примерно вот так:
Страницы: Пред. 1 2 3 4 5 6 7 След.
Наверх