Цена получается из стакана (просто текущая цена продажи).
Цикл вокруг получения цены скорее всего будет не нужен как только я научусь получать цену от любого инструмента.
Коды транзакций я получаю из os.sysdate(). Мне там именно пара нужна.
Функцию отправки запроса я приложил в конце.
Все работает. Цена определяется. Заявка выставляется. Но только если в окне "Текущая таблица параметров" выбрана вот та самая бумага - 'SU26219RMFS4'. Это ОФЗ.
Выбираешь в окне другую и нужно менять код в скрипте.
И вот что должно быть заявлено в скрипте чтобы эту связку разорвать я не совсем понимаю.
Такое поведение Quik меня тоже удивило. Поэтому и спрашиваю.
Я не понял про "установить умный заказ". С окнами и настройками я в общем то разобрался. Но судя по всему что-то упустил именно в контексте программного доступа к данным.
Вероятно помимо настроек нужно по другому компоновать скрипт. Данный подход с функцией main() самый простой. Функции обратного вызова я еще не смотрел. Наверное там следует искать ответ.
По поводу получения цены. Из графиков я уже экспортировал некоторые куски. Посмотрю как это можно использовать как альтернативу цен из стакана.
Благодарю за участие в моем обучении.
Код |
---|
co = require('m_common_objects')
to = require('m_trading_objects')
sn = 'example_9.lua'
function OnInit()
is_running = true
co.toLogInit(sn, 'session begins.')
end
function OnStop()
is_running = false
co.toLogStop(sn, 'session ends.')
end
function main()
local pc = 0
local trans_id_buy = 0
local trans_id_sell = 0
local price_pc_buy = 0
local sec_code = '' -- instrument name
local price_margin
--while to.is_running do
local quoteLevel
local pc = 0
sec_code = 'SU26219RMFS4'
-- infinite loop to compensate for problems with getting the price
while true do
quoteLevel = getQuoteLevel2('TQOB', sec_code)
if quoteLevel.offer then
pc = tonumber(quoteLevel.offer[1].price)
end
if pc == 0 or pc < 0 or pc == nil then
co.toLog(sn, ' still nothing...')
sleep(math.random(1000, 2000))
else
break
end
end
co.toLog(sn, 'pc = '..pc)
price_margin = 0.25
-- get transaction IDs
trans_id_sell, trans_id_buy = to.getTransID(sn)
-- submit Buy order
price_pc_buy = to.pbuy(pc, price_margin)
co.toLog(sn, 'price_pc_buy = '..price_pc_buy)
to.send_order_buy(sn, trans_id_buy, sec_code, price_pc_buy, 1)
--end
co.toLogMain(sn, 'main function ends.')
end
local function send_order_buy(sn, tid, sc, pb, qt)
-- sn - script name
-- tid - transaction ID
-- sc - security code (instrument name)
-- pb - price buy
-- qt - quantity
local order = {}
local err = ''
co.dbg(sn, tid)
while true do
order = {
['ACCOUNT'] = trading_objects.ACCOUNT,
['CLIENT_CODE'] = trading_objects.CLIENT_CODE,
['CLASSCODE'] = trading_objects.CLASS_CODE,
--
['ACTION'] = 'NEW_ORDER',
['EXECUTION_CONDITION'] = 'PUT_IN_QUEUE',
['TRANS_ID'] = tid,
['SECCODE'] = sc,
['OPERATION'] = 'B',
['PRICE'] = tostring(pb),
['QUANTITY'] = tostring(qt)
}
err = sendTransaction(order)
co.dbg(sn, err)
if err ~= '' then
co.toLog(sn, 'Error! '..err)
else
break
end
sleep(math.random(1, 100))
end
co.toLog(sn, sc..'; tid='..tid..'; B ; price='..tostring(pb)..'; qty='..tostring(qt))
return tid
end |