Я определения текущего количества фьючерсов в портфеле я использую функцию getFuturesHolding. Обратил внимание, что если по тикеру ранее не было сделок, то функция возвращает Nil, а не 0 как я предполагал. Если сделки ранее были, то количество бумаг отображается корректно.
никак не могу разобраться с этой функцией. Есть такая молотилка, которая транзакции шлет, но OnTransReply не срабатывает...
Код
local LastStatus = nil
local trans_id=1
local stopped = false
function OnStop()
stopped = true
return 2000
end
function main()
while stopped == false do
trans_id=trans_id+1
local OrderSell = {
["ACTION"]="NEW_ORDER",
["ACCOUNT"]= "SPBFUT0000",
["OPERATION"] = "B",
["CLASSCODE"]="SPBFUT",
["SECCODE"] = "SRU0",
["PRICE"] = "0",
["QUANTITY"] = tostring(1),
["TRANS_ID"] = tostring(trans_id),
["TYPE"] = "M",
}
local result = sendTransaction(OrderSell)
sleep(1000)
end
end
function OnTransReply(trans_reply)
if trans_reply.trans_id == trans_id then
if trans_reply.status == LastStatus then return else LastStatus = trans_reply.status end
if trans_reply.status == 0 then message('OnTransReply(): Транзакция отправлена серверу')
elseif trans_reply.status == 1 then message('OnTransReply(): Транзакция получена на сервер QUIK от клиента')
elseif trans_reply.status == 2 then message('OnTransReply(): Ошибка')
elseif trans_reply.status == 3 then message('OnTransReply(): ТРАНЗАКЦИЯ ВЫПОЛНЕНА')
end
end
end
local stopped = false
function OnStop()
stopped = true
return 1000
end
function main()
local Table = AllocTable()
AddColumn(Table, 1,"FXRL", true, QTABLE_DOUBLE_TYPE, 18)
CreateWindow(Table)
SetWindowCaption(Table, "table")
SetWindowPos(Table, 0, 10, 400, 90)
InsertRow(Table, -1)
while stopped == false do
Quotes_1 = getQuoteLevel2("TQTF", "FXRL")
if Quotes_1 then
offer_1= tonumber(Quotes_1.offer_count)
fxrl_pr = tonumber(Quotes_1.offer[1].price)
SetCell(Table, 1, 1, tostring(fxrl_pr))
end
sleep(1000)
end
end
Попробовал, оба варианта, но не помогает вопрос не в том, что скрипт не работает, а в том, что он выключается и надо заново его включать нажатием play...
Код
if Quotes_1 then
xxxx
end
if Quotes_1 ~= nil then
xxxxx
end
Sergey Gorokhov, такой вариант. При закрытии стакана или отключении инета, тут же останавливается
Код
local xxx=100
local stopped = false
function OnStop()
stopped = true
return 1000
end
function main()
local Table = AllocTable()
AddColumn(Table, 1,"FXRL", true, QTABLE_DOUBLE_TYPE, 18)
CreateWindow(Table)
SetWindowCaption(Table, "table")
SetWindowPos(Table, 0, 10, 400, 90)
InsertRow(Table, -1)
while stopped == false do
if xxx>0 then
Quotes_1 = getQuoteLevel2("TQTF", "FXRL")
offer_1= tonumber(Quotes_1.offer_count)
fxrl_pr = tonumber(Quotes_1.offer[1].price)
SetCell(Table, 1, 1, tostring(fxrl_pr))
end
sleep(1000)
end
end
Есть скрипт, который берет данные из стакана котировок для дальнейшей работы. Если из стакана пропадают котировки (например, из-за сбоя сети), то функции возвращает Nil, скрипт отключается и его нужно включать вручную.
Можно добавить какой-нибудь код, чтобы этого отключения не было?
Sergey Gorokhov, вроде все заработало, спасибо. Но хотел бы уточнить - если транзакция должна уходить при срабатывании какого-либо условия, то это условие должно быть внутри цикла for?
Sergey Gorokhov, сделал такой вариант, но он не работает... Что я написал не так?
Код
local quantity=2
local id=1
function main()
for i=0,quantity,1 do
local OrderSell = {
["ACTION"]="NEW_ORDER",
["ACCOUNT"]= "SPBFUT0000",
["OPERATION"] = "B",
["CLASSCODE"]="SPBFUT",
["SECCODE"] = "SRU0",
["PRICE"] = "0",
["QUANTITY"] = tostring(1),
["TRANS_ID"] = tostring(ID),
["TYPE"] = "M",
}
local Err_Order = sendTransaction(OrderSell)
end
end
К примеру есть некий скрипт, который отправляет заявку при срабатывании условия cond. Но мне нужно, чтобы всего было отправлено заявок в количестве quantity.
Как в мой вариант скрипта добавить этот параметр?
Заранее спасибо.
Код
function main()
ID=10
if cond>100 then
ID=ID+1
local OrderSell = {
["ACTION"]="NEW_ORDER",
["ACCOUNT"]= "SPBFUT0000",
["OPERATION"] = "S",
["CLASSCODE"]="SPBFUT",
["SECCODE"] = "SRU0",
["PRICE"] = "0",
["QUANTITY"] = tostring(1),
["TRANS_ID"] = tostring(ID),
["TYPE"] = "M",
}
local Err_Order = sendTransaction(OrderSell)
end
end
Nikolay, это вполне рабочий код, который работает с малоликвидными бумагами, то есть сделки редкие и осуществляются при определенных условиях. Проблема в том, что если мне надо обнулить портфель из 10 бумаг (asset=10), то условие "until asset<=0" срабатывает отлично. Если же мне надо продать только 3 бумаги, то "until asset<=7" начинает продавать до тех пор, пока не уйдет в шорт. То же самое и "until asset==7".
Sergey Gorokhov, а в чем может быть причина? Когда нужен был 0, то Вы посоветовали "until asset<=0", и он сработал. Но если asset больше 0, то такой вариант не подходит
Сегодня почему-то на Quik Junior не работает getFuturesHolding - возвращает nil Вчера скрипт работал отлично. В чем может быть причина?
Код
function main()
local a1 = getFuturesHolding("SPBFUT", "SPBFUT***","SRU0",0).totalnet
local a2 = getFuturesHolding("SPBFUT", "SPBFUT***","LKU0",0).totalnet
message("Sber "..a1.."\nLkon "..a2)
end
Сделал скрипт, который при добавлении цикла repeat...until почему-то перестает обновляться. Если этот цикл убрать, то обновление идет без проблем... Почему бы так?
Заранее спасибо!
Код
local stopped = false
function OnStop()
stopped = true
return 2000
end
function main()
local Table = AllocTable()
AddColumn(Table, 1,"Data", true, QTABLE_DOUBLE_TYPE, 18)
CreateWindow(Table)
SetWindowCaption(Table, "Data table")
SetWindowPos(Table, 0, 10, 380, 80)
InsertRow(Table, -1)
while stopped == false do
Quotes_1 = getQuoteLevel2("SPBFUT", "SRU0")
Bid_Count_1 = tonumber(Quotes_1.bid_count)
if Bid_Count_1>1 then
aa= tonumber(Quotes_1.bid[Bid_Count_1].quantity)
SetCell(Table, 1, 1, tostring(aa))
end
local asset = getFuturesHolding("SPBFUT", "SPBFUT****","SRU0",0).totalnet
repeat
if aa>1 and asset>0 then
local ID_B_Order=10
local OrderSell = {
["ACTION"]="NEW_ORDER",
["ACCOUNT"]= "SPBFUT****",
["OPERATION"] = "S",
["CLASSCODE"]="SPBFUT",
["SECCODE"] = "SRU0",
["PRICE"] = "0",
["QUANTITY"] = tostring(1),
["TRANS_ID"] = tostring(ID_B_Order),
["TYPE"] = "M",
}
local Err_Order = sendTransaction(OrderSell)
message(Err_Order)
end
asset=asset-1
sleep(1000)
until asset==0
--return
sleep(3000)
end
end
Игорь Б,, я и этом вариант пробовал - то же самое.
Мне кажется, что getFuturesHolding не лучший вариант для таких скриптов. Насколько я понял из документации, есть еще функции для определения текущих позиций, но пока не получилось с ними разобраться - у меня опыт с луа 10 дней )
Стоит задача: после покупки лукойла в количестве 1 штуки (появление его в портфеле) необходимо купить 1 сбер.
В текущем варианте кода лукойл покупается сразу, а сбер только после остановки скрипта и его повторного запуска.
Видимо необходим перезапуск getFuturesHolding; я его пробовал вставить внутрь цикла со сбером ,но эффекта нет...
Как мне следует поступить?
Заранее спасибо!
Код
function main()
while stopped == false do
local portfolio = getFuturesHolding("SPBFUT", "SPBFUT***","LKU0",0).totalnet
if portfolio==0 then
--заявка на покупку LKU0
elseif portfolio==1 then
--заявка на покупку SRU0
end
sleep(1000)
end
en
Код доработал, и все заработало. Не поможете еще с одним вопросом? Я задал условие, что покупка возможна тогда когда количество бумаг в портфеле равно 0 Выражение if portfolio=0 системе не понравилось, и когда я заменил на if portfolio=="0", то ошибка исчезла, но код не работает В чем может быть проблема?
Заранее спасибо!
Код
local stopped = false -- переменная управляющая основным циклом скрипта если значение false цикл работает, если true цикл останавливается и выполнение скрипта заканчивается.
function OnStop() -- функция обратного вызова OnStop() вызывается терминалом QUIK в случае нажатия кнопки "Остановить" в окне "Доступные скрипты"
stopped = true -- изменение значения переменной stopped на true, для остановки основного цикла скрипта
return 2000
end
function main()
while stopped == false do
local portfolio = getFuturesHolding("SPBFUT", "SPBFUT***","LKU0",0).totalnet
if portfolio=="0" then
local ID_B_Order=10
local OrderSell = {
["ACTION"]="NEW_ORDER",
["ACCOUNT"]= "SPBFUT***",
["OPERATION"] = "B",
["CLASSCODE"]="SPBFUT",
["SECCODE"] = "LKU0",
["PRICE"] = "0",
["QUANTITY"] = tostring(1),
["TRANS_ID"] = tostring(ID_B_Order),
["TYPE"] = "M",
}
message(Err_Order)
local Err_Order = sendTransaction(OrderSell)
while Status_B_Order == nil and Err_Order == "" do
sleep(10)
end
ID_B_Order = ID_B_Order + 1
end
sleep(1000)
end
end
Учусь кодить заявки на покупку/продажу и сделал такой код
Код
local stopped = false -- переменная управляющая основным циклом скрипта если значение false цикл работает, если true цикл останавливается и выполнение скрипта заканчивается.
function OnStop() -- функция обратного вызова OnStop() вызывается терминалом QUIK в случае нажатия кнопки "Остановить" в окне "Доступные скрипты"
stopped = true -- изменение значения переменной stopped на true, для остановки основного цикла скрипта
return 2000
end
function main()
while stopped == false do
local ID_B_Order
local OrderSell = {
["ACTION"]="NEW_ORDER",
["ACCOUNT"]= "SPBFUT*****",
["OPERATION"] = "B",
["CLASSCODE"]="SPBFUT",
["SECCODE"] = "LKU0",
["PRICE"] = "0",
["QUANTITY"] = tostring(1),
["TRANS_ID"] = tostring(ID_B_Order),
["TYPE"] = "M",
}
message(Err_Order)
local Err_Order = sendTransaction(OrderSell)
while Status_B_Order == nil and Err_Order == "" do
sleep(10)
end
end
end
При запуске Квик не реагирует вообще. Может быть что-то не дописал или в Квике должна быть открыта какая-нибудь таблица?
На моем Quil Junior почему-то отображается рваный график ММВБ, более того, даже свечу за субботний день нарисовал, хотя торгов не было. На скриншоте "дефектные" свечи обведены красным. Может что-то в настройках неверно?
Sergey Gorokhov, я правильно понимаю, что скрипт должен быть таким?
Код
repeat
local asset = getFuturesHolding("SPBFUT", "SPBFUTJRkUv","LKU0",0).totalnet
local Err_Order = sendTransaction(LimitOrderSell)
until asset = asset-1