Плохая затея. Вызов методов только в момент получения данных. Нет вызова - ничего сделать не можем. А как проверить, что все корректно после отправки транзакции вообще загадка, т.к. будет вызов OnCalculate или нет - неизвестно. Т.е. мы закладываем что все всегда хорошо, быстро и исполняется. Но это, как показывает практика, почти всегда не так.
Получить строки таблицы Текущие торги.
Пользователь
Сообщений: Регистрация: 27.01.2017
28.07.2022 09:18:06
Чем не устраивает файл с списком кодов инструментов и списком параметров для считывания. Читаете файл при старте, а дальше читаете данные по ним. И не надо заполнять ненужные мелькающие таблицы в терминале.
Подписка на стакан OnQuote в quik 9.7.1
Пользователь
Сообщений: Регистрация: 27.01.2017
28.07.2022 09:16:07
OnQuote - это и есть доступный колбек. Объявленная глобально такая функция будет вызываться на каждый чих в стакане. Т.к. таких изменение очень, очень много, и на каждое изменение вызывается getQuoteLevel2, то память и забивается, т.к. getQuoteLevel2 возвращает две таблицы, две строки. А это не так и мало. И делается это так часто, что сборщик мусора просто не успевает.
Если Вам не нужны данные стакана в каждом срезе без пропусков, то в колбеке надо просто установить флаг, что есть новый стакан по инструменту, а в потоке main его прочитать.
Luasocket сервер - останавливает выполнение кода, Возможен ли асинхронный запуск нескольких функций в Quik lua ?
Пользователь
Сообщений: Регистрация: 27.01.2017
25.07.2022 13:21:36
Чистый Lua синхронный, максимум что есть - это корутины. Можно попробовать использовать внешние библиотеки, обеспечивающие асинхронность.
Можете попробовать корутины, вот классчический пример для HTTP, который сразу находится по запросу "": Хотя, наверно, уже пробовали.
Код
function download (host, file, port)
port = port or 80
print (host, file, port)
local connectStatus, myConnection = pcall (socket.connect,host,port)
if (connectStatus) then
myConnection:settimeout(0.01) -- do not block you can play with this value
local count = 0 -- counts number of bytes read
-- May be easier to do this LuaSocket's HTTP functions
myConnection:send("GET " .. file .. " HTTP/1.0\r\n\r\n")
local lastStatus = nil
while true do
local buffer, status, overflow = receive(myConnection, lastStatus)
-- If buffer is not null the call was a success (changed in LuaSocket 2.0)
if (buffer ~= nil) then
io.write("+")
io.flush()
count = count + string.len(buffer)
else
print ("\n\"" .. status .. "\" with " .. string.len(overflow) .. " bytes of " .. file)
io.flush()
count = count + string.len(overflow)
end
if status == "closed" then break end
lastStatus=status
end
myConnection:close()
print(file, count)
else
print("Connection failed with error : " .. myConnection)
io.flush()
end
end
threads = {} -- list of all live threads
function get (host, file, port)
-- create coroutine
local co = coroutine.create(
function ()
download(host, file, port)
end)
-- insert it in the
table.insert(threads, co)
end
function receive (myConnection, status)
if status == "timeout" then
print (myConnection, "Yielding to dispatcher")
io.flush()
coroutine.yield(myConnection)
end
return myConnection:receive(1024)
end
function dispatcher ()
while true do
local n = table.getn(threads)
if n == 0 then break end -- no more threads to run
local connections = {}
for i=1,n do
print (threads[i], "Resuming")
io.flush()
local status, res = coroutine.resume(threads[i])
if not res then -- thread finished its task?
table.remove(threads, i)
break
else -- timeout
table.insert(connections, res)
end
end
if table.getn(connections) == n then
socket.select(connections)
end
end
end
host = "www.w3.org"
get(host, "/TR/html401/html40.txt")
get(host,"/TR/2002/REC-xhtml1-20020801/xhtml1.pdf")
get(host,"/TR/REC-html32.html")
get(host,"/TR/2000/REC-DOM-Level-2-Core-20001113/DOM2-Core.txt")
dispatcher()
Стопы
Пользователь
Сообщений: Регистрация: 27.01.2017
24.07.2022 16:58:57
Подниму. Сам часто забываю зажимать Ctrl. Кажется, что лучше добавить тип установки цены исполнения: абсолютный и относительный. При выборе относительного задается отступ в указанной величине (шаги, пункты, проценты). Тогда при сдвиге отступ будет рассчитываться при активации.
Сейчас же, забудешь зажать и цена легко уйдет за границы допустимого ценового коридора или выйдет за проскальзывание и стоп ордер становится, по сути, бессмысленным. А пользователь, если не обратит внимание, узнает об этом когда увидит странное - он исполнен, а лимитный ордер висит или отвергнут.
Так что да, умолчание должно быть другим.
getBuySellInfo (……….).balance, QUIK LUA
Пользователь
Сообщений: Регистрация: 27.01.2017
20.07.2022 11:56:07
Что мешает при подаче транзакции применить math.abs
Как получить 2 целых числа отдельно до и после точки
Пользователь
Сообщений: Регистрация: 27.01.2017
18.07.2022 19:14:57
Не заметил, что целое. Если известен scale, то умножить на 10 в степени.
Или можно воспользоваться магией динамической
tonumber(tostring(3.12459):match("%.(%d+)")) or 0
Как получить 2 целых числа отдельно до и после точки
Пользователь
Сообщений: Регистрация: 27.01.2017
18.07.2022 16:28:00
на самом деле math.modf
Пустое значение trans_id в таблице сделок.
Пользователь
Сообщений: Регистрация: 27.01.2017
17.07.2022 15:29:59
Цитата
Во-первых, по новым правилам (QUIK 9.7.1.10) на одну сделку приходится не три, а четыре колбека OnTrade.
Это сильно. Жаль что не пять.
Но, кажется, формулировка разработчиков была - есть изменения во внутренних полях, недоступных для чтения, все равно получите callback.
lua-mysql не компилируется под x64
Пользователь
Сообщений: Регистрация: 27.01.2017
11.07.2022 15:41:25
Если Вы не указали rocks какой интерпретатор использовать при установке, то по умолчанию он использует то что найдет. Если не прописаны пути к lua, то возьмет встроенный. Он, кажется 32 бита.
В справке по установке rocks это прописано
Пустое значение trans_id в таблице сделок.
Пользователь
Сообщений: Регистрация: 27.01.2017
05.07.2022 12:37:07
Если сам скрипт и отправляет транзакции, то Вы можете дополнить транзакцию комментарием, который будет записан в поле brokerref. Соответственно сделки с контролируемым комментарием - это сделки, требующие учета. Далее уже в этих сделках ждете появления trans_id и разбираете по идентификатору транзакции (если это вообще необходимо).
Т.к. записи в таблице формируются не за один раз, т.о. первичное появление записи о сделке, возможно, было просто как фиксация факта. Потом уже было дополнено идентификатором транзакции. Если обратите внимание на колбек OnTrade, то он приходит три раза на сделку. Каждый раз - это какое-то изменение в записи таблицы.
Беспрерывная робота робота, Как сделать так, чтобы робот был постоянно в работе и обрабатывал каждый тик?
Пользователь
Сообщений: Регистрация: 27.01.2017
25.06.2022 12:07:41
Владимир, Вы правы только в том, что обрабатывать тиковые данные через proxy терминал Квик - это не лучшая затея. Хотя обрабатывать обезличенные сделки, т.е. каждый тик, вполне можно. Все зависит от задачи и скорости принятия решений. Для примера, задача: определить был ли реализован видимый объем в стакане сделками или снят - решается довольно просто, с достаточной точностью.
В остальном же, как обычно - не надо мне, не надо никому. Но мир не вращается вокруг Вас.
неужели OnParam самый быстрый?
Пользователь
Сообщений: Регистрация: 27.01.2017
24.06.2022 09:38:02
Цитата
Старатель написал: , видимо, у вас не проверяется класс инструмента. Это сделка из класса неполных лотов:
Да, в этом месте было без проверки. Спасибо.
неужели OnParam самый быстрый?
Пользователь
Сообщений: Регистрация: 27.01.2017
23.06.2022 15:09:42
Опять поднимаю тему.
Сегодня брокер Сбербанк вернул по инструменту GAZP в параметрах LAST = 287.79 TIME = 122304
Такой цены не было 19 сессий.
Возвращаюсь опять к вопросу: как контролировать корректность|актуальность значений, получаемых через getParamEx?
Чтение данных метки, Зависание терминала
Пользователь
Сообщений: Регистрация: 27.01.2017
11.06.2022 16:10:50
Версия 9.5
Скрипт простой: ставим метку и потом читаем данные. После установки метки берем и перетаскиваем ее на графике, желательно быстро. Терминал зависает. На таком простом скрипте это происходит не сразу, поэтому можно просто двигать метку до выявления эффекта. Частично помогает избежать проблемы увеличение sleep до 500.
На версиях 8.* - сколько не двигал не получается эффект зависания, даже на sleep 55.
На самом деле - серьезная проблема, т.к. считывание данных с меток - это единственный способ взаимодействия пользователя с скриптом через график.
Ссылка на запись эффекта:
Тестовый скрипт:
Код
local sleep = _G.sleep
local isRun = true
local AddLabel = _G.AddLabel
local GetLabelParams = _G.GetLabelParams
function _G.OnStop()
isRun = false
end
function _G.main()
local tag = 'virt_test'
local label_params = {}
label_params.YVALUE = 119.5
label_params.TEXT = 'TEST |||||||||||||||||||||||||||||||||||||||||||||'
label_params.HINT = 'Еще текст'
label_params.DATE = 20220611
label_params.TIME = 152000
label_params.FONT_FACE_NAME = 'Arial'
label_params.ALIGNMENT = 'RIGHT'
label_params.FONT_HEIGHT = 10
label_params.TRANSPARENT_BACKGROUND = 1
local l_id = AddLabel(tag, label_params)
sleep(1000)
while isRun do
label_params = GetLabelParams(tag, l_id)
if label_params then
_G.message(tostring(label_params.yvalue))
end
sleep(100)
end
end
Динамическое количество линий индикатора
Пользователь
Сообщений: Регистрация: 27.01.2017
09.06.2022 15:02:03
Это значит что при попытке вывода линий они выводятся не на своих местах. Для примера, в Settings.line три линии. В Init добавили еще две линии - их стало пять. Вернули из функции Init 5. При отрисовке линий 4, 5 они выводятся поверх линий 1-3.
Ошибка: attempt to call a nil value (global 'foo'), непонятная ошибка в вызове пользовательской функции
Пользователь
Сообщений: Регистрация: 27.01.2017
09.06.2022 14:57:46
В момент вызова foo она еще не определена. Код в теле скрипта выполняется построчно вниз, определяя контекст.
Транзакции на снятие Лимит. заявки
Пользователь
Сообщений: Регистрация: 27.01.2017
07.06.2022 16:45:00
Код, снимающий заявки у Вас написан, какой бы он ни был.
А далее есть вопросы организации последовательности вызовов методов. Необходимо учитывать, что скрипт работает на клиенте, а ответы приходят с сервера. Т.е. время ответа неизвестно. Далее, если используете колбеки, то необходимо учитывать, что последовательность их прихода не гарантирована. Также, раз у нас клиент-сервер, то изменение состояния ордера после отправки транзакции на снятие, не придет мгновенно. Т.е. если транзакция на снятие ушла без ошибок, то пока не придет ответ или не прочитаете новое состояние ордера, отправлять новую транзакцию нельзя. Иначе возникнет ситуация когда отправили транзакцию на снятие, не дождались ответа и отправили новую.
Поэтому просто кусок кода ничего не даст.
Обмен сообщениями приложений , скриптов на Lua, Python ,С
Пользователь
Сообщений: Регистрация: 27.01.2017
31.05.2022 09:38:02
Вопрос только один: как обеспечивается гарантированность доставки?
Как вручную активировать стоп-заявку через qlua?
Пользователь
Сообщений: Регистрация: 27.01.2017
28.05.2022 09:39:57
Цитата
написал: Возможность принудительной активации стоп-заявки из луа, конечно же есть.
Поле транзакции и типом заявки выглядит так:
action="АКТИВИРОВАТЬ СТОП-ЗАЯВКУ"
Да, каждый раз забываю об это слабо-документированной возможности выгрузки кармана транзакций, с целью посмотреть формат транзакции.
Подскажите как передать информацию из QUIK в скрипт PYTHON через память компа?
Пользователь
Сообщений: Регистрация: 27.01.2017
27.05.2022 09:57:19
Вот, вспомнил про это решение. Не пробовал сам, но в основе там socket
Как вручную активировать стоп-заявку через qlua?
Пользователь
Сообщений: Регистрация: 27.01.2017
27.05.2022 09:15:53
Такой возможности нет. Но Вы всегда можете снять стоп ордер, дождаться статуса снятия и просто закрыть по рынку. Это будет аналогичное действие.
Как получить цену приобритеня акции?
Пользователь
Сообщений: Регистрация: 27.01.2017
26.05.2022 13:52:26
Цитата
Владимир написал: , Не совсем так: торгую как раз ТОЛЬКО я - это я "купил 5 штук по цене X, потом еще 3 по цене Y, потом продал 2 по цене Z". Я их купил, это моя собственность, и только я могу знать, какие именно из них я продаю (хочу ли я это знать - это другой вопрос). Но ни брокер, ни кто-либо ещё этого знать в принципе не могут, и потому вынуждены считать по FIFO.
Так поэтому в Квике так и транслируется. Не нравится - считай сам.
Как получить цену приобритеня акции?
Пользователь
Сообщений: Регистрация: 27.01.2017
26.05.2022 10:12:59
Возникает встречный вопрос - Вы пробовали посмотреть что хранится в указанных таблицах?
Что же касается стоимости, то вот купили Вы 5 штук по цене X, потом еще 3 по цене Y, потом продали 2 по цене Z. Какая стоимость приобретения? Т.к. торгуете не только Вы, то приняты соглашения о методике расчета.
Как получить цену приобритеня акции?
Пользователь
Сообщений: Регистрация: 27.01.2017
26.05.2022 09:58:09
В таблицах и хранится уже рассчитанное значение.
Как получить цену приобритеня акции?
Пользователь
Сообщений: Регистрация: 27.01.2017
26.05.2022 09:29:30
Вы может узнать цену, рассчитанную брокером методом ФИФО. Будут ли она близка к той, что Вы хотите получить - это вопрос.
Но получить можете, сделав запрос к таблицам
futures_client_holding для FORTS depo_limits для фондовой секции.
Можно получить прямым доступом к таблице, найдя нужную строку или воспользовавшись вспомогательными функциями getDepo getFuturesLimit
Подскажите как передать информацию из QUIK в скрипт PYTHON через память компа?
Пользователь
Сообщений: Регистрация: 27.01.2017
22.05.2022 16:51:14
Цитата
Alex написал: Пытался запустить Ваш скрипт, выдает. ошибку. attempt to index a nil value (local 'pipe')
Правильно. Lua умеет писать (читать) в существующий "именованый файл". Поэтому на другой стороне его надо создать. Т.е. нужен сервер (служба), обслуживающий каналы. Вот его и надо на стороне питона делать
Подскажите как передать информацию из QUIK в скрипт PYTHON через память компа?
Пользователь
Сообщений: Регистрация: 27.01.2017
22.05.2022 15:30:23
named pipes Lua поддерживает "прямо из коробки"
Код
local pipe = io.open("\\\\.\\PIPE\\"..pipe_name, "w+b")
if not pipe then
return
end
pipe:write('BlaBla') -- записываем команду в канал
--Читаем
local rd = ''
local ct = os.time()
-- Для примера: Т.к. время ожидания ответа может быть не мгновенным, то ожидаем 2 секунды, читая из канала ответ.
while os.time() - ct < 2 and rd == '' do
rd = pipe:read('*a')
end
tele_pipe:close() -- закрываем канал
А python - это же такая "помойка". Неужели нет готовой библиотеки сервера named pipes? Поиск выдает тонны вариантов.
Подскажите как передать информацию из QUIK в скрипт PYTHON через память компа?
Пользователь
Сообщений: Регистрация: 27.01.2017
22.05.2022 15:06:54
named pipes, socket
Отладка кода, Программа для отладки кода на языке lua для квик версии 9+
Пользователь
Сообщений: Регистрация: 27.01.2017
19.05.2022 18:44:53
методика print debug вам в помощь.
Для тестирования кода, лучше его тестировать, а не отлаживать.
Последовательность функций обратного вызова
Пользователь
Сообщений: Регистрация: 27.01.2017
18.05.2022 20:26:00
Цитата
срабатывания условий тэйка сервером выставляется новая заявка с новым номером order_num который нужно как-то отфильтровать и получить
При срабатывании стоп ордера происходит отправка транзакции сервером брокера. В случае успеха отправки (может не пройти), в стоп ордере, точнее в таблице stop_orders для записи вашего ордера, будет заполнено поле linked_order. Это и есть тот номер лимитного ордера, который отправлен по факту активации стоп ордера. По нему и ищите, фильтруйте. Правда, как и всегда при клиент-серверном взаимодействии, событие смены статуса стоп ордера и событие заполнения linked_order, и появление его в таблице orders, не мгновенные. И необходимо организовать методы ожидания.
Описанная в данном инциденте проблема была устранена в версии 7.23.0 терминала QUIK. Данная версия была разослана всем брокерам системы QUIK в рамках стандартной процедуры обновления версии 23.11.2018. По поводу получения обновления рекомендуем вам обратиться к своему брокеру.
Приносим извинения за причиненные неудобства.
Подниму..
Вроде работало, не следил. Но теперь в 9-ой версии не работает.
Если при первичной инициализации индикатора было x линий (добавление на график). А уже при повторной (после изменения настроек) линий больше x, то отрисовка линий происходит некорректно.
# и table.getn, # и table.getn - косячно
Пользователь
Сообщений: Регистрация: 27.01.2017
04.05.2022 17:11:55
Да, никто не мешает самому организовать счетчик при добавлении и удалении элемента.
# и table.getn, # и table.getn - косячно
Пользователь
Сообщений: Регистрация: 27.01.2017
04.05.2022 12:46:36
В Lua массивы начинают свою нумерацию от 1. Если будет дырка, то оператор # не вернет корректно значение.
Победить - создать метатаблицу, с переопределенным метаметодом __len
Поиск ошибок в индикаторе
Пользователь
Сообщений: Регистрация: 27.01.2017
30.04.2022 13:34:58
Так она и так выводится если код индикатора открыт. Впрочем, можно обернуть текст функции OnCalculate (или исполняемой функции) в pcall. И выводить в лог или сообщения текст ошибки. Только стоит сделать кеш ошибок, чтобы не выводить одну и ту же на каждом баре, а то терминал "умирает" на длинных графиках, выводя в три прохода все эти сообщения.
Количество активных заявок одной командой, Количество активных заявок одной командой
Пользователь
Сообщений: Регистрация: 27.01.2017
29.04.2022 18:02:13
Цитата
nikolz написал: поправлю на запись о регистрации или снятии (исполнении) заявки уходит не более 10 мкс --------------- на формирование и отсылки транзакции на снятие заявки уходит до 300 мкс ---------------------------- на формирование и отсылку транзакции на новую заявку уходит 400 мкс
Это при летной погоде. Надеяться на такие времена всегда - плохая затея. Мой наблюдаемый рекорд от отправки транзакции до появления ордера - 10 минут.
Количество активных заявок одной командой, Количество активных заявок одной командой
Пользователь
Сообщений: Регистрация: 27.01.2017
29.04.2022 18:00:47
Цитата
nikolz написал: не все так просто. Например, уже есть активные заявки до включения скрипта. либо произошел разрыв соединения и восстановление через несколько минут и часть активных заявок сработали. Ну и т д
Конечно не просто. Собственно это и было написано, что необходимо свои заявки опрашивать. Также скрипт должен хранить свое состояние, чтобы при перезапуске, восстановлении соединения и т.д., проверить себя, что изменилось. Может быть так, что терминал упал вчера, а восстановился только сегодня. Поэтому все такие ситуации необходимо предусматривать. И закладывать архитектуру на колбеках - не самое надежное решение.
Количество активных заявок одной командой, Количество активных заявок одной командой
Пользователь
Сообщений: Регистрация: 27.01.2017
29.04.2022 13:26:26
Вы, конечно, можете постоянно не сканировать активные заявки по таблице. При первичной постановке ордера необходимо один раз найти ордер в таблице ордеров и запомнить индекс таблицы. Тогда последующие обращения уже будут простые, без поиска. Если же речь про то, чтобы вообще не искать ордера, то для лимитных ордеров - это не лучшая затея, т.к. в клиринг их снимут и необходимо предпринять какие-то действия. Да, можете по колбеку получить новое состояние ордера и отреагировать, но это если этот колбек не был пропущен.
Запуск скрипта из примера подвешивает терминал Quik
Пользователь
Сообщений: Регистрация: 27.01.2017
28.04.2022 19:01:38
Цитата
Konstantin написал: Убрал onAllTrade результат тот же. Может ещё что убрать...
Советую последовательно анализировать.
Для начала уберите обработку очереди и просто в каждом колбеке выводите сообщение, что пришел такой колбек. Функция main будет cодержать только sleep(10), например.
Код
function main ()
while is_run do
--if # MAIN_QUEUE > 0 then
-- ProcessingCallbakc(MAIN_QUEUE[ 1 ])
-- table.sremove (MAIN_QUEUE, 1 )
-- message ( "Размер очереди " .. tostring( # MAIN_QUEUE))
--end
sleep ( 10 )
end
end
Потом уже последовательно возвращать в колбеках заполнение очереди. По одному, не во всех сразу. Тогда, анализируя поведение скрипта, найдете причину.
И, главное, измените в функции ProcessingCallbakc sleep(3000) на sleep(10). А лучше вообще убрать. Я не представляю что необходимо выполнять три секунды на каждый колбек.
Сдвиг массива без цикла for или while, Возможно ли сдвинуть массив без цикла for или while, если количество строк массива может изменяться?
Сдвинуть помогут. Вопрос был про сам сдвиг. Давить в конец, удалить в начале. Как я понимаю задача держать в массиве заданное число элементов. Правда эту задачу можно решить кольцевым массивом, рассчитывая очередное место индекса массива через остаток от деления, например.
Сдвиг массива без цикла for или while, Возможно ли сдвинуть массив без цикла for или while, если количество строк массива может изменяться?
Пользователь
Сообщений: Регистрация: 27.01.2017
27.04.2022 15:22:21
И очень странная работа с временем. Если необходимо получить разницу времени, то у Вас есть unix-time, простое арифметическое действие даст разницу в секундах. Также время есть и в параметре alltrade - время прошедшей сделки. И да, в этом колбеке выполнять что-то сложное - очень плохо.
Сдвиг массива без цикла for или while, Возможно ли сдвинуть массив без цикла for или while, если количество строк массива может изменяться?
Пользователь
Сообщений: Регистрация: 27.01.2017
27.04.2022 15:16:21
Если это именно массив, то помогут функции table.insert и table.remove
Запуск скрипта из примера подвешивает терминал Quik
Пользователь
Сообщений: Регистрация: 27.01.2017
27.04.2022 13:04:03
Т.к. в примере присутствует OnAllTrade и у Вас организована подписка на поток сделок, скажем, по многим инструментам, то он будет постоянно блокировать поток для внесения новых данных. Лучше удалить этот колбек. Либо добавляйте print debug сообщения, для оценки происходящего.
Время сервера, время последней сделки., Разное время передаваемое с сервера.
Пользователь
Сообщений: Регистрация: 27.01.2017
26.04.2022 17:10:53
Цитата
nikolz написал: сервер брокера никак не контролирует то, что транслирует с биржи. его задача работать со заявками клиентов, проверять достаточность средств и формат заявок и отправлять их на сервер биржи. время сервера иногда гуляет относительно времени биржи.
Это я как раз понимаю. Вопрос ведь в том, что если время серверной части может быть так рассинхронизированным, то не приведет ли это к последствиям. Мы же не знаем как организована работа со временем в серверной части.
Время сервера, время последней сделки., Разное время передаваемое с сервера.
Пользователь
Сообщений: Регистрация: 27.01.2017
26.04.2022 12:15:27
То что время серверной части не связано с временем биржи - это понятно. А вот если есть сильная рассинхронизация, то это повод что-то сделать.
Вопрос был не про синхронизацию. По факту вопрос был: контролирует ли серверная часть, поток данных от биржи. Данная проблема решилась, когда брокер разорвал соединение (по крайнее мере терминал разорвал соединение самостоятельно) и после восстановления соединения время было синхронно.
И проблема явно была не в задержках, иначе бы данные приходили с задержкой. Они же приходили корректно.
Сохранение результатов работы скрипта в файл
Пользователь
Сообщений: Регистрация: 27.01.2017
15.04.2022 14:41:05
Ищите сериализация данных lua и сразу найдете. На этом форуме была не одна тема с таким вопросом и даже примеры кода.
Время сервера, время последней сделки., Разное время передаваемое с сервера.
Пользователь
Сообщений: Регистрация: 27.01.2017
13.04.2022 12:40:14
Прямо сейчас наблюдаю такую картину. Время сервера отстает на минуту от текущего времени (оно синхронизировано и корректно). При этом время последней сделки на минуту впереди времени сервера и близко к правильному текущему времени, т.е. тоже опережает время сервера.
Я могу понять, что это проблема брокера (Сбербанк), но с какой стати время сделки в будущем относительно времени сервера брокера и времени пакета? Т.е. я понимаю, что время сделки просто транслирует биржа, но серверная часть должна же не просто транслировать, но и как-то контролировать, что она транслирует.
Задержка в выставлении заявок.
Пользователь
Сообщений: Регистрация: 27.01.2017
06.04.2022 11:35:04
Если не прошла транзакция, оправленная командой самого терминала, то это уже не проблема клиента, если говорите, что данные обновлялись и торговая сессия шла. Я бы брокеру Алфьа не стал так уж доверять.
Не могу заставить работать функцию Subscribe_Level_II_Quotes()
Пользователь
Сообщений: Регистрация: 27.01.2017
02.04.2022 11:32:42
В данном случае, я тоже не очень понимаю смысл этого анализа, т.к. за время цикла задержки потока стакан изменится много раз. И это если анализировать всего один, не то что тысячи. Можно догадываться, какая задача решается, но часто пытаются через стакан посчитать сумму заявок. Хотя это берется из ТТТ одной строкой. При этом, анализируя стакан, также стоит учитывать, что через Квик доступна только малая часть глубины стакана - в лучшем случае 50 строк, а чаще всего 20.
Но обсуждали чисто техническую реализацию, поэтому все это лирика.
Не могу заставить работать функцию Subscribe_Level_II_Quotes()
Пользователь
Сообщений: Регистрация: 27.01.2017
01.04.2022 17:33:31
Ну так Вы выполняете Unsubscribe_Level_II_Quotes один раз. Если она вернула false, то можете ее вызывать в цикле еще раз (но не бесконечно), пока она не вернет истину. Это Вам выше и написали.