Добрый день. Два дня мучился, осваивал работу через 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
А теперь - самое интересное. Места с задержками. Где скорость как у ласточки я не трогал, подсветил только места задержек:
То есть задержка то есть, то нету. Она равна 15 миллисекунд. И она бывает не только между 3 и 4, но и на разных участках кода. Вот например между 1 и 2 шагом.
Космонавт написал: 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 смахивает на квант для процесса Попробуйте оставить из запущенных задач лишь квик и посмотрите задержку.
Да, это скорее всего был квант. Я уже разобрался. Как советовал Старатель, засунул расчёт индикатора в колбек и сразу получил желаемые космические скорости внутри цикла перебора бумаг. П.С. Индикатор по прежнему считает все свечки.