Эта статья начинает серию статей с примерами блоков кода, которые применяются при написании скриптов на QLua(Lua), каждый блок выполняет свою определенную задачу.
С каждой новой статьей блок кода будет усложняться своей функциональностью.
Эти блоки удобно брать и вставлять в свои скрипты, где нужно решить задачу, реализованную в блоке.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 | -- ПОЛУЧЕНИЕ РЕЗУЛЬТАТОВ ВЫПОЛНЕНИЯ ОТПРАВЛЕННОЙ ТРАНЗАКЦИИ -- для примера отправляется транзакция на выставление лимитированной заявки на покупку по определенной цене ACCOUNT = "SPBFUT00k59" -- Код счета CLASS_CODE = "SPBFUT" -- Код класса SEC_CODE = "RIH6" -- Код инструмента OpenPrice = 73000 -- Цена выставления заявки run = true -- Флаг работы цикла while в функции main trans_id = os.time() -- Текущие дата и время в секундах хорошо подходят для уникальных номеров транзакций LastStatus = nil -- Последний статус транзакции, который был выведен в сообщении -- Основная функция скрипта, пока работает эта функция, работает скрипт function main() -- Отправляет транзакцию на открытие позиции TransOpenPos() -- Пока работает данный цикл, работает скрипт while run do sleep(1) end end -- Срабатывает при остановке скрипта function OnStop() run = false end -- Отправляет транзакцию на открытие позиции function TransOpenPos() -- Выставляет заявку на открытие позиции -- Получает ID для следующей транзакции trans_id = trans_id + 1 -- Заполняет структуру для отправки транзакции local Transaction={ ['TRANS_ID'] = tostring(trans_id), -- Номер транзакции ['ACCOUNT'] = ACCOUNT, -- Код счета ['CLASSCODE'] = CLASS_CODE, -- Код класса ['SECCODE'] = SEC_CODE, -- Код инструмента ['ACTION'] = 'NEW_ORDER', -- Тип транзакции ('NEW_ORDER' - новая заявка) ['OPERATION'] = 'B', -- Операция ('B' - buy, или 'S' - sell) ['TYPE'] = 'L', -- Тип ('L' - лимитированная, 'M' - рыночная) ['QUANTITY'] = '1', -- Количество ['PRICE'] = tostring(OpenPrice) -- Цена } -- Отправляет транзакцию local Res = sendTransaction(Transaction) if Res ~= '' then message('TransOpenPos(): Ошибка отправки транзакции: '..Res) else message('TransOpenPos(): Транзакция отправлена') 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(): ТРАНЗАКЦИЯ ВЫПОЛНЕНА !!!') elseif trans_reply.status == 4 then message('OnTransReply(): Транзакция не выполнена торговой системой. Более подробное описание ошибки отображается в поле «Сообщение» (trans_reply.result_msg)') elseif trans_reply.status == 5 then message('OnTransReply(): Транзакция не прошла проверку сервера QUIK по каким-либо критериям. Например, проверку на наличие прав у пользователя на отправку транзакции данного типа') elseif trans_reply.status == 6 then message('OnTransReply(): Транзакция не прошла проверку лимитов сервера QUIK') elseif trans_reply.status == 10 then message('OnTransReply(): Транзакция не поддерживается торговой системой') elseif trans_reply.status == 11 then message('OnTransReply(): Транзакция не прошла проверку правильности электронной цифровой подписи') elseif trans_reply.status == 12 then message('OnTransReply(): Не удалось дождаться ответа на транзакцию, т.к. истек таймаут ожидания. Может возникнуть при подаче транзакций из QPILE') elseif trans_reply.status == 13 then message('OnTransReply(): Транзакция отвергнута, так как ее выполнение могло привести к кросс-сделке (т.е. сделке с тем же самым клиентским счетом)') end end end |
-- ПОЛУЧЕНИЕ РЕЗУЛЬТАТОВ ВЫПОЛНЕНИЯ ОТПРАВЛЕННОЙ ТРАНЗАКЦИИ -- для примера отправляется транзакция на выставление лимитированной заявки на покупку по определенной цене ACCOUNT = "SPBFUT00k59" -- Код счета CLASS_CODE = "SPBFUT" -- Код класса SEC_CODE = "RIH6" -- Код инструмента OpenPrice = 73000 -- Цена выставления заявки run = true -- Флаг работы цикла while в функции main trans_id = os.time() -- Текущие дата и время в секундах хорошо подходят для уникальных номеров транзакций LastStatus = nil -- Последний статус транзакции, который был выведен в сообщении -- Основная функция скрипта, пока работает эта функция, работает скрипт function main() -- Отправляет транзакцию на открытие позиции TransOpenPos() -- Пока работает данный цикл, работает скрипт while run do sleep(1) end end -- Срабатывает при остановке скрипта function OnStop() run = false end -- Отправляет транзакцию на открытие позиции function TransOpenPos() -- Выставляет заявку на открытие позиции -- Получает ID для следующей транзакции trans_id = trans_id + 1 -- Заполняет структуру для отправки транзакции local Transaction={ ['TRANS_ID'] = tostring(trans_id), -- Номер транзакции ['ACCOUNT'] = ACCOUNT, -- Код счета ['CLASSCODE'] = CLASS_CODE, -- Код класса ['SECCODE'] = SEC_CODE, -- Код инструмента ['ACTION'] = 'NEW_ORDER', -- Тип транзакции ('NEW_ORDER' - новая заявка) ['OPERATION'] = 'B', -- Операция ('B' - buy, или 'S' - sell) ['TYPE'] = 'L', -- Тип ('L' - лимитированная, 'M' - рыночная) ['QUANTITY'] = '1', -- Количество ['PRICE'] = tostring(OpenPrice) -- Цена } -- Отправляет транзакцию local Res = sendTransaction(Transaction) if Res ~= '' then message('TransOpenPos(): Ошибка отправки транзакции: '..Res) else message('TransOpenPos(): Транзакция отправлена') 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(): ТРАНЗАКЦИЯ ВЫПОЛНЕНА !!!') elseif trans_reply.status == 4 then message('OnTransReply(): Транзакция не выполнена торговой системой. Более подробное описание ошибки отображается в поле «Сообщение» (trans_reply.result_msg)') elseif trans_reply.status == 5 then message('OnTransReply(): Транзакция не прошла проверку сервера QUIK по каким-либо критериям. Например, проверку на наличие прав у пользователя на отправку транзакции данного типа') elseif trans_reply.status == 6 then message('OnTransReply(): Транзакция не прошла проверку лимитов сервера QUIK') elseif trans_reply.status == 10 then message('OnTransReply(): Транзакция не поддерживается торговой системой') elseif trans_reply.status == 11 then message('OnTransReply(): Транзакция не прошла проверку правильности электронной цифровой подписи') elseif trans_reply.status == 12 then message('OnTransReply(): Не удалось дождаться ответа на транзакцию, т.к. истек таймаут ожидания. Может возникнуть при подаче транзакций из QPILE') elseif trans_reply.status == 13 then message('OnTransReply(): Транзакция отвергнута, так как ее выполнение могло привести к кросс-сделке (т.е. сделке с тем же самым клиентским счетом)') end end end
Если у Вас появились какие-то вопросы, задайте их в комментариях под статьей !!!