Тема: Обработка тиков по интервалу количества

Здравствуйте! Я новичок, разбираюсь с QLUA.
Столкнулся с такой задачей - нужно взять тики по инструменту, отсчитать заданное их количество, назовем его интервалом, (например, 200шт), в этом интервале найти максимум и минимум цены, а также цены первого и последнего тика. И так обновляться в реальном времени. Затем эти данные подставить в индикатор скользящей средней в качестве Open, Close, Low, High.
Пока понимаю, что данные можно получить либо через getCandlesByIndex, либо через CreateDataSource, но не понимаю, как их дальше обрабатывать.
Буду благодарен за пример скрипта.

Мой набросок нерабочего варианта(

function main()
x = getNumCandles('Instrument')
Instr, InstrN, InstrName = getCandlesByIndex('Instr', 0, 0, x)
for i = 0, InstrN-1, 1 do
tick = Instr{i}.close

--if tick[now-1]>tick[now] then HIGH = tick[now-1] else HIGH = tick[now] end
--if tick[now-1]<tick[now] then LOW = tick[now-1] else LOW = tick[now] end

end
--message('HIGH = '..HIGH..', LOW = '..LOW)
end

2

Re: Обработка тиков по интервалу количества

В QUIK скрипты индикаторов и "роботов", так скажем - это полностью непересекающиеся сущности.
Функция main() есть только в "роботах", в индикаторах ее нет.
Посмотрите именно написание индикаторов по справке. Там нельзя в произвольный момент времени "брать тики", там все привязано к моментам получения цены по инструменту (по факту совершения новых сделок на бирже).
В этом смысле построить индикатор с произвольным интервалом (вроде это вы хотите) - не совсем понятно как. А может вас стандартные (т.е. имеющиеся в QUIK) интервалы устроят?

С произвольными интервалами даже не знаю как реализовать то, что вы хотите.

3

Re: Обработка тиков по интервалу количества

swerg пишет:

С произвольными интервалами даже не знаю как реализовать то, что вы хотите.

На тиковом можно, но смысл пропадает, 1000 тиков ограничение, если по 200 тиков, то 4 точки будет показывать

4 (2020-07-31 22:54:05 отредактировано MetalHeart)

Re: Обработка тиков по интервалу количества

Стандартные интервалы меня точно не устраивают. Тики же квик получает, работать с ними позволяет, в данный момент меня рисование на графики как таковое не интересует. Мне нужно взять пусть 200 тиков, это возможно без проблем, насколько я понял, засунуть их в цикл в качестве входных данных, за эти 200 тиков найти макс, мин, открытие-закрытие как на обычной свече. Т.е. это я так понимаю один цикл. И потом это повторять опять же на следующие 200 тиков. Допустим это будет одна функция. А потом результаты этой функции подсунуть следующей функции-индикатору, чтобы получить данные скользящей средней. Опять же, рисовать не обязательно это. Код индикатора доступен, как это делается в общем скрипте с роботом, примеры есть. У меня пока что загвоздка именно в обработке тиков.

А вот про ограничение "1000 тиков ограничение, если по 200 тиков, то 4 точки будет показывать" вообще ничего не понял, не объясните?

5

Re: Обработка тиков по интервалу количества

kalikazandr, swerg, в любом случае спасибо за активность, постоянно натыкаюсь на ваши ники в разных постах, познавательно)

6 (2020-08-01 00:55:27 отредактировано kalikazandr)

Re: Обработка тиков по интервалу количества

MetalHeart пишет:

А вот про ограничение "1000 тиков ограничение, если по 200 тиков, то 4 точки будет показывать" вообще ничего не понял, не объясните?

Здравствуйте, вы хотите интервал в 200 тиков, 1 тик = 1 бар {open,high,low,close,datetime}все цены равны.
В настройках графика стоит ограничение в 1000 баров, у вас 1 бар = 200 тиков 1000/200 = 5 баров, т.к. тики шустро обновляются на графике, то вы будете видеть только 4 ваших бара, которые связаны какой-то линией.
В примере в качестве источника тиков - таблица обезличенных сделок.
Используя lua_share https://quik2dde.ru/viewtopic.php?id=306, а именно пространство имен 'queues' можно создать очередь ваших баров для индикатора, который при каждом вызове OnCalculate будет разгружать очередь, искать соответствие по datetime на истории тиков и устанавливать нужное значение на график из вашего бара

--local sh = require'lua_share'
--local tics = sh.GetNameSpace('queues')
local tics = {}
local t = {}
local count = 0
local tf = 200
local ticker = "SiU0"
local function new_tic(p, dt)
    if not t.O then
        t.O = p
        t.H = p
        t.L = p
        t.C = p
        t.dt = dt
        count = 1
        return
    end
    if p > t.H then t.H = p end
    if p < t.L then t.L = p end
    t.C = p
    count = count + 1
    if count == tf then
        message("bar time "..os.date("%H:%M:%S",os.time(t.dt))..
            "\nO= "..t.O..
            "\nH= "..t.H..
            "\nL= "..t.L..
            "\nC= "..t.C, 2)
        tics[#tics+1] = t
        --tics.indicator = t
        t.O = nil
    end
end

local exitflag
function main()
    local old_tlr = getNumberOf("all_trades") - 500
    while not exitflag do
        local tlr = getNumberOf("all_trades")
        if tlr > old_tlr then
            for i=old_tlr, tlr-1 do
                local item = getItem("all_trades",i)
                if item and item.sec_code == ticker then
                    new_tic(item.price, item.datetime)
                end
            end
            old_tlr = tlr
        end
        sleep(1)
    end
end
function OnStop()
    exitflag = true
end