Перевод робота с lua 5.1 на lua 5.3

Страницы: 1
RSS
Перевод робота с lua 5.1 на lua 5.3
 
Добрый день.

Писал робота для Квика версии 7 на lua 5.1. При использовании на демо-версии Квика 7 версии робот работает; при использовании на реальной версии 8.12.0.41 - не выставляет отложку в соответствии с кодом.
Вопрос: каким образом нужно изменить код, чтобы робот заработал на новой версии Квика?
Возможно, есть какое-то руководство или отдельная тема на форуме, посвящённая изменениям в коде при переходе с lua 5.1 на lua 5.3?

Неработающая на новой версии Квика часть кода:

Код
function NewOtlLong(acc,emit,class)
   
   local NumOfCandlesM1 = getNumCandles (graphic_id)                     
   local t, n, _ = getCandlesByIndex(graphic_id, 0, NumOfCandlesM1-3, 3)      
   
   transaction={                                                
               ["ACCOUNT"] = acc,
               ["CLASSCODE"] = class,
               ["SECCODE"] = emit,
               ["ACTION"] = "NEW_STOP_ORDER",
               ["TRANS_ID"] = "001",
               ["OPERATION"] = "B",
               ["QUANTITY"] = "1",
               ["STOPPRICE"] = tostring((t[1].low)+60),
               ["PRICE"] = tostring((t[1].low)+60),
               ["EXPIRY_DATE"] = "GTC"
            }
   transaction.CLIENT_CODE = "РОБОТ"
   local res = sendTransaction(transaction)                        
   return 1                                                   
end
 
Много раз уже обсуждалось.
Для примера https://forum.quik.ru/messages/forum10/message49125/topic5841
lua 5.3 при использовании tostring к типу float добаляет ".0 в представление.
tostring(5) ~ "5.0"

Если число 5 выглядит как целое, но его тип math.type может быть float. Поэтому tostring добавит в представление точку и ноль. Квик такое не принимает в качестве параметра транзакций, где предполагается целое.
 
Цитата
Nikolay написал:
Много раз уже обсуждалось.
Для примера  https://forum.quik.ru/messages/forum10/message49125/topic5841
lua 5.3 при использовании tostring к типу float добаляет ".0 в представление.
tostring(5) ~ "5.0"

Если число 5 выглядит как целое, но его тип math.type может быть float. Поэтому tostring добавит в представление точку и ноль. Квик такое не принимает в качестве параметра транзакций, где предполагается целое.
Благодарю. Добавил math.floor:  tostring(math.floor((t[1].low)+60)), заработало.
 
Доброго дня.

Снова возник вопрос, связанный с переходом на lua 5.3. В комбинации функций, удаляющих заявку, номер заявки (order_num) из таблицы заявок (функция getNumberOf("orders")) отображается в виде 1.4898984Е (цифры другие, как пример) и не идентифицируется как номер заявки. Версия Квика последняя. При этом полностью аналогичная комбинация функций, удаляющих стоп-заявку, работает; номер стоп-заявки (order_num) робот видит корректно.

Прошу вашей поддержки. В чём ошибка?
Код
function DeleteZayByNumber(class,emit,keyNumber)            
   transaction={
               ["CLASSCODE"] = class,                  
               ["SECCODE"] = emit,                     
               ["ACTION"] = "KILL_ORDER",               
               ["TRANS_ID"] = "333",
               ["ORDER_KEY"] = tostring(keyNumber),
            }
   transaction.CLIENT_CODE = "РОБОТ"
   local res = sendTransaction(transaction)               
   message(res)                                       
end

function DeleteAllZaySell(acc,emit,class)                  
   local NumOfCandlesM1 = getNumCandles (graphic_id)                  
   local t, n, _ = getCandlesByIndex(graphic_id, 0, NumOfCandlesM1-3, 3)   
   local N = getNumberOf("orders")                  
   local deleteCount = 0                              
   for i = 0,N-1 do
      local row = getItem("orders",i)
      if(row.account==acc and row.sec_code==emit and row.class_code==class) then                        
         if(bit.band(row.flags,1)>0) and                      
           (bit.band(row.flags,4)>0) then                  
            local keyNumber = math.floor(row.order_num)         
            DeleteZayByNumber(class,emit,keyNumber)            
            deleteCount = deleteCount + 1                  
         end
      end
   end
   return deleteCount                                 
end
 
Цитата
Олег написал:
В чём ошибка?
Вот в этой строчке
Код
local keyNumber = math.floor(row.order_num)
Зачем тут у вас math.floor()?
Он вам и приводит число к экспоненциальной записи.
Уберите и будет все работать
 
Цитата
BlaZed написал:
Цитата
Олег написал:
В чём ошибка?
Вот в этой строчке
Код
   local  keyNumber  =   math.floor (row.order_num)  
Зачем тут у вас math.floor()?
Он вам и приводит число к экспоненциальной записи.
Уберите и будет все работать

Добрый день. Попробовал убрать math.floor.
Ошибка остаётся прежней: Неправильно указан номер заявки: "1.9250430826724e+018"
 
Код
["ORDER_KEY"] = tostring(keyNumber)
Попробуй так
["ORDER_KEY"] = string.format("%u", keyNumber);
 
Олег, У меня стоит так:
A.TRANS_ID=tostring(TC);-- идентификатор транзакции
A.ACTION="KILL_ORDER"; -- на снятие заявки
A.ORDER_KEY=tostring(s.order_num);
Всё прекрасно работает.
 
Цитата
Олег написал:
Добрый день. Попробовал убрать math.floor.Ошибка остаётся прежней: Неправильно указан номер заявки: "1.9250430826724e+018"
Какая версия терминала используется?

Запустите следующий код
Цитата
  local N = getNumberOf("orders")                  
  for i=0,N-1 do
    local row = getItem("orders",i)
    if(bit.band(row.flags,1)>0) and (bit.band(row.flags,4)>0) then message("order_num="..row.order_num) end
  end
будет ли корректно отображаться номера активных заявок?
Страницы: 1
Читают тему
Наверх