1

Тема: Как зафиксировать открытие новой свечи

Приветствую, коллеги.
Я правда Lua второй раз вижу, честно признаюсь...Больше по питону, амиброкеру...
Но понадобилось определить открытие новой свечи, в питоне решалось 1 словом-  candle_close = true или False.
А как на этом языке вопрос нахождения новой свечи решается, может кто-то нечто подобное уже делал, ведь у многих роботы наверно приступают к расчету по закрытию текущей свечи (или открытию новой). Перелопатил много информации на этом языке, даже продвинулся немного. Но уперся в несколько моментов.

1. Основной  (потому что на п.2 я врядли уже что-то найду)- как сравнить 2 рядом стоящих числа в массиве на предмет одинаковости или нет. Лучше последнее с предпоследним сравнивать, хотя это одно и то же видимо.
2. И второй как взять данные из таблицы, которая заполняется в реальном времени номерами баров через Getcell,  созданной пользователем при помощи Setcell. В мануале что-то не густо примеров на эту тему ))
Спасибо за помощь.

2 (2023-04-15 02:13:18 отредактировано s_mike)

Re: Как зафиксировать открытие новой свечи

Что то типа такого

local last_candle_number
local function is_new_candle()

    local size = определить_количество_свечей_инструмента()    -- не знаю как в вашем случае оно делается

    if size ~= last_candle_number then
        last_candle_number = size
        return true
    end
end

Вызывайте ее или по таймеру или по колбеку от приходящих котировок или по трем зеленым свисткам или как вам еще удобно

3

Re: Как зафиксировать открытие новой свечи

Сделал в итоге по другому, через массив и даже работает smile).

Если коротко - получаем данные на инструмент через CreateDataSource, заносим оттуда номер свечи в массив, обновляем через SetUpdateCallback и дополняем массив , берем 2 крайних значения индекса из массива, разделяем их и сравниваем между собой, если новый индекс не равен прошлому = новый бар вуаля....
Дайнное действо получается из-за того, что CreateDataSource сыпет индексы с гораздо большей скоростью, чем появляется минутный бар, соответственно получаем много одинаковых номеров одной и той-же свечи.
Рабочий код по определению нового бара ниже. Пожелания и комментарии приветствуются. Но мне бы хотелось туда еще добавить, время запуска данной процедуры проверки, если робот на М5, то секунд за 30 до окончания времени было бы хорошо стартануть, хотя может и так не будет сильно грузиться память, надо посмотреть.

stopped = false
function OnStop()
stopped = true
return 5000
end

class_code = "QJSIM"
sec_code = "SBER"

interval = INTERVAL_M1

data = {}

function cb(index)
        
  local t = ds:Size(index)
  table.insert(data, tostring(index))    

end    


function string:split(delimiter) 
    local result = { }
    local from  = 1
    local delim_from, delim_to = string.find( self, delimiter, from  )
    while delim_from do
        table.insert( result, string.sub( self, from , delim_from-1 ) )
        from  = delim_to + 1
        delim_from, delim_to = string.find( self, delimiter, from  )
    end
    table.insert( result, string.sub( self, from  ) )
    return result
end


function main()
    
    ds=CreateDataSource(class_code,sec_code,interval)

    ds:SetUpdateCallback(cb)

    while stopped == false  do
    
        rows = #data
            
        if rows > 1 then   -- проверяем что массив не пустой
        
              list = table.concat(data, ',', #data - 1, #data)   -- забираем из таблицы 2 последних индекса   

              res = list:split(",")                   -- разделяем 2 индекса и сравниваем между собой
              candle_last_index = res[2]      -- новый индекс нового бара
              candle_index_1 = res[1]         -- прошлый индекс перед новым баром
          
              if candle_last_index ~= candle_index_1 then
                 new_candle = true
               else
                 new_candle = false
              end
        end
         
        message('rows = '..tostring(rows)..
                '\n candle_index-1 = '..tostring(candle_index_1)..
                '\n candle_last_index = '..tostring(candle_last_index)..
                '\n new_candle = '..tostring(new_candle))

        sleep(300)
    
    end        
end