Баги QUIK 8.13

Страницы: 1
RSS
Баги QUIK 8.13
 
Баги QUIK 8.13:
* Нет хоткея для показа Lua-скриптов.
* У окна стоп-заявок нет якоря, хотя у обычных заявок он есть.
* Сделки тоже без якоря.
* Если в Настройки=>"Получение данных" снять галку "Запрашивать данные раз в … сек.", то ParamRequest() вернет true, но данные не придут.
* Забавно, но "Смена операции клавишей Пробел" не позволяет пробелом ставить галку, например, "Рыночная".
* Нужна панель с индикаторами (с значками) запущенных скриптов.
* Ошибка о нехватки средств на срочном рынке вылезает из-за расчета ГО мин/макс цены для рыночной заявки. QUIK считает "рыночное" ГО для +500 пунктов и вылезает за лимит без отправки заявки на сервер, когда по стакану достаточно +20 пунктов с запасом на VTB и на ГО депо хватает.
Код
Ошибка создания заявки. [GW][332] "Нехватка средств по лимитам клиента.".

* "Ошибку создания заявки" sendTransaction() не возвращает, как ошибку. Да, эту ошибку нельзя заблокировать! В заявках тоже пусто! Только OnTransReply() её ловит на позднем этапе.
   Вообще все транзакции с статусом==4 можно через sendTransaction() вернуть, а не беспокоить пользователя.
   Ну превысил в скрипте QTY... ну, верните ошибку скрипту! Юзер тут причем?

* Нужна sendTransactionSync() с гарантированным возвратом последнего trans_reply:
   - ошибка (БЕЗ ПОКАЗА ОШИБКИ ЮЗЕРУ)
   - заявка в очереди (PUT_IN_QUEUE)
   - заявка исполнена или отклонена (FILL_OR_KILL и KILL_BALANCE)

* isConnected() == nil возможно! Похоже это происходит когда QUIK при запуске сразу стартует Lua-скрипт, но функция isConnected() еще не прошла иницилизацию.
Я не вижу другого объяснения, почему этот цикл иногда при старте не срабатывает:
Код
function main()
    ISRUN = true
    while ISRUN and isConnected() == 0 do
        sleep(1000)
    end
    -- код
end


* Нужна галка на авто-перезапуск скрипта, потому при неожиданном разрыве некоторые функции могут вернуть nil и убить скрипт. В Lua нет try-catch. Например:
Код
local minstep = getSecurityInfo("SPBFUT", sec_code).min_price_step


* В 2021г без Unicode?! Сам Unicode по BOM определяется. И давно уже научились отличать Win-1251 от UTF-8.
Сам файл можно в любой кодировки читать, а компилировать в Win-1251, если это так важно.

* Возвращаемое значение из OnCalculate() должно быть table, а сейчас такой бред:
Код
function OnCalculate(index)
    -- код
    return r[1],r[2],r[3],r[4],r[5],r[6],r[7],r[8],r[9],r[10],r[11],r[12],r[13],r[14],r[15],r[16],r[17],r[18],r[19],r[20],r[21],r[22],r[23]
end

А вот такой код обрабатывает оба варианта возврата:
Код
function OnCalculate(index)
    local result
    result = {7, 9}
    return result[1], result[2], result
end
function main()
    str = "R: "
    for k, v in pairs({OnCalculate()}) do
        if type(v) == "table" then
            for k0, v0 in pairs(v) do
                str = str.." tbl "..tostring(k0).."="..tostring(v0)
            end
        else
            str = str.." "..tostring(k).."="..tostring(v)
        end
    end
    message(str)
end


И хватит распространять миф об уникальности TRANS_ID. Он почему-то должен быть объявлен, хотя Таблица Заявок утверждает, что nil тоже норм.
А уникальным он точно может не быть - просто дополнительное число для фильтрации заявок. Описание в MQL5 аналогичного параметра:
Код
Идентификатор эксперта. Позволяет организовать аналитическую обработку торговых ордеров. Каждый эксперт может выставлять свой собственный идентификатор при отправке торгового запроса
 
Roffild, Ну, во-первых, это не баги, а во-вторых, при чём здесь "программирование на Lua"? Все эти "пробелом ставить галку" - это интерфейс юзера. И нафига Вам isConnected? В жизни ни разу не проверял! А Unicode на кой?
Цитата
В Lua нет try-catch.
Господи! Неужели ХОТЬ ЧТО-ТО в этом языке сделано нормально? :smile:

Ну и, наконец, а на кой вообще нужен TRANS_ID, если он не уникальный?
 
Эх... вспомню форумную молодость и покормлю тролля
Цитата
Владимира ;)
[QUOTE]Ну, во-первых, это не баги, а во-вторых, при чём здесь "программирование на Lua"? Все эти "пробелом ставить галку" - это интерфейс юзера.
Мне влом разделять тему на две.

Цитата
И нафига Вам isConnected? В жизни ни разу не проверял![QUOTE]Антоха? Ни единого разрыва! :D

[QUOTE]А Unicode на кой? [QUOTE]Современный стандарт IDE.

[QUOTE]Ну и, наконец, а на кой вообще нужен TRANS_ID, если он не уникальный?
Отличать заявки первого скрипта от второго или для дополнительной информации.
 
Roffild, Ишь ты, "молодость", панимаш! Да ещё и "покормлю тролля"...  :smile:
Цитата
Мне влом разделять тему на две.
Зачем разделять? Название нормальное придумать.
Цитата
Антоха? Ни единого разрыва! :D
Да бывают разрывы - в чём проблемы? Скрипт просто перестаёт работать, и никакой isConnected для этого нафиг не нужен.
Цитата
Современный стандарт IDE.
И чего? На каждый чих этих долбаных "стандартизаторов" будем курочить софт, который и без того глючный? Чем не устраивает 1251?
Цитата
Отличать заявки первого скрипта от второго или для дополнительной информации.
Чтобы отличать заявки первого скрипта от второго (на кой вообще нужен второй скрипт?) нужна как раз уникальность айдишек. Я вот именно по TRANS_ID ловлю номера заявок для снятия, если они мне не известны, и здесь тоже нужна именно уникальность ID.
 
Roffild, добрый день!

1. Такой возможности действительно не предусмотрено. Можем предложить зарегистрировать пожелание на доработку.

2. Режим связанных окон в текущей реализации не предусматривает использование таблицы стоп-заявок как основной таблицы. Можем предложить зарегистрировать пожелание на доработку, в таком случае просьба уточнить, с какую (какие) таблицу Вы хотели бы использовать как связанную в таком режиме? По какому признаку должна производиться фильтрация?

3. Аналогично пункту 2.

4. Просьба уточнить. Правильно понимаем, что настройка умного заказа данных включена, но несмотря на успешное выполнение функции ParamRequest, функция getParamEx не возвращает никаких значений?

5. "Смена операции клавишей "Пробел"" предусмотрена для смены операции на форме подачи заявки (как и следует из ее названия).

6. Просьба подробнее описать желаемый функционал. Как это должно выглядеть и действовать? Готовы зарегистрировать пожелание.

7. Заметим, что в виду отсутствия в торговой системе срочного рынка рыночных заявок, система QUIK выставляет искусственную "рыночную" заявку с ценой равной максимально/минимально возможной по данному инструменту. Если с учетом этой информации описанная Вами проблема сохраняется, просьба прислать подробный пример со снимком экрана, будем разбираться.

8. Уточните, что имеется в виду под "Ошибкой создания заявки"? Ответ от торговой системы? В таком случае, это корректное поведение, так как SendTransaction возвращает ошибку лишь по тем транзакциям, которые в принципе не удалось передать серверу. Для всего остального можно и нужно использовать OnTransReply.

9. Можете подробнее описать, для чего это нужно? Данная возможность уже реализована - OnTransReply

10. Нам не удалось воспроизвести описанную Вами проблему. Если она повторится, зафиксируйте ее пожалуйста и пришлите снимок экрана. Спасибо.

11. Правильно понимаем, что данная опция должна безусловно перезапускать упавший скрипт? Что делать, если скрипт продолжает падать при каждом запуске? Готовы зарегистрировать пожелание.

12. Ваше пожелание зарегистрировано, мы постараемся его рассмотреть. Впоследствии, по результатам анализа, будет приниматься решение о реализации пожелания в будущих версиях ПО.

13. Данная проблема решается при помощи функции unpack в документации к использованию lua-индикаторов в QUIK даже приведен пример с ее использованием.

14. Trans_ID должен быть уникальным только при импорте транзакций из файла. При отправке транзакции из Lua-скрипта, его значение может быть каким угодно, так как оно используется только для синхронизации внутри самого скрипта (если таковая требуется).
 
Цитата
Roffild написал:
В Lua нет try-catch.
В луа есть try-catch, называется pcall.
 
Anton, О, чёрт! И тут облом!  :smile:  
 
1. Нет хоткея для показа Lua-скриптов.

2. Unicode.

2. Якоря нет у стоп-заявок и сделок. Логика, как у обычных заявок. Связь, вроде, по инструменту. Простой копи-паст. Может еще есть таблицы с Инструментами, но нет якоря...

3. И Lua-таблицу можно по инструменту связать... Специальная колонка заполняется соответствующими данными - вот и связь.

4. Кстати, в окне "параметров индикатора" нет выбора для Lua-значений false/true и пришлось заменить на число.

5. В окне Lua-скриптов под "Остановить" добавить галку "Перезапуск после ошибки" - "Автоматический перезапуск скрипта через 30сек после завершения из-за ошибки."

7. Нужна панель с индикаторами запущенных скриптов. Зеленый квадрат с числом - количество запущенных скриптов. Красный квадрат с числом - количество остановленных скриптов. По панельки можно будет определить: упал скрипт по ошибке или пашет.

8. Из-за невозможности поставить галку "Рыночная" пробелом, пришлось искать "Смена операции клавишей Пробел". Топорно сделано. Лучше нейтральные PgUp/PgDown (правая рука) и ~ (левая рука) под это пустить. Можно в качестве дополнительной возможности - будет из чего выбрать.

9. Возвращаемое значение из OnCalculate() должно быть table. Ну, да... чё-то где-то про table.unpack() проскакивало... Но можно заставить QUIK обрабатывать оба варианта возврата, а не напоминать о костыле Lua. На примере из 1 поста я показал, что это возможно. Языки с динамическими типами заставляют все варианты обрабатывать.

10. isConnected() == nil возможно! Тут явно "гонка потоков". Этот баг отловить непросто. Чтоб 100% избежать бага нужно стартовать скрипты когда все загрузилось. "Окно подключения" появляется после отрисовки графиков на старых данных - вот на этом этапе нужно стартовать скрипты, но не раньше.
А может причина проще: забыли переменную в isConnected() инициализировать 0 и она периодически попадает на "грязную память".

11. Настройка умного заказа данных включена. Если в Настройки=>"Получение данных" снять галку "Запрашивать данные раз в … сек.", то ParamRequest() вернет true, но данные не придут. И getParamEx() вернет 0 или старое значение. Проблема именно с переключением галки "Запрашивать данные раз в … сек.". Я эту галку сначала снял, потому что неправильно понял описание, и долго не понимал, почему 0 возвращается.

12. Ошибка о нехватки средств на срочном рынке вылезает из-за расчета ГО мин/макс цены для рыночной заявки. QUIK считает "рыночное" ГО для +500 пунктов, вылезает за лимит и не отправляет заявку на сервер. По стакану достаточно +20 пунктов с запасом на VTB и на ГО депо хватает.
Пример:
Депо=1000р (чтоб впритык было)
VBZ1=5500 с ГО=820р
Если заявить на покупку 1 VBZ1 по 5520(5500+20), то все исполнится.
Если заявить на покупку 1 VBZ1 по "Рыночной"(5500+500=6000), то "Нехватка средств по лимитам клиента." == "нет денег на ГО".

13. Добавьте "Trans_ID должен быть уникальным только при импорте транзакций из файла. При отправке транзакции из Lua-скрипта, его значение может быть каким угодно, так как оно используется только для синхронизации внутри самого скрипта (если таковая требуется)." в доку sendTransaction(), а то на форуме запутались с уникальностью TRANS_ID. Еще большую неразбериху с TRANS_ID вносит запрет, что он обязателен для Lua-скрипта. Можно снять этот запрет.

10. А теперь с OnTransReply():
С сентября у Сбербанка начались проблемы с соединением. Паровозик раньше ехал стабильно, а сейчас часто стоит. Дисконнекты участились. И как в таких условиях ждать OnTransReply()?
Надежнее мониторить таблицу заявок для 100% статуса. И если заявка уже принята сервером, то логично ожидать с номером 0 (означает, что до МБ не добралась) даже после дисконнекта. Такие заявки должны хранится сервером не более часа. По таким заявкам проще сделать цикл ожидания.
А еще из-за особенности поточности Lua-скриптов, событийная модель - ненадежное решение. sendTransactionSync() должно решить проблему Lua-программистов, но решать заморочки с плохим соединением придется уже вам.
 
Roffild,
1. И такой хоткей нам нафиг не нужен.

2. См. пункт первый.

3, 4, 5... да ещё и с кривой нумерацией... вот АБСОЛЮТНО ничего нафиг не нужно из всего этого потока заявлений ветки с наглым названием "Баги QUIK". Кстати, один из моих брокеров как раз Сбербанк, скрипт работает каждый (рабочий) день, с утра до вечера, никаких "проблем с соединением" не замечено. Да, раза два или три связь рвалась, но она и раньше точно так же рвалась, и не только у Сбера. В чём проблемы-то? Ах, в OnTransReply? Так она тоже нафиг не нужна! И мониторить таблицу заявок нафиг не нужно. И уж сервер Вам АБСОЛЮТНО ничего не должен. И событийная модель никакого отношения к "особенности поточности Lua-скриптов" не имеет. И sendTransactionSync нафиг не нужна - я даже не знаю, что это вообще такое, Но упаси, Господи, ей "решать проблему Lua-программистов". Особенно, если никаких проблем нет. В общем, "дело было не в бобине".(с)
 
15. В окно "Состояние счета" нужен столбец "Цена сделки" (Цена последней сделки).
 
Roffild, Ага, только его там не хватало! Во-первых, цена и так есть в "Таблице заявок", во-вторых, она нафиг не нужна - скрипт и сам прекрасно знает, что и по какой цене он делал. В-третьих, "Состояние счёта" нужно только для контроля соответствия портфеля со стороны скрипта и со стороны брокера (я это дело проверяю примерно раз в неделю) и ни для чего более.
 
Цитата
Roffild написал:
10. isConnected() == nil возможно! Тут явно "гонка потоков". Этот баг отловить непросто. Чтоб 100% избежать бага нужно стартовать скрипты когда все загрузилось. "Окно подключения" появляется после отрисовки графиков на старых данных - вот на этом этапе нужно стартовать скрипты, но не раньше.
А может причина проще: забыли переменную в isConnected() инициализировать 0 и она периодически попадает на "грязную память".
У меня много скриптов, где есть isConnected(). Ни разу подобной проблемы не было. Если вы таки сталкивались с подобным, то порекомендую условие в цикле модифицировать так или наоборот и всё:
Код
(isConnected () or 0) == 1
 
16. В "редакторе клавиш" не весь список. Сейчас хотел сменить хоткей "Следующее окно" (CTRL+F6), но его нет в списке. И окно не переключается.
 
Здравствуйте!

Касательно пункта 15. Могли бы Вы уточнить, для чего Вам нужен данный функционал, ведь значение цены последней сделки можно получить из таблицы текущих торгов ?

касательно пункта 16. Ваше письмо получено, проблема изучается. Постараемся в ближайшее время дать ответ.
 
По 15 пункту:
Цена последней сделки из ТТТ (LAST) - не то.

Цена из "Таблицы Сделок", крайняя сделка по инструменту - ВОТ ЭТО. На графике стрелками обозначаются.
 
Roffild, Вас же просили объяснить, ЗА КАКИМ ХРЕНОМ Вам это надо? Вы что, не знаете цену своей последней сделки? Выбросьте Ваш софт на помойку! И не забивайте всяким говном общий софт - он написан и для нормальных пользователей!
 
10. Странный isConnected() получается. Сейчас глянул в лог:
9:10:39 Соединение установлено
9:10:40 Введите PIN
9:10:43 MyLua started (isConnected() == 1)
9:12:35 Двухфакторная аутентификация прошла успешно

Если бы MyLua начал торговать до PIN, то словил ошибки...
 
Версия 8.13.1

Снял якорь с таблицы стоп заявок, но полный список не вывелся, как сделать вывод всего списка что был ранее?
 
Sfinexer, может в таблице какие фильтры по полям остались?
 
17. Шаблоны для графиков только цвета меняют. Шаблон должен график очистить и все настройки с индикаторами восстановить с 0. В МТ5 это нормально сделано, а в Квик - бред какой-то.
 
[QUOTE=Sfinexer]Снял якорь с таблицы стоп заявок, но полный список не вывелся, как сделать вывод всего списка что был ранее?Есть такой баг: фильтры после снятия якоря не восстанавливаются.
 
И форум после Просмотра ББКод обрезает...
 
Roffild, Добрый день,

Касательно 15 пункта. Вы можете получить данное значение средствами Qlua. Значение полей таблицы заявок можно получить, используя функцию "getItem". Подробнее об этом можно почитать в       документации QLUA.chm в разделе "Функции для обращения к строкам произвольных таблиц QUIK" в пункте "getItem". Также рекомендуем обратить внимание на пункт документации "Таблицы, используемые в функциях «getItem», «getNumberOf» и «SearchItems»".

Касательно 17 пункта. Правильно понимаем, Вы хотите, чтобы индикаторы сохранялись в шаблоны, чтобы при применении данного шаблона на новое окно с графиком появлялись и индикаторы,       добавленные в шаблон? Если да, то на данный момент это сделать нельзя. Можем зарегистрировать пожелание на добавление данного функционала. Если нет, просьба уточнить, о чём идёт речь.

Касательно снятия якоря с таблицы стоп-заявок. Предлагаем в настройках таблицы заявок в списке "Выбранные классы" нажать на используемый класс, нажать на "..." напротив "Фильтр инструментов" (См. скриншот 1) и добавить все инструменты в "Выбранные инструменты" (См. скриншот 2).
 
Sfinexer, Добрый день,

Предлагаем выполнить данные инструкции:
Цитата
Предлагаем в настройках таблицы стоп заявок в списке "Выбранные классы" нажать на используемый класс, нажать на "..." напротив "Фильтр инструментов" (См. скриншот 1) и добавить все инструменты в "Выбранные инструменты" (См. скриншот 2).
 
15. Не Lua, а про окно "Состояние счета" вообще-то. "Баланс" - средняя цена за день. Я хочу последнюю сделку видеть.

17. А какой смысл в шаблоне, который ничего не меняет? Старые индикаторы удаляются, новые добавляются.
Страницы: 1
Читают тему (гостей: 1)
Наверх