отправка заявки из скрипта Lua

Страницы: 1
RSS
отправка заявки из скрипта Lua
 
Добрый день,
Скрипт вызывается из окна "Доступные скрипты".
В скрипте все как обычно: получаю цену, открываю заявку.
Но, и цена и заявка срабатывают только если в таблице "Текущая таблица параметров" выбран инструмент соответствующий инструменту заданному в скрипте.
Что это, такое запрограммированное поведение Quik?
Или все-же существует метод как получить цену и открыть заявку без какой-либо связки скрипта с окнами инструментов?
 
spb13 Это лучшей вопрос, за время которое я провел на сайте просто супер, только не обижайтесь "ради  бога"! :smile:  :smile:  :smile:  
 
Не обижаюсь. Потому-что не понимаю в чем собственно проблема. ;-)
Если это сарказм с Вашей стороны, то лучше объяснить, что к чему для неофита.
И все же, можно или нельзя.
 
__spb13__,  С перового прочтения сформулированный Вами  вопрос, сильно смахивает на каламбур, рассмешил, извините еще раз.  Касаемо вопроса.
1) Квик действительно нужно настроить под себя, в открытом окне развернуть необходимые для работы таблицы. Зайти в настройки и установить умный заказ. Более подробно, на сайте есть от разработчиков, по моему первые посты.
2) цену в скрипте можно получать разными способами: с подпиской, с графика, из таблицы текущих параметров, стакана и так далее.
3) То что Вы описываете, поведение не совсем характерное, для понимания проблемы, лучше показать код, где получаете цену и как пытаетесь вывести ее в ордере.
 
Цена получается из стакана (просто текущая цена продажи).
Цикл вокруг получения цены скорее всего будет не нужен как только я научусь получать цену от любого инструмента.
Коды транзакций я получаю из 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
 
Цитата
__spb13__ написал:
Добрый день,
Скрипт вызывается из окна "Доступные скрипты".
В скрипте все как обычно: получаю цену, открываю заявку.
Но, и цена и заявка срабатывают только если в таблице "Текущая таблица параметров" выбран инструмент соответствующий инструменту заданному в скрипте.
Что это, такое запрограммированное поведение Quik?
Или все-же существует метод как получить цену и открыть заявку без какой-либо связки скрипта с окнами инструментов?
Можно  использовать колбек Onparam.
этот колбек вызывается , когда приходят какие-либо изменения в ТТП
Например, совершилась сделка или изменились лучшая цена в стакане.
При этом Вы получаете код инструмента и можно прочитать текущую цену этого инструмента и решить выставлять или нет заявку или изменить положение стоп-заявки
 
__spb13__,  С кодом у Вас, все в порядке. Перед основным циклом, Вы задаете инструмент по которому хотите работать, он загружается один раз перед выполнением цикла, а дальше вся работа идет в цикле.
       sec_code = 'SU26219RMFS4'
       -- infinite loop to compensate for problems with getting the price
       while true do
Цитата
__spb13__ написал:
Но только если в окне "Текущая таблица параметров" выбрана вот та самая бумага - 'SU26219RMFS4'. Это ОФЗ.Выбираешь в окне другую и нужно менять код в скрипте.
У вас окна квика привязаны к  таблице текущих параметров, для того чтобы отключить эту функцию, нужно сбросить якоря(в верхнем углу стакана горит цветная кнопка, встаете на нее л.кнопка мыши "отключить"). Чтоб работал Этот код должен быть открыт стакан по данному инструменту. quoteLevel = getQuoteLevel2('TQOB', sec_code). в вашем случае,  sec_code = 'SU26219RMFS4'.
Если хотите добавить работу с портфелем бумаг вместо sec_code = 'SU26219RMFS4', создайте таблицу sec_codes = {'SU26219RMFS4', ...,} и в цикле перебирайте эту таблицу.

Код
 
local sec_codes = {'SU26219RMFS4', ...}

 -- infinite loop to compensate for problems with getting the price
        while true do

         for _, sec_code in ipairs(sec_codes) 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
        end
       
 
VPM, Ага, все таки окна. У меня действительно заякорены были три окна. Отключил и скрипт ожил. Странная связка.
Да с циклом по инструментам я знаком. Изначально скрипт был так и написан. Но нужно было упростить модель для выяснения причин неправильной работы.
Благодарю Вас за разъяснения.
 
nikolz, Да, работа с этими функциями еще предстоит. Благодарю за участие.
 
Всех благодарю за помощь. Программа заработала. Вопрос закрыт.
Страницы: 1
Читают тему
Наверх