Эта статья начинает серию статей с примерами блоков кода, которые применяются при написании скриптов на QLua(Lua), каждый блок выполняет свою определенную задачу.
С каждой новой статьей блок кода будет усложняться своей функциональностью.
Эти блоки удобно брать и вставлять в свои скрипты, где нужно решить задачу, реализованную в блоке.
Блок кода QLua
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
Если у Вас появились какие-то вопросы, задайте их в комментариях под статьей !!!