Есть два брокерских счёта у него. Два терминала Квик. После очередного обрыва связи, которые на этой неделе почти каждый день, ордера из одного брокерского счёта стали видны в таблице Квика другого брокерского счёта. Буквально - есть записи с несуществующим кодом клиента для этого счёта, терминала. Что ещё забавно, если снять ордер в этом терминале (хотя этот ордер не принадлежит этому брокерскому счёту), то он также снимается и в другом. Вот такая загогулина. Если бы не было печально, то, наверно, можно было бы посмеяться. Возникает вопрос - как серверная часть терминала допускает такое? А если бы стали видны ордера совсем другого клиента?
Прикладываю картинку. Один терминал и окно другого терминала. Видны ордера из первого во втором. Если это не критическая уязвимость связки терминал-сервер, то я не знаю что это. И просьба не говорить о том, что брокер может что-то настроить у себя на серверной части. Такого просто не может быть, ни при каких обстоятельствах.
Сегодня на тестовом контуре в таблице depo_limit получил такое:
limit_kind = 20250116
Это что? Ясно что дата. Но с какой такой... Я не слышал о новом режиме торгов в виде даты. Есть Т0, Т+1, Т+2, TOD, TOM и новое Т365, отображаемое в терминале Тх.
Ответ транзакции: [INFO 2024-09-18 13:13:09] : OnTransReply all trans count: 8 | sec_code SiZ4 result_msg: Ответ из торговой системы не получен, статус исполнения транзакции неизвестен. За уточнением просьба обратиться к Вашему брокеру. status: 4 trans_id: 50553350 order_num: 0 price: 80013 qty: nil account SPBFUT000i4 client_code SPBFUT000i4 firmid nil brokerref SPBFUT000i4//NTR01
Не то чтобы нужен ответ, но просто хотелось бы понять причину. Это что-то новое: запрос сделан, ответ - кто же знает что там случилось.
Есть два параметра таблицы текущих торгов - BID, OFFER. Вопрос разработчикам - правильно ли я понимаю, что при отсутствии с одной из сторон данных (планка) будет возвращен 0 в качестве значения? Либо result будет "0", сообщающий, что данные не получены? Если просто 0, то как тогда это соотносится с возможностью нулевых цен для части инструментов. Не хотелось бы опрашивать стакан для такой простой задачи
Если ли доступ к таблицам, создаваемым модулем TrustManager из qlua? При подключении модуля появляется тип транзакции NEW_GROUP_ORDER, судя по экспорту. Поэтому и возникает вопрос - как сформировать команду, читать данные и т.д.
Скрипт простой: ставим метку и потом читаем данные. После установки метки берем и перетаскиваем ее на графике, желательно быстро. Терминал зависает. На таком простом скрипте это происходит не сразу, поэтому можно просто двигать метку до выявления эффекта. Частично помогает избежать проблемы увеличение 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
Прямо сейчас наблюдаю такую картину. Время сервера отстает на минуту от текущего времени (оно синхронизировано и корректно). При этом время последней сделки на минуту впереди времени сервера и близко к правильному текущему времени, т.е. тоже опережает время сервера.
Я могу понять, что это проблема брокера (Сбербанк), но с какой стати время сделки в будущем относительно времени сервера брокера и времени пакета? Т.е. я понимаю, что время сделки просто транслирует биржа, но серверная часть должна же не просто транслировать, но и как-то контролировать, что она транслирует.
Не удается второй день подключится к демо серверу SERVER: Информационно-торговая система ARQA, IPCOMMENT: JUNIOR 1
Ни в 8-ой, ни в 9-ой версии терминала. Пароль принимает нормально. Пишет, что до истечения пароля осталось столько-то, далее: Соединение установить не удалось.
В описании доступных функций глобального контекста индикатора для версии терминала 9.* есть isDarkTheme. Однако, если присутствует ее вызов в теле индикатора, то он не показывается в списке выбора. Если же убрать вызов, то индикатор становится доступен для добавления на график.
На версии 8.х столкнулся на реальных счетах разных брокеров, что функции получения текущих позиций как getFuturesHolding, getDepoEx работают нестабильно. Чаще всего это происходит с getFuturesHolding на едином счете. В течении сессии часто (обычно перед клирингом) функция не возвращает ничего. При этом если перебрать строки прямым итератором, то все нормально находится.
Приходится отказываться от использования функций. Но перебор - это существенный расход памяти и просто медленней.
Начались торги в вечернюю сессию на фондовой секции. Я уже задавал вопрос про трансляцию времени сессии, но вот сейчас она идет и можно посмотреть на реальный поток данных.
Что мы видим:
Вот утро. Начало торгов. По фьючерсу все ожидаемо и понятно. Есть и времена и статус. По акции я вижу только статус, а время заполнилось только утренним аукционом.
Вот данные пор акции внутри дня. Время утреннего акциона. Это как понимать? Уже сессия к концу идет, а время старое. [INFO 2020-06-23 17:33:32] : SBER TRADINGSTATUS {param_image = "открыта", param_type = "4", param_value = "1.000000", result = "1"} [INFO 2020-06-23 17:33:32] : SBER STARTTIME {param_image = "9:50:00", param_type = "5", param_value = "95000.000000", result = "1"} [INFO 2020-06-23 17:33:32] : SBER ENDTIME {param_image = "9:59:34", param_type = "5", param_value = "95934.000000", result = "1"}
Вечер. По фьючерсам все адекватно, а вот по акциям:
Времена аукциона я еще могу понять. А вот что это такое при старте вечерней сессии уже с трудом. И опять - времена то где? Почему нельзя заполнить времена прямо при подключению к серверу, как это делается для фьючерсов и менять их, если они меняются внутри дня? Поля же есть.
Часть акций торгуется, часть нет. А информации о времени сессии нет. Раньше можно было хотя бы определить константы, когда времена были фиксированными (хоть это было и спорное решение), но сейчас то как.
В связи с началом торгов в вечернюю сессию на фондовом рынке, возникает вопрос: какие параметры будут транслироваться для списка бумаг допущенных к торгам? В частности: TRADINGSTSTUS, ENDTIME, EVNSTARTTIME, EVNENDTIME. Будут ли числовые значения статуса отличаться меджду основной сессией и вечерней?
Т.к. в индикаторе необходимо при инициализации указывать количество возвращаемых линий, то написана такая конструкция в функции init:
Код
for i = 1, lines do
Settings.line[i] = {}
Settings.line[i] = {Color = RGB(185, 185, 185), Type = TYPE_LINE, Width = 2}
end
Алгоритм вводит линии по мере наполнения массива линий. Сначала их может быть 20, потом уже 100 и т.д. Для оптимизации линии выводятся только с не пустым значением.
Все бы хорошо, но заметил такую особенность (версия 7.19), если не вывести хотя бы один раз все линиий с не пустым значением, то потом они не отображаются на графике, хотя функция GetValue возвращает значение. Я долго не мог понять почему у меня линии не показываются с течением времени, а если заново инициализировать индикатор (через параметры графика), то все на месте.
Пришлось сделать такой странный костыль:
Код
if index == 1 then
tmpOutlines = {}
for i=1,lines do --необходимо вывести все линии хотя бы один раз, чтобы потом они отображались без проблем
tmpOutlines[i] = O(Size())
end
return unpack(tmpOutlines)
end
if index == 2 then
for i=1,lines do
SetValue(1,i,nil)
end
return nil
end
Есть пожелание по вводу индекса бара (свечи) в контекстной подсказке при наведении на бар. Сейчас выводится только дата, время и торговые параметры бара, но при отладе скриптов, да и просто для удобства задания диапазона, хотелось бы видеть индекс без костылей в виде доп. индикаторов.
Возникла проблема. Выводятся текстовые метки друг над другом. Задется высота шрифта 10. А как перевести эту высоту в шаг цены? Сейчас приходится подбирать дельту цены, чтобы метки не накладывались.
Собственно очень не хватает процедур пересчета абсолютных координат окна (идеально еще бы иметь событие - "изменение масштаба") в ценовую и временную шкалы. Сразу бы решились многие проблемы. Сейчас просто невозможно рассчитать линию под определенным углом, или, наоборот, рассчитать угол линии.
Получение данных индикатора из скрипта возможно. А обратно?
У меня скрипт считает даные, хранит в таблице. Я хотел бы вывести их как значения индикатора. Т.е. сам индикатор будет пустой, возвращающий nil. А вот скриптом хотелось поставить значения, по примеру функции SetValue.
Кто-нибудь пробовал обращаться к внешним сервисам типа Twitter из qlua? Есть у меня желание добавить себе в скрипт чтение ленты по ключевым словам. Я нашел библиотеки Lua для подключения к тому же Twitter, вопрос только - заработет ли из Квика? Может проще написать того же бота на питоне.
Пишется индикатор с динамическим количеством линий. Можно ли вместо данных типа ruturn out1, out2, out3 вернуть массив {}. Соответственно, данные линий - это индексные данные массива.
Уж больно некрасиво приходится делать большое количество переменных с запасом.
Есть еще вариант динамического описания кода. Есть ли в интерпретаторе qlua execute("Текст выполняемого кода")?
Очень бы хотелось иметь достаточной простой интрумент как вилы Эндрюса. Также очень хочется существующие уровни Фибоначчи строить не только горизонтально, но и под любым углом. Тем самым получая наклонные уровни. А уж для полноты картины - веер Ганна был бы очень кстати.