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

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

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

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

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

Блок кода QLua

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

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

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

  1. Добрый день! Не подскажите почему не работает условие снять остаток?
    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)
    Пробовал и через робот запускать и вручную в терминале. Заявка выставляется и тут же снимается. А по идее должен сниматься только не исполненный остаток.

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

    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
  3. Доброе время суток. А как можно вывести на терминал что-то типа окошка например с 2-мя кнопками "ДА" "НЕТ", ну и дальше действовать, в зависимости от нажатия

  4. Добрый день!
    Пытаюсь колбеки транзакций записывать в файл - но пропадают некоторые из них. Я отправляю сразу 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;