3. В папке с программой создать bat-файл следующего содержания:
Код
del *.log
del *.ik
del *.dat
del *.wnd*
del *.ini
и выполнить его.
И пользуйтесь ею, пожалуйста. Это избавит нас от многих споров "падает - летает, воспроизводится - не воспроизводится". И только если проблема не воспроизводится в "чистой" версии имеет смысл запрашивать дополнительные файлы.
Надо делать так, как надо. А как не надо - делать не надо.
В меню <Система / Заказ данных / Поток обезличенных сделок...> выбран класс целиком. Если теперь создать Таблицу обезличенных сделок и добавить в неё или добавить в раннее открытую таблицу одну бумагу из выбранного класса, то в <Поток обезличенных сделок...> установится фильтр на заказ только одной бумаги из всего класса. Можно сделать так, чтобы открытие или редактирование ТОС не сбрасывало инструменты, заказанные через <Поток обезличенных сделок...>?
Надо делать так, как надо. А как не надо - делать не надо.
swerg написал: А точно требуется вызывать DestroyTable для таблицы, связанной с окном, которое и так закрывается? Я думал таблица при этом автоматически уничтожится.
Часть данных остаётся в памяти, что демонстрирует данный скрипт:
Код
function main()
t_id = AllocTable()
message(tostring(t_id))
AddColumn(t_id, 1, 'Колонка1', true, QTABLE_STRING_TYPE, 20)
AddColumn(t_id, 2, 'Колонка2', true, QTABLE_STRING_TYPE, 20)
CreateWindow(t_id)
while t_id do
if IsWindowClosed(t_id) then CreateWindow(t_id) end
sleep(100)
end
end
Поэтому, если таблица более не нужна, я её Destroy
Надо делать так, как надо. А как не надо - делать не надо.
Окно "Доступные скрипты": 1. Не позволяет изменить размер - надо исправить 2. Кнопки не согласуются с кнопками в других окнах - слишком длинные, занимают лишнее место. 3. Кнопка "Закрыть" вообще не нужна, опять же занимает широкую полосу внизу окна - есть крестик в правом углу для закрытия. 4. Поле "Ошибки выполнения скрипта" можно сделать раскрывающимся, как, например, дополнительное поле в окне ввода заявок. С какой-нибудь индикацией, что скрипт завершился с ошибкой и в доп. поле есть что почитать ))
Надо делать так, как надо. А как не надо - делать не надо.
ISR написал: Подтверждаю, проблема есть - замучался исправлять кол-во.
У них там, видать, дистрибутивы перепутаны: в public выпускают сырые бэта-версии, а stable - для внутреннего пользования. Месяцами мне поют, что "проблема не воспроизводится". Вы там работаете вообще? Как вы тестируете?
Надо делать так, как надо. А как не надо - делать не надо.
Sergey Gorokhov, к сожалению я не знаю, как вам помочь работать. Про CQ01930759 и многие другие вы также длительное время "пели", что не падает... Проблему я обозначил, а вы уж сами смотрите.
Надо делать так, как надо. А как не надо - делать не надо.
run, t_id = true
function main()
t_id = AllocTable()
CreateWindow(t_id)
while run do
sleep(1) -- можно sleep убрать, чтоб наверняка
end
end
function OnStop()
run = nil
DestroyTable(t_id)
end
function OnDisconnected()
OnStop()
end
При разрыве соединения в темной теме QUIK падает. Как временное решение проблемы - поставить небольшую задержку в конце main()
Надо делать так, как надо. А как не надо - делать не надо.
PFelix написал: Что, если ПРЕЖДЕ пришел калбек с флагом "расчет", то сохранив "данное знание в переменной", "по исполнении" мы можем ОДНОЗНАЧНО понимать "в какую сторону" выполнилась стоп-заявка?
Да, только если параметр "отступ от max/min" небольшой, и стоп сразу же исполнился, то колбэка с флагом "расчёт" может не быть. Поэтому на сегодняшний день такая проверка не даёт 100% результат.
Надо делать так, как надо. А как не надо - делать не надо.
Sergey Gorokhov, на приведённом куске кода у меня проблема также не воспроизводится Оригинальный скрипт - это более 3 тыс. строк кода. Я попытался его уменьшить, дабы локализовать проблему. Но столкнулся с тем, что при уменьшении ниже 1500 строк ошибка не возникает. Даже удаление неиспользуемых в скрипте функций приводит к тому, что проблема не воспроизводится. Отсюда я делаю вывод, что вероятность возникновения ошибки тем выше, чем больше размер глобальной таблицы.
Вы можете подтвердить или опровергнуть?
Цитата
Старатель написал: Что-то происходит с глобальной таблицей в колбэках.
Глобальная таблица как-то затрагивается, например для синхронизации потоков?
Надо делать так, как надо. А как не надо - делать не надо.
Ожидается реакция от разработчиков: Зависает скрипт со "сложной" в плане кода сортировкой. В коде сортировки нет ошибки: если использовать table.sort или переместить из main в колбэк, то сортировка работает.
Надо делать так, как надо. А как не надо - делать не надо.
повторный Init() без OnDestroy() в индикаторе, При смене инструмента графика в Lua индикаторе перечитывается файл без предварительного срабатывания OnDestroy()
Egor Zaytsev написал: То, что скрипт индикатора перечитывался заново.
В этом есть свой плюс: при изменении кода индикатора не нужно выполнять кучу манипуляций по его удалению и повторному добавлению на график. Достаточно переключить инструмент в режиме связанных окон туда-обратно. А вот обнуление значений переменных - это проблема: теряются хендлеры файлов, меток и пр.
Надо делать так, как надо. А как не надо - делать не надо.
ilushin, Вот специально проверил: если исключить первую минуту в 10 ч. и в 19 ч., то разница между соседними тиками по SiM7 составляет 42 пп. (13.04.17 19:05), а по RIM7 220 пп. (06.04.17 19:05) за весь апрель. И то, только потому, что вечерняя сессия в эти дни начиналась в 19:05. Так что, я склонен считать, что скорее имеет место ошибка в коде. Можете выслать. Будет время - я гляну.
Надо делать так, как надо. А как не надо - делать не надо.
QUIK 7.10.0.76. Иногда при подключении к серверу скрипт падает с ошибкой
Цитата
attempt to call global 'W' (a nil value)
W - это функция, которая крутится в цикле main. Она никак не может быть nil. Вот фрагмент кода:
Код
function OnConnected()
Sort = true
end
function W()
return nil
end
function main()
...
while run do
if Sort then
table.sort({0, 1}) -- сортировка никак не связана с функцией W, но без сортировки проблема не воспроизводится
Sort = nil
elseif not W() then -- тут возникает ошибка
else sleep(100) end
end
end
Целый день убил на поиск проблемы, пока не заглянул в глобальную таблицу _G. А её и нет: когда изменил код так:
Код
function main()
while run do
if Sort then
table.sort({0, 1})
Sort = nil
else
if not _G then message('Ahtung! Not _G', 3)
elseif not W() then
else sleep(100) end
end
end
end
то при подключении скрипт стал однократно выдавать сообщение об отсутствии _G (т.е. впоследствии _G снова обнаруживается) или падать с ошибкой
Цитата
attempt to call global 'W' (a table value) (неожиданно!)
Скрипт использует только функции из qlua.dll, не модифицирует функцию W, и не работает напрямую с глобальной таблицей.
Соответственно, вопрос разработчикам: есть ли в QLua какие-либо механизмы, способные так повлиять на работу?
Надо делать так, как надо. А как не надо - делать не надо.
повторный Init() без OnDestroy() в индикаторе, При смене инструмента графика в Lua индикаторе перечитывается файл без предварительного срабатывания OnDestroy()
Вопрос был задан потому, что для некоторых инструментов (календарные спрэды) цена может быть как положительной, так нулевой и отрицательной. Поэтому last = 0 для таких инструментов не является ненормальным.
Цитата
ilushin написал: Например, сегодня на Sim7 два случая было у меня. прислали цену минус 100 пунктов к цене, а через три часа прислали плюс 100 пунктов к цене.
Покажите лог.
Надо делать так, как надо. А как не надо - делать не надо.
повторный Init() без OnDestroy() в индикаторе, При смене инструмента графика в Lua индикаторе перечитывается файл без предварительного срабатывания OnDestroy()
Egor Zaytsev написал: ело в том, что подобные проблемы ранее возникали, если версия ниже 7.5, то обновитесь до актуальной 7.10.
В 7.10, как и в предыдущих, при смене инструмента скрипт индикатора перечитывается заново. При этом значения всех переменных принимают первоначальные значения. OnDestroy при этом не вызывается.
Надо делать так, как надо. А как не надо - делать не надо.
Как я раннее указывал старые инструменты и так остаются в кэше: И уж коль они есть, то пусть тогда и графики открываются. Просто уберите флаг запрета отображения графиков по бумагам с истёкшим сроком. Графики нужны для тестирования на history, т.к. новые инструменты пока для этого не годятся.
Надо делать так, как надо. А как не надо - делать не надо.
Несмотря на то, что инструменты сохраняются в sec.dat и таблице securities, графики - в кэше archive, по инструментам с истёкшим сроком не открываются графики. Зачем это ограничение?
Надо делать так, как надо. А как не надо - делать не надо.
Старатель написал: Так RGB(255, 0, 0) должен соответствовать числу 0xff0000, а по факту соответствует 0x0000ff Т.о., если подставлять число в HEX-формате получим совсем другой цвет.
Цитата
Michael Bulychev написал: Никакой ошибки мы тут не видим. Можете пояснить в чем проблема?
Ну я не знаю, как ещё объяснить В QLua функции работы с цветом (SetColor, Highlight, Settings.line[1].Color) принимают на вход число, не соответствующее цветовой схеме RGB. Т.о., если мы хотим загрузить из настроек цвет в HEX-формате (0xff0000), то для использования в QLua его надо сначала конвертировать в GBR (0x0000ff). Это и есть ошибка.
Надо делать так, как надо. А как не надо - делать не надо.
Michael Bulychev, я вас услышал. Проверять можно по косвенным признакам, например по "qty". Представители биржи уверяют, что обновление таблицы в биржевом потоке цельное.
А как обстоят дела в QUIK? Гарантированно ли, что если qty не равно 0, то в last точно будет цена? (Возвращаемся к вопросу из #3)
Надо делать так, как надо. А как не надо - делать не надо.