Здравствуйте! По названиям параметров ТТП, к которым можно обращаться с помощью функции getParamEx, иногда бывает трудно однозначно понять, что эти параметры означают и/или как рассчитываются их значения. Подскажите, пожалуйста, где можно взять подробное и актуальное описание всех параметров, которые транслируются с Московской биржи? Если оно есть на сайте биржи, то подскажите ссылку.
Андрей пишет: разрешающая информация для сделки - это именно сервер, а не документы файлы, информация брокера
Ну строго говоря, на сайте и в документах можно написать все что угодно, но если то же самое не прописать в настройках сервера Quik, то работать это все равно не будет. Поэтому доверять нужно в первую очередь информации из терминала, а не с сайта. Тем более, что на сайте ее могут просто забыть или не успеть обновить.
Кстати, вы этот вопрос уже задавали три недели назад... Что мешало узнать подробности у брокера?
Цитата
Дмитрий пишет: А вот это лучше у брокера спросить. Позвоните ему, не стесняйтесь. И пусть объяснит, почему информация в квике и на сайте разная. А Вы нам потом расскажите, что Вам ответил брокер - нам тоже интересно...
Поддерживаю пожелания sam063rus Лично меня напрягает процесс создания с помощью небогатых средств QLua для работы с экранными таблицами таких в общем-то стандартных элементов, как кнопки, переключатели, списки выбора, поля ввода и т.п. А пользоваться сторонними библиотеками без крайней необходимости не хочу (из соображений надежности и устойчивости работы скрипта).
И еще один вопрос: Если окно было закрыто не вручную, а с помощью вызова функции DestroyTable, то какое значение после этого должна вернуть функция IsWindowClosed?
Здравствуйте! В документации в описании функции IsWindowClosed сказано, что окно может быть открыто повторно с помощью функции CreateWindow. В связи с этим вопрос - после закрытия окна вручную (крестиком) можно сразу вызвать повторно CreateWindow, указав в качестве ее параметра старое значение идентификатора таблицы t_id? Или все-таки при повторном открытии окна необходимо перед вызовом CreateWindow опять вызывать AllocTable для получения нового идентификатора таблицы?
sam063rus пишет: Я, конечно, не спорю но, если можно, приведите примеры когда это имеет большое значение?
Цитата
Дмитрий пишет: В качестве примера можно привести такой оператор: if (t_id ~= nil) and not IsWindowClosed(t_id) then ...
Например, я подумал, а что если в результате вызова IsWindowClosed(t_id) или какой-нибудь другой функции (в том числе самописной) в таком же условном операторе при обработке ею значения параметра, равного nil, возникнет ошибка, которая приведет к аварийной остановке работы скрипта.
То же самое написано и в официальном описании языка.
Lua 5.1 Reference Manual : The conjunction operator and returns its first argument if this value is false or nil; otherwise, and returns its second argument. The disjunction operator or returns its first argument if this value is different from nil and false; otherwise, or returns its second argument. Both and and or use short-cut evaluation; that is, the second operand is evaluated only if necessary. http://www.lua.org/manual/5.1/manual.html#2.5.3
Lua 5.3 Reference Manual : The conjunction operator and returns its first argument if this value is false or nil; otherwise, and returns its second argument. The disjunction operator or returns its first argument if this value is different from nil and false; otherwise, or returns its second argument. Both and and or use short-circuit evaluation; that is, the second operand is evaluated only if necessary. http://www.lua.org/manual/5.3/manual.html#3.4.5
Constantin Constantin пишет: Это стандарт языка, а не оптимизация. Можно смело полагаться на такое поведение.
Вы правы, судя по тому, что написано в книге Programming in Lua (first edition) by Roberto Ierusalimschy: The operator and returns its first argument if it is false; otherwise, it returns its second argument. The operator or returns its first argument if it is not false; otherwise, it returns its second argument. Both and and or use short-cut evaluation, that is, they evaluate their second operand only when necessary.
Спасибо! Я правильно понимаю, что это стандартное поведение для Lua? Или все же не исключено, что в разных версиях/реализациях языка поведение в данном случае может быть различным?
Здравствуйте! Хотелось бы узнать, всегда ли интерпретатор Lua (и в частности QLua) вычисляет логические выражения полностью в операторах if, while и repeat, или же он прерывает их вычисление в том случае, когда результат уже заведомо известен? В качестве примера можно привести такой оператор: if (t_id ~= nil) and not IsWindowClosed(t_id) then ... Если t_id == nil, то будет ли в данном случае осуществляться вызов функции IsWindowClosed(t_id)? Ведь и без этого ясно, что данное выражение будет равно false. В компиляторах языков программирования типа Pascal или C (уже не помню точно какого из них) для управления поведением программы в таком случае была опция, которая называлась кажется "complete boolean eval", поскольку иногда этот вопрос имеет большое значение. А как с этим обстоят дела в (Q)Lua?
Думаю, что нельзя, если только не писать собственный индикатор. А вы умножьте период скользящей средней, построенной по часовому графику, на число торговых часов в сутках - и получите примерно то же самое (хотя отличия конечно будут).
Sergey Gorokhov пишет: Вам нужно попросить брокера предоставить историю графиков по волатильности.
Значит, у брокера есть возможность накапливать и затем передавать клиентам историю за предыдущие дни не только цен сделок и объемов, но и любых других параметров из ТТП?
sam063rus пишет: точные замеры тут не имеют смысла
Отсюда надо сделать вывод, что если важна быстрая реакция на события, по которым происходят срабатывания коллбэков, то полную обработку такого события нужно делать только внутри самого коллбэка, не доверяя это функции main() ?
sam063rus пишет: это справедливо на случай форс-мажора, т.е. при зависании одного из тредов
Значит, если сам терминал не зависнет (то есть его основной поток), то main() в описанном примере всегда сможет уже через доли секунды отреагировать на события, зафиксированные коллбэками (к примеру, не более чем через 100 мс)?
sam063rus пишет: таким образом, чтобы не терять в потери производительности - они остановились на этом варианте
По умолчанию можно оставить ту же самую настройку, что и сейчас - не более 3000 свечей. А если кому-то надо больше (невзирая на потерю памяти и производительности) - то это будет его выбор. Главное, чтобы возможность выбора была.
Цитата
sam063rus пишет: по документации максимальное время гарантированного переключения между тредами может доходить до 5 сек, а вреальности и того больше
Это значит, что если у нас работает скрипт на QLua, в котором используются коллбэки для фиксации каких-то событий (типа изменения ТТП, приход сделки и т.п.), а затем на эти события каким-то образом должен отреагировать алгоритм, описанный в функции main() (которая работает в отдельном потоке), то фактически такая реакция может отставать на несколько секунд?
Серж пишет: При этом чтобы не грузить терминал пользователь может задать в настройках "Отображать последние x свечей", что уже реализовано.
Если ограничение на количество свечей будет снято, то было бы хорошо добавить подобную настройку в основное меню, чтобы один раз введенное значение применялось ко всем вновь открываемым графикам. А уже при необходимости пользователь мог бы изменить его потом в свойствах отдельных графиков.
Внизу есть полоса прокрутки, аналогичная той, которую вы видите в редакторе Ворд справа от текста. Если ее нет и кнопка "показать весь график" неактивна, то вероятно вы и так уже видите весь график.
А то, какие выражения вы используете при сравнении этих чисел, никак не повлияет на Ваши дальнейшие вычисления, так как значения этих чисел в результате сравнения все равно не изменятся.
Тогда Вам поможет следующий вариант, уже написанный мною выше: math.floor(qt.bid[i].price*PRICE_SCALE) == math.floor(current_order_price_buy*PRICE_SCALE) или правильней так, чтобы округление было по правилам математики, а не просто отсечение дробной части: math.floor(qt.bid[i].price*PRICE_SCALE) == math.floor(current_order_price_buy*PRICE_SCALE + 0.5)
Michael Bulychev, подскажите, пожалуйста, а отдельной функции округления по правилам математики в Lua нет?
И кстати значение current_order_price_buy=91.7027 откуда берется? Если в результате какой-то арифметической операции, то разряды. дающие разницу между этими переменными, могут быть просто не видны, т.к. больше 6 разрядов после точки не отображается.
Два раза левой кнопкой мыши по пустому месту на графике щелкнули - открылось окно "настройка параметров диаграммы", закладка "параметры отрисовки", там все что Вам надо, в том числе можно выбрать шрифт и цвет шрифта.
Андрей 77 пишет: Причем каждый раз, несмотря на заданное наименование бумаги, РУКАМИ вбивать его в форму.
ну вообще-то можно построить текущую таблицу параметров по классу "акции" и уже по каждой строчке нажимая строить график. Так что вводить названия руками нет нужды.
function main()
file = io.open("C:\\DATA\\test_short.txt", "w+t")
local firm_id = "XXXXXXXXXXXX"
local client_code = "XXXXX"
local sec_list = getClassSecurities("TQBR")
count = 0
for sec in string.gmatch(sec_list, "%w+") do
count = count + 1
local t = getBuySellInfo(firm_id, client_code, "TQBR", sec, 0)
if t == nil then
file:write(count .. " : " .. sec .. " - nil\n")
else
file:write(count .. " : " .. sec .. "\n")
for key, v in pairs(t) do
file:write(key .. " - " .. v .. "\n")
end
file:write("\n")
end
end
file:close()
end
Дмитрий пишет: is_margin_sec - Признак маржинальности инструмента. Возможные значения: «0» – не маржинальная; «1» – маржинальная Под маржинальной имеется в виду акция, доступная для короткой продажи (т.е. продажи в долг)?
Добрый день! Сейчас прогнал тест по всем акциям - ни одна из них не имеет значения "1" в поле is_margin_sec, хотя заведомо знаю (по таблице купить/продать), что акций, по которым разрешена короткая продажа - почти два десятка.
Серж пишет: функция CreateDataSource() заказывает данные по интересующему параметру только в том случае, если этот параметр задан вручную в настройках меню "Связь - Списки..."
А если у меня включена настройка "Формировать список получаемых инструментов и параметров - Исходя из настроек открытых пользователем таблиц"? Тогда по идее терминал никак не должен реагировать на настройки в меню "Связь - Списки..." В таком случае мне нужно открывать соответствующую таблицу с нужными мне параметрами?
Серж пишет: Но, к сожалению, она бесполезна (равно, как и вариант с запоминанием значений по времени) без шаманства в меню "Связь - Списки..." (CQ01544135).
А можно немного подробней - о чем в данном случае речь (почему бесполезна и что за шаманство)? По указанному номеру (CQ01544135) статей на форуме не нашел.
А нельзя сохранить значения этих параметров по состоянию, например, на 9:55, 18:50 и 23:55 ? А потом вычесть значение на 9:55 из значения на 18:50, затем прибавить к этой разности значение по состоянию на 23:55
Серж пишет: Для ФОРТС сложнее: с вечерней сессии отсчёт начинается по-новой.
Проблема в том, что нет сделок за вчерашнюю вечернюю сессию? Если так, то включите получение всех сделок по классу FUTEVN (для фьючерсов) или OPTEVN (для опционов)
А если в приведенном примере внутри функции mycallbackforallstocks мне нужно получить номер изменившейся свечки, то нужно добавить в ее описание третий параметр index ?
Код
function mycallbackforallstocks(class,security,index,...)
message(class .. " " .. security .. " - " .. tostring(index), 1)
end
ds:SetUpdateCallback(function(...) mycallbackforallstocks(class,security,index,...) end)
Sergey Gorokhov пишет: Но так как действия будут производиться одни и те же, будет удобней создать одну функцию, а через колбеки просто ее вызывать
Проблема в том, что эта функция должна как-то узнать, источником данных по какому инструменту (и таймфрейму) в данный момент она была вызвана.
s_mike@rambler.ru, спасибо за подсказку. Только я не совсем понял, в приведенном ниже коде должны быть именно троеточия или на их месте должно стоять что-то другое:
Код
function mycallbackforallstocks(class,security,...)
message(class .. " " .. security,1)
end
function DataSource(class,security,interval)
local ds = CreateDataSource(class,security,interval)
ds:SetUpdateCallback(function(...) mycallbackforallstocks(class,security,...) end)
return ds
end