Робот вчера выставил стоп заявку "тейк-профит" , заявка имеет статус Активна, сегодня график поднимался до заданной цены, но сделка не произошла, в чем причина? Я не правильно создаю заявку или мне не хватило встречных заявок на покупку, что бы продать по моей цене или что то другое? Все картинки соединил в одну и выкладываю.
Какие минимальные цены можно получить по текущему фьючерсу, и за какой период? (За текущую сессию, за все время жизни фьючерса, минимально возможная его цена до конца закрытия или за произвольный период, например за последние 10 дней?) И по каким таблицам, если это можно
Спасибо за ответ, то что вы написали это понятно и логично, я снимаю стоп заявки, или точнее сказать лимитированные заявки, которые не ушли ещё на сервер, они находятся у брокера и не исполнены. Они должны сниматься и снимаются в ручную, у меня не получается снимать их из программы. Формируется ли какой либо флаг на транзакцию по снятию лимитированной стоп заявки. В таблице транзакции я их не вижу или надо просто настроить обратный вызов на транзакцию и там смотреть флаг не исполнения транзакции? Да еаверно так и надо)
При отправке транзакции по фьючерсу на покупку у клиента резервируется сумма ГО, а прибылью и убытком что является? Разница в цене самого фьючерса между покупкой и продажей плюс комиссии или разница в ГО на момент покупки и продажи? Думаю этот вопрос тоже глупый, но мне это не понятно)
Написал простого робота, который покупает по рыночной стоимости и продает по тейк-профиту, но если график пошел не туда (куда надо) ставлю фьючерс на продажу по рыночной стоимости, а стоп- заявку пытаюсь снять, но система Quik выдает сообщение, что снять указанную заявку не может. Самые простые причины допускаю или ошибка в коде или ошибка в определении номера заявки и в коде, но как локализовать причину ошибки не могу понять. Вот часть кода на всякий случай, может кто то что то подскажет? Поиск номера ордера по номеру транзакции
Код
...
ordernum=snat_zayvk(trans) --номер заявки по которой была отправлена транзакции на покупку ТП
stopzayvka(ordernum)
...
function snat_zayvk(tran)
for i=0,getNumberOf('orders')-1 do --количество записей в таблице
local orders = getItem('orders', i); -- получает строку с номером i
if tonumber(orders.trans_id)==tonumber(tran) then
ordernum=tonumber(orders.order_num)
end
end
return ordernum
end
И код транзакции на снятие заявки по номеру ордера заявки
Код
function stopzayvka(nom_order)
transid_m=tonumber(osdat());
local Transaction={
['TRANS_ID'] = tostring(transid_m),
['ACCOUNT'] = 'SPBFUT000pf',
['CLASSCODE'] = 'SPBFUT',
['ACTION'] = 'KILL_ORDER',
['ORDER_KEY'] = tostring(nom_order)
}
sendTransaction(Transaction)
end
Если подавать заявку руками, то наверно заявка сработает на том таймфрейме на котором открыт график. А если я подаю транзакцию на заявку программно, я не указываю какой тайм фрейм меня интересует. Или все заявки, не зависимо от таймфрейма торгуются по одной бумаге в общей куче? Я уже пока писал, понял что вопрос глупый. Но раз уж написал спрошу, таймфрейм нужен только для индикаторов, а для покупки и продажи все равно какой тайфрейм?
При запуске программы первый раз такой вот код выдает ошибку
Код
start6 = tonumber(getFuturesHolding('SPBFUT000000','SPBFUT000pf','BRG9', 0).totalnet)
...
...am Files\QUIK-Junior\LuaIndicators\m2_14_BRG9_M1.lua:40: attempt to index a nil value
но если я куплю бумагу и потом ее продам например по рыночной, то после этого программа с таким кодом спокойно работает дальше и проверяет количество бумаг на остатке в различные периоды работы кода. По идее понимаю, что надо как то сделать проверку на nil и если nil, то переменной start6 присвоить ноль, но что то методом тыка пока не получилось это сделать, пробовал и так и эдак:
Код
start6 = tonumber(getFuturesHolding('SPBFUT000000','SPBFUT000pf','BRG9', 0).totalnet) or 0
...
if getFuturesHolding('SPBFUT000000','SPBFUT000pf','BRG9', 0).totalnet==nil then
start6=0
все равно программа ругается на код, подскажите пожалуйста как можно решить эту задачу?
Функция обратного вызоваOnParam(class_code,sec_code) через функцию getParamEx() может получить значение нужного параметра таблицы текущих торгов. А в QLUA.chm в разделе "Структуры данных" такой таблицы нет. Где можно найти поля структуры , в примере есть только один параметр это bid (tbid = getParamEx(class, sec, "bid") ).А какие остальные?
Скрытый текст
function OnParam( class, sec ) if class =="SPBFUT"and sec == "RIZ2"then tbid = getParamEx(class, sec, "bid") if tbid.param_value > =130000 then message("Спрос " .. tbid.param_image) end end end
Хочу просто вывести стакан котировок по своему фьючерсу и посмотреть как он изменяется, такой код будет работать?
Код
function OnQuote(class, sec )
if class =="SPBFUT" and sec == "SRH9" then
ql2 = getQuoteLevel2(class, sec)
PrintDbgStr(ql2.bid_count.."-"..ql2.offer_count)
for i,#ql2.bid do
PrintDbgStr(ql2.offer[i].price ..'-'.. ql2.offer[i].quantity)
end
PrintDbgStr("-----------------------------------------------")
end
end
И почему в таблице обезличенных сделок моя заявка прошла как лимитированная на продажу, она должна идти по рынку и закрыть заявку на покупку, следовательно она не должна быть видна в таблице обезличенных сделок, как и в стакане тоже. А она видна вот выборка
Формируется заявка, но цена у нее очень странная, откуда такая берется цена?
Код
[4816] обратный вызов ордер OnOrder(orders)
[4816] сист дата и время заявка сделка флаг бум лот цена сумм транз сост напр дата и время сделки
[4816] #03.01.2019 11:59:01 87655808 100011100 SRH9 2 17872 35744 0 исполн продажа 3.1.2019 11:59:7 846000
Затем проходит сделка, но уже по более похожей цене, но все равно по самой низкой за текущую минуту
Код
обратный вызов сделка OnTrade(trade)
[4816] сист дата и время заявка сделка флаг бум лот цена сумм транз сост напр дата и время сделки
[4816] #03.01.2019 11:59:01 87655808 10614082 001000100 SRH9 2 19339 38678 31158 исполн продажа 3.1.2019 11:59:7 846000
Каким образом настроен алгоритм квика, что берутся такие цены? И почему то не открывается тиковый график, что бы посмотреть реальные данные на сервере в данный момент времени, может у меня настройки не так выставлены? Картинку с минутным графиком прилагаю.
По выходным да, я понял, но кроме выходных есть еще праздничные, у вас праздничные и выходные это разные дни или праздничные тоже считаются выходными?, вот привожу картинку с праздничными и выходными днями за 2018 год, там желтым цветом выделены выходные, а красным праздничные.
Скрытый текст
Кто работает на бирже не первый год, для них это все ясно и понятно. А мне нет и я думаю не я один такой). В прошлом году я подумал, что все зимние праздники биржа работать не будет и не играл, а в этом году решил все же уточнить более конкретно, но пока это не получилось)) Не проще было на сайте написать, в какие дни работает учебная биржа, а в какие нет. Даже на магазинах, всегда пишут конкретно, когда магазин работает в длинные праздники, значит тоже не я один такой непонятливый, а еще есть и другие)
params = {"startbuy","startsell","startnet","todaybuy","todaysell","totalnet","session_status"}
for key,v in ipairs(params) do
local totalnet = getFuturesHolding('SPBFUT000000','SPBFUT000pf','SRH9', 0)[v]
if totalnet~=nil then
PrintDbgStr(v.." = "..totalnet)
end
end
vgi написал: Во втрой строке должно быть естественно
Спасибо за все поправки и подстановки, очень полезная информация, последний ваш ответ я даже пока не знаю где можно применять(пусть будет в запас), а предыдущие сейчас все попробую. Еще тогда уж разрешите вопрос, что бы все было прозрачно что пока не ясно:
Почему не выводятся данные можете сказать?, кстати подстановка в квадратных скобках в данном случае не работает, пишет сообщение об ошибке, а если выводить параметр подстановки vбез скобок, то вообще ничего не выводится, вернее с другим кодом выводится, а именно этот пустой, код и ошибка ниже
Код
--ДОБАВЛЕНИЕ ДАННЫХ В ТАБЛИЦУ Позиции по клиентским счетам
PrintDbgStr("Позиции по клиентским счетам (фьючерсы) из таблицы")
params = {"startbuy","startsell","startnet","todaybuy","todaysell","totalnet","openbuys","opensells","cbplused","cbplplanned"}
for key,v in ipairs(params) do
PrintDbgStr(v .. " = " .. getFuturesHolding('SPBFUT000000','SPBFUT000pf','SRH9','1').v)
--PrintDbgStr(v .. " = " .. getFuturesHolding('SPBFUT000000','SPBFUT000pf','SRH9','1').[v])
end
вот ошибка с квадратными скобками
Код
Syntax error while compiling C:\Program Files\QUIK-Junior\LuaIndicators\k12_8.lua: C:\Program Files\QUIK-Junior\LuaIndicators\k12_8.lua:95: '<name>' expected near '['
А другой код где последовательно прописываю все поля нормально выводит, но его очень долго писать, в цикле быстрее получилось бы)
Код
[4680] сделка из таблицы
[4680] сист дата и время заявка сделка флаг бум лот цена сумм транз сост напр дата и время сделки
[4680] *0 27.12.2018 11:55:30 82958504 10251485 001000000 SRH9 1 18941 18941 2147483647 исполн покупка 27.12.2018 11:54:33 166000
[4680] Позиции по клиентским счетам (фьючерсы) из таблицы
Хотя это не так и важно, долго писать не долго, но интересно почему не работает?
Sergey Gorokhov написал: Дополним. К таблице позиций по клиентским счетам (futures_client_holding) можно обратиться функциями getFuturesHolding или через getItem
Спасибо большое, конечно посмотрю потом подробнее, просто надо с чего-то начать)
Павел Bosco написал: Всё решилось обновлением win32kfull.sys и корректировкой синхронизации времени.Сейчас время не улетает
Интересно вы все рассуждаете про свечи, но не учитываете что сама операционная система windows компьютера не является системой реального времени, линукс может чуть лучше, но то же не может выдать вам реальное время в микросекундах, миллисекунды наверно может причем десятки может быть, поэтому все рассуждения о синхронизации по атомным часам даже в теории мне кажется не реально. Но у меня другой вопрос, где можно посмотреть чем отличаются различные модули квика при обновлении, это где то пишется? Я тупо обновляю программу, что приходит, а что там обновилось не имею представления. Может где то можно почитать или это не имеет особого значения при работе программы?
Sergey Gorokhov написал: К сожалению эта информация не попала в документацию, приносим извинения.
Не нужно извиняться у вас очень хорошая программа и бесплатная и форум хороший, на вопросы отвечаете всегда очень быстро и не важно, что они повторяются и бестолковые иногда по неопытности. Очень приятно, что у вас такая команда) Хочется поздравить Вас с новым годом и пожелать удачи всем и дальнейших улучшений и убыстрений Квика)
С остатком по деньгам, объяснили в прошлой теме, стало примерно понятно буду пробовать их получать. А вот с остатком по количеству, нужно самому считать сколько купил и сколько продал и каких бумаг? или в системе Quik где то есть количество лотов фьючерсов на срочном рынке имеющихся в данный момент в плюсе или в минусе у себя?
Пытаюсь вывести в отладочное окно некоторые поля таблицы заявок, но подстановка не работает, можете подсказать в чем ошибка?
Код
PrintDbgStr(" Просмотр полей таблицы заявок")
params = {"order_num", "flags", "sec_code"}
for i=0,getNumberOf('orders')-1 do
PrintDbgStr(i)
local order = getItem('orders', i);
for key,v in ipairs(params) do
PrintDbgStr(v .. " = " .. order.v)
end
end
аналогичный пример взял из справки для функции getInfoParam(), там немного иная подстановка и все работает
Код
params = {"VERSION", "TRADEDATE", "SERVERTIME"}
for key,v in ipairs(params) do
PrintDbgStr(v .. " = " .. getInfoParam(v).."\n")
end
(На реальном счете и на демо счете вижу остаток в таблице "Ограничение по клиентским счетам", но как программно обратиться к этому остатку в поле "Лимит открытых позиций" не могу найти()
После срабатывания обратного вызова транзакции в поле
Цитата
flags
NUMBER
Флаги транзакции
выход код 1001000000000000000001 - что он обозначает, есть где то битовые значения этого флага. Получаю данные из следующего кода
(может этот флаг и не нужен для работы, но просто интересно, почему на него нет описания в QLUA.chm или я его просто не нашел( И еще почему то номер trans.trans_id 2147483647 не совпадает с тем , который я отправлял в запросе (['TRANS_ID'] = '2412181506')
Код
--ДОБАВЛЕНИЕ ДАННЫХ В ТАБЛИЦУ ТРАНЗАКЦИЙ
function OnTransReply(trans)
-- Если поступила информация по текущей транзакции
obrv_trans_text1(tostring(trans.trans_id),trans.sec_code,tostring(trans.status), tostring(tobin(trans.flags)),
tostring(trans.order_num),tostring(trans.quantity),tostring(trans.price),trans.result_msg);
obrv_trans_data1(trans.date_time);
end;
систем дата и время ид транз бум ст флаг заявка л ц сообщение Дата выполн и время
*24.12.2018 15:08:43 2147483647 SRH9 3 1001000000000000000001 78807678 1 0 Заявка 78807678 успешно зарегистрирована. 24.12.2018 15:8:43 789238
====================
local Transaction={
['TRANS_ID'] = '2412181506', -- Номер транзакции надо сделать время с днем с часами минутами и секундами
['ACCOUNT'] = 'SPBFUT000pf',
['CLASSCODE']='SPBFUT',-- Код класса
['SECCODE'] = 'SRH9', -- Код инструмента
['ACTION'] = 'NEW_ORDER', -- Тип транзакции ('NEW_ORDER' - новая заявка)
['OPERATION'] = 'B', -- Операция ('B' - buy, или 'S' - sell)
['TYPE'] = 'M', -- Тип ('L' - лимитированная, 'M' - рыночная)
['QUANTITY'] = '1', -- Количество
['PRICE'] = '0' -- Цена
}
sendTransaction(Transaction)
Василий написал: Согласен, что все равно надо изучать
Если на самом деле писали раньше, то не нужно сомневаться, садитесь и пишите код, язык программирования мало чем отличается один от другого, везде одни и те же функции - массивы, циклы, строковые, математические, условия и тд. а заказывать кота в мешке абы у кого себе выйдет дороже...
Андрей написал: Еще разрешите вопрос по этой теме, каким образом понять к какой транзакции относится заявка? В сделке например есть поле trans_id, а в заявке такого поля я не нашел trans_id, как быть?
там скопилось много пустых записей и они мешают визуальному просмотру таблицы, пример картинки прилагаю, только две нормальные транзакции , которые сами удалятся после закрытия текущей сессии , а пустые так и останутся. И еще вопрос где то видел, что таблицы можно перенести из одной вкладки в другую, но не могу найти как это сделать?
Еще разрешите вопрос по этой теме, каким образом понять к какой транзакции относится заявка? В сделке например есть поле trans_id, а в заявке такого поля я не нашел trans_id, как быть? (наверно можно выкрутить если сделку по полю trans_id привести в соответствие с транзакцией, а затем сделку с заявкой через поле order_num. Но как это делается на практике?)
Интересно, вчера получилось и код нормально работал (транзакция создавалась и заявка и сделка) Сегодня заменилось большое количество бумаг при входе в систему демо квик юниор и код перестал работать. Поменял бумагу на другую из текущей таблицы торгов, но код все равно не работает, обрезал его до минимума и все равно не хочет код выполнять транзакцию и сообщений об ошибке нет, и счет нужный подключен. В чем может быть причина?
Код
function main()
local Transaction={
['TRANS_ID'] = '13579', -- Номер транзакции
['ACCOUNT'] = 'SPBFUT000pf',
['CLASSCODE']='SPBFUT',-- Код класса
['SECCODE'] = 'BRF9', -- Код инструмента
['ACTION'] = 'NEW_ORDER', -- Тип транзакции ('NEW_ORDER' - новая заявка)
['OPERATION'] = 'B', -- Операция ('B' - buy, или 'S' - sell)
['TYPE'] = 'M', -- Тип ('L' - лимитированная, 'M' - рыночная)
['QUANTITY'] = '1', -- Количество
['PRICE'] = '0' -- Цена
}
while run do sleep(1000) end
end