Виктор Столетов написал: Можно ли в Lua получить доступ к свечам открытого интереса, например к закрытию C?
Да это возможно. Доступ происходит по тому же принципу что и к графику цены и объема. Если через getCandlesByIndex, то на нужном графике надо указать идентификатор. Если через CreateDataSource, то в четвертом параметре надо указать имя параметра, для открытого интереса это "numcontracts"
Nikolay написал: Не уверен, что есть ошибки, т.к. если убрать обработку ожидания while trans_Status == nil do sleep(1) end, то все работает.
Больше интересует вопрос что именно "работает"? Т.е. заявка по факту ставится или нет? В качестве примера, сообщите точное время (по МСК) когда была попытка выставить такую заявку.
Проверьте в таблице транзакций терминала QUIK нет ли ошибки при отправке транзакций. Дело в том что рыночные заявки на покупку могут быть запрещены. Если так то в таблице транзакций Вы увидите сообщение об этом. Сообщите Ваш UID чтобы мы могли проверить права.
electron, О каком тестовом сервере идет речь? Если это сервер Вашего брокера то вопрос к брокеру. Если это наш джуниор, то мы не будем менять настройки т.к. разных брокеров много и у каждого могут быть свои настройки, а джуниор один на всех.
Артем, Здравствуйте, Для анализа нужен полный код портфеля. QPILE признан нами устаревшим и мы уже давно его не развиваем. Так что если Вы только начинаете программировать в QUIK лучше сразу начинать с QLUA Документация лежит в отдельном файле QLUA.chm в папке с терминалом.
Попробуйте выделить две функции под разные параметры
Код
dofile ("C:\\Program Files\\Lua\\5.1\\lua\\ATR.lua")--ATR
ds_v = CreateDataSource(instr[k].v_class,instr[k].v_sec,INTERVAL_D1)
ds_v:SetEmptyCallback()
sleep(1000)
func1 = ATR()
func2 = ATR()
candles=ds_v:Size() --до этого места доходит и выдаёт количество свечей
long_v={}
short_v={}
for i=1,candles do
long_v[i]=func1(candles, {Period=252}, ds_v)
short_v[i]=func2(candles, {Period=5}, ds_v)
end
К слову, ATR не вернет данных если номер свечки меньше чем заданный период (по умолчанию 14) Т.е. если у Вас период 14, то первые 14 значений будут nil и это нормально.
Арсений, Здравствуйте, Есть целая куча причин. Существуют разные ограничения со стороны биржи. Например нельзя указывать слишком маленькую или слишком большую цену. Или слишком часто подавать транзакции или еще много чего. Это описано биржевых правилах торгов. Еще Ваш брокер может настроить какие-нибудь ограничения. Это следует уточнить у брокера. В связи с чем, всегда лучше всего сообщить текст ошибки которая возникает при неудачном выставлении.
Let_it_go написал: 1. Если я воспользуюсь ds[sec]:Close(), чтобы отписаться от дневок, он случайно не отпишет меня от минуток?
Если Вы вызовите Close для потока с дневным интервалом, то он закроет поток с дневным интервалом.
Цитата
Let_it_go написал: 2. По графику, где мне нужны раз в день дневки, я заказываю минутки на постоянной основе. Будет ли КВИК делать лишнюю работу, если я буду всё время обновлять дневки (не отпишусь от них), или в данном случае этой лишней работой можно пренебречь?
Время в сообщениях, это время Вашего компьютера. SERVERTIME это время сервера. И эти времена совершенно не обязаны совпадать. Никто кроме Вас не может гарантировать что время на Вашем компьютере синхронизировано с компьютером брокера.
TRADEDATE показывает дату торговой сессии. Это не тоже самое что астрономическая дата. Дата торговой сессии это дата когда проводились торги. Последний раз они проводились в пятницу, 9-го числа.
Lua не будет получать данные если они не заказаны. И это правильное поведение. Если раньше оно работало, значит либо раньше заказ все-таки происходил, либо это была какая-то ошибка.
Заказать данные по обезличенным сделкам через сам Lua можно функцией CreateDataSource с параметром INTERVAL_TICK, и последующей установкой коблека SetEmptyCallback или SetUpdateCallback. Если нужно заказать данные по параметрам текущих торгов, то это делается функцией ParamRequest Если нужно заказать данные по стаканам, то это делается функцией Subscribe_Level_II_Quotes
_sk_ написал: Разработчикам пора в дистрибутив терминала включить вот такой bat-файл,
Во первых, брокер сам формирует дистрибутив для своих клиентов, так как сам посчитает нужным. Во вторых, в терминале QUIK есть команда запуска -clear Подробнее о нем в документации -Раздел 1. Подготовка к работе ---Ключи запуска Рабочего места QUIK
Илья, Если проблема в С++ то увы помочь ничем не можем т.к. вопрос вне нашей сферы ответственности. Только вопросы касающиеся непосредственно QUIK.
По коду QLUA как минимум видно что Вы опять совершаете ту же самую ошибку что мы уже с Вами обсуждали Еще раз повторяем OnQuote() срабатывает сам по себе при изменении любых стаканов. У Вас же при любом изменении стаканов по любым инструментам, вызывается getQuoteLevel2 по сбербанку. Например, изменился стакан по лукойлу, а Вы дергаете данные по сбербанку. Это уже само по себе не логично и не правильно. Решение уже было озвучено и еще раз повторим, надо добавить проверку инструмента в событии.
Либо если с пониманием колбеков проблемы, вообще избавиться от OnQuote. Раз Вам так надо дергать стакан в цикле, так и делайте, никто не запрещает.
Илья, Таблица "Состояние счета" никакого отношения к стаканам не имеет. Ищите лучше. Либо у Вас все-таки где-то открыты стаканы по другим инструментам (посмотреть в меню Окна - Менеджер окон) Либо у Вас настроен экспорт стаканов по ODBC (посмотреть в меню Сервисы - Экспорт/Импорт данных - Экспорт инструментов по ODBC) Либо запущен какой-то Lua скрипт который заказывает стакан функцией Subscribe_Level_II_Quotes
Если Вы считаете что всё сказанное для Вас не верно, пришлите нам на quiksupport@arqatech.com папку с терминалом (без ключей доступа) мы проверим.
Илья написал: Но все еще не понял - почему функция вызывается по СЛУЧАЙНОМУ стакану, вместо того который открыт или по нескольким если открыты несколько или не возвращает ноль если стаканы закрыты все?
Функция срабатывает при поступлении данных по любому заказанному стакану в любом порядке. Т.е. все в одну кучу. Далее программист сам фильтрует то что ему надо. Раз функция OnQuote у Вас срабатывает по не нужному инструменту, значит где то у Вас заказан стакан по этому инструменту. Заказ данных происходит либо при открытии стакана, либо при экспорте по ODBC, либо через скрипт LUA. Если заказано 10 стаканов по разным инструментам, значит OnQuote будет срабатывать по 10 разным инструментам и не важно кто и как их заказал.
Constantin написал: А номер транзакции должен быть уникальным или не обязательно? Если, например, запускаются несколько роботов и они нумеруют свои транзакции с единицы.
TRANS_ID может быть любым. уникальным или нет, всё равно, решать Вам. Можете во всех транзакциях указывать 123 и оно будет работать. Для удобства может в разных роботах указать разное значение. Чтобы определять какой робот подал транзакцию.
Илья, терминал сам вызывает функцию OnQuote при изменении данных по стакану. В этом сама суть колбеков. И от того что Вы сами вызовите функцию OnQuote, терминал от этого не перестанет ее вызывать. Вот и получается что терминал вызывает функцию по стакану который Вы не ожидаете. Чтобы этого избежать надо добавить фильтр.
Илья написал: Прошу, поясните - это баг, это фича, или это у меня руки кривые ?
Исправьте код так:
Код
function main()
is_run=true;
while is_run == true do
sleep(2000);
end
end;
function OnQuote(class, sec)
if (class == "TQBR") and (sec == "SBER") then
tb = getQuoteLevel2(class, sec);
message(tostring(tb.offer[1].price));
end
end
Виктор Столетов, Просьба больше никогда не выкладывать код в виде JPEG. Для кода в панели есть специальная кнопка Например:
Код
function Close_all_order()
function myFind(F)
return (bit.band(F, 0x1) ~= 0)
end
local ord = "orders"
local orders = SearchItems(ord, 0, getNumberOf(ord)-1, myFind, "flags")
if (orders ~= nil) and (#orders > 0) then
for i=1,#orders do
local transaction={
TRANS_ID=tostring(1000*os.clock()),
ACTION="KILL_ORDER",
CLASSCODE=c_code,
SECCODE=getItem(ord,orders[i]).sec_code,
ORDER_KEY=tostring(getItem(ord,orders[i]).order_num)
}
local res=sendTransaction(transaction)
end
end
end
getMoney возвращает только лимит вида Т0 Вам же нужен другой вид лимита. Посмотрите в таблице лимитов, в колонке "Вид лимита" что на самом деле Вам нужно. Для остальных видов лимитов, существует отдельная функция getMoneyEx.
Виктор Столетов написал: И все же я не совсем понимаю, как работает функция снятия всех заявок
Что именно не понятно?
Цитата
Виктор Столетов написал: Почему например в операторе local ord = "orders" стоит "orders", а не "order"?
При обращении к данным таблицы используются константы которые приведены в документации -Функции для обращения к строкам произвольных таблиц QUIK --Таблицы, используемые в функциях «getItem», «getNumberOf» и «SearchItems»
Eldar написал: если я изменю настройки индикатора, то в любом случае он будет пересчитываться весь с первой свечи! так зачем событие? при изменении не будет входа в функцию Init. ну этого мы избежим и грамотнее код напишем.
На вопрос "зачем" уже был дан ответ. Если Вам не нужно использовать OnChangeSettings просто не используйте. Еще раз повторять одно и тоже не вижу смысла.
Цитата
Eldar написал: я добавляю индикатор на график. есть начальные настройки, которые указываю. так и нужно. но например я открываю настройку области на графике и хочу изменить какие либо настройки самой области (например убрать сетку) или меняю области местами, а индикаторы пересчитываются. вот именно в данном случае не стоит все пересчитывать. или например я поменял цвет линии!! и тут не нужно пересчитывать индикатор.
В текущей реализации нет никакого способа отличить те настройки "где надо делать перерасчет" от тех "где не надо", по этому перерасчет делается всегда.
Sergey Gorokhov написал: если на графике всего одна свечка то постоянно будет сыпать 1. Как отличить? Никак, именно по этой причине мы создали OnChangeSettings.
TRANS_ID - это произвольный номер Вашей транзакции, "снятие заявки" - это тоже транзакция и ей надо придумать номер. Номер может быть любым в диапазоне от «1» до «2 147 483 647»
пример транзакции типа "Айсберг-заявка" приведен в документации на терминал QUIK -Раздел 6. Совместная работа с другими приложениями --Импорт транзакций ---Формат .tri-файла с параметрами транзакций ----Примеры строк, которые могут содержаться в файле
Eldar написал: сейчас изменение параметра вызывает пересчет всего индикатора с 1 по текущую свечу. в 7.16 данное изменение не приведет к пересчету?
В 7.16 ничего в этом месте не менялось, только добавилось событие.
Цитата
Eldar написал: изменение параметра будем отлавливать по событию?
вопрос не понятен. Изменили параметр, случился OnChangeSettings, далее все по старому, перерасчет и т.д.
Цитата
Eldar написал: по индикатору из 1 свечи - сравниваем с Size(). хотя как показала практика и общение на форме, Size() это не количество свечек на графике, а количество интервалов.
Eldar написал: вопрос - если изменили настройки индикатора, разве он не с 1 свечи будет вызывать OnCalculate?
Естественно будет перерасчет с 1. А еще, если на графике всего одна свечка то постоянно будет сыпать 1. Как отличить? Никак, именно по этой причине мы создали OnChangeSettings. Другой вопрос в том зачем расчитывать
Цитата
Eldar написал: где можно почитать описание нового события ?
В документации на терминал 7.16 Цитата от туда
Цитата
OnChangeSettings - Функция вызывается при редактировании свойств индикатора после нажатия кнопок «Применить» или «OK». Функция вызывается также при перезагрузке Рабочего места QUIK и при загрузке wnd-файла либо tab-файла, в которых сохранен график с индикатором
Здравствуйте, Не рекомендуем использовать циклы в колбеках. Т.к. колбеки выполняются в основном потоке терминала, т.е. пока колбек не закончит работу, терминал будет виснуть. Все тяжелые циклы, следует использовать только в main. В самом же колбеке, следует добавить флаг, приводящий к нужным действиям в main Пример
Код
work = false
function OnStopOrder(...)
work = true
end
function main()
...
if work then
...
end
...
end
Сергей написал: Как посмотреть список возможных и валидных класс кодов?
Здравствуйте, Список доступных кодов классов можно получить через функцию getClassesList Или просто открыть в терминале таблицу текущих торгов и посмотреть (колонка "код класса")
Класс с кодом QJSIM существует только на нашем демо контуре https://arqatech.com/ru/support/demo/ Если Вы используете демо доступ какого-то брокера, то там код класса вполне по честному может быть другим. Либо Вы пытаетесь запросить данные когда наш демо контур не работает
Здравствуйте, Из описания не понятно ,в "новых версиях" это в каких? В версии 7.16, для корректной обработки изменения настроек индикатора, было добавлено новое событие OnChangeSettings.