30.10.2017 Номинал 400.00 НКД 25.46 Купон 25.53 Оборот 79574 руб. / 196 шт. -> средняя цена 405.99 руб.
31.10.2017 Номинал 400.00 НКД 0.00 Купон 25.53 Оборот 63699 руб. / 321 шт. -> средняя цена 198.44 руб.
01.11.2017 Номинал 200.00 НКД 00.02 Купон 7.58 Оборот 286718 руб. / 1451 шт. -> средняя цена 197.60 руб.
Т.к. торги происходят в режиме Т+1, то уже 31 октября сделки происходят исходя из нового номинала 200 руб. и нового купона 7.58 руб. Но в Квике отображаются устаревшие номинал и купон, ориентируясь на которые клиент купит неправильное количество бумаг. В моем случае торгует qlua-робот, который вовсе не заметит аномалию при совершении сделок и будет торговать неверным количеством лотов.
Сервер №2 balance=0. На серверах №1, №3, №4 - аналогично, balance=0. На VIP-сервере balance=остаток. (на обычных серверах тестировал с другого uid, но думаю это не критично)
Отправляю транзакцию на снятие лимитированной заявки. При получении коллбека OnTransReply(t) записываю все поля таблицы t в лог. Проблема: при подключении к разным серверам брокера поле balance заполняется по-разному.
Лог-файл при подключении к VIP-серверу БКС (91.209.122.122:15100):
В первом случае приходит balance=1 (равно неисполненному остатку). Во втором случае приходит balance=0. Один и тот же счет. Один и тот же терминал. Один и тот же тестовый скрипт.
Всегда приходило balance=остаток. На сервере №2 последний раз торговал 27 июня и получал balance=остаток. А теперь почему-то стало balance=0. На фондовой секции картина аналогичная. Версия терминала 7.11.1.5 (также тестировал на версии 7.2.1.5 - картина такая же).
Техподдержка брокера БКС заявляет, что версии серверной части QUIK на всех их серверах идентичны и настроены одинаково.
Вопросы: 1) Чему должно быть равно поле balance в данном случае? 2) Были ли какие-либо обновления серверной части QUIK в которых могла поменяться логика формирования поля balance в коллбеке OnTransReply? (допускаю что БКС недавно сделал обновление всех серверов, кроме VIP-сервера) 3) Возможна ли такая разница из-за различий в конфигурации серверов?
Прошу разработчиков зарегистрировать пожелание: Ни в коем случае не делать никаких trans_id=nil !!
В руководстве четко прописано что поле trans_id имеет тип NUMBER. Соответственно программисты (в частности я) в своих скриптах считают что в этом поле может быть только число. В Lua значение nil это отдельный тип переменной, и например выражение t.trans_id>0 приведет к ошибке и вылету скрипта. Почему я должен перелопачивать десятки тысяч строк кода в десятках своих скриптов и вводить множество ненужных проверок, из-за того, что кому-то вдруг приспичило получать nil?
2 Старатель. Вы упорно не хотите принять положение, что теперь некоторые параметры сделки могут измениться. Нет никакой разницы, что присылать по-умолчанию, 0 или nil. Надо просто понимать, что теперь теоретически возможна ситуация что сначала пришло t.trans_id=12345 а через минуту придет t.trans_id=67890. Разработчики наверное потому и не хотят выкладывать список "неизменяемых" параметров, что теоретически может поменяться любой параметр. Они сделали систему для общего случая для произвольной биржевой площадки. Как с этим общим случаем работать - это уже геморрой программистов.
1) У Вас в коде какая-то белеберда if ds~=true then ... if ds[h]~=true then .... Зачем? ds и ds[h] только что созданы.
Мой код - тестовый, кроме него в скрипте ничего нет. Сделан чтобы продемонстрировать проявление ошибки.
2) В общем случае, закрытие источников вовсе не обязано производиться в конце скрипта. Например один из моих скриптов ежедневно в полночь сохраняет таблицу изменений параметров по группе инструментов. Делается это через вызов CreateDataSource(). Если сразу после обработки не закрывать источники, то получим переполнение памяти.
3) Представитель разработчиков подтвердил что проблема типа "график с пустым черным окном" уже встречалась и в актуальной версии терминала уже решена. В 7-й версии проблема мною не замечена. Т.е. тему можно закрывать.
В версии 7.0.4.10 проблемы не наблюдаю. В одном из последних релизов 6-й версии (6.17.3.6) проблема была.
Скажите, исчезновение проблемы в 7-й версии это осознанное изменение в коде (т.е. уже были замечания со схожими симптомами)? или фикс получился случайно и непонятно как?
Честно говоря пока боязно переводить боевые торговые терминалы на свежую 7-ю версию. Мало ли где вылезут непредвиденные баги...
function main()
message("_________________________________")
class_code0="TQBR"
sec_code={"AFKS","AFLT","ALRS","CHMF","GAZP","GMKN","FEES","HYDR","LKOH","MAGN","MGNT","MOEX","MTSS","NLMK","NVTK","ROSN","RTKM","SBER","SBERP","SNGS"}
hm=#sec_code
ds={}
for h=1,hm do
ds[h],error=CreateDataSource(class_code0,sec_code[h],INTERVAL_M1)
if ds[h] then
text=string.format("%-2d %-5s created",h,sec_code[h])
else
text=string.format("%-2d %-5s error: %s",h,sec_code[h],error)
end
message(text)
end
message("---------------------------------")
sleep(1000)
for h=1,hm do
if ds[h] then
text=string.format("%-2d %-5s size: %d",h,sec_code[h],ds[h]:Size())
if ds[h]:Close() then
text=text.." closed"
else
text=text.." error"
end
else
text=string.format("%-2d %-5s empty",h,sec_code[h])
end
message(text)
end
message("=================================")
end
Тестовый скрипт создает 1-минутные DataSource-ы по нескольким десяткам бумаг. Ждет 1 секунду. Выводит количество свечек в каждом источнике данных, после чего закрывает его. При первом вызове скрипта все источники открываются корректно, везде около 3000 свечек. При повторных вызовах скрипта появляются "битые" источники, в которых 0 свечей. График по таким инструментам перестает отображаться (пустой черный экран).
Избавиться от такого "битого" графика можно только путем удаления соответствующего файла в папке archive при выключенном QUIK-е. Простой перезапуск терминала не помогает, график все равно остается пустым. Повреждение графика инструмента происходит случайным образом. Если перезапустить скрипт 10-20 раз, то битыми окажутся почти все графики.
В некоторых случаях (не всегда!) при закрытии терминала появляется ошибка приложения.
Пример отчета по ошибке из журнала Windows:
Код
Имя сбойного приложения: info.exe, версия: 6.16.1.15, отметка времени: 0x54a24cf3
Имя сбойного модуля: ntdll.dll, версия: 6.1.7601.18247, отметка времени 0x521ea8e7
Код исключения: 0xc0000374
Смещение ошибки: 0x000ce753
Идентификатор сбойного процесса: 0x4b0
Время запуска сбойного приложения: 0x01d15e4c7e48ab69
Путь сбойного приложения: C:\QUIK_VTB24_sao\info.exe
Путь сбойного модуля: C:\Windows\SysWOW64\ntdll.dll
Код отчета: dc491653-ca4e-11e5-aa20-50465d4d62f1
Код тестового скрипта:
Код
function main()
message("_________________________________")
sec_code={"AFKS","AFLT","ALRS","CHMF","GAZP","GMKN","FEES","HYDR","LKOH","MAGN","MGNT","MOEX","MTSS","NLMK","NVTK","ROSN","RTKM","SBER","SBERP","SNGS"}
hm=#sec_code
ds={}
for h=1,hm do
ds[h],error=CreateDataSource(class_code0,sec_code[h],INTERVAL_M1)
if ds[h] then
text=string.format("%-2d %-5s created",h,sec_code[h])
else
text=string.format("%-2d %-5s error: %s",h,sec_code[h],error)
end
message(text)
end
message("---------------------------------")
sleep(1000)
for h=1,hm do
if ds[h] then
text=string.format("%-2d %-5s size: %d",h,sec_code[h],ds[h]:Size())
if ds[h]:Close() then
text=text.." closed"
else
text=text.." error"
end
else
text=string.format("%-2d %-5s empty",h,sec_code[h])
end
message(text)
end
message("=================================")
end
Пример результатов выполнения скрипта: При втором прогоне источники по NVTK и ROSN оказываются битыми, хотя при первом прогоне все было нормально.