Дублируются пользовательские сообщения из скрипта lua

Страницы: 1
RSS
Дублируются пользовательские сообщения из скрипта lua
 
Всем добрый день.

Есть такой код:
Код
ticker = {"VTBR"}
lot = {"1"}
trans_id = {os.time()+1}
account = "xxxxxx"
class_code = "yyyy"
client_code = "zzzzzzzz"
LastStatus = {nil}           
run = true         

function main()
   TransOpenPos() 
   while run do sleep(1) 
   end
end

function OnStop() 
   run = false 
end

function TransOpenPos()
   for j = 1, #ticker do
      local Transaction={
         ACCOUNT = account;
         CLIENT_CODE = client_code;
         CLASSCODE = class_code;
         SECCODE = ticker[j];
         ACTION = 'NEW_ORDER';
         OPERATION = 'S';
         TYPE = 'M';
         PRICE = 0;
         QUANTITY = lot[j];
         TRANS_ID = tostring(trans_id[j]);
      }
      local Res = sendTransaction(Transaction)
      if Res ~= '' then message('TransOpenPos(): Ошибка отправки транзакции: '..Res) else message('TransOpenPos(): Транзакция отправлена') 
      end
   end
end

function OnTrade(trade)
   for j = 1, #ticker do
      if trade.trans_id == trans_id[j] then
         sleep(100);
         message('OnTrade(): По транзакции №'..trade.trans_id..' успешно совершена сделка №'..trade.trade_num..' по цене '..trade.price..' объемом '..trade.qty) 
         qty_trades = getNumberOf("trades"); 
         num_trade = 0; 
         for i = 0, qty_trades - 1 do 
            trade_find = getItem("trades", i); 
            if trade_find.sec_code == ticker then 
               num_trade = trade_find.trade_num
            end
         end
         message("Номер сделки в торговой системе - "..trade.trade_num);
         sleep(100);   
      end
   end
end

Работает нормально, только после выполнения кода почему-то повторяются сообщения, которые находятся внутри functon OnTrade(trade). См. вложенный файл с серией сообщений после выполнения кода.
Подскажите, пожалуйста, с чем это связано и как исправить.

С уважением.
 
Функции обратного вызова вызываются по нескольку раз и это обычное поведение. Вызываются они не только после изменения свойств входящего параметра доступных внутри луа, но и свойств которые остаются "за кадром".
 
Благодарю за ответ.
Вот здесь нашел решение - https://quik2dde.ru/viewtopic.php?id=310 .
Вставил в начало кода:
Код
t_trades = {}

И после function OnTrade(trade)
Код
   if t_trades[trade.order_num] then
   return
   end
   t_trades[trade.order_num] = true

Сейчас сообщения не повторяются.
 
Цитата
Алексей А. написал:
Благодарю за ответ.
Вот здесь нашел решение -  https://quik2dde.ru/viewtopic.php?id=310  .
Вставил в начало кода:
Код
  t_trades  =  {}
  

И после function OnTrade(trade)
Код
      if  t_trades[trade.order_num]  then 
    return 
    end 
   t_trades[trade.order_num]  =   true 
  

Сейчас сообщения не повторяются.
Информация к размышлению:
------------------------
1) Зачем дублировать таблицу сделок?
----------------------
2) Если сделок миллион. Сколько времени уйдет на поиск   t_trades[trade.order_num]?
 
Цитата
nikolz написал:
1) Зачем дублировать таблицу сделок?
Честно говоря, не знаю. Код работает, да и ладно.
Цитата
nikolz написал:
2) Если сделок миллион.
Миллиона не будет. Возможно, около 50.
 
Цитата
nikolz,
Может, у вас есть вариант решения проблемы, чтобы сообщения не повторялись?
 
Цитата
nikolz написал:
Цитата
2) Если сделок миллион. Сколько времени уйдет на поиск   t_trades[trade.order_num]?
Там хеш-таблица. Много времени не уйдет.
 
Я просто сделал проверку на то, что каждый получаемый trade_num , был больше предыдущего и дубли исчезли.
Код
function OnTrade(trade) -- обработчик события сделки
   if trade.client_code~=p_clientcode or trade.sec_code~=trw.p_seccode then return end -- чужая заявка
   local tnord=trade.trade_num --номер сделки
   local on ord=trade.order_num --номер заявки
   local price=trade.price --цена сделки
   local dir="" if bit.test(trade.flags,2)==true then dir="S" else dir="B" end -- направление сделки   
   if tnord>last_trade then --в обработку
          last_trade=tnord
...
...
...
  end
end

 
 
Естественно last_trade прописана как глобальная переменная
 
Порядок прихода сделок по возрастанию номера не гарантирован.
 
Цитата
Станислав написал:
Порядок прихода сделок по возрастанию номера не гарантирован.
Это да. По этому другой вариант - отбрасывать сделки где last_trade==tnord
Страницы: 1
Читают тему
Наверх