Почему медленно работает код

Страницы: 1
RSS
Почему медленно работает код
 
Добрый день.
Два дня мучился, осваивал работу через DataSourse. Заработало. Но код работает в 5 раз медленнее, чем когда я получал данные индикатора через идентификатор.

Прошу подсказать почему.
Вот код. Боллинджер считается внутри файла BB.lua, который выложили разработчики вот здесь:
ftp://ftp.quik.ru/public/INDICATORS.zip
Код
function DataSource(class,sec,interval)
   ds[sec] = CreateDataSource(class,sec,interval)

   ds[sec]:SetEmptyCallback ()
   return ds[sec]
end

function main()
    dofile(getWorkingFolder().."\\LuaIndicators\\BB.lua")
    for sec in string.gmatch(ticker_list,"%a+") do
        DataSource(class,sec,interval)
    end
  while is_run do
    stime=getSTime()
    if stime==nil then stime=0 end

if stime>100000 and stime<184005 then --не считаем вне сессии

for sec in string.gmatch(ticker_list,"%a+") do
    toLog (log, sec)
    toLog (log, "1")
    func = BB() 
    toLog (log, "2")
    local num_candles=ds[sec]:Size()     
    toLog (log, "3")    
    line_10,_,line_3=func(num_candles, {Period=12, Metod = "SMA", VType="Typical", round=4, Shift=2}, ds[sec])
    toLog (log, "4")
    -- tbl:SetValue(line_count_table[sec],'BB_middle', line_10)
    -- tbl:SetValue(line_count_table[sec],'BB_lower', line_3)    
    --sleep (1)

дальше не сложный анализ.
end

А теперь - самое интересное. Места с задержками. Где скорость как у ласточки я не трогал, подсветил только места задержек:
Цитата
12/02/16 15:18:24,923 LNTA
12/02/16 15:18:24,923 1
12/02/16 15:18:24,923 2
12/02/16 15:18:24,923 3
12/02/16 15:18:24,938 4
12/02/16 15:18:24,938 LSRG
12/02/16 15:18:24,938 1
12/02/16 15:18:24,938 2
12/02/16 15:18:24,938 3
12/02/16 15:18:24,938 4
12/02/16 15:18:24,938 MAGN
12/02/16 15:18:24,938 1
12/02/16 15:18:24,938 2
12/02/16 15:18:24,938 3
12/02/16 15:18:24,938 4
12/02/16 15:18:24,938 MFON
12/02/16 15:18:24,938 1
12/02/16 15:18:24,938 2
12/02/16 15:18:24,938 3
12/02/16 15:18:24,938 4
12/02/16 15:18:24,938 MGNT
12/02/16 15:18:24,938 1
12/02/16 15:18:24,938 2
12/02/16 15:18:24,938 3
12/02/16 15:18:24,938 4
12/02/16 15:18:24,938 MOEX
12/02/16 15:18:24,938 1
12/02/16 15:18:24,938 2
12/02/16 15:18:24,938 3
12/02/16 15:18:24,938 4
12/02/16 15:18:24,938 MSNG
12/02/16 15:18:24,938 1
12/02/16 15:18:24,938 2
12/02/16 15:18:24,938 3
12/02/16 15:18:24,954 4
12/02/16 15:18:24,954 MSRS
12/02/16 15:18:24,954 1
12/02/16 15:18:24,954 2
12/02/16 15:18:24,954 3
12/02/16 15:18:24,954 4

То есть задержка то есть, то нету. Она равна 15 миллисекунд. И она бывает не только между 3 и 4, но и на разных участках кода. Вот например между 1 и 2 шагом.
Цитата
12/02/16 15:18:24,969 PIKK
12/02/16 15:18:24,969 1
12/02/16 15:18:24,985 2
12/02/16 15:18:24,985 3
12/02/16 15:18:24,985 4
12/02/16 15:18:24,985 PLZL
12/02/16 15:18:24,985 1
12/02/16 15:18:24,985 2
12/02/16 15:18:24,985 3
12/02/16 15:18:24,985 4
12/02/16 15:18:24,985 POLY

Вопросы.
1. Почему происходят эти задержки?
2. Почему на разных участках кода?
3. Рационально ли составлен код?

Спасибо.
 
Цитата
Космонавт написал:
3. Рационально ли составлен код?
Нет. Пересчитывать значение индикатора имеет смысл только при обновлении последней свечи. А вы пытаетесь его пересчитывать каждую мс. Какой в этом смысл, если цена не изменилась?
Расчёт индикатора лучше вставить в SetUpdateCallback() и сохранять значения в глобальной таблице.
Надо делать так, как надо. А как не надо - делать не надо.
 
Цитата
Старатель написал:
Цитата
Космонавт   написал:
3. Рационально ли составлен код?
Нет. Пересчитывать значение индикатора имеет смысл только при обновлении последней свечи. А вы пытаетесь его пересчитывать каждую мс. Какой в этом смысл, если цена не изменилась?
Расчёт индикатора лучше вставить в SetUpdateCallback() и сохранять значения в глобальной таблице.
покажите пожалуйста на примере. Задача не тривиальная. Ведь при каждом новом таймф-фрейме таблицу придётся таки обновлять и запихивать в её поля новый набор свечек. То есть раз в таймфрейм полный пересчёт делать всё же придётся.
 
Цитата
Космонавт написал:
Ведь при каждом новом таймф-фрейме таблицу придётся таки обновлять и запихивать в её поля новый набор свечек. То есть раз в таймфрейм полный пересчёт делать всё же придётся.

А кто мешает сохранять свечи и индикатор в таблицу в зависимости от таймфрейма? Как-то так:
Код
  ds[SecCode][Interval] = CreateDataSource(ClassCode, SecCode, Interval)
  local function GetPrice(index)
    Candles[SecCode][Interval] = ds[SecCode][Interval]
    Indicator[SecCode][Interval][index] = func( ... )
  end
  for i = 1, ds:Size() do GetPrice(i) end
  ds:SetUpdateCallback(GetPrice)
Надо делать так, как надо. А как не надо - делать не надо.
 
Цитата
Космонавт написал:
Добрый день.
Два дня мучился, осваивал работу через DataSourse. Заработало. Но код работает в 5 раз медленнее, чем когда я получал данные индикатора через идентификатор.

Прошу подсказать почему.
Вот код. Боллинджер считается внутри файла BB.lua, который выложили разработчики вот здесь:
ftp://ftp.quik.ru/public/INDICATORS.zip
Код
   

А теперь - самое интересное. Места с задержками. Где скорость как у ласточки я не трогал, подсветил только места задержек:
Цитата
То есть задержка то есть, то нету. Она равна 15 миллисекунд. И она бывает не только между 3 и 4, но и на разных участках кода. Вот например между 1 и 2 шагом.
Цитата
Вопросы.
1. Почему происходят эти задержки?
2. Почему на разных участках кода?
3. Рационально ли составлен код?

Спасибо.
задержка в 15 ms смахивает на квант для процесса
Попробуйте оставить из запущенных задач лишь квик и посмотрите задержку.
 
Да, это скорее всего был квант.
Я уже разобрался.
Как советовал Старатель, засунул расчёт индикатора в колбек и сразу получил желаемые космические скорости внутри цикла перебора бумаг.
П.С. Индикатор по прежнему считает все свечки.
 
вообще-то Вы опять не правильно делаете.
Расчет надо делать в колбеках. либо в майн по флагу из колбека.
Ваш вариант функции main очень плохой.
 
Цитата
Николай Камынин написал:
Расчет надо делать в колбеках. либо в майн по флагу из колбека.
+
Перебор бумаг в цикле while is_run do лишний. В том же SetUpdateCallback можно сделать весь "не сложный анализ".
Надо делать так, как надо. А как не надо - делать не надо.
 
Спасибо, попробую!
Вот бы ребята из техподдержки Арки тоже научились давать такие ёмкие качественные ответы!
 
Цитата
Старатель написал:
Цитата
Николай  Камынин   написал:
Расчет надо делать в колбеках. либо в майн по флагу из колбека.
+
Перебор бумаг в цикле while is_run do лишний. В том же SetUpdateCallback можно сделать весь "не сложный анализ".
А торговать из колбека тоже можно? Отсылать лимитки при выполнении условий (цена, индикатор).

И ещё вопрос. Цену последней сделки откуда лучше брать: из колбека в DataSourse или всё же из таблицы всех сделок?
 
Выше в коде строка в функции GetPrice
Код
Candles[SecCode][Interval] = ds[SecCode][Interval]
лишняя.

Цитата
Космонавт написал:
А торговать из колбека тоже можно? Отсылать лимитки при выполнении условий (цена, индикатор).
Конечно.

Цитата
Космонавт написал:
Цену последней сделки откуда лучше брать: из колбека в DataSourse или всё же из таблицы всех сделок?
Смотря для чего "лучше". Я обычно беру из getParamEx(class_code, sec_code, 'last') в OnParam, если нет необходимости обрабатывать все сделки.
Надо делать так, как надо. А как не надо - делать не надо.
 
Старатель,
лучше с точки зрения скорости.
Куда быстрее приходит цена - в тек.таблицу, таблицу всех сделок или в ДатаСорс?
Страницы: 1
Читают тему
Наверх