Оптимизация быстродействия

Страницы: 1
RSS
Оптимизация быстродействия
 
Добрый день.
Уточните, пожалуйста, пару моментов:
  • можно ли ограничить количество последних свечей, получаемых из функции createDataSource. Мне не нужны все свечи тянуть оттуда, достаточно 100 последних свечей?
  • можно ли после вызова createDataSource в полученном ds оставить 100 последних свечей?
  • можно ли как-то кешировать результат работы RSI? Например, я просчитал RSI для всех свечей из ds, а потом хочу через каждую минуту получать RSI только для последней, не производя вычисления для предыдущих свечей?
 
Цитата
нет написал:
можно ли ограничить количество последних свечей, получаемых из функции createDataSource. Мне не нужны все свечи тянуть оттуда, достаточно 100 последних свечей?
Такой возможности нет.

Цитата
нет написал:
можно ли после вызова createDataSource в полученном ds оставить 100 последних свечей?
Такой возможности нет. Можно перенести данные из ds в Lua таблицу, а потом закрыть ds.

Цитата
нет написал:
можно ли как-то кешировать результат работы RSI? Например, я просчитал RSI для всех свечей из ds, а потом хочу через каждую минуту получать RSI только для последней, не производя вычисления для предыдущих свечей?
Просто сохраняете данные в какую-нибудь Lua таблицу
 
Sergey Gorokhov, подскажите, пожалуйста, как можно создать новый ds_2 из последних 10 свечей старых, с возможностью вызова функций :C(i) и других?
 
нет, коряво написал вопрос в последний раз.
подскажите, пожалуйста, как можно создать новый 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)
 
Год назад я поднимал вопрос, близкий  к данной теме. Получить контроль над количеством свечек без нехороших излишеств. Не всем нужны 65000 свечек, многим и 300 избыточны.

https://forum.quik.ru/messages/forum10/message30431/topic3560/#message30431

И даже обещание дать ответ было получено.

https://forum.quik.ru/messages/forum10/message30477/topic3560/#message30477

Пожалуйста, соберитесь с силами и дайте ответ.

А пока что, чтоб получить даже "старые автоматические" 3000 свечек, приходится удалять руками файлы в archive и перезаказывать данные.
Сделайте нормальное управление, без танцев с файлами. Ведь могли же когда-то ограничивать фиксированным начальным размером.

Предложение ТС поддерживаю.  
 
Борис Гудылин, более того, была необходимость покопаться в их скриптах (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
 
Мне кажется,  проще, построить график цены. К нему построить индикатор (пусть RSI). И через getCandlesByIndex получить то, что Вам нужно.  
 
 
Цитата
нет написал:
Но минус вот в чем: все эти значения будут верными если только, просчитывать все значения, иначе выдает неверные значения - проверено.
Достаточно рассчитать двойной период.
т.е. если период RSI =14, то верные значения пойдут после 28 расчёта.
инаяе говоря, чтобы рассчитать предпоследнее значение в моменте, необходимо и достаточно просчитать 29 последних значений.
 
Цитата
Борис Гудылин написал:
Не всем нужны 65000 свечек, многим и 300 избыточны.
Я даже больше скажу, если на графике ограничить, скажем, 500 интервалов, то луа-индикатор все равно бежит по всем с самого начала :(
 
Цитата
Борис Гудылин написал:
Год назад я поднимал вопрос, близкий  к данной теме. Получить контроль над количеством свечек без нехороших излишеств. Не всем нужны 65000 свечек, многим и 300 избыточны.

https://forum.quik.ru/messages/forum10/message30431/topic3560/#message30431

И даже обещание дать ответ было получено.

https://forum.quik.ru/messages/forum10/message30477/topic3560/#message30477

Пожалуйста, соберитесь с силами и дайте ответ.

А пока что, чтоб получить даже "старые автоматические" 3000 свечек, приходится удалять руками файлы в archive и перезаказывать данные.
Сделайте нормальное управление, без танцев с файлами. Ведь могли же когда-то ограничивать фиксированным начальным размером.

Предложение ТС поддерживаю.  
Добрый день.

Пожелание было уже зарегистрировано. В данный момент не рассмотрено. Как будет результат мы обязательно дадим ответ.  
 
Мне кажется, что проблема производительности решается. Если у вас есть DataSource, и вам надо обратиться к последним 100 свечкам, пишите цикл от ds:Size() - 100 до ds:Size(), чтобы пропустить всё ненужное далёкое прошлое.

Используемый индикатор можно запрограммировать самостоятельно. Это далеко не самое сложное в торговом роботе. Если, к примеру, надо рассчитать какой-нибудь EMA для последних 100 свечей, достаточно начать рассчитывать этот индикатор, скажем, для последних 300 свечей (отступ зависит от периода EMA), т.к. влияние далёкого прошлого мало.

Практика разработки роботов для трейдинга показывает, что расчёты типичных однопроходных индикаторов можно организовать так, чтобы на это тратилось порядка 100-500 мс. Этого вполне достаточно.
Страницы: 1
Читают тему
Наверх