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

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

Страницы: 1 2 3 4 5 6 7 8 9 10 11 ... 26 След.
Гарантируется ли вызов колбэка при получении Квиком новых данных?, Вопросы разработчикам QUIK
 
Цитата
TGB написал:
для того, чтобы события коллбеков при этом не терялись, в QUIK должна быть внутренняя служебная(ые) очередь. Эта очередь может гарантировать отсутствие потерь событий только при  
Цитата
TGB написал:
v1 <= v2
Не только очередь, а еще ack флаги. Сама очередь ничего не гарантирует.
Причина очень медленной загрузки QUIK
 
Цитата
Йцукен написал:
Можно предположить, что основной поток был чем-то занят, поэтому колбэк OnTrade был вызван с опозданием. И терминал в это время не мог принимать и отправлять данные на сервер, в связи с чем получил информацию по заявке только через две с половиной минуты.
Это даже не надо предполагать, это так и есть. Когда в следующий раз на рынке будет бада-бум, просто отправьте транзакцию прямо из терминала. И посмотрите когда в таблице ордеров появится ордер. Только нажимайте на команду один раз, т.к. очень часто многие совершают ошибку: нажал купить - ничего. Наверно не отправилось, нажму ещё раз. Нажал еще раз кнопку купить - опять ничего. Что же такое? Еще раз - опять ничего.

А потом все эти три ордера прилетают.

Т.о. это нормально для терминала Квик. Но назвать такое поведение корректным для простого пользователя очень сложно. Если бы терминал хотя бы имел таблицу отправленных транзакций, то хотя бы можно было бы посмотреть есть ли транзакция, отправленная на сервер. И значит необходимо просто ждать ответ транзакции.

Так что даже в банальное открытие рынка часто подвисает, т.к. сразу проходит много сделок.
БКС терминал Quik, подключение к серверам БКС
 
 А что простой ping или tracert говорит?
Пожелание по развитию форума QUIK, Идея
 
Цитата
Alexey Ivannikov написал:

Добрый день.

Пользователь попросил, за следующие 8 дней никто здесь не написал что ему не нравится что и как было предложено. Почему сразу было не высказать своё несогласие? В таком случае у нас было бы время учесть и Ваше мнение.
Это как пришел один и попросил поднять налоги всем на 10%, сделал это через форму подачи заявлений, которая хоть всем и доступна, но предполагает, что её все должны читать. Раз никто не возразил, значит все согласны.

Если уж говорить о конкретике, то Вы не обсуждали внешний вид, а сразу сделали. Впрочем, форум давно превратился в некое подобие обращения к разработчикам по ошибкам. Так что будут появляться безумные числа на ветках после длительного отсутствия - особой разницы нет. Просто хотелось понять логику:

Видим цифру 100. И что? Руками отсчитывать эти 100 сообщений? Хотя уже давно, почти во всех площадках, есть переход на последнее прочитанное сообщение - хочешь, читай все пропущенное. Хочешь - пропускай. А то, что есть непрочитанные и так было видно ранее. А вот то, что есть теперь цифра не избавит от необходимости искать где был последний раз.
Пожелание по развитию форума QUIK, Идея
 
Цитата
Alexey Ivannikov написал:

Добрый день.

Пользователь попросил - мы добавили. В чём проблема?
Попросил именно в таком виде? А спросить у остальных, устраивает это или нет? Многие вопросы касательно форума не решаются, а такое "вырви глаз" - сразу...
Причина очень медленной загрузки QUIK
 
Цитата
Йцукен написал:
Цитата
Nikolay написал:
В  итоге сканер сделок по таблице увидел новую сделку от 14:57:01, сканер  состояния ордеров через таблицы увидел изменение состояния ордера на  исполнен в 14:59:31 - две с половиной минуты от сделки.
Это разные скрипты или один?
Один.

Такая задержка не новость. В марте 2020 были и больше, но там было ясно, что сервер брокера не справляется. В 2022 тоже самое. В 2011, 2014, 2016 - любой год можно назвать.
Откуда на фьючерсах расчеты T1?
 
Готовятся

https://www.moex.com/ru/derivatives/unified-trading-session
Причина очень медленной загрузки QUIK
 
Вчера, после выключения электричества на длительное время, один терминал и  скрипт был перезапущен в 14:42:38. При старте найдены запомненные  ордера. Далее брокер начал активно обмениваться сообщениями типа:

OnTransReply  result_msg: Справочник отправлен. status: 3 trans_id: 19 order_num: 0  price: 0 qty: nil account  client_code  firmid nil brokerref

В  итоге сканер сделок по таблице увидел новую сделку от 14:57:01, сканер  состояния ордеров через таблицы увидел изменение состояния ордера на  исполнен в 14:59:31 - две с половиной минуты от сделки.
При этом колбеки OnTrade и OnOrder пришли в 14:59:32, т.е. на секунду позже.

Так что я так и продолжу работать как это делают в системах на "железе", без всяких колбеков.

Этот  брокер всегда отличался особой неспешностью. Запуск терминала в  14:42:38. В 14:43:01 состояние ордера было прочитано как активен. Сделка  в 14:57:01.

В 14:59:30 до сих пор идут транзакции вида : OnTransReply result_msg: Справочник отправлен.

По  факту исполнения ордера была отправлена транзакция, на зеркальный ордер  в 14:59:31. И в итоге за 120 секунд так и не пришел ответ транзакции и  ордер. Т.е. эффект полного отказа сервера брокера. Ответ пришел только в  15:02:41 - три минуты.
Только в 15:02:35 ответы стали приходит за адекватное время - 20 минут после старта.

Можно винить брокера, он резервный и не особо важен, но сам факт такого поведения на 12-ой версии печален.
Пожелание по развитию форума QUIK, Идея
 
Не очень понятно зачем вообще ввели эти странные символы, особенно на красном фоне. Было вполне рабочее решение - выделение жирным. А если уж решили браться за данные изменения, то вместо вывода числа непрочитанных сообщений, лучше бы открывали ветку на месте последнего прочитанного сообщения - это было бы действительно удобно, т.к. не надо искать что последнее прочитал.
Деинсталяция, QUIK не удаляется!
 
Просто удалить каталог. Можно еще почистить реестр, чтобы не светились ярлыки, но все лежит в каталоге.
Свободное перемещение графика
 
Цитата
Йцукен написал:

Дарю идею:
В терминале QUIK добавляете таблицу "Пожелания пользователей", в которой отмечаете присвоенный приоритет и количество проголосовавших.
Каждый пользователь может проголосовать один раз за любое пожелание. Все голоса сохраняются на сервере брокера, который периодически присылает в ARQA файл с голосами. Вы сводите отчёты всех брокеров воедино и рассылаете им обновлённые списки.
А то сейчас я даже не представляю, как вы определяете сколько человек заинтересованы в той или иной доработке.
Если будут вопросы, - обращайтесь
Вы неправильно оцениваете клиентов компании ARQA. Это брокеры и проф. участники. Розничные спекулянты - это клиенты брокеров. Их можно послушать, особенно в части найденных ошибок, но точно не в части курса развития разработки.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
Цитата
VPM написал:
ни кто не по беспокоит, ни какие колбеки не прилетят, пока зависимости в модулях не установлены
Если это беспокоит, то работа с колбеками организован некорректно. Приход колбека должен быть не прерыванием, а добавлением события в очередь. Когда завершите всю работу с инициализацией, то разберете колбеки что пришли, если пришли. А порядок инициализации не испортится, если это сделать не в OnInit. Вы же сами его задаете, вызывая последовательно модули. Хотя и здесь, если вдруг потребуется его изменить, придется переписывать код.

Также, как я уже сказал выше, передача модулей по ссылкам выглядит "коряво".

OrderManager.init({ExecutionLedger = ExecutionLedger, Logger = Logger})

Если бы каждый модуль сам подключал библиотеки через require, то и передавать их не придется. Например, какой-то модуль для своей работы требует библиотеку, которая больше нигде не используется. Почему же модель сам не подключит ее и будет работать с ней. Если он один, то скажете: хорошо, тогда там и подключу его через dofile. А если таких модулей два? В итоге Вы вынуждены подключать их в одном месте и передавать как параметры.

Хотя задача решается элементарно:
Код
------------------------------
my_module1.lua
------------------------------

local  log = require('log')

local  M = {}

M.method1 = function(x)
   log.info(x)
end

return M


------------------------------
my_module2.lua
------------------------------

local  log = require('log')

local  M = {}

M.method2 = function(y)
   log.info(y)
end

return M


------------------------------
main_file.lua
------------------------------

local  m1 = require('my_module1')
local  m2 = require('my_module1')


function main()

m1.method1(5)
m2.method2(10)

end


Где подключать my_module1, my_module2 и в каком порядке - вопрос второй. Но смысл в том, что каждый модуль несет ответственность за свой контекст.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
Здесь не так использование dofile, что и заставляет использовать так. Я не вижу все файлы, то проблема dofile в том, что он каждый раз локализует и исполняет файл. Что кардинально отличается от require. Также dofile работает в глобальном контексте, не позволит подключить один и тот же файл один раз в разных модулях, например, тот же модуль логирования. Вы же из-за такой схемы передаете модули как параметры и будет вынуждены так и гонять контекст туда-обратно. Также если метод  utils.safeParam - это оболочка для getParamEx, то в OnInt не стоит его вызывать, это уже не технологический запрос, а логический к данным.

А сам OnInit в таком виде - не нужен. Я меня также его нет, просто вызываю в начале main свой метод on_init, где выполняю технологические операции при старте скрипта.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
А теперь представьте, что у вас запускаемый скрипт не содержит main. Т.е. тот файл, что выбирает в Квик - это скрbпт без main. Единственное, что этот скрипт делает - это подключает библиотеки и устанавливает параметры, имеет свой искатель библиотек (если нужно).

А как же это работает? Просто - подключая какую-то библиотеку через require, выполняется тело библиотеки. И в какой-то есть main.
Т.о. этот запускаемый файл и выполняет роль инициализатора скрипта. Почему - это не в OnInit. Ответ прост - это намного гибче, т.к. пока дойдем до выполнения main уже выполнится много кода, инициализирующую среду исполнения. Причем в зависимости от скрипта, инициализация разная, может быть сложная, в может простая. Каждая подключаемая библиотека тоже что-то свое подключает.

Т.о. когда доходим до OnInit, то мы уже имеем инициализированную среду и нам остается только вывести в лог пути к подключенным библиотекам, их версии, параметры. Т.е. мы фиксируем в лог что подключено и какие параметры среды. Если всю работу выше загнать в OnInit, то он будет сложным, плохо контролируемым. Т.е. OnInit - это окончание инициализации, где просто выводим в лог состояние. а не начало инициализации.

Также достаточно просто посмотреть на схему выполнения Lua скрипта в документации, где видно, что сначала выполняется body, а потом OnInit скрипта. Т.е. с точки зрения main они равнозначны  - выполняются до main. А вот у же с точки зрения OnInit отсутствие body - это недостаток, т.к. когда проект состоит из десятков файлов со своей инициализацией, то контроль за процессом запуска только в OnInit - это сложно.

И с таким подходом, OnInit - совсем не обязательная сущность.
Цитата
VPM написал:
3.2. Загрузка сохраненного состояния (persisted state). В OnInit удобно:* восстанавливать позиции;* читать журнал;* восстанавливать FSM состояние;* загружать последние известные заявки (last known orders)
Возможно я не понял это, но максимум, что можно сделать до main - это прочитать что-то с диска. Ни о каких восстановлении состояния речи не может быть, т.к. восстановление подразумевает и актуализацию после подключения к серверу. Если это просто чтение, то да. Но и это я тоже не делаю в OnInit, т.к. скрипт может не останавливаться и работать сутками без выключения терминала. Это значит, что OnInit вызвался вчера, а сегодня что? Надо же после восстановления связи с сервером и обновления таблиц тоже актуализировать состояние, проверить что случилось, что есть в данных и т.д. И делать это надо при старте каждого дня пока скрипт работает. А работать он может месяцами.

Поэтому OnInit - это технический колбек, просто сигнализирующий, что код исполненный выше в body скрипта при его запуске, не привел к ошибкам. Ничего более. Делается это один раз при запуске. Поэтому там и могут быть только сугубо технические действия именно при запуске скрипта и ничего более.
свободные средства для срочного рынка на едином счете
 
Цитата
VPM написал:
Nikolay, Да решение классное на этот момент оптимальное!  ::  Я тоже сбежал.
Но у меня там приличный портфель, и "срочка" иногда нужна. НО по фондовому тоже ни чего не работает. Из приложения приходится рулить.
Ну видимо, т.к. я ушел с срочки давно, то и проблема не коснулась. Хотя меня уже объединяли в один терминал по нескольким брокерским счетам, т.к. у меня их не один у Сбера.
Там осталась фонда и ИИС.
свободные средства для срочного рынка на едином счете
 
Цитата
VPM написал:
А если серьезно, возможно у кого еще было подобное? Возможно что то нужно поменять в настройках, рабочего места?
Лучше проще. Я банально перестал совершать сделки на срочной секции у брокера Сбер. С такими комиссиями, спасибо, не надо.
свободные средства для срочного рынка на едином счете
 
Цитата
Kilor написал:
Но в окне запись же по-прежнему есть - неужели ее невозможно достать? И как-то странно, что функция не может ее вернуть.
Ну и если "в портфеле", то это getPortfolioInfoEx? Что в ней смотреть, и какое по смыслу событие аналогично OnFuturesLimitChange?
Выведите все записи таблиц futures_client_holding, futures_client_limits, money_limits, depo_limits, account_positions, account_balance

И банально посмотрите на данные. Иногда это проще и быстрее, чем ждать ответ.
Функция getDepoEx может приводить к зависаниям терминала
 
Цитата
Вы это проверили, запустив скрипт в квике из архива?
На своем.
Функция getDepoEx может приводить к зависаниям терминала
 
Цитата
Йцукен написал:
Изменил скрипт в таком виде
Ну это, конечно, ошибка если зависает. Если мне нужен простой скрипт для расчета и завершится, то я не ввожу main и любые колбеки. Просто тело скрипта.

Запустил Ваш скрипт у себя, изменив данные и дату limit_kind на сегодняшнюю. Нет проблем. И с вашими данными, очевидно не подходящими, тоже нет проблем.  
Функция getDepoEx может приводить к зависаниям терминала
 
Цитата
Йцукен написал:
Вы код смотрели? При чём тут sleep?
При том, что его там нет. Именно это и приводит к "зависанию" терминала.

Опять читаем документацию
Цитата
Вызов функции sleep() внутри цикла потока main() обязателен. Значение аргумента функции sleep() может быть равно 1, но в этом случае задержка приближена к значению прерывания системного таймера (по умолчанию 15.625мс).
Цитата
Йцукен написал:
Ну а мне очевидно, что между OnInit и main может вклиниться какой-нибудь колбэк.
Вот именно. Поэтому определение стартовых данных в событийной модели целесообразно делать до main.
И вклинился, и что? Если под этим подразумевается, что в коде вообще не предусмотрено получение вручную данных из таблицы depo_limits, то, конечно, другого варианта как считывать данные в колбеке нет. Но тогда все равно не ясно зачем это делать в служебном колбеке OnInit. Делайте в специализированном OnDepoLimit. Он, если судить по предоставленной событийной модели в документации, все равно вызовется после OnInit. Дайте провести инициализацию скрипта, пусть запустится main. В нем можно считать данные начала. А потом все обрабатывать по приходу OnDepoLimit. Если OnDepoLimit вызовется раньше чем код дойдет до места в main где вызывается getDepoEx, то это ни на что не повлияет, т.к. getDepoEx уже получит актуальные данные.
Функция getDepoEx может приводить к зависаниям терминала
 
Цитата
Йцукен написал:
Но, несмотря на отсутствие в main цикла скрипт не завершает свою работу самостоятельно и нагружает один поток процессора на 100%.
Это давно известный факт, и я про него написал выше "если убрать sleep, терминал "умрет""

Цитата
Йцукен написал:
Чтобы узнать, есть ли данные в терминале, необходимо выполнить запрос. Сюрприз.
Не совсем. Сначала необходимо узнать есть в таблице записи, запросив размер таблицы. Это все же разные запросы, хоть и тоже метод qlua

Цитата
Йцукен написал:
А если скрипт запускается при установленном соединении?
Если запускается при установленном соединении, то да данные есть. Но обычно, все же, скрипты пишутся для работы во всех режимах, а не в одном.

Цитата
Йцукен написал:
Очевидно, что если определять стартовые позиции в main, то есть риск неверной работы скрипта, если в это время будет вызван колбэк OnDepoLimit.
Не очевидно совсем. Этот колбек вызывается очень часто, и не только при изменении позиции. Более того, в определенные моменты торговой сессии, там могут быть некорректные данные. Т.е. необходимо не просто брать данные, а понимать можно ли их брать в этот момент времени. Также, корректно сделать ручной запрос перед принятием решения, зависящего от данных в таблице depo_limits. Колбек - это хорошо, но я очень много раз видел, как в терминал пришли сделки, а позиция в depo_limits обновляется с существенной задержкой. Или, что тоже часто, есть сделки выхода из позиции, по идее можно установить обратно ордера на открытие позиции, а брокер не дает и пишет что денег нет. Т.е. данные еще не обновились.

Так что можете использовать колбеки, никто не мешает. Но речь же про OnInit, а не все колбеки как таковые.
Функция getDepoEx может приводить к зависаниям терминала
 
Цитата
Йцукен написал:
Так может вообще запретить вызывать qlua-функции в колбэках? Только сюрприз: они все стучатся в основной поток, и main будет ждать завершения функции.
Так любой синхронный код, на то и синхронный, что пока вызов идет, то дальше код не исполняется. Здесь ничего нового. И опять - я не знаю как выполняются qlua методы, вызываемые из main. Но если читать документацию
Цитата
Во время выполнения функции main() Lua скрипт не мешает работе основного
функционала РМ QUIK, таким образом, внутри функции main() использование функции
sleep() не приводит к «подвисанию» РМ QUIK и позволяет периодически
приостанавливать скрипт и возобновлять его работу через некоторый промежуток
времени.
можно предположить, что все же вызов методов qlua из main организован без вызова основного потока. Но и не без проблем, т.к. если убрать sleep, терминал "умрет".
Функция getDepoEx может приводить к зависаниям терминала
 
Цитата
Йцукен написал:
А где вы предлагаете определять стартовые (при запуске скрипта) позиции по бумагам и деньгам при использовании событийной модели?
Можно и в колбеках, если угодно, но не в OnInit точно. Начальное заполнение можно выполнить и при запуске main, в начале тела функции. Это не будет сильно отличаться по времени от OnInit.

Но, по хорошему, прежде чем выполнять какие-то запросы, необходимо дождаться, что данные есть в терминале. Если скрипт стартует вместе с терминалом, а брокер вызывает OnCleanUp, то пока данные не загрузятся, вызывать getDepoEx не имеет смысла. Поэтому - сначала старт скрипта, потом проверка наличия данных, потом запрос данных. Но точно не в OnInit когда вообще даже подключения к серверу может не быть.

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

Когда проверять позицию - это вопрос субъективный. Можно по колбеку OnDepoLimit, но стоит учитывать, что будут постоянные вызовы не связанные с изменением позиции. Можно по новой сделке. А если требуется смотреть не только позицию, то и по изменению в таблице ордеров, например. Все зависит от задачи.
Функция getDepoEx может приводить к зависаниям терминала
 
Цитата
Йцукен написал:
Для меня странно выглядит сам факт зависания.
Во-первых, в руководстве ничего не сказано, что getDepoEx нельзя вызывать внутри OnInit.
Во-вторых, если есть ошибка в функции getDepoEx, приводящая к зависанию, мы не знаем, где она может ещё всплыть.

Здесь вопрос самой концепции. OnInit - это сигнал, что скрипт запускается и прямо сказано, что перед вызовом функции main(). А т.к. это колбек, то и в потоке интерфейса терминала.
Т.е. это некий пограничный момент. Т.к. реализацию работы с потоками мы не знаем, то вполне может происходить некий конфликт - скрипт стартует, формируется доп. поток main. А здесь ему пинок - иди выполни qlua метод. Да, любое зависание основного окна приложения - это ошибка, баг. С этим не поспоришь.
Функция getDepoEx может приводить к зависаниям терминала
 
Возможно это и проблема, но, честно говоря, вызов getDepoEx внутри колбека OnInit выглядит странно.  
Гарантируется ли вызов колбэка при получении Квиком новых данных?, Вопросы разработчикам QUIK
 
onTransReply все же не столь показателен, т.к. таблицы транзакций нет.
Уменьшаю время локальной загрузки QUIK до нуля.- Это просто.
 
Т.е. то что я делаю уже лет 20 на Mac. Приложения не закрываются - зачем, система не выключается - зачем?

А если по теме, то это, конечно, не решение проблемы. Но, судя по всему, мы вошли в стадию постоянных бета тестов. По крайней мере мне сложно понять почему за такой короткий промежуток времени вышло столько мажорных версий.
Уменьшить объем памяти и время старта QUIK-это просто
 
Уж не знаю что изменялось в 12-ой версии, но скрипты стали работать с памятью как это было во времена версии 5.3. Память скрипта скачет на несколько мб и сбрасывается. Это не во всех скриптах, если он небольшой, то такого нет. Но если код большой, то происходят "скачки". После перехода на 5.4 - это ушло, стало стабильно, с небольшими колебаниями в сотни кб. А теперь опять. Приходится ставить достаточно корявый костыль

SearchItems('money_limits', 0, 0, empty_func, "currcode")

И память стоит как влитая, даже на сложных, объемных скриптах.
Гарантируется ли вызов колбэка при получении Квиком новых данных?, Вопросы разработчикам QUIK
 
Пока гарантированность не будет указана в документации, то все это спекуляции. Я, конечно, могу предположить, что если документация банально написана плохо, то многие моменты там не будут указаны.
Но тогда, необходимо хотя бы подтверждение от поддержки.
Причина очень медленной загрузки QUIK
 
Цитата
nikolz написал:
Цитата
Nikolay написал:
Сегодня специально убрал все таблицы текущих торгов, особенно с иностранными акциями. Была, оказывается, открыта в свернутом виде. И терминал прямо ожил. Т.е. ТТТ с большим числом записей дает такую загрузку терминала.
 Nikolay ,
Если у Вас квики от нескольких брокеров, то напишите какой размер у них файла справочника  sec.dat.
1: 99 мб
2: 28 мб
3: 60 мб

1-й самый медленный. Но он всегда был таким, даже когда ничего не было открыто.
В 1-ом и 3-ем есть поток данных по опционам.

Также заметил, что если скрипт стартует вместе с терминалом и при этом скрипт заказывает данные через ParamRequest, то все начинает очень тормозить. Если же скрипт запустить после того как время сервера от пакетов догонит текущее, то намного быстрее. Так что есть подозрение, что в 12-ой версии сломали работу заказа данных из разных потоков, они банально мешают друг-другу. Сейчас добавил принудительное ожидание LASTRECORDTIME прежде чем что-то заказывать. Но как бы сам факт запуска скриптов, т.е. создание отдельных потоков в процессе запуска после OnCleanUp не было причиной.

Так что в очередной раз новая версия заставляет заниматься бесполезной деятельностью.
Не приходит полная версия OnTrade
 
Цитата
Я и спросил были ли сообщения от пользователей об этих случаях, когда данные есть, а колбэка не было?
Я не искал специально на форме, это было еще в 7-ой версии терминала. Т.к. после этих случаев я просто изменил подход, то и нет необходимости отслеживать. В данном случае - решение каждый принимает сам.
Данная дискуссия просто обсуждение подходов с учетом официальной информации доступной в документации.
Причина очень медленной загрузки QUIK
 
Сегодня специально убрал все таблицы текущих торгов, особенно с иностранными акциями. Была, оказывается, открыта в свернутом виде. И терминал прямо ожил. Т.е. ТТТ с большим числом записей дает такую загрузку терминала.
Не приходит полная версия OnTrade
 
Цитата
Йцукен написал:
Чёт я такого не припоминаю, можно ссылку на обсуждение данной проблемы?
Вы в документации видите утверждение о гарантированности доставки, вызова. А если нет, то значит это не ошибка, а особенность. В документации к RabbitMQ гарантируют доставку, а здесь нет.
Не приходит полная версия OnTrade
 
Цитата
Йцукен написал:
Я всё никак не пойму, о потерях каких колбэков речь? Если колбэк не получен, то и в таблицах не будет информации, что вы там собираетесь сверять?
Банально не был вызван, а в таблице данные корректны. В текущих версиях это очень редко, а ранее было не так и редко.
Не приходит полная версия OnTrade
 
Цитата
VPM написал:
Обработку таблиц вызываем когда система само диагностировала несоответствие данных.
И когда она решит это вызвать? Когда цена уже пройдет две планки? Т.е. эту фразу я воспринимаю так: ориентируемся на колбек. Если он не пришел, каким-то образом, скорее всего с некой периодичностью читаем данные и сверяем. Т.е. данные подтверждаются с неким интервалом, возможно даже не таким и маленьким. Да, если считать, что колбек с вероятностью 99.99999 приходит, то можно предложить взять такой риск. Но я уже давно понял, что достаточно одного события с 10 сигма, чтобы потом очень сильно пожалеть. Тем более, что если скрипт не только для себя.
Не приходит полная версия OnTrade
 
Цитата
VPM написал:
Речь о двух независимых потоках, QUIK / колбек и Lua / main.
Ок. Предположим, что скрипт пишется корректно, и в колбеках только быстрое обновление информации, передача полученной информации в поток main.

Цитата
VPM написал:
1. Колбеки прилетят быстрее факт очевидный пусть даже с маловероятным событием пропусками.
Это предположение, а не факт. А также не отвечает на вопрос, что делать с пропусками, если блока чтения данных напрямую не предусмотрено.

Цитата
VPM написал:
2. main мы вынуждены тормозить искусственно чтоб передавать управление ЦП. Вызывая обработку таблиц из цикла маин мы должны учитывать как минимум эту задержку?
Учитывать для чего? Если Вы не выполняете код в колбеке, а, как минимум, транзакции отправлять точно не стоит, то чтобы выполнить какое-то действие вы должны вернуться в mian. А значит эта задержка, какая бы она не была, есть постоянная для алгоритма.

Цитата
VPM написал:
Все это и позволяет мне утверждать что будет более надежно обработано большее количество инструментов за меньшее время.  
Это просто субъективное соображение.



Ок. Пусть есть колбек для таблицы ордеров. Вы его обработали, что-то сделали с информацией. Можно, конечно, даже провести какие-то расчеты в колбеке, но тогда уже стоит учитывать, что данное решение будет плохо масштабироваться, на, скажем, 100 инструментов в одном скрипте. Рекомендация от разработчиков проста - взяли данные в колбеке и передали в main, и уже там с ней работает. И здесь возникает вопрос: если перед принятием решения необходимо иметь актуальную информацию и это мы делаем в main, то что мешает прямо перед принятием решения посмотреть на данные?

Если же колбек используется просто как светофор, то эту модель я как раз могу понять. У нас есть некий метод получения состояния портфеля или другой информации зависящей от сделок, установленных ордеров и т.д. И чтобы постоянно не опрашивать его, можно колбек использовать как сигнал для обновления. Сами данные все равно будет опрошены в main, но уже не постоянно, а по сигналу.

Еще один пример для колбека OnQuote. Я очень часто вижу как внутри этого колбека читают стакан и разбирают данные. И возникает вопрос - а точно понимают что делают?
Пришел колбек, что данные в стакане изменились. Хорошо. Для чего нам эта информация? Если необходимо фиксировать все изменения в потоке времени, а потом их анализировать, то да, другого выхода нет, необходимо читать и разбирать. А если данные стакана потребуются уже только в main, когда дойдем до некого метода где требуется информация о текущем состоянии, то прямо там и надо его прочитать один раз, если был сигнал от колбека. Т.е. сам колбек - это сигнал, что надо данные обновить. Пока дойдём до чтения в main, этот стакан изменится десятки раз. И все изменения кроме последнего - бесполезные.
Не приходит полная версия OnTrade
 
Цитата
VPM написал:
событийная модель может их решить элегантнее, чем простое увеличение таймаутов.
Все никак не могу понять о каких таймаутах речь и как потерянное событие решается без прямого обращения к данным. Если у вас есть датчик, то только его опрос даст данные, сам он их не пришлет - это простая железка.
Не приходит полная версия OnTrade
 
Цитата
VPM написал:
Ваш подход тоже жертвует строгой консистентностью, но у него нет формальных гарантий, что в момент расхождения не будет ошибки. Вы просто надеетесь, что 1 секунд достаточно, чтобы всё "устаканилось"?
О какой секунде речь - не понятно. Если речь про транзакцию, то после её подачи по номеру происходит поиск записи в таблице ордеров сразу, мгновенно. OnTransReply нужен только для того, чтобы прекратить поиск, если есть ошибка. Еще раз в момент принятия решения Вы просто смотрите на данные. Других данных у Вас нет.
Не приходит полная версия OnTrade
 
Цитата
VPM написал:
что событийная модель предполагает надёжность колбэков, а в том, как она обрабатывает неопределённость
И какое же преимущество у колбека (условно декларативного) перед императивным подходом? Что же такого это дает, кроме уменьшения кода, с чем не поспоришь. Также очень странно видеть "событийно-ориентированная архитектура" и "она предназначена именно для того, чтобы жить в мире, где события могут теряться, приходить не в том порядке или с задержкой". Как же жить если реакция на событие не пришла?
Не приходит полная версия OnTrade
 
Цитата
VPM написал:
TGB, Описаный Вами подход не хуже и не лучше — он просто другой. Он проще и для многих задач работает, а может даже и оптимален.

Но если задача стоит построить систему, которая должна быть математически корректной, отказоустойчивой и масштабируемой, без событийной модели и формальных инвариантов не обойтись.
Потому что её поведение можно доказать на реальной торговле на любых объёмах и с любыми стратегиями, а не просто протестировать!

Могу привести еще недостатки Вашего подхода, но прислушаюсь к совету
Вы исходите из того, что колбек в Квике - это гарантированное событие. Но это не так. Одно это уже заставляет просто даже не смотреть в их сторону. Потом скорость и асинхронность - я не очень понимаю этот довод, т.к. это тоже не гарантирует получения консистентных данных. Смотрим в сторону CAP теоремы. Колбек может прийти как до момента, когда Вам надо принять решение, а может после (а в подходе с ручным контролем можете сами опросить данные прямо в необходимый момент).  Если хотите больше гарантий, то, как минимум, необходимо строить систему, учитывающую команды всех скриптов, принимать решение с их учетом, например, учитывать транзакции по которым еще не получены ответы и данные по деньгам уже некорректны. Но даже если скрипт один, в момент принятия решения Вы не знаете о своем портфеле точной информации, банально потому, что данные которые видите - это прошлое. Настоящее оно на сервере биржи и приедет к вам через некую задержку. Поэтому для некоторых систем уменьшение задержек на 1 млс - стоит того, чтобы проложить отдельное оптоволокно сквозь горы.
Не приходит полная версия OnTrade
 
Цитата
TGB написал:
В моих роботах единственный обрабатываемый коллбек это OnTransReply по той причине, что в нем есть информация о возможных причинах отказа в выставлении заявки. При этом я предполагаю, что он может теряться и отслеживаю в таймере выставление заявки по  времени, проверяя таблицу заявок (orders соответственно stop_orders). Если заявка не появилась в соответствующей таблице в течении 120 секунд, то это ошибка в выставлении и есть ветка отработки этой ошибки.
    Все остальное, включая случаи необходимости получения текущих данных таблиц текущих торгов и тд. я беру из таблиц QUIK, кешируя для быстрого доступа индексы используемых таблиц.
    Признаком изменения состояния таблиц (исключая orders, stop_orders) является изменение длины, которую можно получать функцией getNumberOf.  Признаком возможных изменений в существующих записях orders и stop_orders является изменение длины таблицы сделок.
    Вообще, для торговли надо знать состояние своего счета и какую то картину рынка. Все это можно получить из таблиц QUIK и я не вижу смысла возни с коллбеками.
Я использую такой же подход. Тем более что сканировать таблицы необходимо в любом случае при старте скрипта.

Правда такой подход уже сложнее реализовывать, если данные гоняются через socket в алгоритмы, написанные не на lua. Необходимо реализовывать свой колбек на стороне socket сервера, организованного также через сравнение числа записей. А также колбеки по изменению данных в записи таблицы, например, флага состояния или баланса.
Причина очень медленной загрузки QUIK
 
Мои наблюдения тоже по брокеру Сбербанк. После принудительного обновления на последнюю версию, старт терминала стал очень долгим. Но не сам старт, а загрузка данных. Запуск и показ окна - это секунд 15. У меня не так много открыто окон. А вот потом начинается реальный тормоз. Примерно минут 5 уходит на загрузку данных, это видно по времени последнего пакета и времени сервера в строке состояния. Оно скачками изменяется и отстает на минуты 2 пока все не загрузится, и только тогда оно начинает изменяться по секунде. Т.к. скрипты стартуют с терминалом, то в момент долго старта явно видно, что обработка действий с таблицей происходит не то что медленно, а можно увидеть как обновляется информация построчно. Вспоминаю времена Word 2.0 на 386.

Рядом брокер от Альфа, они на версии 12.5 - запуск секунд 5, работа возможна практически сразу, по крайней мере, запускаясь вторым после Сбера, и пока он думает, здесь уже скрипты проверили данные и подали транзакции, ордера установлены. А Сбер так и думает пока.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
Цитата
VPM написал:
А вот это обидно! А Вы уберите sleep   и по рассуждаем чья инженерия кода лучше?
Sleep здесь вообще не важен. Тем более, что если уберете его из main, то Квик банально встанет, что не говорит в его пользу и организацию работы с потоками.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
Цитата
TGB написал:
Из написанного вами о двойной очереди (по сути реализующей одну) я не понял между какими функциональностями робота они могут использоваться и что при этом не обеспечивается в QLua, выложенным мной давно известным вариантом?
Думаю, что для qlua такой проблемы вообще нет. Не те скорости. Это просто был пример для более тяжелых систем, не более.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
Цитата
Йцукен написал:
Nikolay, а для чего вам знать размер очереди? Вы же не извлекаете из середины?
Если организуется FIFO, то берётся первый элемент из очереди до тех пор, пока там что-то есть.
Может и не надо. Ремарка была, т.к. прозвучало, что это потокобезопасно. Не более.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
Мы не знаем как реализовали доп. поток в Квик. Реализовали ли макросы lua_lock вместо заглушек в lua исходниках. Хотя в этой давней теме https://forum.quik.ru/forum10/topic3270/ обсуждалось, что таки реализовали.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
Цитата
Йцукен написал:
Не факт
Да, но потокобезопасность - это гарантия, а не вероятность.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
Цитата
Йцукен написал:
Почему?
Потому что в момент получения размера, другой поток изменит last или first

-- Текущий размер очереди ---
function QueueSize(self)    return self.last - self.first + 1  end
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
Цитата
Йцукен написал:
Добавление элемента в начало очереди в одном потоке не приводит к тому, что при попытке в другом потоке извлечь последний элемент возвращается nil.
Извлечь нет, а вот размер уже можно получить кривой. Плюс надо как-то гарантировать, что в двух потоках не будут разбирать очередь. Можно надеяться, что так не напишут, но это не гарантия, т.к. блокировок нет.
Хотя можно завернуть код в table.ssort

Цитата
Йцукен написал:
А можно ссылку на это обсуждение?
Это было не обсуждение, а просто комментарий, что иногда такой подход используют, когда порядок разбора очереди не столь важен.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
Я только не очень понял, почему представленный пример называется двойная очередь, если это просто очередь как связанный список.
И как она стала потокобезопасной в Lua, где этого нет.

Когда я говорил о двойной очереди, я говорил именно о двух очередях.
Страницы: 1 2 3 4 5 6 7 8 9 10 11 ... 26 След.
Наверх