Получение данных из таблицы текущих торгов

Страницы: 1
RSS
Получение данных из таблицы текущих торгов
 
В документации ответа на вопрос не нашёл.
Предположим, мы хотим послать набор из 20 параметров из таблицы текущих торгов. В документации есть такой пример

в callback OnParam вызываем GetParamEx по нужному классу-коду-параметру, записываем в глобальную табличку и в main() её вычитываем, чтобы не лочить поток обработчика.
Вопрос такой: GetParamEx работает над копией строки, которая была обновлена или нет?

Вопрос связан с тем, что вызвав GetParamEx() 20 раз, я получу неконсистентные данные (пока получаю параметры поштучно строка изменяется) или всё будет хорошо? Мне бы получить оригинальную строку, которая бы была в Таблице текущих торгов.
 
Правильный вопрос.
Можно попробовать вот такую конструкцию, где используется синхронизация через table.ssort (см. документацию для прояснения деталей; в потоке коллбэков эта конструкция не нужна, а в потоке main нужна):

Код
local paramTable = {}
  table.ssort({ 0, 1 }, function(a, b)  
  -- Тут делаем нужные операции, которые, по идее, должны быть выполнены атомарно
  paramTable["bid"] =  GetParamEx(аргументы для получения bid).param_value
  paramTable["offer"] =  GetParamEx(аргументы для получения offer).param_value
  -- Далее аналогично
return true
end)

Но вопрос к разработчикам терминала такой: этим мы достигнем требуемого (см. первое сообщение темы)?
 
Я планировал формировать таблицу в потоке коллбэков, а обрабатывать её через main() По ощущениям, GetParamEx функция недорогая, хотя я планирую выгружать все инструменты всех классов. По идее, отсутствие в коллбеке строки, для которой коллбек сработал, говорит нам о том, что данные нескольких вызовов GetParamEx не будут консистенты, так как эта фунция общего назначения. Исключение только если во время работы коллбека в терминале србатывает глобальная брокировка на обновление данных.


По крайней мере мне это видится так.
 
Я формирую таблицу в мейне, заполняю её строками (удаляю ненужные или добавляю недостающие) тоже в мейне (раз в 15 секунд), заполняю ячейки данными тоже в мейне (раз в секунду) - тогда и получаю необходимые данные (через GetParamEx) для нескольких сотен инструментов разных классов. Времени это не жрёт, от слова "совсем". И никаких коллбэков, от того же самого слова. Исключение - OnStop и OnTrade. Чего и  другим советую.  :smile:  
 
Я пока остановился на таким варианте. Где-то тысяч 5 инструментов экспортируется, параметров 25, раз в 2 секунды Запас по производительности как будто бы есть. А в чём преимущество всё делать в мейне и как вообще отказаться от коллбэка?
Главное сервер надолго не отключать, если таблица отжирает гиг, то Квик помирает. При нормальной работе очереди нет (занимаемая скриптом память < мегабайта).


Код
json = require("lib.json")
socket = require("lib.socket")
cfg = require("config")

function string.starts(String,Start)
   return string.sub(String,1,string.len(Start))==Start
end

function hasOption (tab, val)
    for index, value in ipairs(tab) do
        if string.starts(val, value) then
            return true
        end
    end

    return false
end

function OnInit(script) 
   isRun = true
   connected = false
   InstrumentsQueue = {}
end

function OnParam(class_code, sec_code)
   if cfg.classes:find(class_code) ~= nil then
      if (class_code == "SPBOPT" and hasOption(cfg.optionFilter, sec_code) == false) then
         return
      end

      local data = {}
      data["market"] = getParamEx(class_code, sec_code, "CLASS_CODE")
      data["ticker"] = getParamEx(class_code, sec_code, "CODE")
                -- кусь --
      table.sinsert(InstrumentsQueue, data)
   end
end

function OnStop()
   isRun = false
   client:close()
   return 3000
end

function connect()
   if connected == false then
      client = socket.connect(cfg.server.host, cfg.server.port)
      if client == nil then
         message("Error connecting to socket server")
         sleep(5000)
      else
         connected = true
         message("Connected to socket server")
      end
   end
end


function main()
   while isRun do 
   connect()
   if #InstrumentsQueue > 0 and connected then
      local data = InstrumentsQueue[1]
      local jsonData = json.encode({type = "instrument", value = data})
      local status, msg = client:send(jsonData .. "\r\n")
      
      if status ~= nil then
         table.sremove(InstrumentsQueue, 1)
      else
         message("Error sending data to socket server #" .. msg)
         if msg == "closed" then
            message("Disconnected from socket server")
            client:close()
            connected = false
         end
      end
   else
      sleep(50)
   end
   end
end


 
foobar, А я вообще с сервером не связываюсь: все данные получаю только от Квика, команды даю тоже только ему. В мейне стоит тупой цикл:
Код
 while f do
  r();      -- раз в секунду запускаем утилиту опроса
  sleep(1000);   -- текущих данных и принятия решений по ним
 end;
А внутри ежесекундного прерывания ещё один тупой цикл с опросом:
Код
function r()   -- мелкий обработчик прерывания по таймеру
 for i=0,N-1 do -- цикл по тикерам (прорисовка таблицы)
  s=a[i][2];   -- предыдущее и последнее значение курса
  a[i][2]=tonumber(getParamEx(a[i][1][0],a[i][0],"LAST").param_value);
...
Таким образом, коллбэки мне нужны только на OnTrade. Не хило бы, конечно, иметь ещё и по OnOrder, но там множество разных глюков, разбираться с которыми не имею ни малейшего желания, а потому выкинул это прерывание вообще. Никто ничего не жрёт, ничего не помирает, таблица спокойно обновляется, команды на покупку или продажу передаются в Квик - что ещё нужно от скрипта? А в более тяжёлом (15-секундном) прерывании (вызываемом прямо из этого, то есть фактически тоже в мейне) я считаю свечи по разным периодам и ещё кое-что. Мне - ндравицца! :smile:  
 
Вариант, что-то я не подумал об этом сразу. Я планировал использовать коллбек чтобы снизить нагрузку на скрипт, в том смысле что если изменений по инструмету не было, то и в коллбек он не придёт.
 
Да ведь копеечная экономия! Я, правда, не работал "с огромными тыщами", но несколько сотен тикеров этот вариант преспокойно обслуживает.
Страницы: 1
Читают тему
Наверх