s_mike@rambler.ru написал: прокси запущен один раз, в цикле проверяет изменение времени файла отлаживаемого скрипта и если оно изменилось - исполняет посредством dofile.
Я всё же перезапускаю скрипты реже, нежели сохраняю. Или наоборот. Короче, эти два события не связаны.
Цитата
Roman Azarov написал: Речь идет о том, что именно так поведение окон реализовано на данный момент. Поэтому в данном случае оно корректно.
"Железная логика"! Калькулятор считает не правильно, но так реализовано. Поэтому корректно. Бред конечно, но главное самому верить в то, что пишешь, да?
Пожелание сейчас не готов сформулировать. Хрен с ним, мож кому-то так удобней. Но BUG извольте зафиксировать:
Цитата
Более того, если переключиться с одной вкладки на другую, где окно со свойством "Показывать на всех", является активным, а потом вернуться обратно, просто переключить вкладку туда-сюда и больше ничего, то на всех вкладках это окно вылазит на передний план. Такое поведение для любого окна является некорректным.
Положение окон не должно меняться при простом переключении вкладок. И у меня какое-то чувство дежавю: по-моему уже писал об этом несколько лет назад.
Надо делать так, как надо. А как не надо - делать не надо.
Более того, если переключиться с одной вкладки на другую, где окно со свойством "Показывать на всех", является активным, а потом вернуться обратно, просто переключить вкладку туда-сюда и больше ничего, то на всех вкладках это окно вылазит на передний план. Такое поведение для любого окна является некорректным.
Надо делать так, как надо. А как не надо - делать не надо.
Roman Azarov написал: Данное поведение является корректным и проявляется не только на окне "Доступные скрипты" (при наличии более 2х окон на вкладке).
Возможно, вы правы в отношении других окон. Но, поскольку окно "Доступные скрипты" является дофига большим, то мне не удобно данное поведение именно этого окна. Т.к. скрипт может создать таблицу только на той вкладке, на которой запущен, то приходится держать окно "Доступные скрипты" на всех вкладках, чтобы не городить таблицы от всех скриптов на одной вкладке. И чтобы окно "Доступные скрипты" не занимало полезного пространства, его часть перекрываю другими окнами. Но когда на одной вкладке запускаешь скрипт, "Доступные скрипты" на всех вкладках вылазит на передний план. Если бы у вас в команде был бы хоть один человек, работающий (в прямом смысле этого слова) с вашим продуктом под названием QUIK, то он бы объяснил вам насколько не удобно работать со скриптами. А разработчику скриптов - это не один раз запустил и забыл. Приходится десятки раз на дню перезапускать их
Надо делать так, как надо. А как не надо - делать не надо.
Видео Описание: Две вкладки, на каждой открыто по окну, в данном случае ТТТ, а также окно "Доступные скрипты", которое перекрывается первым окном. "Доступные скрипты" делаю "Показывать на всех вкладках". Когда активирую окно "Доступные скрипты" на одной вкладке, то на другой положение (перекрывание) окон сохраняется. Но когда запускаю Lua скрипт с созданием окна, этот порядок нарушается. На видео окна на Вкладке 1 расположил в следующем порядке (сверху вниз): Lua-окно, ТТТ, Доступные скрипты. Далее переключился на вкладку 2 и активировал окно "Доступные скрипты". Возвращаюсь на вкладку 1, порядок поменялся: Lua-окно, Доступные скрипты, ТТТ.
Надо делать так, как надо. А как не надо - делать не надо.
Anton написал: пожелаем, чтоб нам дали функцию в луа типа STRING getClassParameters(STRING classcode).
Я другое хотел предложить: возвращать таблицу вида: {["Имя параметра"] = "Формальный заголовок", } Но не знаю, насколько это юзабельно, поэтому не стал
Надо делать так, как надо. А как не надо - делать не надо.
Andrey Bezrukov написал: Скрипт может "узнать" о заявке / сделках / позициях благодаря функциям обратного вызова QLUA OnOrder, OnTrade и др. или в результате обращения к таблицам заявок, сделок, позициями, ограничениям с использованием функций getItem, getOrderByNumber, getNumberOf, SearchItems.
Я в курсе. Но если getNumberOf возвращает 0, это не значит, что позиции не открыты. Это также может означать, что клиент ещё не получил ни одной записи о позициях.
Цитата
Andrey Bezrukov написал: можем зарегистрировать пожелание на индикацию в скрипте о том, что необходимые для отображения таблиц данные были получены с сервера после очистки
Что имеется ввиду под "необходимые для отображения таблиц данные"?
Надо делать так, как надо. А как не надо - делать не надо.
_sk_ написал: По второму пункту хотелось бы понять, как избежать постоянных проверок, что информация отсутствует.
Можно в OnConnected проверить список доступных классов getClassesList() и, если нужный класс ещё не загружен, то не дёргать getSecurityInfo вообще. Но конкретно с бумагой сложнее: информация по бумаге может загрузиться в любой момент без уведомления.
Цитата
_sk_ написал: Возможно, что при перезагрузке данных в таблицах имеет смысл блокировать запросы к функциям типа getSecurityInfo(), пока они не могут вернуть данные. Пусть скрипты подождут на этой блокировке.
Вы и сами это можете сделать тупым зацикливанием с постоянной проверкой возвращаемого результата от функции. Но есть вероятность зависнуть тут навсегда.
Надо делать так, как надо. А как не надо - делать не надо.
Пусть будет SBER. И думается мне, что чем больше времени прошло с начала торгов, тем дольше надо ждать. Поэтому проверять лучше ближе к концу торговой сессии.
Надо делать так, как надо. А как не надо - делать не надо.
QUIK 8.9.0 Если установлена галка "Получать информацию по обезличенным сделкам с текущего момента", то после подключения к серверу сделки начинают поступать только через несколько минут
Надо делать так, как надо. А как не надо - делать не надо.
возможна ли ситуация с получением данных графика, когда свеча уже имеется (учтена в getnumcandles), но ее значение не заполнено и по getCandlesByIndex возвращаются ohlcv 0?
На диаграмме несколько графиков?
Надо делать так, как надо. А как не надо - делать не надо.
Магический шар подсказывает, что ТС путается в типах данных: положил в массив с ключом одного типа, а ищет в ячейке с ключом другого типа. Естественно, там nil
Надо делать так, как надо. А как не надо - делать не надо.
Evgeniy Karnaukhov написал: если для инструмента, на который создавался стакан, доступна транзакция "Удалить все заявки по условию", то при нажатии на панели торговли на кнопку "Снять все активные заявки из текущего окна котировок" происходит выполнение этой транзакции; а если такая транзакция недоступна, то происходит обычное снятие заявок, как есть сейчас
А также для кнопок "Снять все активные заявки на покупку..." и "Снять все активные заявки на продажу..."
На самом деле, по второму пункту немного сложнее, поскольку транзакция "Удалить все заявки по условию" на FORTS снимает заявки по коду базового актива, т.е. могут быть сняты заявки не только из текущего стакана. И алгоритм в этом случае примерно следующий: 1) Определяем код базового актива 2) Пробегаемся по таблице заявок и собираем в массив активные заявки с инструментами, базовым активом, для которых является код из п.1 3) а) если среди найденных нет заявок по тому инструменту, из стакана которого подавалась заявка, то ничего не делаем, иначе б) если среди найденных только заявки по нашему инструменту, то применяем транзакцию "Удалить все заявки по условию", иначе в) снимаем все заявки по одной (как сейчас)
Надо делать так, как надо. А как не надо - делать не надо.
Evgeniy Karnaukhov, Когда мы нажимаем одну из кнопок в панели снятия заявок по условию или горячие клавиши (Ctrl + F8, Ctrl + Z, Ctrl + X), то QUIK делает следующее: пробегает по всем активным заявкам и отправляет на сервер по одной транзакции на снятие для каждой заявки, удовлетворяющей условию. Я предлагаю при наличии хоть одной активной заявки, удовлетворяющей условию, отправлять всего одну транзакцию "Удалить все заявки по условию". Если эта транзакция не доступна для данного инструмента, то выполнять снятие по прежнему алгоритму.
Цитата
Evgeniy Karnaukhov написал: Может Вы имеете в виду функцию "Снятие заявок по условию" ("Сервисы" - "Снятие заявок по условию...")?
Для этого сервиса также можно применять транзакцию "Удалить все заявки по условию".
Надо делать так, как надо. А как не надо - делать не надо.
Evgeniy Karnaukhov написал: подходят ли уже существующие кнопки, удаляющие заявки, которые расположены на панели торговли ("Снять выделенную заявку", "Снять все активные заявки на продажу...", "Снять все активные заявки на покупку...", "Снять все активные заявки...")?
Подходят, только
Цитата
Старатель написал: 2. снимать все заявки, удовлетворяющие условию, одной транзакцией вместо по_одной_транзакции_на_каждую_заявку.
Надо делать так, как надо. А как не надо - делать не надо.
Evgeniy Karnaukhov, данный функционал уже существует, но использует несколько транзакций вместо одной. Предлагаю: 1. перемещать заявки методом drag-and-drop с помощью одной транзакции вместо двух. 2. снимать все заявки, удовлетворяющие условию, одной транзакцией вместо по_одной_транзакции_на_каждую_заявку.
Надо делать так, как надо. А как не надо - делать не надо.
1. Перемещать мышкой заявку в стакане транзакцией "Переставить заявки" ("Изменение заявки"), если доступен данный тип транзакции для инструмента. Если по одной цене стоят несколько заявок, то применять операцию для последней выставленной заявки (для двух последних на FORTS).
2. Снимать заявки (панель снятия заявок по условию в стакане) транзакцией "Удалить все заявки по условию", если доступна.
Надо делать так, как надо. А как не надо - делать не надо.
Откройте вкладку с графиками и таблицами, в т.ч. стаканами. И нарисуйте схематично, как бы вы адаптировали при изменении размеров главного окна. Думаю, сами поймёте.
Надо делать так, как надо. А как не надо - делать не надо.
Роман написал: окно квика и окна внутри него отображаются пропорционально окну квика
Вы же в курсе, что кроме графиков, в квике существуют таблицы, которые нифига не мастабируются? Это и была неудачная попытка изменять размеры внутренних окон пропорционально внешнему.
Надо делать так, как надо. А как не надо - делать не надо.
Anton написал: Вы жмете кнопку остановить, главный поток квика посылает OnStop, скрипт оттуда возвращается, главный поток квика входит в WaitForSingleObject. В этот момент мейн вызывает SetCell, что под ковром приводит к отправке сообщения окну скрипта (живущему в главном потоке). Но главный поток сообщений не обрабатывает, он стоит на WaitForSingleObject. Ваш мейн зависает в ожидании ответа на сообщение. Через 5 секунд WaitForSingleObject возвращается по таймауту, квик видит таймаут и прибивает мейн принудительно.
Цитата
Anton написал: проверять флаг f перед каждым вызовом SetCell.
На мой взгляд, это уже зона ответственности квика: при вызове SetCell проверить не было ли команды OnStop. И если была, то игнорировать все оконные команды (раз они всё равно не могут быть исполнены) и переходить к выполнению следующих инструкций.
Цитата
TGB написал: Наверное, стоит "выкатить", обнаруженное Вами, поддержке QUIK.
Anton, так и у меня может до нескольких дней без зависаний работать. Но всё же проблема есть, в т.ч. в 8.9
Попробуйте следующий скрипт, также зависает:
Код
local run = true
local z = {0, 0}
local ssort = table.ssort
function OnAllTrade(alltrade)
ssort(z, function () return true end)
end
function OnParam(class, sec)
end
function OnStop()
run = nil
end
function f1()
for k, v in pairs(_G) do end
end
local function f2()
f1()
end
local function f3()
f2()
end
local function f4()
f3()
end
function main()
while run do
for i = 1, 50 do
f4()
end
sleep(1)
end
end
Зачем вложенные функции? Дело в том, что если использовать pairs непосредственно в цикле main, то скрипт раньше остановится с ошибкой
Цитата
invalid key to 'next'
Что делал, чтобы не ждать неделю и быстрее воспроизвести: заказал обезличенные сделки по всем инструментам, запустил три скрипта и по очереди каждый останавливал и запускал. Занятие довольно нудное, но результат будет быстрее.
Надо делать так, как надо. А как не надо - делать не надо.
Владимир, у меня нет навыка чтения мыслей. В той строчке кода, что вы привели нет tonumber. Вы можете привести полный код скрипта или продолжить возмущаться, но лучше не на этом форуме, т.к. тут общаются взрослые дяди
Надо делать так, как надо. А как не надо - делать не надо.
Anton написал: все остальное там это кэш информации
Кешировать степень числа (pwr10) не имеет смысла, т.к. возведение в степень быстрее в два раза, чем вытащить значение из таблицы. А вот операции со строками в Lua на порядок дольше, т.ч. strf будет полезно.
Надо делать так, как надо. А как не надо - делать не надо.
Владимир написал: а не хочу я узнать тип переменной - мне нужно, чтобы она не меняла свой тип,
В Lua, как и большинстве (или всех?) других языков, тип переменной произвольно не меняется. Тип может измениться только при определённых действиях над переменной. И опытный программист всегда знает, какой тип переменной будет при той или иной операции над переменной.
Надо делать так, как надо. А как не надо - делать не надо.
Следующий тест: запустил скрипт 1 и три скрипта 3 (дабы быстрее получить результат) с вашей патченой длл. Сделал несколько тестов. Ошибки не дождался, т.к. QUIK зависал по уже знакомой схеме: main одного скрипта прибит, остальные скрипты крутятся, основной поток остался в состоянии ожидания.
Сейчас вышла версия 8.9. Посмотрим насколько она стабильнее.
Надо делать так, как надо. А как не надо - делать не надо.
Понятней не стало )) Мож, ваша ошибка, мож, баг квика, мож, кривые ручки брокера...
Цитата
Nikolay написал: Но все же, параметры TIME и LAST синхронизированы? Т.е. если мне брокер прислал в колбеке цену по времени пол часа назад, то параметр TIME укажет это?
Если ошибка не на вашей стороне, то какие тут могут быть гарантии?
Надо делать так, как надо. А как не надо - делать не надо.
Nikolay написал: Сегодня брокер выдал в OnParam по фьючерсу RIZ0 цену последней сделки из прошлого. В 17.37 цена была одна, а колбек выдал цену где-то на пол часа назад, очень далекую от текущей.
Можете подробней? Как это произошло? Вы только запустили робота и получили старый результат? Или работал себе робот, получал актуальные данные, и тут раз и однократно проскакивает цена из прошлого? Сам колбек OnParam возвращает только класс и код инструмента, в котором произошли изменения. Каким образом получаете котировку?
Надо делать так, как надо. А как не надо - делать не надо.
Anton написал: вы тоже наблюдаете такой эффект: если много этих тестовых скриптов запущено, таблица всех сделок не успевает обновляться, перерисовывается изредка сразу с большим шагом.
У меня в таблицу обезличенных сделок добавлен только один инструмент: либо какой-нибудь старый уже истёкший фьючерс либо какой-то неторговый. Т.ч., по факту само окно пустое, а сделки заказываю через фильтры (либо скриптом).
Надо делать так, как надо. А как не надо - делать не надо.