Интерпретатор языка Lua. Руководство пользователя:
Скрытый текст
3.11.1 sendTransaction В качестве параметра принимает таблицу, в которой имена и значения полей соответствуют параметрам tri-файла (см. Руководство пользователя QUIK, Раздел 6 «Совместная работа с другими приложениями», п. 6.11.3).
А там:
6.11.3 Формат .tri-файла с параметрами транзакций EXPIRY_DATE Срок действия стоп-заявки. Возможные значения: * «GTC» – до отмены * «TODAY» – до окончания текущей торговой сессии, * Дата в формате «ГГГГММДД»
И чтобы 2 раза не вставать: ORDER_KEY: Номер заявки, снимаемой из торговой системы Применяется при «ACTION» = «KILL_ORDER» или «ACTION» = «KILL_NEG_DEAL» или «ACTION» = «KILL_QUOTE»
-- classCode, trans_id, order_num заданы корректно
local trans_params = {
["CLASSCODE"] = classCode,
["TRANS_ID"] = trans_id,
["ACTION"] = "KILL_ORDER",
["ORDER_KEY"] = order_num
}
local res = sendTransaction(trans_params)
if string.len(res) == 0 then
message('Заявка на снятии: '..order_num)
-- момент снятия фиксируется в OnOrder()
else
message('Ошибка снятия заявки '..order_num..". Причина= " .. res)
-- какие-то действия при этом
end
Сегодня словил это, на демо:
Интересное явление: QUIK это увидел и отразил в сообщении, OnTransReply() никак не среагировал (((. Как же подобное отлавливать на QLua? Или это - особенности демо-версии?
local v = '6.17'
if versionLess(Terminal_Version,v ) then
table_insert=table.insert
table_remove=table.remove
table_concat=table.concat
else
table_insert=table.sinsert
table_remove=table.sremove
table_concat=table.sconcat
end
Можно ли сделать так, чтобы всем было одинаково хорошо: и тем, кто применяет QUIK 6.0, и тем, у кого 6.17 и тем, кто юзает модный Dark Metro style QUIK 7.1? Наверно нет. Только QUIK 7.1, только хардкор!
local trades = {} -- таблица наших сделок
local tmp_tr = {} -- временная таблица наших сделок для отсева дублей OnTrade
function OnTrade(trade)
-- <...>
if not tmp_tr[trade.trade_num] then
-- добавим в таблицу первый колбэк.
tmp_tr[trade.trade_num] = true
-- добавим в очередь на обработку.
table.insert(trades,trade)
end
end
function OnTradeDo(trade)
-- <...обработать сделку>
end
function main()
-- <...>
if #trades~=0 then
while #trades>0 do
local t=table.remove(trades,1)
-- сделку отправим на обработку, таблицу чистим.
if t~=nil then OnTradeDo(t) end
end
end
-- <...>
end
Сильно не хотел добавлять лишние временные таблицы. :-|
Интерпретатор языка Lua, Руководство пользователя, Версия 2.3
2.2.3 OnTrade Функция вызывается терминалом QUIK при получении сделки.
Так быть должно: получили сделку, получили колбэк. Эта функция отличается от соседней:
Цитата
2.2.4 OnOrder Функция вызывается терминалом QUIK при получении новой заявки или при изменении параметров существующей заявки.
Есть заявка, и ее параметры могут меняться: регистрация, частичные исполнения, отмена или исполнение. Логично.
Но так себя вести сделка не должна: Это явление по своей природе разовое: это сделка! Пошли в магазин за хлебом, дали денег, получили хлеб и чек на этот товар. Один чек, не два! И после нашего ухода из магазина никто нам вдогонку не кричит - возьмите еще, он такой же, но третий! Логично: один товар - один чек. Если бы было не так - значит что-то происходит неладное: аппарат кассовый неисправен, кассир не обучен или еще что. И с этим OnTrade что-то неладное: Если до 7-ой версии несколько лет она работала исправно, согласно документации: вызывалась при получении сделки, то сейчас работает так:
Цитата
2.2.3 OnTrade Функция вызывается терминалом QUIK при получении сделки или при изменении параметров прошедшей сделки.
Прошу вас, вчитайтесь. Ужаснитесь!
Цитата
Николай Камынин написал: Я пользуюсь таким алгоритмом для отличия первого колбека от последующих
Придется и мне, наверное, такой костыль , приделать.
Цитата
Илья Грачёв написал: Сергей, Вы так и не ответили зарегистрировано ли моё пожелание расширить имеющийся интерфейс коллбэков, путём добавления новых (типа OnOrderChanged, OnTradeChanged, OnTransCompleted и т.п.), которые вызывались бы только один раз и всегда приносили бы окончательное значение объекта. Судя по Вашему ответу, сервер уже сейчас отличает первый вызов коллбэка ото всех остальных, поэтому моё предложение не потребует от Вас внесения серьёзных изменений в код. Зато, как я понимаю, это устроило бы всех. P.S. Конечно, это предполагает, что в дальнейшем ARQA не будет вносить изменения в логику работы уже опубликованных интерфейсов.
-- LastPos - ТЧП
-- Reverse - реверс или нет?
-- WorkSize - рабочий размер
-- OperSell - попытка продать
-- OperBuy - попытка купить
if LastPos > 0 then
if Reverse then
k=LastPos+WorkSize
OperSell(k)
else
OperSell(LastPos)
end
elseif LastPos < 0 then
if Reverse then
k=-LastPos+WorkSize
OperBuy(k)
else
OperBuy(-LastPos)
end
else
if not OperBuy(WorkSize) then
OperSell(WorkSize)
end
end
В моем сообщении от 08.02.2016 №119 приведен протокол OnTrade() QUIK версии 7.0.4.10. Время всех трех колбэков (АБСОЛЮТНО ИДЕНТИЧНЫХ) одно и то же, с точностью до миллисекунд: 14:27:54,046 Вы говорите: "Начиная с последнего обновления сервера, таблица сделок стала обновляемой." Но факты говорят, что OnTrade() шлет тройной отклик. Повторяю: шлет тройной отклик! Ваша "обновляемая таблица сделок" была обновляемой, если бы: а) Время колбэков отличались бы друг от друга; б) Они несли бы отличающиеся друг от друга в чем-то данные. Ни того ни другого не наблюдается. Да, вы писали:
Цитата
Серьезно, обновляются те поля которые пока еще не доступны в LUA
"...пока..." С прошлого года! Все еще недоступны! Дайте хоть бит дополнительный: первый - "1", не первый - "0"!
Скрытый текст
Брокерские сервера шлют излишние (в данном случае - вторые и третьи колбэки) данные, которые не несут никакой полезной информации. Пользователь эти излишки сходу и не увидит. Брокер, если и увидит - переложит дополнительные затраты на потребителей. Но в целом, конечно же, отписки ваши сильно настораживают.
Пожелание да зарегистрировано, но это не значит что оно прям в следующей же версии будет реализовано. Следите за новостями.
Понятие "разумные сроки" не вписывается в вашу философию. Все пункты теста Джоэла (12 шагов к лучшему коду) вам не пройти.
Цитата
Сервер знает какой терминал к нему подключается и в зависимости от версии отправляет данные по разному.
Ясно.
Цитата
Туда приходит только первый колбэк.
Значит он (сервер) отличает ее от следующих! Так внесите этот отличительный признак в отправляемую OnTrade! Большего от вас я не прошу. Сделайте же хоть что-то.
Итак, QUIK 7 как получал три абсолютно идентичных отклика, так и продолжает получать. Обещанный порядковый номер отклика так и не реализован. Но при всем при этом, QUIK версии 6.17.1.17 все же получает один ответ OnTrade. Он их как-то отличает и выдает только один из трех? Тут не совсем ясно, пользовательский терминал генерирует три вызова OnTrade на 7-ом и один на ранних версиях, или серверная часть их шлет?
Три варианта названия языка ! 1. LUa; 2. Луа; 3. Лув. Вы, уважаемый vic, определитесь уж с названием языка вначале. Посмотрите название форума. Либо прочитайте: http://www.lua.org/about.html#name
Примерно так: в Settings нужно написать Time = "11.00", в OnCalculate делать проверку равенства часов времени свечи с Settings.Time При совпадении - высчитать требуемые значения и нарисовать, иначе - нарисовать предыдущие значения. Все.
_sk_, да вы просто монстр, такое выдать! Утащу к себе. В п.6 можно поступить проще: не создавать отдельную таблицу, а добавить в таблицу ордера статус отправки команды на ее удаление, и в п.5 добавить - удаляется при снятии заявки.
«Идентификатор» – уникальный строковый идентификатор, присваиваемый графику. Идентификатор используется при получении доступа к указанному графику средствами языка QLua или QPILE.
Рабочее место пользователя Программного комплекса QUIK – фронт-офисной системы прямого доступа (Руководство пользователя.) Раздел 4. Работа с графиками 4.2 Настройка графика 4.2.4 Дополнительные настройки
Sergey Gorokhov пишет: На сделке, которая является сущностью торговой системы нет некоторых полей, которые есть в QUIK В частности это UID, TRANS_ID а также набор флагов и ряд других специфичных параметров Серверу чтобы проставить эти обновленные параметры приходится отправлять сделку несколько раз. Иначе, отправка сделки задерживалась бы до установки всех параметров, что гораздо хуже чем получить подряд несколько обновлений.
2.
Цитата
Sergey Gorokhov пишет: Как уже было сказано и еще раз повторю, трансляция нескольких OnTrade есть, будет и от этого избавляться не планируется, по уже озвученным причинам. Это значит что если данная реализация приводит к неудобству, предложите способ его избежать и мы зарегистрируем пожелание. Варианты типа "сделайте как было" не принимаются.
3.
Цитата
Sergey Gorokhov пишет: Серьезно, обновляются те поля которые пока еще не доступны в LUA
4.
Цитата
Sergey Gorokhov пишет: "биржевые" параметры, НЕ стали вдуг обновляемыми, кто Вам такое сказал? Еще раз внимательно прочитайте мой ответ.
Если продолжить цепляться к словам, то, в общем, не важно, что именно "биржевые" параметры" не стали обновляемыми. Стали обновляемыми сделки, при этом, очень странным образом, обновляемые сделки вовсе не обновляются, а просто повторяются три раза. Да, прочитал: "обновляются те поля которые пока еще не доступны в LUA". А зачем их отправлять в Lua, в таком случае? Если они не важны для нее, не отправляйте их в "втемную", тупо присоединив их к тем данным, которые уже отправлялись ранее!
"Lua" (pronounced LOO-ah) means "Moon" in Portuguese. As such, it is neither an acronym nor an abbreviation, but a noun. More specifically, "Lua" is a name, the name of the Earth's moon and the name of the language. Like most names, it should be written in lower case with an initial capital, that is, "Lua". Please do not write it as "LUA", which is both ugly and confusing, because then it becomes an acronym with different meanings for different people. So, please, write "Lua" right!
_sk_ пишет: В шестой версии такого не бывает, т.к. она не поддерживает обновление строк в таблице сделок.
Я потому и задаюсь вопросом: в 6-й версии таблица сделок была не обновляемой. Это значит, что пришедшая с биржи информация по сделке была либо сразу полной, либо... Почему теперь концепция изменилась, и биржевые параметры в таблице сделок могут обновляться бесконечное число раз?
Они сделали это по своим внутренним причинам.
Цитата
Николай Камынин пишет: если trans_id=0 , то это означает, что "ноль" если trans_id=nil , то это означает, что "nil" А когдапоступитtrans_id не равен 0, то и будем его обрабатывать. Т е либо мы обрабатываем интересующие нас события, либо игнорируем их.
В том случае, которое было упомянуто в самом начале этой темы, приходили три отклика OnTrade() с одинаковым количеством параметров и одинаковыми данными. И все, что было в моем скрипте ориентировано на обработку OnTrade() летит в тар-тарары. Фактически, эта функция была выведена из строя. И если с несколькими откликами OnOrder() мы уже сжились, но засады по OnTrade() мало кто ожидал. И тема trans_id, вобще-то, не при чем. То, что она появилась и что с ней происходит, это интересно, но не в этой теме.
Вячеслав писал: OnTrade() на одну сделку теперь дает ТРИ обратных вызова?
И вопрос как-то остался без ответа (( Тема "trans_id=0" как бы опять не увела в сторону решение основной, на мой взгляд, темы, озвученной в вышеприведенной цитате.
Старатель пишет: По какому принципу чистите? После третьего колбека?
Код
-- 2.2.3 Функция вызывается терминалом QUIK при получении сделки.
function OnTrade(trade)
table_insert(trades,trade)
end
<...>
--Обработка таблицы сделок
if #trades~=0 then
while #trades>0 do
local t=table_remove(trades,1)
if t~=nil then OnTradeDo(t) end
end
end
Старатель пишет: Собственно, так раньше было с OnOrder, когда он приходил по нескольку раз. В 7-й версии вместо OnOrder по нескольку раз приходят OnTrade. Причём все с абсолютно одинаковыми параметрами.
С это фичей мы уже живем дружно не первый год!
Цитата
Старатель пишет: А зачем удалять? Я храню таблицы номеров пришедших заявок и сделок.
Я их обрабатываю один раз. И чищу сразу.
Цитата
Старатель пишет: Вот действительно непонятно, зачем слать несколько одинаковых колбеков, если уже в первом приходят все параметры. Можете подробнее пояснить?
Если они, коллбеки, будут как-то (например, по номерам) идентифицированы, то я готов этот вопрос не задавать. И не спрашивать: а в чем же все-таки смысл второго и третьего отклика OnTrade()
Sergey Gorokhov пишет: Как уже было сказано и еще раз повторю, трансляция нескольких OnTrade есть, будет и от этого избавляться не планируется, по уже озвученным причинам. Это значит что если данная реализация приводит к неудобству, предложите способ его избежать и мы зарегистрируем пожелание. Варианты типа "сделайте как было" не принимаются. На вскидку, например можно подумать над добавлением порядкового номера обновления для каждой сущности. 1, 2, 3 и т.д. Тогда, в коде можно будет фильтровать по номеру обновления if num=1 then.
Если возражений нет, предлагаю зарегистрировать такое пожелание.
Это отличный способ. Возражений нет, зарегистрируйте, пожалуйста!
В прежних версиях QUIK количество купленных-проданных лотов можно было брать из OnTrade(): вести подсчет trade.qty. В данной версии это уже не будет работать так просто. Можно, конечно, запоминать приход информации в некую базу_сделок , произвести расчеты, и по приходу следующих порций OnTrade() быстренько так глянуть в эту базу: а не было ли уже этой сделки раньше? Пока я не вижу критериев, как удалять из этой базы сделку, так как "несколько раз" - расплывчато. Будем копить? На таких условиях применять OnTrade() становится не очень комфортно.
quio, если вопрос ко мне - то у меня на тестах трехкратное исполнение наблюдается на каждой сделке. Sergey Gorokhov, это похоже на то, что я совершаю покупку в магазине: получаю товар, а чек мне выдают не один, а целых три. И они одинаковые. С вами весело .
Здравствуйте! Я часто езжу к бабушке в деревню. У нее живет много разных животных, но меня интересует одна птица. Это курица. Понимаю, что это звучит забавно, но мне нужна не сама курица, а ее клюв. Дело в том, что мой один хороший друг рассказал мне, что можно его отпилить, так чтобы курица осталась жива. Клюв мне нужен для чёток, нам в школе дали задание сделать их из подручных материаллов. Мне хочется сделать что то оригинальное. Так вот мой вопрос: чем лучше всего пилить и вообще каким образом, ведь курица будет дергаться...? Огромное спасибо за советы!!!
Было уже. Стиль вопроса топикстартера схож. И люди отвечают на полном серъёзе .
Точнее будет - "qty" вместо "quantity". И не позавидуешь тем, кто применяет роботов на Lua, в которых применена функция OnTransReply() с использованием параметров price, quantity, sec_code и class_code :\ .
XXM пишет: и за 2-3 клика легко и просто перешли бы на новые контракты.
Используйте якорь
Попробовал якорь. Работает. Но если графиков (например) 10, то прицеплять - отцеплять 10 графиков - муторно, да и подпись во вкладке "Общие" в параметрах индикатора не сохраняется (а он у меня, как правило, совпадает с идентификатором). Удобства утилиты WndConverter неизмеримо выше.
Я ей давно перестал пользоваться по причине своего вывода о зависании программы. Но если бы она (WndConverter) выводила бы на экран некоторую информацию о ходе своей работы (типа "обработка графика такого-то", "обработка фильтра ...", "обработка наименования ..."), вряд ли сделал такой поспешный вывод и не перестал бы применять ее, в общем-то, очень удобную утилиту. Сейчас скачал Quik_Junior_v7.0 и не увидел в этом наборе программы "WndConverter". Тут уж решил написать свой начальный вопрос.
Сейчас опробовал ее на Quik v7.0.0.289 - сработала на 5+
Черное окно. И тишина... Которое я воспринял как зависание. Через 20-30 секунд я принудительно закрывал окно. Сейчас дал времени побольше - и программа решила поставленную задачу! стыдно :| . И так: программа работает, моя тревога была ложной, спасибо за ответы.
Было дело, написали вы WndConverter (при переходе с Т0 на Т2). Я ей пользовался некоторое время перед экспирацией фьючерсов (подробнее на smart-lab.ru). Но время шло, версии Quik-а обновлялись, менялись структуры данных (наверное) и возможности утилиты тихо и молча иссякли. Было бы неплохо, если вы восстанóвите работоспособность программы, и вместо того, чтобы сетовать:
Код
«Перед экспирацией меняю инструмент на графиках, как обычно много лет уже…
Замена графика как обычно:
правой кнопкой тык в окно графика > параметры текущего окна > диаграмма > заменить инструмент >
выбираем нужный, сохраняем. А графиков меня более 20. Устаю»
Николай Камынин пишет: У меня все гораздо скучнее, потому что просто. Есть цикл по параметрам оптимизации, которые задаем в виде "начало,конец,шаг".
Это, бесспорно, интересно. Но скучно не потому, что просто - потому что музыки у вас нет. ;-)
Цитата
Николай Камынин пишет: В результате - получаю оптимизированный по параметрам алгоритм. Эквити выводится и в реале и при оптимизации на график для каждой сделке. В реальной работе оптимизация отключается заданием нулевого шага.
Sergey Gorokhov пишет: ... Это можем зарегистрировать как пожелание, причем только при отображение информации ... Это нет, так как средствами LUA уже можно легко округлить значения если необходимо
С Lua - да, легко округляется. Так и буду делать. Скрипту, в общем-то, и без разницы, сколько там запятых будет отображаться на графиках. Свое предложение я снимаю. Визуально округлять большого смысла не вижу. Спасибо!
Есть ли возможность настроить индикаторы на вывод с настраиваемой точностью (например, для контракта SRU5 выставить "0 цифр после запятой")? Причем настроить не только для вывода на график, но и для считывания скриптами на Lua.
lergen пишет: Дело в том что у меня есть робот который подбирает неэффективность рынка. Т.е. его алгоритм заточен заключать сделку только когда она 100 процентов принесет прибыль. Так и было несколько месяцев. Несколько дней назад ситуация поменялась в корне. Сделки почти все в минус.
А вы резко так поменяйте ваш алгоритм: вместо прежней "КУПИТЬ" посылайте команду "ПРОДАТЬ" и наоборот.
Цитата
lergen пишет: Но я знаю что против меня это работает весьма эффективно.
И да - сделать это следует не с открытия рынка, а после 14.00. И важно вовремя заметить ослабление потока прибыли, чтобы ОН или ОНИ не почувствовали подвоха