нет (Все сообщения пользователя)

Выбрать дату в календареВыбрать дату в календаре

Страницы: 1
Оптимизация быстродействия
 
Борис Гудылин, более того, была необходимость покопаться в их скриптах (https://arqatech.com/upload/iblock/398/INDICATORS.zip), и узнал неприятную особенность.

Мне нужно просчитывать два значения ЕМА и RSI. Вроде как RSI расчитывается на значениях EMA.

Представим следующее - в ds хранится 3000 свечей.
Подсчитываю нужные мне значения вот так:
Код
for i = 1, key do
  ema=f_ema(i, {Period=40, Metod = EMA, VType=CLOSE}, ds)
  rsi=f_rsi(i, {Period=14, VType=CLOSE}, ds)
еnd

Но минус вот в чем: все эти значения будут верными если только, просчитывать все значения, иначе выдает неверные значения - проверено.
Но один раз можно просчитать все значения (все 3000 свечей, и то необязательно, в моем случае можно взять последние 100 свечей).
Если сократить кол-во свечей с 3000 до 100, то скорость программы вырастет в 30 раз - что очень недурно.

С другой стороны, когда мы просчитали все свечи до нужной, то просчитывать в очередной раз все 3000 свечей нет нужды при наступлении нужного нам события (по логике).
Можно взять предпоследнее значение и подставить в формулу и расчитать новое значение, в таком случае скорость скрипта еще вырастет.

Однако разработчики так не сделали (или не подумали об этом).
В моем случае для просчет EMA нужно обойти все 3000 свечей, а затем и RSI вновь пойдет расчитывать все 3000 свечей, не смотря на то, что вроде вычисления основаны на ЕМА.


У кого-то возникнут вопросы, к чему это все, у нас компы и им не трудно каждый раз просчитывать 3000 и более свечей.
А вел я это к тому, что в один прекрасный день весь Quik начнет безбожно тупить и медленно работать, и для оптимальной работы понадобится дорогой компьютер.
Но этого можно избежать, если разработчики и сами авторы скриптов будут правильно понимать результат своей работы.

UPD:

В моем случае, дабы не считать каждый раз 3000 свечей можно сделать так:
  1. запоминаем для какой свечи мы производим расчеты
  2. проверяем есть ли расчитанное значения для предыдущей свечи
  3. если да, то просто подставляем в формулу и получаем нужное значение для текущей свечи
  4. если нет, то вычисляем нужные значения для всех свечей, вплоть до предущей, а потом п. 3
Оптимизация быстродействия
 
нет, коряво написал вопрос в последний раз.
подскажите, пожалуйста, как можно создать новый ds_2 из последних 100 свечей старого ds, с возможностью вызова функций :C(i) и других?

Если пытаюсь следующим образом,
Код
for i = #ds - limit, #ds

table.insert(ds_2, {Close = ds:C(i)})

end

-- то потом выдает ошибку
ds_2:C(#ds_2)
Оптимизация быстродействия
 
Sergey Gorokhov, подскажите, пожалуйста, как можно создать новый ds_2 из последних 10 свечей старых, с возможностью вызова функций :C(i) и других?
Код класса для получения котировок с СПБ - биржи
 
Подскажите, пожалуйста, какой код класса нужно использовать для получения котировок с СПБ-биржи.

Для сбера использую команду - CreateDataSource(,security,interval)

а какой код класса прописать, например для компании FedEx?

CreateDataSource(????????????????','FDX',INTERVAL_1H)
Оптимизация быстродействия
 
Добрый день.
Уточните, пожалуйста, пару моментов:
  • можно ли ограничить количество последних свечей, получаемых из функции createDataSource. Мне не нужны все свечи тянуть оттуда, достаточно 100 последних свечей?
  • можно ли после вызова createDataSource в полученном ds оставить 100 последних свечей?
  • можно ли как-то кешировать результат работы RSI? Например, я просчитал RSI для всех свечей из ds, а потом хочу через каждую минуту получать RSI только для последней, не производя вычисления для предыдущих свечей?
Подскажите по расчету RSI
 
Подскажите, пожалуйста, как вызвать саму функцию RSI?
Имеется вот такой небольшой скрипт:
после "local Size = DS[key]:Size()" хочу получить значение RSI, как это сделать?
Скрытый текст
Получить архив котировок без открытия графика
 
Добрый день.
Использую следующий код (просто скопировал из документации и поменял кода и акцию в CreateDataSource), но ничего не работает.
Уточню, что данные пытаюсь получить без открытия данных.

У меня несколько вопросов:
  • что не так в коде?
  • где можно посмотреть список кодов, например, TQBR
Код
-- ѕример получени¤ первой свечи текущего дн¤
function main()
   -- —оздаем таблицу со всеми свечами нужного интервала, класса и кода
   ds, error_desc = CreateDataSource("TQBR", "FDX", INTERVAL_H1)
   -- ќграничиваем количество попыток (времени) ожидани¤ получени¤ данных от сервера
   local try_count = 0
   
   -- ∆дем пока не получим данные от сервера,
   --   либо пока не закончитс¤ врем¤ ожидани¤ (количество попыток)
   while ds:Size() == 0 and try_count < 100 do
      sleep(100)
      try_count = try_count + 1
   end
   -- ≈сли от сервера пришла ошибка, то выведем ее и прервем выполнение
   if ds:Size() == 0 or error_desc ~= nil and error_desc ~= "" then
      message("ќшибка получени¤ таблицы свечей:")
      return 0
   end
   
   -- “екущий день мес¤ца (1 - 31)
   local today_day = tonumber(os.date("%d"))
   -- “екуща¤ свеча (с которой начинаем поиск)
   local current_candle = ds:Size()
   -- ћаксимальное количество свечей дл¤ поиска
   --   не может быть больше чем общее количество свечей в таблице
   local max_candles = math.min(1000, ds:Size())
   -- »ндекс первой свечи текущего дн¤
   local first_candle_index = nil
   
   -- ÷икл пока не нашли первую свечу дн¤ либо не проверили
   --   максимальное количество свечей
   while first_candle_index == nil and current_candle > ds:Size() - max_candles do
      -- ≈сли день текущей свечи не совпадает с текущим днем
      if tonumber(ds:T(current_candle).day) ~= today_day then
         -- “огда индекс искомой свечи
         first_candle_index = current_candle - 1
         message("Ќайден индекс: " .. tostring(first_candle_index))
      end
      
      current_candle = current_candle - 1
   end
   
   -- ≈сли индекс был найден
   if first_candle_index ~= nil then
      message("ѕерва¤ свеча дн¤:")
      message("      индекс: " .. tostring(current_candle))
      message("      врем¤: " .. tostring(ds:T(current_candle).hour) .. ":" .. tostring(ds:T(current_candle).min) .. ":" .. tostring(ds:T(current_candle).sec))
      message("ѕоследн¤¤ свеча предыдущего дн¤:")
      message("      индекс: " .. tostring(current_candle - 1))
      message("      врем¤: " .. tostring(ds:T(current_candle - 1).hour) .. ":" .. tostring(ds:T(current_candle - 1).min) .. ":" .. tostring(ds:T(current_candle - 1).sec))
   -- ≈сли индекс найти не удалось
   else
      message("ѕерва¤ свеча дн¤ не найдена. Ќе достаточно свечей дл¤ поиска (" .. tostring(ds:Size()) .. ").")
      message("—ама¤ дальн¤¤ свеча:")
      message("      индекс: " .. tostring(1))
      message("      врем¤: " .. tostring(ds:T(1).hour) .. ":" .. tostring(ds:T(1).min) .. ":" .. tostring(ds:T(1).sec))
   end
end
Страницы: 1
Наверх