function round(number, znaq) -- функция округления числа num до знаков znaq local num = tonumber(number) local idp = tonumber(znaq) if num then local mult = 10 ^ (idp or 0) if num >= 0 then return math.floor(num * mult + 0.5) / mult else return math.ceil(num * mult - 0.5) / mult end else return num end end
function DaysToDie(class_code, sec_code)
-- Получаем количество дней до погашения инструмента,<br />-- class_code - для фьючерсов SPBFUT<br />-- sec_code - код инструмента SiZ2, BRZ2, CRZ2 и т.д.
-- если < 4, просим заменить инструмент
-- для работы необходима ф-ция round (округляем до целого числа)
-- is_run - глобальный флаг работы робота - false = отключаемся.
---
local daysToDie = 0 -- количество дней до погашения инструмента
----- получаем количество дней до погашения, если < 4, рекомендуем перейти на новый инструмент ----------
daysToDie = round(getParamEx(class_code, sec_code, "DAYS_TO_MAT_DATE").param_value, 0)
if daysToDie <= 4 and daysToDie > 0 then
message("Количество дней до погашения инструмента " .. SEC_CODE .. " равно " .. tostring(daysToDie) .. ". Необходимо заменить инструмент в настройках робота")
elseif daysToDie == 0 or daysToDie == nil then
message("Инструмент больше не торгуется")
is_run = false
end
return daysToDie
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
-------------------------------------------------------------------------------------------------------
--- Функция получения результатов свечей в .CSV в виде:
--- <Инструмент> <Дата> <Время> <Цена_Open> <Цена_High> <Цена_Low> <Цена_Close> <Объем>
--- BRN0 1 20200605 200100 42.15 42.16 42.1 42.1 2150
-------------------------------------------------------------------------------------------------------
is_run=true
-- Параметры
tInstr="BRN0" --код инструмента/бумаги
classcode="SPBFUT" --код класса инструмента/бумаги, если нужен фондовый рынок - вводить TQBR вместо SPBFUT
iNterval=INTERVAL_M1 --таймфрейм
-- доступные таймфреймы указаны в справке Quik (qlua.chm в папке с quik) по поиску CreateDataSource
-- пример INTERVAL_H1
corrTime=3 --Время МСК. C сервера время приходит без корректировки.
pFile="w:\\temp" --путь, где будет создаваться файл
cBars=10 --сколько свечей надо вывести
--настройка параметров
function OnInit()
out_file=io.open(pFile .."\\"..tostring(tInstr)..".csv","w")
is_run=(out_file~=nil)
ds=CreateDataSource(classcode, tInstr, iNterval ) --создаем источник данных
ds:SetUpdateCallback(NewChartData) --обновление последних данных
end
function strText(int)
local m=tostring(int)
local mLen=string.len(int)
if mLen==1 then
Output="0" .. tostring(m)
else Output=m
end
return Output
end
function main()
while is_run do
local Size=ds:Size() --Получение количества всех свечей в источнике данных
if cBars>Size then
cBars=Size-1
end
for i=Size-cBars, Size, 1 do
local O=ds:O(i) -- Значение цена открытия свечи
local H=ds:H(i) -- Значение High для свечи
local L=ds:L(i) -- Значение Low для свечи
local C=ds:C(i) -- Значение Close для свечи
local V=ds:V(i) -- Значение Volume для свечи
local T=ds:T(i) -- Значение Time для свечи
sTime=os.time(T)
datetime=os.date("!*t",sTime)
--вывод в файл
out_file:write(tInstr..";"..tostring(iNterval)..";"..tostring(datetime.year)..tostring(strText(datetime.month))..tostring(strText(datetime.day))..";"..tostring(strText(datetime.hour + corrTime))..tostring(strText(datetime.min))..tostring(strText(datetime.sec))..";"..tostring(O)..";"..tostring(H)..";"..tostring(L)..";"..tostring©..";"..tostring(V).."\n")
out_file:flush() --запись данных
end
out_file:close()
sleep(1000) -- приостановка на 1 секунду
out_file=io.open(pFile .."\\"..tostring(tInstr)..".csv","w")
end
end