Небольшой, комментарий. В частности для SMA, параметр Index_tbl не обязательно должен быть именно таблицей и написать можно проще. Но в некоторых индикаторах требуется "пройтись" по предыдущим свечкам и тогда без таблицы не обойтись. Поэтому в примере используется именно таблица. Ну и конечно-же, критика принимается.
Settings = {
Name = "*SMA Example",
Period = 9,
line = {{Name = "SMA",Type = TYPE_LINE, Color = RGB(255, 0, 0)}}
}
local Index_tbl = {}
local SUM_TMP={}
function Init()
return #Settings.line
end
function OnCalculate(I)
if I == 1 then
SUM_TMP = {}
Index_tbl = {}
end
if CandleExist(I) then
if (Index_tbl[#Index_tbl]~=I) then Index_tbl[#Index_tbl+1]=I end
else return nil end
I = #Index_tbl
SUM_TMP[I]=(SUM_TMP[I-1] or 0)+C(Index_tbl[I])
if I >= Settings.Period then
return (SUM_TMP[I]-(SUM_TMP[I-Settings.Period] or 0))/Settings.Period
end
return nil
end
Евгений, Приведите часть кода, отвечающую за вывод информации из ORDER_STATUS_CALLBACK
Цитата
Евгений написал: Добавлю: Процессор 32 бит. То есть trans2quik.dll версии 1.3 в принципе не встанет. Кстати вопрос: зачем было писать 32-х разрядную библиотеку trans2quik.dll (а она именно 32-х разрядная) для 32-х разрядного Quik, только для 64-х разрядного процессора? В PE заголовке библиотеки указано: IMAGE_FILE_MACHINE_AMD64
Для того чтобы х64 битные приложения могли работать с trans2quik.dll Например х64 битный Excel.
Александр Правилов, Ваш вопрос не понятен. О какой таблице идет речь? На каком этапе возникает проблема? В чем суть проблемы? Ведь это обычная строка, ровно как если бы написали local NameStock_T = "Hello world!"
Евгений написал: В связи с выходом библиотеки trans2quik.dll версии 1.3 объявлена поддержка старой версии 1.2. Однако это не так.
Совершенно не понятно как Вы пришли к такому выводу. Если у Вас возникла какая-то проблема, это совершенно не значит что мы отказываемся от поддержки ПО.
То что в ORDER_STATUS_CALLBACK приходит несколько обновлений это нормально. То что в QUIK_ORDER_QTY и в nBalance приходят непонятные значения, естественно не нормально. И данная проблема у нас не воспроизводится. Что на версии 1.2, что на версии 1.3, данные приходят корректные. В свзяи с ем, причины такого поведения пока не понятны. Сообщите версию терминала QUIK, и точные параметры транзакции, которую Вы отправляли. Также, проверьте поведение на нашем примере API_Tester_DLG.exe
Constantin, Функционал специально создан для того чтобы менять инструменты с истекшим сроком погашения. Не зная когда этот самый срок истечет, нет никакой возможности выбрать инструменты с истекшим сроком погашения. Если нужно менять вообще любые инструменты на любые, то в текущей реализации, через интерфейс это сделать нельзя. Только через командную строку см документацию: -Раздел 1. Подготовка к работе --Установка программы
Здравствуйте, Через QLUA можно назначать горячие клавиши только на Lua таблицы. Т.е. горячая клавиша не сработает пока не будет активна Lua таблица. Это делается через функцию SetTableNotificationCallback На сам терминал горячие клавиши через Lua настроить нельзя.
fortraderforum написал: Это использование условий, а нам нужно выделить конкретные бумаги, например, выделить 30 бумаг разных компаний по условиям нельзя.
Если у нужных облигаций, нет какого-то общего признака, то никак. разве что в саму таблицу торгов, добавить только нужные облигации.
Цитата
fortraderforum написал: Если я создал таблицу только из облигаций, а на бирже начали обращаться акции новых компаний, акции и другие ц.б. также будут добавляться во все мои таблицы?
Да, т.к. настройка работает для любых режимов.
Цитата
fortraderforum написал: Ничего из этого в новых версиях, как я вижу, нереализовано.
Да, верно, такого функционала сейчас в терминале нет. Сейчас, вопрос можно решить только средствами программирования на QLua, или выводить в excel и там считать.
Никак не можем воспроизвести проблему. Есть версия, что у Вас отключен автозаказ данных. Из-за чего, терминал не может получить доступ к параметру "До погашения" и как следствие определить что у инструмента скоро закончится срок. Проверьте, транслируются ли у Вас данные в параметре "До погашения" таблицы текущих торгов. Если нет, это и есть причина. Либо включите параметр в Система - Заказ данных - Поток котировок. Либо включите настройку "Исходя из настроек открытых пользователем таблиц" в настройках терминала, раздел Программа - Получение данных.
Александр Правилов написал: Но ведь это не правильное решение, так быть не должно.
Почему не должно? Ведь документация на Lua как раз и говорит нам, что именно так быть и должно.
Цитата
Александр Правилов написал: То есть если есть условие то убираем Local, если нет условия, то всё ок работает. Как то кривовато.
Вам следует ознакомиться с тем что такое local и что такое "область видимости" для понимания почему именно так а не иначе. Либо еще раз прочитать ответ:
Цитата
Sergey Gorokhov написал: local означает что объявленная переменная существует только там где Вы ее объявите. Значит, после выхода из условия, переменная пропадает, в результате Вы получаете nil.
Александр Правилов написал: По факту: - захожу в условие - всё ок - внутри условия вычисляются необходимые мне переменные - всё ок - выхожу из цикла. переменная nill
Но, если у переменной убрать local, работает.
Ну да, так и должно быть. local означает что объявленная переменная существует только там где Вы ее объявите. Значит, после выхода из условия, переменная пропадает, в результате Вы получаете nil. Про local читать тут: http://www.lua.ru/doc/2.6.html
Цитата
Александр Правилов написал: Подскажите, если я в таблицу присвоил значение переменной LASTDEPTHT=tonumber(toPrice(sec, LASTDEPTHT_T.param_value)) как мне, например в переменную LAST получить значение из этой таблицы?
Вопрос совершенно не понятен. А в чем сейчас сложность? Что не работает?
Александр Правилов написал: Ну почему никак, неужели я средствами lua в скрипте не смогу получить, например, время ПК?
Вы не правильно поняли. Ваш вопрос конкретно звучал "как средствами функции getTradeDate узнать время". И конкретно на этот вопрос ответ был "Никак". На вопрос, как вообще узнать время, в частности время компьютера, ответ - через стандартную Lua функцию os.time() Описание по ссылке: http://www.lua.ru/doc/5.8.html
Александр Правилов написал: В справке нашел функцию getTradeDat, как на основе неё сделать условие? if (Значение функции getTradeDat) >10:00:00 and (Значение функции getTradeDat) < 18:40:03 then
Никак, согласно документации, (да и в судя по названию функции), функция getTradeDate () возвращает дату, а не время.
Ваша функция getSTime() у нас работает. Почему не работает у Вас, к сожалению не понятно. Проверьте, какие значения она у Вас возвращает, перед тем как попасть в условие if.
Здравствуйте, По всей видимости проблема кроется в функции getSTime() Что это за функция, нам не известно. Это какая-то Ваша функция. Ищите проблему в ней.
Drionn Drionn написал: Однако в указанной документации речь идет об интерактивном способе, а меня интересует qlua.
Вы спрашиваете про поведение стоп заявки, а оно не зависит от того через интерфейс ее подавать или через Lua. "по исполнению" - означает ровно то что означает. а именно ПО исполнению. А не НА исполненной. т.е. по событию перехода заявки из "активная" в "исполнена".
Цитата
Drionn Drionn написал: Так она работает в обоих смыслах или только для первого?
Читаем документацию:
Цитата
Заявки «по исполнению» представляют собой условные заявки, условием активации (начала проверки их стоп-цены сервером QUIK) которых является исполнение определенной активной заявки («заявки-условия»).
Цитата
Drionn Drionn написал: В документации я не обнаружил что происходит с заявкой "по исполнению" если основная (к которой она привязана) будет снята?
Читаем документацию:
Цитата
Если заявка-условие снята или отвергнута торговой системой, то снимаются все связанные с ней заявки «по исполнению».
Стоп заявка "По исполнению" срабатывает по исполнению активнойлимитированной заявки. Подробней в документации на терминал QUIK: -Раздел 5. Торговые операции клиента --Заявка с условием «по исполнению»
Она не в QUIK относится к фьючам, а на Московской бирже, существует две разных торговых площадки, одна для фьючерсов, другая для акций. Соответственно и таблицы у них разные. И правила торгов разные, и контракты, и методы расчета позиций клиента и т.д. Почему именно так, а не иначе, вопрос к бирже. Раз на бирже это разные вещи то и в QUIK тоже. Да, средствами QUIK, со стороны брокера, можно объединить данные (это называется Единая Денежная Позиция), но не то что Вам нужно.
Вам нужно определиться что именно Вам требуется, по тем таблицам которые относятся к акциям. А именно: Таблица лимитов по деньгам Таблица лимитов по бумагам Таблица Клиентский портфель. Таблица Купить/Продать
Здравствуйте, Для ответа на вопрос со стороны Lua, для начала, нужно понять что Вам нужно со стороны интерфейса терминала QUIK. На выбор: Таблица лимитов по деньгам Таблица лимитов по бумагам Таблица ограничений по счетам Таблица позиций по счетам Таблица Клиентский портфель. Таблица Купить/Продать В зависимости от интересующего рынка, или интересующей цифры в этих таблицах, будет и отличаться ответ на Ваш вопрос.
Vasya Pupkin написал: При исполнении несколько раз заходит в событие OnTrade(trade).
То что OnTrade может выполниться не один раз, это нормально. Данный вопрос уже неоднократно обсуждался на нашем форуме.
Цитата
Vasya Pupkin написал: Можете сказать по какому параметр смотреть, что сделка точно выполнилась?
Сделка, не может выполниться или не выполниться. Выполниться или не выполниться может только заявка. А сделка это результат заявки, т.е. факт совершения операции. Таким образом, если Вы получили запись в OnTrade, значит сделка была.
fortraderforum написал: 2) Как в квике добавить ненужные облигации полностью в игнор, чтобы когда добавлялись новые выпуски старых ненужных не было. Можно использовать фильтр инструментов, но тогда придется каждый раз перебирать список, если появятся новые бумаги, что создает путаницу, не выход. Либо, если я создал таблицу текущих торгов, то новые выпуски облигаций включаются туда в автоматическом режиме, т.е. мне не надо будет их добавлять постоянно? А те, к-е я убрал из неё - их не будет?
Есть функционал пользовательского фильтра, он работает аналогично пользовательскому форматированию (см тот же ролик) Касаемо автоматического добавления бумаг в таблицы, для этого существует отдельная настройка. Меню Система - Настройки - Основные настройки - Программа - Получение данных, в секции "При получении новой ценной бумаги", галка "Добавлять ее во все таблицы".
Цитата
fortraderforum написал: 3) Можно ли как-то отобразить "грязную" доходность, т.е. с учетом НКД без остального шума? Доходность к погашению(в стандартном её понимании, как на rusbonds) в новых версиях я так понимаю также не реализована?
К сожалению, данный вопрос не совсем понятен. QUIK в данном месте транслирует только то что ему пришлет биржа и версии тут не причем. Если нужный Вам параметр биржа транслирует, то и в QUIK он должен быть. Уточните, если Вам известно, как нужный параметр называется на бирже? (описание интерфейса, (URL: ftp://ftp.micex.ru/pub/ClientsAPI/ASTS/Bridge_Interfaces/Equities/Equities23_Broker_Russian.htm ) размещёно на сайте Московской Биржи).
Илья Белый, Нам нужны все файлы, кроме папок и файлов справок (*.chm) и ключей доступа. Файлы можно запаковать архиватором, тогда они будут меньше весить. Паковать следует при закрытом терминале.
V Y написал: То есть получается таблица securities, а также GetClassesList "обращаются к брокеру" и возвращают те списки инструментов и классов которые брокер может предоставить?
Да верно.
Цитата
V Y написал: Как тогда можно узнать какие данные терминал заказал (подписался)?
V Y, Потому что описания инструментов (securities) заказываются всегда и безусловно. Связано это с тем, что нельзя отфильтровать ненужные инструменты, не зная какие инструменты вообще есть. Грубо говоря, Вы можете выбрать нужные и ненужные инструменты из списка, именно потому что терминал их записал в таблицу securities. Иначе бы не было из чего выбирать.
Да, присланный код у нас прекрасно работает. Без единого нарекания. Он выводит вообще все что есть. И у Вас должен выводить вообще все что есть. А раз не выводит делаем вывод что выводить нечего, т.е. в таблице Клиентский портфель, в колонке Стоимость портфеля у Вас цифра ноль. Если не так, присылайте на quiksupport@arqatech.com архив всей папки с терминалом QUIK без ключей доступа. В письме укажите ссылку на эту ветку форума.
sec_list = getClassSecurities("SPBFUT")
for fut_code in string.gmatch(sec_list, "([^,]+)") do
ba=getParamEx("SPBFUT",fut_code,"OPTIONBASE").param_image
if ba=="GAZR" then
days_till_exp=getParamEx("SPBFUT",fut_code,"DAYS_TO_MAT_DATE").param_value
end
end
Oleg Ch, Если ставить стоп заявку на продажу вида "стоп лимит", то в поле "Условие активации заявки" Вы укажите условие, при котором если цена на рынке опустится ниже указанной, то выставится лимитированная заявка на продажу по цене указанной в поле "Цена". Никаких +10 не будет, а будет ровно то что Вы сами укажите в поле Цена. Т.к. в стоп-лимите на продажу, условие срабатывания <=, то стоп не сработает если цена будет выше указанной, а сработает только если цена будет ниже. и с таким же успехом она может сработать сегодня а не завтра, т.к. сегодня цена 128,89. единственный Вариант, если указать дату исполнения стопа завтрашнем числом. Тогда да, стоп-лимит сработает завтра.
Судя по диалогу, либо Вы не понимаете что такое стоп-лимит, либо речь вообще не про стоп-лимит, а про тейк-профит.
dwell dwell написал: Спасибо за быстрый ответ. У меня версия 7,2, но я нигде не вижу "Открыть канал". Все в таблице иссмотрел и излазил, не вижу такого пункта.. :)
Как уже было сказано, функционал доступен в более свежей версии 7.10
эм... А разве версия 7,2 не более свежая, чем 7,1?
Смотрите внимательней. Разговор про версию 7.10 (десять!) а не про 7.1 (один) Как бы разница довольно существенна между 1 и 10.
Илья Белый, Для начала, замените функцию GET_CLIENT_MARGINAL_PORTFOLIO_INFO на GET_CLIENT_MARGINAL_PORTFOLIO_INFO_EX т.к. функция GET_CLIENT_MARGINAL_PORTFOLIO_INFO выводит данные только для лимита Т0, а в портфеле, могут быть данные и по другим видам, например Т2. Скорее всего проблема именно в этом, и Вам нужно смотреть лимит Т2, а не Т0. Это следует отдельно проверить, просто посмотрев визуально, какой вид лимита указан в таблице Клиентский портфель. К слову, вид лимита можно брать из той же таблицы лимитов по деньгам: LIMIT_KIND = GET_VALUE(all_client, "LIMIT_KIND")
Далее, фирму берите автоматом из лимитов по деньгам. Простите конечно, но у нас вызывает сомнение то что фирма в коде соответствует фирме в таблице. Для этого добавьте строку: FIRMID = GET_VALUE(all_client, "FIRMID")
В итоге строка должна иметь вид: client_port = GET_CLIENT_MARGINAL_PORTFOLIO_INFO_EX(FIRMID, client_pre, LIMIT_KIND)
dwell dwell написал: Спасибо за быстрый ответ. У меня версия 7,2, но я нигде не вижу "Открыть канал". Все в таблице иссмотрел и излазил, не вижу такого пункта.. :)
Как уже было сказано, функционал доступен в более свежей версии 7.10
Русский, Банальный пример, когда в одном окне два разных графика. один по нелеквиду, а второй по активно торгующейся бумаге. В таком случае на графике нелеквида будут пустые свечки.
Боюсь предположить, что Вы наткнулись на известную тему про сравнение значений типа DOUBLE с плавающей точкой. Про данную тему легко найти статьи в википедии, или учебниках по программированию. Дело в том что для значений с плавающей точкой, недопустима проверка на жесткое равенство т.к. цифра легко может оказаться равной 1.0000001 вместо 1. Правильно сравнивать с заданной точностью, типа if t.high-f.high <0.0001 then, ну либо смотреть не на H или L, а на их среднее. Например if f.high > (t.high+t.low) /2 then
Роман написал: 1. Архив графика мы получаем отнюдь не через таблицы, а скачиваем архив с отдельного сервера, где таблицами и в помине не было!
Раз не понятно, придется повторять:
Цитата
Sergey Gorokhov написал: Индексы строятся по данным из таблицы текущих торгов.
Что означает "Данные" попадают и в "таблицу" и в "Архив графика" из одного и того же потока и этот поток едет срезами т.е. раз период, а не по изменению. Иными словами, какая разница, если данные одинаковые. Надеюсь теперь понятно?
Цитата
Роман написал: 2. Что самое нестыкуймое с вашем объяснением, так это то что сам индекс обновляется раз в секунду, поэтому даже учитывая то что последние данные графика в отличии от архива строиться исходя из последнего значения, то как он может проскальзывать если сам он обновляется раз в секунду?
Раз не понятно, придется повторять:
Цитата
Sergey Gorokhov написал: Индексы строятся по данным из таблицы текущих торгов. А таблица текущих торгов попадает в QUIK срезами данных (т.е. раз в период)
Что означает, что часть значений в ходе торгов может быть пропущена. Close пропущен быть не может, ибо даже если торговая сессия закончилась, произойдет очередной запрос данных и приедут актуальные значения. OHL легко могут не совпадать. Банальный пример, допустим было три обновления значения индекса. Очередной запрос попал после первого и после третьего, а после второго не попал. Все, второе обновление на график не попало. А вдруг, это самое второе обновление является H за весь день? В результате, на дневной свечке H будет отличаться от того что на бирже. Надеюсь теперь понятно?
V Y, Вы сами ответили на свой вопрос. Такой возможности нет. А если точнее, то в QLUA вообще нет ни одной функции работающей напрямую с таблицами интерфейса терминала QUIK (кроме функций работы с LUA таблицами). Все функции, по получению данных, работают не самими таблицами интерфейса, а с хранилищем данных из которого таблицы интерфейса берут значения. Хранилище данных одно, а таблиц может быть много. Именно по этой причине, фильтры в таблицах интерфейса не влияют на данные в QLUA. А влияет только заказ данных. Если что-либо заказало данные, то и в QLUA они есть, а если нет то нет. И по сути, не важно кто именно закажет данные, сам терминал или через QLUA, ведь хранилище то одно.
Егор Масалкин, Никакой. Такого параметра нет. Это сказано в документации. Единственный способ получить цену графика и сравнить ее со значением цены у фрактала. Если цена фрактала равна HIGTH то стрелка вверх, если LOW то вниз.