Продолжаю бесплатный период своего робота.
Наибольший интерес вызвали торговые системы арбитража.
Публикую долгожданное большинством видео QUIK. Робот Сетка. ТС «Арбитраж».
Хочу отметить, что представленный пример с разницей акций Сбербанк-Сбербанк-ап представлен для общего понимания.
Робот может реализовать не только парный арбитраж.
Возможно реализовать портфельный арбитраж, можно использовать любые торговые инструменты в QUIK, можно использовать фронтраннинг, котировать другие инструменты с хеджированием и многое другое.
Заявки на разработку роботов не рассматриваю, т.к. пишу для себя и торгую на бирже тоже для себя.
Описание торговой системы «Арбитраж».
Возьмём два инструмента: Сбербанк об. по 137.18 и Сбербанк пр. по 131.85. Известно, что некоторые инструменты коррелируют между собой, т.е. цены двигаются в одном направлении. Однако, есть небольшие отличия в движении этих активов. Можно торговать эту разницу.
Здравствуйте. Возможно ли написать скрипт на Lua, который бы создавал таблицу со значениями индикатора ATR.
Заголовками столбцов были бы даты(30 последних торговых сессий), заголовки строк — короткое наименование ТОП-20 фьючерсов по обороту.
Нужно, чтобы в ячейках таблицы были значения ATR за n-ный день в таком-то фьючерсе.
Спасибо.



function main()
local Trades = {}
local comission = 0
SearchItems('trades', 0, getNumberOf('trades')-1,
function (class_code, trade_num, flags, exchange_comission)
if class_code == 'SPBFUT' or class_code == 'SPBOPT' then -- Учитываем только сделки на срочной секции
comission = comission + exchange_comission
local t = {flags & 0x4, exchange_comission}
if Trades[class_code] then
Trades[class_code][trade_num] = t
else
Trades[class_code] = {[trade_num] = t}
end
end
return false
end,
'class_code,trade_num,flags,exchange_comission')
local total = 0
local maker = 0
local taker = 0
local comission2 = 0
SearchItems('all_trades', 0, getNumberOf('all_trades')-1,
function (class_code, trade_num, flags, sec_code)
if Trades[class_code] then
local t = Trades[class_code][trade_num]
if t then
total = total + 1
if flags & 0x1 ~= 0 then
if t[1] == 0 then
maker = maker + 1
else
taker = taker + 1
comission2 = comission2 + t[2]
end
elseif flags & 0x2 ~= 0 then
if t[1] == 0 then
taker = taker + 1
comission2 = comission2 + t[2]
else
maker = maker + 1
end
else
comission2 = comission2 + t[2]
end
end
end
return false
end,
'class_code,trade_num,flags,sec_code')
message(string.format('total: %u\nmaker: %u\ntaker: %u\n\ncomission\nсейчас: %.2f\nскальпинг: %.2f\nстанет: %.2f', total, maker, taker, comission, comission / 2, comission2 * 3))
endfunction main
-- пример работы функции. Приостановка на клиринг
local ServerTime = getInfoParam("SERVERTIME")
local tTime = {"14:00:00","14:05:00"} -- время начала/окончания неторгового периода
local result = diffTime(tTime[1], tTime[2])
if ServerTime>=tTime[1] and ServerTime<=tTime[2] then
message("Приостановка работы скрипта на ".. tostring(result).." сек.")
sleep(result*1000) -- время приостановки в секундах. Время в Quik в миллисек., поэтому * 1000
end
end
function diffTime(time1, time2)
-- возвращает разницу в секундах между time2-time1; либо 0, если time1 > time2
-- time1 = "14:00:00"
-- time2 = "14:05:00"
-- result = diffTime(time1, time2) -- = 300 секунд
local dt1 = {}
local dt2 = {}
local dTime1 = 0
local dTime2 = 0
local result = 0
dt1.hour,dt1.min,dt1.sec = string.match(time1,"(%d*):(%d*):(%d*)")
for key,value in pairs(dt1) do
dt1[key] = tonumber(value)
end
dt2.hour,dt2.min,dt2.sec = string.match(time2,"(%d*):(%d*):(%d*)")
for key,value in pairs(dt2) do
dt2[key] = tonumber(value)
end
--часы*3600 + минуты*60 + секунды.
dTime1 = dt1.hour*3600 + dt1.min*60 + dt1.sec
dTime2 = dt2.hour*3600 + dt2.min*60 + dt2.sec
result = dTime2 - dTime1
if result <= 0 then
return 0
else
return result
end
end