VPM написал: что событийная модель предполагает надёжность колбэков, а в том, как она обрабатывает неопределённость
И какое же преимущество у колбека (условно декларативного) перед императивным подходом? Что же такого это дает, кроме уменьшения кода, с чем не поспоришь. Также очень странно видеть "событийно-ориентированная архитектура" и "она предназначена именно для того, чтобы жить в мире, где события могут теряться, приходить не в том порядке или с задержкой". Как же жить если реакция на событие не пришла?
Пользователь
Сообщений: Регистрация: 15.06.2023
15.02.2026 15:53:04
Nikolay, CAP-теорема говорит, что в распределённой системе мы можем выбрать только две из трёх характеристик: * Consistency, * Availability, * Partition tolerance.
Биржа — это отдельный узел, с которым у нас нет синхронной связи. Мы выбираем Availability и Partition tolerance, жертвуя строгой консистентностью в реальном времени.
На практике, допускаем, что в любой момент наше локальное состояние может немного расходиться с биржевым. Но мы вводим механизмы, которые гарантируют, что это расхождение всегда будет обнаружено и исправлено за конечное время, и что в процессе расхождения система не совершит опасных действий (например, не превысит лимиты).
Именно это дают, в моем варианте, инварианты S1‑S6 и Watchdog.
Ваш подход тоже жертвует строгой консистентностью, но у него нет формальных гарантий, что в момент расхождения не будет ошибки. Вы просто надеетесь, что 1 секунд достаточно, чтобы всё "устаканилось"?
Пользователь
Сообщений: Регистрация: 27.01.2017
15.02.2026 16:00:15
Цитата
VPM написал: Ваш подход тоже жертвует строгой консистентностью, но у него нет формальных гарантий, что в момент расхождения не будет ошибки. Вы просто надеетесь, что 1 секунд достаточно, чтобы всё "устаканилось"?
О какой секунде речь - не понятно. Если речь про транзакцию, то после её подачи по номеру происходит поиск записи в таблице ордеров сразу, мгновенно. OnTransReply нужен только для того, чтобы прекратить поиск, если есть ошибка. Еще раз в момент принятия решения Вы просто смотрите на данные. Других данных у Вас нет.
Пользователь
Сообщений: Регистрация: 15.06.2023
15.02.2026 16:09:11
Я говорю о том, что архитектура с чёткими инвариантами и детерминированными компонентами позволяет предсказать поведение системы в любых ситуациях, включая сбои, и гарантировать, что она не совершит опасных действий (например, не превысит лимиты, не создаст дублирующий ордер). Это достигается не магией, а строгим проектированием. Именно поэтому в моей архитектуре колбэки не являются единственным источником истины. Они служат лишь для оперативного обновления состояния, но всегда дополняются регулярной сверкой с таблицами (reconciliation). Если колбэк потерян, система обнаружит это при следующем опросе и скорректирует состояние.
Таким образом, событийная модель не требует надёжности колбэков — она лишь использует их для уменьшения задержки!
Пользователь
Сообщений: Регистрация: 12.05.2020
15.02.2026 16:19:51
VPM Понятно, вас с "толку" не сбить . Но интересно, что вы напишите на следующее. Обрабатывая коллбеки и восстанавливая их результат, вы, по сути, повторяете (но в условиях неопределенности) работу которая выполняется в QUIK при формировании его таблиц. 1. Зачем повторять функциональность которую реализовали разработчики и которая отлажена, скорее всего лучше чем "призрачные" коллбеки (зависящие от кода main), так как это было давно (до появления QLua) и проще контролируется? 2. Полагаете, что вы квалифицированнее разработчиков? 3. Вы же вроде согласны с принципом "меньше дергаешься - реже падаешь". Вам нечем заняться и хочется поразвлечься с коллбеками?
Пользователь
Сообщений: Регистрация: 12.05.2020
15.02.2026 16:24:52
VPM Забыл добавить: где доказательство безопасности счета?
Пользователь
Сообщений: Регистрация: 15.06.2023
15.02.2026 16:25:08
TGB, Я не пытаюсь навязать событийную модель как единственно верную. Я лишь показываю, что она даёт определённые преимущества в плане гарантий и детерминизма, которые могут быть критичны для сложных систем.
Ваш подход проще и для многих задач достаточен. Выбор зависит от требований к надёжности и готовности платить за сложность.
Если есть конкретные проблемы (например, потеря OnTrade), событийная модель может их решить элегантнее, чем простое увеличение таймаутов. Но если текущая система вас устраивает — нет смысла её усложнять.
Пользователь
Сообщений: Регистрация: 15.06.2023
15.02.2026 16:28:09
Цитата
TGB написал: VPM Забыл добавить: где доказательство безопасности счета?
А этого Вам не достаточно, или какие то слова не понятны?
Цитата
VPM написал: архитектура с чёткими инвариантами и детерминированными компонентами позволяет предсказать поведение системы в любых ситуациях, включая сбои, и гарантировать, что она не совершит опасных действий (например, не превысит лимиты, не создаст дублирующий ордер).
Пользователь
Сообщений: Регистрация: 27.01.2017
15.02.2026 16:34:23
Цитата
VPM написал: событийная модель может их решить элегантнее, чем простое увеличение таймаутов.
Все никак не могу понять о каких таймаутах речь и как потерянное событие решается без прямого обращения к данным. Если у вас есть датчик, то только его опрос даст данные, сам он их не пришлет - это простая железка.
Пользователь
Сообщений: Регистрация: 12.05.2020
15.02.2026 16:41:17
У вас много текста но нет простых вещей:
Цитата
TGB написал: где доказательство безопасности счета?
Пользователь
Сообщений: Регистрация: 12.05.2020
15.02.2026 16:43:45
Цитата
VPM написал: архитектура с чёткими инвариантами и детерминированными компонентами позволяет предсказать поведение системы в любых ситуациях, включая сбои, и гарантировать, что она не совершит опасных действий (например, не превысит лимиты, не создаст дублирующий ордер).
Это заклинания . Вы думаете, что они работают?
Пользователь
Сообщений: Регистрация: 02.01.2026
15.02.2026 20:07:53
Цитата
TGB написал: Вы проверяли задержку между коллбэком с заполненными параметрами и появлением записи в таблице? Если нет, то проверьте.
Зачем?
Пользователь
Сообщений: Регистрация: 15.06.2023
16.02.2026 09:10:26
Цитата
TGB написал: Но интересно, что вы напишите на следующее. Обрабатывая коллбеки и восстанавливая их результат, вы, по сути, повторяете (но в условиях неопределенности) работу которая выполняется в QUIK при формировании его таблиц. 1. Зачем повторять функциональность которую реализовали разработчики и которая отлажена, скорее всего лучше чем "призрачные" коллбеки (зависящие от кода main), так как это было давно (до появления QLua) и проще контролируется? 2. Полагаете, что вы квалифицированнее разработчиков? 3. Вы же вроде согласны с принципом "меньше дергаешься - реже падаешь". Вам нечем заняться и хочется поразвлечься с коллбеками?
А что тут комментировать, ЧУШЬ полная! Да и обсуждение совершенно о другом.
написал: событийная модель может их решить элегантнее, чем простое увеличение таймаутов.
Все никак не могу понять о каких таймаутах речь и как потерянное событие решается без прямого обращения к данным. Если у вас есть датчик, то только его опрос даст данные, сам он их не пришлет - это простая железка.
Речь о двух независимых потоках, QUIK / колбек и Lua / main. 1. Колбеки прилетят быстрее факт очевидный пусть даже с маловероятным событием пропусками. 2. main мы вынуждены тормозить искусственно чтоб передавать управление ЦП. Вызывая обработку таблиц из цикла маин мы должны учитывать как минимум эту задержку? 3. Сама система может находиться в 6 состояниях (модель куб состояний, где 8 вершин - фазовые переходы, 6 граней те самые инварианты), система замкнута следовательно может находится только в этих 6 состояниях. Кода находит расхождения в данных, она восстанавливает данные путем уже опроса таблиц. Так как событие редкое то и опросы редки. Все это и позволяет мне утверждать что будет более надежно обработано большее количество инструментов за меньшее время. Есть еще конечно и сама инженерия кода, но ведь обязательно кто то создаст надежный.
Пользователь
Сообщений: Регистрация: 12.05.2020
16.02.2026 09:52:26
Цитата
VPM написал: А что тут комментировать, ЧУШЬ полная!
Это ваше добровольное признание :
Цитата
VPM написал: Не ну ладно, я "несу всякую ахинею", разбирая свои идеи по винтикам и полочкам на примерах.
На всякий случай ссылка:
Пользователь
Сообщений: Регистрация: 15.06.2023
16.02.2026 10:17:11
TGB, За ссылку спасибо, но там столько не понятных для меня слов, что не хватает моей компетенции разобраться. За то хватает их чтоб прокомментировать Ваше сообщение выше. Глобально свое мнение не поменял.
Цитата
VPM написал: 1. Зачем повторять функциональность которую реализовали разработчики и которая отлажена, скорее всего лучше чем "призрачные" коллбеки (зависящие от кода main)
Прокомментируйте почему вдруг "призрачные" коллбеки (зависящие от кода main)? Как все реализовано разработчиками посвящен целиком этот сайт, а у меня даже мысли бы не было лезть туда куда ни надо.
Пользователь
Сообщений: Регистрация: 12.05.2020
16.02.2026 10:29:46
Цитата
VPM написал: За ссылку спасибо, но там столько не понятных для меня слов, что не хватает моей компетенции разобраться.
Если вы не понимаете то, что написано вами, то бесполезно вам что то объяснять. Все равно не поймете.
Пользователь
Сообщений: Регистрация: 15.06.2023
16.02.2026 10:41:19
TGB, Не я не понимаю иногда то что Вы пытаетесь донести как истину в последней инстанции. А я бывает и ошибаюсь, читаю тех. литературу и пересматриваю подходы. Но так как Вы тему отказываетесь комментировать то смысла нет перепираться. Либо приводите убедительные доводы.
Пользователь
Сообщений: Регистрация: 27.01.2017
16.02.2026 10:51:11
Цитата
VPM написал: Речь о двух независимых потоках, QUIK / колбек и Lua / main.
Ок. Предположим, что скрипт пишется корректно, и в колбеках только быстрое обновление информации, передача полученной информации в поток main.
Цитата
VPM написал: 1. Колбеки прилетят быстрее факт очевидный пусть даже с маловероятным событием пропусками.
Это предположение, а не факт. А также не отвечает на вопрос, что делать с пропусками, если блока чтения данных напрямую не предусмотрено.
Цитата
VPM написал: 2. main мы вынуждены тормозить искусственно чтоб передавать управление ЦП. Вызывая обработку таблиц из цикла маин мы должны учитывать как минимум эту задержку?
Учитывать для чего? Если Вы не выполняете код в колбеке, а, как минимум, транзакции отправлять точно не стоит, то чтобы выполнить какое-то действие вы должны вернуться в mian. А значит эта задержка, какая бы она не была, есть постоянная для алгоритма.
Цитата
VPM написал: Все это и позволяет мне утверждать что будет более надежно обработано большее количество инструментов за меньшее время.
Это просто субъективное соображение.
Ок. Пусть есть колбек для таблицы ордеров. Вы его обработали, что-то сделали с информацией. Можно, конечно, даже провести какие-то расчеты в колбеке, но тогда уже стоит учитывать, что данное решение будет плохо масштабироваться, на, скажем, 100 инструментов в одном скрипте. Рекомендация от разработчиков проста - взяли данные в колбеке и передали в main, и уже там с ней работает. И здесь возникает вопрос: если перед принятием решения необходимо иметь актуальную информацию и это мы делаем в main, то что мешает прямо перед принятием решения посмотреть на данные?
Если же колбек используется просто как светофор, то эту модель я как раз могу понять. У нас есть некий метод получения состояния портфеля или другой информации зависящей от сделок, установленных ордеров и т.д. И чтобы постоянно не опрашивать его, можно колбек использовать как сигнал для обновления. Сами данные все равно будет опрошены в main, но уже не постоянно, а по сигналу.
Еще один пример для колбека OnQuote. Я очень часто вижу как внутри этого колбека читают стакан и разбирают данные. И возникает вопрос - а точно понимают что делают? Пришел колбек, что данные в стакане изменились. Хорошо. Для чего нам эта информация? Если необходимо фиксировать все изменения в потоке времени, а потом их анализировать, то да, другого выхода нет, необходимо читать и разбирать. А если данные стакана потребуются уже только в main, когда дойдем до некого метода где требуется информация о текущем состоянии, то прямо там и надо его прочитать один раз, если был сигнал от колбека. Т.е. сам колбек - это сигнал, что надо данные обновить. Пока дойдём до чтения в main, этот стакан изменится десятки раз. И все изменения кроме последнего - бесполезные.
Пользователь
Сообщений: Регистрация: 30.01.2015
16.02.2026 11:15:11
Добавлю свои пять копеек в вашу вумную беседу... --------------------- Разные события обрабатываю по-разному. ------------------------ Обработка в main связана с очередью событий, если не хочется пропускать события. А стояние в очереди - это тоже время. ---------- Для оптимизации и минимизации: ----------------- OnTransReply Очень простой алгоритм, если нет ошибки. обработка ошибки сложнее, но она бывает редко. Поэтому его обработку делаю внутри функции колбека. Время обработки равно времени передачи в очередь. ----------------------- Применяю оптимизацию очереди. Суть в том, что если пришло событие по конкретному инструменту, которое уже есть в очереди, то событие в очереди уже устарело и его обрабатывать не следует.
Пользователь
Сообщений: Регистрация: 30.01.2015
16.02.2026 11:21:14
Лазить в таблицы вместо колбеков имеет смысл ,например, для получения текущих значений счета или размера позиции. Но даже и в этом случае колбек может быть полезен.
Пользователь
Сообщений: Регистрация: 30.01.2015
16.02.2026 11:23:20
Читать стакан в колбеке - это мазохизм какой-то.
Пользователь
Сообщений: Регистрация: 30.01.2015
16.02.2026 11:31:46
Вообще-то, так как роботы есть разные, то целесообразность использования событий(колбеков) тоже разная. ---------------------- Поэтому сделал обработку для всех событий, а применяю в конкретном роботе то, что имеет смысл "здесь и сейчас". -------------------- Сейчас у меня все очень оптимально. Все события обрабатывает один скрипт Он же выставляет и снимает заявки. Остальные скрипты и приложения занимаются прогнозированием момента изменения позиции по конкретному инструменту Скрипт(приложение) на инструмент или класс.
Пользователь
Сообщений: Регистрация: 15.06.2023
16.02.2026 11:35:47
Nikolay, Рассуждения мои сводятся только к 3 коллбекам исполнения, дальше просто не заглядывал. Модель светофор не рассматривал, хотя показалась интересно нужно "покумекать". Вы правы соображения субъективны, все выкладки чисто теоретические, так как систему только собрал еще даже не запускал. В соседней ветке описал от куда ноги растут. Задача стояла быть уверенным что на какой то момент времени можно утверждать что все данные пришли. алгоритм "Рекомендация от разработчиков проста - взяли данные в колбеке и передали в main, и уже там с ней работает". То есть колбеки уже напихали нам отфильтрованную информации, работаем только с ней. Ну тут даже интуитивно видно что подход более оптимален, нежели описанный в примере от TGB. Обработку таблиц вызываем когда система само диагностировала несоответствие данных. 6 инвариантов или можно сказать 6 фазовых состояний замкнутый цикл. Все. Да же если допустить, что событие несоответствия данных частое, то система перейдет в состояние опроса таблиц.
Здесь хочу добавить что рассуждения строил от приказа стоп - лосса, но так как он в QUIK такой же лимитный, то все просто расширяю на исполнение всех лимитных ордеров?
Пользователь
Сообщений: Регистрация: 27.01.2017
16.02.2026 11:48:49
Цитата
VPM написал: Обработку таблиц вызываем когда система само диагностировала несоответствие данных.
И когда она решит это вызвать? Когда цена уже пройдет две планки? Т.е. эту фразу я воспринимаю так: ориентируемся на колбек. Если он не пришел, каким-то образом, скорее всего с некой периодичностью читаем данные и сверяем. Т.е. данные подтверждаются с неким интервалом, возможно даже не таким и маленьким. Да, если считать, что колбек с вероятностью 99.99999 приходит, то можно предложить взять такой риск. Но я уже давно понял, что достаточно одного события с 10 сигма, чтобы потом очень сильно пожалеть. Тем более, что если скрипт не только для себя.
Пользователь
Сообщений: Регистрация: 02.01.2026
16.02.2026 12:10:26
Цитата
VPM написал: Если колбэк потерян, система обнаружит это при следующем опросе и скорректирует состояние.
Цитата
Nikolay написал: ориентируемся на колбек. Если он не пришел, каким-то образом, скорее всего с некой периодичностью читаем данные и сверяем.
Я всё никак не пойму, о потерях каких колбэков речь? Если колбэк не получен, то и в таблицах не будет информации, что вы там собираетесь сверять?
Пользователь
Сообщений: Регистрация: 15.06.2023
16.02.2026 12:10:48
В моей текущей реализации системы, это модуль Watchdog, задача которого обеспечить непрерывный контроль в реальном времени. Он утверждает: "Прямо сейчас состояние допустимо". И пусть цена идет куда угодно, пока состояние ни восстановлено, так как принимать решение все равно нельзя. Собственно это и есть механизм защиты от 10 сигма.
Пользователь
Сообщений: Регистрация: 27.01.2017
16.02.2026 12:15:17
Цитата
Йцукен написал: Я всё никак не пойму, о потерях каких колбэков речь? Если колбэк не получен, то и в таблицах не будет информации, что вы там собираетесь сверять?
Банально не был вызван, а в таблице данные корректны. В текущих версиях это очень редко, а ранее было не так и редко.
Пользователь
Сообщений: Регистрация: 02.01.2026
16.02.2026 12:26:26
Цитата
Nikolay написал: Банально не был вызван, а в таблице данные корректны. В текущих версиях это очень редко, а ранее было не так и редко.
Чёт я такого не припоминаю, можно ссылку на обсуждение данной проблемы?
Пользователь
Сообщений: Регистрация: 27.01.2017
16.02.2026 12:41:32
Цитата
Йцукен написал: Чёт я такого не припоминаю, можно ссылку на обсуждение данной проблемы?
Вы в документации видите утверждение о гарантированности доставки, вызова. А если нет, то значит это не ошибка, а особенность. В документации к RabbitMQ гарантируют доставку, а здесь нет.
Пользователь
Сообщений: Регистрация: 02.01.2026
16.02.2026 13:11:00
Цитата
Nikolay написал: Вы в документации видите утверждение о гарантированности доставки, вызова. А если нет, то значит это не ошибка, а особенность. В документации к RabbitMQ гарантируют доставку, а здесь нет.
Я не об этом спросил. Вы утверждаете
Цитата
Nikolay написал: Банально не был вызван, а в таблице данные корректны. В текущих версиях это очень редко, а ранее было не так и редко.
Я и спросил были ли сообщения от пользователей об этих случаях, когда данные есть, а колбэка не было?
Пользователь
Сообщений: Регистрация: 27.01.2017
16.02.2026 13:18:32
Цитата
Я и спросил были ли сообщения от пользователей об этих случаях, когда данные есть, а колбэка не было?
Я не искал специально на форме, это было еще в 7-ой версии терминала. Т.к. после этих случаев я просто изменил подход, то и нет необходимости отслеживать. В данном случае - решение каждый принимает сам. Данная дискуссия просто обсуждение подходов с учетом официальной информации доступной в документации.