Получение результатов выполнения отправленной транзакции QLua(Lua)

Автор записи: Дмитрий (Admin)
1 звезда2 звезды3 звезды4 звезды5 звезд (Голосов 5, среднее: 5,00 из 5)
Загрузка...

Блоки кодаЭта статья начинает серию статей с примерами блоков кода, которые применяются при написании скриптов на QLua(Lua), каждый блок выполняет свою определенную задачу.

С каждой новой статьей блок кода будет усложняться своей функциональностью.

Эти блоки удобно брать и вставлять в свои скрипты, где нужно решить задачу, реализованную в блоке.

Блок кода QLua

Если у Вас появились какие-то вопросы, задайте их в комментариях под статьей !!!

Добавить комментарий

Получение результатов выполнения отправленной транзакции QLua(Lua): 31 комментарий

  1. Добрый день! Посмотрел комментарии, был вопрос о переносе заявки, но для переноса лимитной заявки такой код не срабатывает. Может кто-то использовал в своей практике подобные вещи? Пробовал некоторые параметры, но все равно не срабатывает. Как я понимаю, при выставлении лимитной заявки с критериями переноса и до какой даты, должно заполниться поле "Код биржи" в таблице заявок.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    
    	local Transaction={
    		["TRANS_ID"]			= tostring(trans_id_OPT),
    		["ACTION"]				= "NEW_ORDER",
    		["CLASSCODE"]			= class_code_opt,
    		["SECCODE"]				= OptionCall,
    		["OPERATION"]			= "B",										-- покупка (BUY)
    		["TYPE"]				= "L",										-- лимитка (Limit) -- "M", -- по рынку (MARKET)
    		["QUANTITY"]			= string.format("%.0f",tostring(LotBCall)),	-- количество
    		["ACCOUNT"]				= TRADE_ACC,
    		["PRICE"]				= PriseCallBuy,
    		["exec_type"]			= 2,										-- «2» – «Поставить в очередь» «5» – До даты
    		["Переносить заявку"]	= "Да",
    		--["exchange_code"]		= tostring(time_sek),						-- Дата окончания срока действия заявки
    		["EXPIRY_DATE"]			= tostring(time_sek),						-- Дата окончания срока действия заявки
    		--["EXPIRY_DATE"]		= GTC,										-- Дата окончания срока действия заявки
    		--["EXPIRY"]			= tostring(time_sek),						-- Дата окончания срока действия заявки
    		["COMMENT"]				= "Покупка опционов Call скриптом"
    	}
    1. Здравствуйте, Василий, самый простой способ разобраться с полями - это использовать таблицу "Карман транзакций", открыть ее можно: "Создать окно" - "Все типы окон" - Прочее - "Карман транзакций"
      Добавьте в нее нужную Вам транзакцию, затем кликните по ней правой кнопкой мыши и выберите пункт "Сохранить транзакции в tri-файл"
      Откройте получившийся файл и посмотрите какие там поля и какие значения, функция sendTransaction() позволяет отправлять таблицы транзакций как с англоязычными названиями полей, так и с русскими, хоть вперемешку. Можно при помощи этой функции отправить все содержимое этого tri-файла одной строкой

      1. Дополню комментарий, может кому пригодится.
        Через скрипт qlua можно отправить лимитную заявку с англоязычными названиями полей, но только без переноса через клиринг.

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        
         	local Transaction={
        		["TRANS_ID"]		= "1",
        		["ACTION"]		= "NEW_ORDER",
        		["CLASSCODE"]	= SPBOPT,
        		["SECCODE"]		= "Si74500BB1",
        		["OPERATION"]	= "S",			-- продажа (SELL)
        		["TYPE"]			= "L",			-- лимитка (Limit) -- "M", -- по рынку (MARKET)
        		["QUANTITY"]	= "2",			-- количество
        		["ACCOUNT"]	= "5446872",
        		["PRICE"]			= "100",
        		["COMMENT"]	= "Call"
        	}

        Если необходимо переносить лимитную заявку до какой либо даты, то в коде нужно использовать русскоязычное название полей, а также их значений, исключение составляют лишь некоторые поля и значения.

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        
         	local Transaction={
        		["TRANS_ID"]		                	= "1",
        		["ACTION"]	         			= "Ввод заявки",
        		["CLASSCODE"]		        	= "SPBOPT",
        		["Инструмент"]	        		= "Si74500BB1",
        		["К/П"]				        	= "Покупка",
        		["Тип"]	                        		= "Лимитированная",
        		["Количество"]		        	= "2",
        		["Торговый счет"]	        	= "5446872",
        		["Цена"]			                	= "100",
        		["Условие исполнения"]	= "Поставить в очередь",
        		["Переносить заявку"]   	= "Да",
        		["Дата экспирации"]	        	= "20210218",
        		["Комментарий"]			= "Call"
        	}
  2. Добрый день! Не подскажите почему не работает условие снять остаток?
    sell = {
    ["EXECUTION_CONDITION"] = "KILL_BALANCE",
    ["CLASSCODE"] = tostring(p_classcode),
    ["SECCODE"] = tostring(p_seccode),
    ["ACCOUNT"] = tostring(p_account),
    ["CLIENT_CODE"] = tostring(p_account),
    ["ACTION"]="NEW_ORDER",
    ["TYPE"]="L",
    ["OPERATION"]="S",
    ["QUANTITY"]= tostring(lots),
    ["PRICE"]=tostring(priceSell),
    ["TRANS_ID"]="2"
    }
    result = sendTransaction(sell)
    Пробовал и через робот запускать и вручную в терминале. Заявка выставляется и тут же снимается. А по идее должен сниматься только не исполненный остаток.

  3. Здравствуйте. Почему-то не отправляется транзакция, никак не могу найти, в чём причина. Вот код:

    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
    
    function sendBid(class_code, sec_code, isOpened, isBuy)
    	local price = getPriceForTrade(isBuy)
    	local strBuyStatus = ''
    	if isBuy then
    		strBuyStatus = 'покупка'
    	else
    		strBuyStatus = 'продажа'
    	end
    	local msg = 'Отправка транзакции. Цена: '..price..' Действие: '..strBuyStatus
    	WriteToLog(msg, 1, true)
    	tryToSendTransaction(class_code, sec_code, isBuy, price)
     
    end
     
    function tryToSendTransaction(class_code, sec_code, isBuy, price)
    	local operationStr = nil
    	if isBuy then
    		operationStr = "B"
    	else
    		operationStr = "S"
    	end
    	t = {
    		["ACCOUNT"] = DEPO_ACCOUNT,
    		["PRICE"] = tostring(price),
    		["QUANTITY"] = "1",
    		["SECCODE"] = sec_code,
    		["ACTION"] = "NEW_ORDER",
    		["CLASSCODE"] = class_code,
    		["CLIENT_CODE"] = CLIENT_CODE,
    		["TYPE"] = "L",
    		["OPERATION"] = operationStr,
    		["TRANS_ID"] = "1"
    	}
    	local res = sendTransaction(t)
    	if res ~= '' then
    		WriteToLog('Транзакцию не удалось отправить', 3, true)
    	end
     
    end
  4. Доброе время суток. А как можно вывести на терминал что-то типа окошка например с 2-мя кнопками "ДА" "НЕТ", ну и дальше действовать, в зависимости от нажатия

  5. Добрый день!
    Пытаюсь колбеки транзакций записывать в файл - но пропадают некоторые из них. Я отправляю сразу 10 тестовых заявок, из них записываются 8-9
    Вот код

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
    function main()
       while IsRun do
    	for i,queu in ipairs(queue) do
    		line=tostring(queue[i].trans_id)..";"..tostring(queue[i].status)..";"..tostring(tonumber(queue[i].order_num))..";"..tostring(queue[i].brokerref)..";"..tostring(queue[i].result_msg)..";".."\n";
    		table.sremove(queue,i);
    		f:write(line);
    		f:flush();
    	end;
       end;
    end;
    -- Функция вызывается терминалом, когда с сервера приходит новая информация о транзакциях
    function OnTransReply(trans_reply)
    	table.sinsert(queue,trans_reply);
    end

    Если запись в файл поставить в OnTransReply, то все колбеки записываются

    1. Добрый день! Это происходит из-за смещения индексов массива при удалении в цикле. Самый простой вариант, ничего не удалять из массива, а запоминать индекс последней обработанной транзакции при завершении цикла for и при следующей итерации цикла while начинать чтение массива со следующего по счету индекса, тогда Вы не пропустите ничего.

        1. Пожалуйста! Есть еще такой вариант:

          1
          2
          3
          4
          5
          6
          7
          8
          
          local offset = 0
          for i=1,#queue do
             line=tostring(queue[i - offset].trans_id)..";"..tostring(queue[i - offset].status)..";"..tostring(tonumber(queue[i - offset].order_num))..";"..tostring(queue[i - offset].brokerref)..";"..tostring(queue[i - offset].result_msg)..";".."\n";
             table.sremove(queue,i - offset);
             offset = offset + 1
             f:write(line);
             f:flush();
          end;

          Вроде бы тоже должен работать

            1. Что-то вы перемудрили, вот так проще:

              1
              2
              3
              4
              5
              6
              
              while #queue > 0 do
               line=tostring(queue[1].trans_id)..";"..tostring(queue[1].status)..";"..tostring(tonumber(queue[1].order_num))..";"..tostring(queue[1].brokerref)..";"..tostring(queue[1].result_msg)..";".."\n";
                 table.sremove(queue,1);
                 f:write(line);
                 f:flush();
              end;
            2. Перебирайте таблицу с конца и не парьтесь на счет всяких там индексов
              for i=1, #queu, -1 do
              line=tostring(queue[i].trans_id)..";"..tostring(queue[i].status)..";"..tostring(tonumber(queue[i].order_num))..";"..tostring(queue[i].brokerref)..";"..tostring(queue[i].result_msg)..";".."\n";
              table.sremove(queue,i);
              f:write(line);
              f:flush();
              end;

              1. t = {
                ["TRANS_ID"]=10,
                ["CLASSCODE"]=SPBFUT,
                ["SECCODE"]=BRH18,
                ["ACTION"]="NEW_ORDER",
                ["ACCOUNT"]=SPBFUTJRcwz,
                ["TYPE"]="L",
                ["OPERATION"]=B,
                ["QUANTITY"]=1,
                ["PRICE"]=66.8,
                }
                res=sendTransaction(t)
                message(res,1)

                Quik выдает ошибку - неверный идентификатор транзакции, перепробовал все начиная от времени системы в "транс ИД" до произвольных чисел.

                1. ["QUANTITY"] - вот так нет нужды писать, ну если начётно известно имя поля
                  Все значения таблицы t должны быть строками, а у вас цифры и какие-то переменные: BRH18, SPBFUTJRcwz - чему они равны?
                  Вот так будет правильно:
                  t_id = 10
                  price = 66.8
                  scode = "BRH18"
                  t = {
                  TRANS_ID=tostring(t_id ),
                  CLASSCODE="SPBFUT",
                  SECCODE=scode,
                  ACTION="NEW_ORDER",
                  ACCOUNT="SPBFUTJRcwz",
                  TYPE="L",
                  OPERATION="B",
                  QUANTITY="1",
                  PRICE=tostring(price),
                  }
                  res=sendTransaction(t)
                  message(res,1)

                    1. Почему то ругается на кол-во знаков после запятой, машина думает что я указываю 67.420000
                      Когда как указываю 67.42