for bid_i=1, bid_count, 1 do
bid_quantity = tonumber( bid[bid_i]["quantity"] )
if (bid_quantity > max_bid_count) then
max_bid_count = bid_quantity
max_bid_price = bid[bid_i]["price"]
end
end
почему я тут могу получить NIL? или если у меня не загрузится стакан, то как раз поэтому у меня NIL и выходит?
У нас не воспроизводится. Приведите полный текст ошибки.
Eldar пишет: получается что обычно OnQuote работает с открытыми стаканами, но через Subscribe_Level_II_Quotes я подписываюсь на изменения. то есть в первом цикле делаю Subscribe_Level_II_Quotesпо всем тикетам, а потом отрабатываю через OnQuote (а внутри через getQuoteLevel2) ? второй цикл не нужен, так как изменить данные нужной строки таблицы вывода я могу через SetCell, где ключем будет код бумаги.
Вы программист, Вам решать какую логику использовать.
Здравствуйте, Ваше пожелание зарегистрировано. Мы постараемся рассмотреть его и сообщить Вам результаты анализа. Впоследствии, по результатам анализа, будет приниматься решение о реализации пожелания в будущих версиях ПО.
Sergey Gorokhov пишет: Вынесите Subscribe_Level_II_Quotes в отдельный цикл, перед строкой "while is_run do" заказывать постоянно одни и те же стаканы нет смысла. Плюс, сам цикл "for i=1, 30 doсовершенно не понятен. Зачем он?
мне надо запросить объемы в стаканах по 30 бумагам. мне Subscribe_Level_II_Quotes запросить один раз на каждую бумагу в отдельном цикле?а потом получать стакан по getQuoteLevel2?
Посмотрите код внимательней.
Вот Вы гоняете в цикле все бумаги по очереди:
Код
for key, value in spairs(tikets) do
Далее, для каждой из этих бумаг Вы вызываете функцию Quotes в которой вызываете цикл "for i=1, 30 do" Таким образом, если в таблице "tikets" у Вас 30 бумаг, то в общем случае, за одну итерацию, цикл "for i=1, 30 do" приведет к тому что функции внутри него будут вызваны 30*30=900 раз. Конечно, сложно судить не видя полного кода, но на мой взгляд 900 раз вызывать одни и те же функции совершенно излишне.
"Eldar пишет: и т.д. первая проблема -перебор 30 строк в таблице это долго.
Вынесите Subscribe_Level_II_Quotes в отдельный цикл, перед строкой "while is_run do" заказывать постоянно одни и те же стаканы нет смысла. Плюс, сам цикл "for i=1, 30 do совершенно не понятен. Зачем он?
Цитата
Eldar пишет: вторая -если сделаю меньший sleep то часто не получаю данные стакана.
На заказ данных по очередному скакану требуется время, но 250 как-то много. обычно хватает 10-50. Быть может терминал чем-то нагружен? Попробуйте провести эксперимент с sleep(50) но при этом закрыв все посторонние окна в терминале.
Цитата
Eldar пишет: временами ошибка attempt to perform arithmetic on local 'delta ' (a string value )
Тут проще, если стакан не полный, то при обращении к пустой строке стакана функция выдаст nil, отсюда и ошибка.
Цитата
Eldar пишет: причину отловить не могу. механизмов отладки нет (или я не нашел где они).
Механизмов отладки много, самый простой это логирование через PrintDbgStr. Также в интернете можно почитать про Decode и ее аналоги.
Ваше пожелание зарегистрировано. Мы постараемся рассмотреть его и сообщить Вам результаты анализа. Впоследствии, по результатам анализа, будет приниматься решение о реализации пожелания в будущих версиях ПО.
Kirill Toporkov пишет: Может существуют еще какие-то способы устранения проблемы или нужно искать проблему в DDE?
Проблема с самого начала была именно в DDE сервере. Эксперимент с увеличением параметра, только доказывает это. Соответственно, если и можно сделать что-то, то именно на стороне Вашего DDE сервера.
Kirill Toporkov пишет: Подскажите, как избавиться от этой проблемы?
если терминал Quik передает данные в DDE сервер очень быстро, а сам DDE сервер не успевает обрабатывать поступающие в него данные, то происходит накопление очереди из отправляемых данных. В результате чего происходит торможение. попробуйте увеличить параметр price-timeout
Viktor MMM пишет: 1. Идентификатор пользователя (trans_order["uid"])
UID это номер Вашей учетной записи в базе Вашего брокера.
Цитата
Viktor MMM пишет: А как через sendtransaction в эти поля занести значения? Поле COMMENT из гайда не работает. Но там и написано, что оно для группового снятия. Значит есть какое-то другое поле. Какое?
Комментарий указывается в параметре CLIENT_CODE после знака разделителя "//" или "/" (зависит от настроек на стороне брокера) Например: ["CLIENT_CODE"]="12345//Привет"
Ваше пожелание зарегистрировано. Мы постараемся рассмотреть его и сообщить Вам результаты анализа. Впоследствии, по результатам анализа, будет приниматься решение о реализации пожелания в будущих версиях ПО.
Сергей Радченко пишет: просьба добавить возможности: 1 менять цвет у линии в индикаторе 2 Также добавьте отображение индикатора в виде баров, свечей, гистограммы. 3 Будет супер если появится возможность рисовать индикаторы, графики без привязки ко времени.
1. Менять цвет уже сейчас можно. или имеется в виду динамическое изменение цвета? 2. мы уже работаем над этим 3. в этом пункте не совсем понятно. уточните пожалуйста на примере.
Viktor MMM пишет: Совершенно верно. Двумя и более.
Просто так, такое событие сделать не получится. Нам известно что пользователи решают задачу использованием Named pipe. Также кто-то даже написал отдельную dll которая использует Name Space. Но проще всего использовать простое чтение/запись из файла
Поделиться ссылками на примеры не могу, так как это сторонние проекты.
Серж пишет: Правильно ли я понимаю ваш ответ, что в QUIK поддерживаются параметры/значения_параметров транзакций различных бирж, не описанные в Руководстве пользователя QUIK? Нам осталось только угадать как они могут называться в вашей интерпретации?
Не надо ничего гадать, все транзакции которые не описаны в нашей документации, имеют стандартные параметры описанные в интерфейсе к конкретной бирже. Одно лишь перечисление всех возможных полей транзакций заняло бы в руководстве страниц 200. Поэтому простите, но описывать их мы не будем.
Все доступные транзакции всегда есть в меню Торговля - Транзакции. Все транзакции которые там есть можно добавить в карман транзакций и от туда сохранить в tri файл таким образом можно узнать какие параметры можно вводить в транзакции.
Нет Вы поняли не правильно. Если у Вас нет открытого графика по нужному инструменту, но ранее он открывался, значит Вы не подписаны на изменение по нему данных. В этом случае данные в терминале есть и CreateDataSource сработает, но только для тех данных которые остались в памяти терминала. Если в течении сессии график вообще не открывался, то CreateDataSource вообще не сработает в этом случае нужно заказать данные. Это можно сделать либо открыв окно с графиком, либо вызвав функцию ds:SetEmptyCallbac() один раз.
На сколько становится понятно, график у Вас не открыт и скорее всего открываться не будет. Значит напишите так:
Сергей Радченко пишет: Как определить оптимальное время на закачку? Просто если поменять инст. на RIM5 проблем нет. Куда втыкать sleep до CreateDataSource или после и сколько ставить единиц? Как определить полноту передачи массива свечей?
Втыкать sleep после CreateDataSource Определить можно только поставив эксперимент.
Цитата
Сергей Радченко пишет: SetUpdateCallback позволяет генерить событие если свечка изменилась, а если не изменилась , то ничего не делать. Да это здорово для обработки текущей свечи. Но я больше склоняюсь к получению данных из таблиц данных через getParamExкак пример getParamEx ("SPBOPT", mas_opt_par["code"], "NUMCONTRACTS").param_value
Если Вы используете getParamEx зачем Вам CreateDataSource? Да еще и с интервалом 15. Если для того чтобы заказать данные то нужно использовать тиковый интервал и подписаться через SetEmptyCallback()
Сергей Радченко пишет: если воткнуть sleep(100) в самом начале то выведет
Да на закачку данных требуется время, так и должно быть.
Цитата
Сергей Радченко пишет: Как лучше получать данные если иструментов для работы в цикле много, и обращения частые? У меня задача тащить по одной свечке из множества инст. и хотелось бы получать правильные данные.
lergen пишет: Нужно указывать именно актуальную цену(лучший бид/аск) или вариант с макс/мин возможной(худшей) ценой должен также работать?
Трансляция мин/макс цен на опционах появилась сравнительно недавно. Если она у Вас транслируется, можете использовать ее. Если нет, значит брокер еще не обновил шлюз, тогда используйте бид/аск
Sergey Gorokhov пишет: речь идет про SetUpdateCallback. Для него интервал не имеет значения ( не считая тикового ).
А в чем разница работы SetUpdateCallback при выборе тикового интервала и при выборе любого другого?
Тиковые данные, это по сути Таблица Всех Сделок только в виде графика, а интервальные данные это уже сжатая информация с сервера. От сюда возникает гигантская разница в количестве. Интервальных данных может быть максимум 60*24+3000=4440, а тиковых неограниченное количество. Из за этого при работе с тиковыми данными могут быть тормоза
Серж пишет: ечь в данном случае идёт о получении изменения параметров или таблице истории изменений. Разве для этого имеет значение интервал (не считая тикового)?
речь идет про SetUpdateCallback. Для него интервал не имеет значения (не считая тикового). Поэтому и ответ "на свое усмотрение"
Optimus1 Optimus1 пишет: Ну хотя бы такую инфомрацию. Вопрос в том, можно ли эту информацию получить офф.лайн, то есть, как таблицу истории по стакану в конце дня, потому как собирать ее в течении для онлайн, не вариант прям.
Серж пишет: А пока данное пожелание не реализовано, разумно ли вместо OnParam использовать функции CreateDataSource и SetUpdateCallback на каждый из отслеживаемых параметров? Не окажет ли это негативного влияния на производительность?
Здравствуйте, На производительность не должно оказать влияния, но с оговоркой что речь идет о разумном количестве заказываемых параметров.
Дмитрий пишет: добавить в функцию OnParam(STRING class_code, STRING sec_code) еще один параметр, сообщающий, изменение значений каких именно параметров ТТП привело к вызову этой функции
Ваше пожелание зарегистрировано. Мы постараемся рассмотреть его и сообщить Вам результаты анализа. Впоследствии, по результатам анализа, будет приниматься решение о реализации пожелания в будущих версиях ПО.
sam063rus пишет: слишком большие накладные расходы, снижение быстродействия.
Но это же нужно только для ответа на вопрос автора. Никто не заставляет держать кучу таблиц одновременно. к тому же на производительность это не должно влиять только на удобство просмотра.
Цитата
Дмитрий пишет: Или все же биржа отправляет в этом случае только текущие (последние) значения параметров?
Sergey Gorokhov пишет: А то что цифры в этом изменении фактически остались те же никто не проверяет
Кстати, если интересно, отследить параметр который изменился, все таки можно. Если построить по каждому из параметров, отдельную таблицу истории. Для каждого параметра своя таблица. Потом посмотреть по времени, какой из параметров прислал два одинаковых значения подряд тот и виноват
Дмитрий пишет: Непонятно, как программа узнает об этих изменениях, если она получает данные только срезами, а эти изменения произошли в промежутке между срезами и в конечном счете на момент получения второго среза ничего не изменилось.
Раз в период, с биржи приезжает кучка параметров. Эта кучка отправляется от сервера клиенту. Клиент в свою очередь, обновляет только те данные которые приехали, а те которые не приехали оставляет в предыдущем значении. раз в промежуток между срезами были изменения, то биржа отправит эту самую кучку. А то что цифры в этом изменении фактически остались те же никто не проверяет
sam063rus пишет: есть лишь обычная программа-сервер, которая мониторит изменение биржевого потока и выдаёт его клиентам
Это надо понимать так, что когда речь идет о получении значений ТТП срезами, то это касается лишь передачи данных от сервера QUIK в терминал, в то время как сам сервер QUIK получает с биржи и отслеживает абсолютно все изменения этих параметров непрерывно , а не срезами?
Никто ничего не "мониторит" То есть, не существует какого-либо алгоритма определения "изменились данные" или это "предыдущее значение". Раз в период, с биржи приезжает кучка параметров. Эта кучка отправляется от сервера клиенту. Клиент в свою очередь, обновляет только те данные которые приехали, а те которые не приехали оставляет в предыдущем значении
Optimus1 Optimus1 пишет: Если изменения были, почему мы не увидим их в таблице историй ?? Ведь изменения произогли во время среза. Если же изменение произошли в промежутками между срезами, то система, как я понимаю, не должна знать о изменении/
Если по простом, например, до среза было 100 заявок, произошел срез он показал в таблице 100 заявок. Потом произошло увеличение стало 101 и тут же уменьшение, опять 100. Для программы это означает что данные изменились значит их нужно показать, вот он и показывает цифру 100.
Дмитрий пишет: То есть получается, что, с одной стороны, в терминале нет данных о том, что параметр изменился. А с другой стороны они вроде бы в терминале есть, раз такая строка попадает в Таблицу истории значений параметров.
Получается что так. Если предложите способ как обойти эту ситуацию, можем зарегистрировать пожелание