Таблица обезличенных сделок и SearchItems

Страницы: 1
RSS
Таблица обезличенных сделок и SearchItems
 
Снова возвращаюсь к вопросу. о котором разработчики позабыли, как видится.


Вот эта функция крутится в цикле опроса:

Код
   -- Собирает из ТОС новые обезличенные сделки
   rescan =
      function()
         if database.need_rescan == false then
            return
         end
         database.need_rescan = false

         local num_trades = getNumberOf("all_trades") - 1
         local items = SearchItems("all_trades",
                                    database.tos + 1,
                                    num_trades,
                                    database.search_function,
                                    "class_code,sec_code,datetime.day,datetime.month,datetime.year"
                                  ) or {}
         database.tos = num_trades
         log.write("Получено ",`#'items," сделок")

         for _,n in ipairs(items) do         -- Всегда по возрастанию
            database.process_trade(getItem("all_trades",n))
         end

         database.save()
      end,

   ---------------------------------------------------------------
   -- Обработка одной сделки
   process_trade =
      function(trade)

         -- Костыль для фильтрации кривых обезличенных сделок, которые шлёт терминал
         if not trade or trade.datetime.year == 1601 then
            log.error("BS: Ошибка терминала. Недопустимая таблица обезличенной сделки ",trade)
            return
         end




20:09:22.057   Получено 151892 сделок
20:09:23.197   BS: Ошибка терминала. Недопустимая таблица обезличенной сделки nil
20:09:23.197   BS: Ошибка терминала. Недопустимая таблица обезличенной сделки nil
20:09:23.197   BS: Ошибка терминала. Недопустимая таблица обезличенной сделки nil
20:09:23.198   BS: Ошибка терминала. Недопустимая таблица обезличенной сделки nil
20:09:23.198   BS: Ошибка терминала. Недопустимая таблица обезличенной сделки nil
20:09:23.198   BS: Ошибка терминала. Недопустимая таблица обезличенной сделки nil
20:09:23.221   BS: Ошибка терминала. Недопустимая таблица обезличенной сделки nil
20:09:23.222   BS: Ошибка терминала. Недопустимая таблица обезличенной сделки nil
20:09:23.222   BS: Ошибка терминала. Недопустимая таблица обезличенной сделки nil
20:09:23.222   BS: Ошибка терминала. Недопустимая таблица обезличенной сделки nil
20:09:23.223   BS: Ошибка терминала. Недопустимая таблица обезличенной сделки nil
20:09:23.223   BS: Ошибка терминала. Недопустимая таблица обезличенной сделки nil
20:09:23.223   BS: Ошибка терминала. Недопустимая таблица обезличенной сделки nil
20:09:23.224   BS: Ошибка терминала. Недопустимая таблица обезличенной сделки nil
20:09:23.224   BS: Ошибка терминала. Недопустимая таблица обезличенной сделки nil
20:09:23.225   BS: Ошибка терминала. Недопустимая таблица обезличенной сделки nil
20:09:23.225   BS: Ошибка терминала. Недопустимая таблица обезличенной сделки nil
20:09:23.225   BS: Ошибка терминала. Недопустимая таблица обезличенной сделки nil
20:09:23.226   BS: Ошибка терминала. Недопустимая таблица обезличенной сделки nil
20:09:23.226   BS: Ошибка терминала. Недопустимая таблица обезличенной сделки nil

Подписка на тиковые данные происходит по двум колбекам.
Код
oncleanup.subscribe(function()
                     repository.init()
                    end
                   )
onconnected.subscribe(function(flag)
                        if flag then
                           repository.init()
                        end
                      end
                   )

repository.init в частности исполняет следующее


Код
         local security = getSecurityInfo(_class,_code)
         if not security then
            log.write("Инструмент ",instrument_dir," не обнаружен")
            screen.add(_class,_code,INSTRUMENT_NOT_FOUND)
            return
         end

         local ds,err = CreateDataSource(_class,_code,INTERVAL_TICK)
         if not ds then
            log.write("Невозможно получить обезличенные сделки по инструменту ",instrument_dir)
            screen.add(_class,_code,INSTRUMENT_NOT_FOUND)
            return
         end
         table.insert(database.ds,ds)
         log.write("Подписка на инструмент ",instrument_dir," успешна")


Указанный эффект всегда происходит при первом включений терминала в пределах дня. Последующие включения такой эффект не несут.

Если я что-то делаю неправильно, было бы полезно понять. что именно. Иначе получается, что это грубая ошибка терминала.

Спасибо.
 
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
 
Могу высказать догадку... возможно, это из-за того, что при первом включении в течение дня таблица всех сделок содержит данные за предыдущую торговую сессию, и по этим данным отрабатывает и возвращает результат поиска ф-ция SearchItems. Дальше, таблица всех сделок сбрасывается и начинается закачка новых данных в эту таблицу, что занимает несколько минут, но при этом одновременно к этой же таблице идёт запрос из цикла опроса ipairs(items) по индексам старых данных, которых уже нет, и возвращается куча nil в итоге...
 
Возможно и так. Гадать смысла нет. Внутреннее мир известен глистам и проктологу.

Хотелось бы чтобы разработчики наморщили лоб и что-нибудь изрекли.
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
 
Цитата
s_mike@rambler.ru написал:
Возможно и так. Гадать смысла нет. Внутреннее мир известен глистам и проктологу.

Хотелось бы чтобы разработчики наморщили лоб и что-нибудь изрекли.
Если моя догадка верна, то она легко проверяется по дате, времени и номеру сделок в логах... Перед вызовом SearchItems просто запишите данные первого и последнего элемента таблицы, и второй раз проделайте эту операцию уже после цикла ipairs(items)... и по этим четырём значениям сразу всё станет ясно, что там с этой таблицей происходит, когда у вас nil'ы сыпятся...
 
Добрый день.
getItem вернет nil если таблица указана некорректно, либо если нет элемента с таким индексом. Если возвращается nil, то попробуйте сравнить индекс элемента с результатом getNumberOf(), возможно таблица очистилась пока вы перебирали результаты.
 
Цитата
Michael Bulychev написал:
Добрый день.
getItem вернет nil если таблица указана некорректно, либо если нет элемента с таким индексом. Если возвращается nil, то попробуйте сравнить индекс элемента с результатом getNumberOf(), возможно таблица очистилась пока вы перебирали результаты.
срасибо, совет прочитан.

с nil результат get_item я сравниваю и сейчас )

а вот что даст проверка индекса с текущмюим количеством сделок в таблице - я не понимаю.

Таблица может очиститься и начинать заполняться новыми сделками. Количество новых сделок может быть как больше того, что было на момент старта программы, так и меньше. Что я должен понять из этого и какой вывод сделать?
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
 
Проверка индекса поможет только если он выходит за пределы массива хранилища. Если сделок уже стало больше, то получите новую сделку по указанному индексу. Но вообще получение nil в результате это повод прекратить текущую обработку и начать все заново.
 
Цитата
Michael Bulychev написал:
Проверка индекса поможет только если он выходит за пределы массива хранилища. Если сделок уже стало больше, то получите новую сделку по указанному индексу. Но вообще получение nil в результате это повод прекратить текущую обработку и начать все заново.
на утро в терминале было 10 сделок вчерашнего дня.

скрипт запустился, прошел oncleanup. Скрипт видел 10 вчерашних сделок в качестве результата searchitems.

начал их перебирать. Перебрал 3 сделки. В этот момент в терминал пришла пачка из 15 новых сделок. Скрипт вынимает 4 сделку - все хорошо. Потом пятую и так далее. А результате ошибок в скриате нет, но полученные данные неверны.
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
Страницы: 1
Читают тему
Наверх