Блог им. _sk_
local Throttle = require("Throttle") -- указать путь к файлу модуля local throttle = Throttle:new("D:/throttle/", 10)
while not throttle:isAllowed() do sleep(10) end sendTransaction(...)Приятным свойством данного подхода является то, что все торговые скрипты, работающие с общей папкой, будут иметь общее ограничение, вне зависимости от числа применяемых терминалов QUIK. В принципе, папку D:\throttle\ можно даже разместить на сетевом диске, тогда терминалы QUIK с роботами с разных компьютеров будут иметь общее ограничение по количеству транзакций.
--- --- Ограничитель интенсивности на базе файловой системы. --- --- В папке folder создаются служебные файлы, содержащие штампы с идентификатором объекта и текущим временем. --- Функция isAllowed() выдаёт разрешение или запрещает использование ресурса. --- Количество используемых служебных файлов capacity обеспечивает ограничение интенсивности уровнем не более --- чем capacity разрешений в секунду. --- --- Алгоритм реализации использует датчик случайных чисел и не гарантирует, что на практике уровень интенсивности --- будет в точности равен capacity разрешений в секунду при высоких нагрузках. --- local M = {} --- Конструктор. -- @param self объект -- @param folder имя папки со служебными файлами; оканчивается символом '/' -- @param capacity количество используемых служебных файлов local function new(self, folder, capacity) os.execute("mkdir \"" .. folder .. "\"") local object = { folder = folder, capacity = capacity, id = math.random(1000000, 9999999) } setmetatable(object, self) self.__index = self return object end M.new = new local function getFilename(self) return self.folder .. string.format("%03d.dat", math.random(1, self.capacity)) end local function getStamp(self) return self.id .. ":" .. os.time() end local function getIdTime(stamp) if type(stamp) ~= "string" then return nil, nil end local i = string.find(stamp, ":", 1, true) if i then return tonumber(string.sub(stamp, 1, i - 1)), tonumber(string.sub(stamp, i + 1)) else return nil, nil end end --- Узнать, разрешено ли использование ресурса. -- @param self объект -- @return true/false local function isAllowed(self) local filename = getFilename(self) local file = io.open(filename, "r") if file then local stamp = file:read() file:close() local id, time = getIdTime(stamp) if id == nil or time == nil then return false end if time == os.time() then return false end end file = io.open(filename, "w+") if file then local stamp1 = getStamp(self) file:write(stamp1) file:close() file = io.open(filename, "r") if file then local stamp2 = file:read() file:close() return stamp1 == stamp2 else return false end else return false end end M.isAllowed = isAllowed return M
Lua реально выучить новичку самостоятельно? Просто тупо документацию из квика по языку читать?
А это на чьей стороне ограничение? И оно чем-то грозит, кроме того, что вылезающие за лимит в моменте транзакции отклонятся?
www.banki.ru/services/responses/bank/response/10461425/
Транзакции будут отклоняться. Чтобы не было ошибок подобного рода и нужен ограничитель.
Мрак какой-то.
Приоритетов итп похоже нету никаких, кто первый встал, того и тапки.
Стало даже немножко страшно за тех, кто в таких инфраструктура бабки крутит…