У вас не стоит Flash Player
Настройки
#63401 - Mon Jul 21 2014 01:34 PM Заметка про реальное использование кеша для ускоре
Andrey Beliakov Offline
journeyman

Registered: Thu Jun 12 2014
Записи: 65
Хотел бы поделиться своими словами про нужное использование кеша для ускорения работы скрипта.
Надо сказать, что ребята с ТСЛаба уже написали вот тут http://www.rusalgo.com/ ряд статей по этой теме. Но нужно признать, что нужно быть изрядно подготовленным программистом, чтобы сходу понять нужность этой очень классной фишки.

Попробую разжевать на очень примитивном примере.
Давай те загрузим наш систему какими нибудь большими вычислениями.
Вводные данные
1) Берем бар, ну скажем 10 сек
2) Высчитываем размер бара (Хай - Лоу)
3) И что нибудь с этим делаем. Анализируем и входим в позицию.

Легко подсчитать, что уже через 4ч работы мы накопим 1440 баров. То есть, через 4 часа работы мы можем с каждым пересчетом скрипта мы будем прогонять предыдующие 1440 баров и заново считать их размеры.
Естественно, было бы здорово, если бы скрипт уже при запуске брал бы подсчитанные значения заранее. Вот тут нас и спасает кеш.
Схемотично, запуск бы скрипта выглядел так


Но, так как при запуске скрипта у нас уже появились новые бары с прошлого раза, то нам нужно досчитать новые значения.
И схематично:


И в конце скрипта, нам нужно просто пересохранить старые расчеты уже с новыми добавленными расчетами.
Схематично


Так вот куда выгружаем и от куда загружаем - это и есть кеш.
Теперь что косательно Api.
Загрузить с кеша - LoadObject("свой какой нибудь придуманный индентификатор")
Сохранить в кеш - StoreObject("свой какой нибудь придуманный индентификатор", значение);

Что касательно нанего примера:
Code:
//Берем хаи и лоу, кстати их тоже можно было бы грузить в кеш            
var high = source.HighPrices;
var low = source.LowPrices;

//в bar_count храним кол-во уже просчитанных раньше баров
//грузим из кеша по заданному идентификатору
var cache = ctx.LoadObject("bar_count"); 
//если ничего не загрузилось, то 0, иначе преобразуем к типу int
var bar_count = cache == null ? 0 : (int) cache;
//Грузим наш массив из кеша. Тут возможно я что то делаю не совсем правильно, но у меня работает на ура
cache = ctx.LoadObject("Delta[]"); 
//если ничего не загрузили, то пустой массив на 10000 баров, либо преобразуем загруженное к типу массива
double[] Delta = cache == null ? Delta = new double[10000]: (double[]) cache;

//делаем дорасчет новых какой нибудь анализ
//обращаю внимание, что цикл начинаем не с 0, а именно с того бара, на котором закончили расчет
(int i = bar_count+1; i < source.Bars.Count; i++)
{
  //сам дорасчет
  Delta[i]=high[i]-low[i];
  //какой нибудь анализ
}

//сохраняем в кеш новые значения
ctx.StoreObject("bar_count", source.Bars.Count);
ctx.StoreObject("Delta[]", Delta);


В итоге получаем, что цикл расчета не идет заново с 0, а идет с последнего рассчитаного места.

Про себя скажу, такие манипуляции ускорили мой скрипт с 400млсек до 3млсек.
Удачи.



Отредактировано Andrey Beliakov (Mon Jul 21 2014 01:35 PM)

Наверх
#63403 - Mon Jul 21 2014 01:43 PM Re: Заметка про реальное использование кеша для ускоре [Re: Andrey Beliakov]
ra81 Offline
Carpal Tunnel

Registered: Thu Sep 27 2012
Записи: 2860
тока ваш код не предусмотрел еще разные там варианты smile. А они бывают. Типо того что кэш скривился. Или поехал относительно свечек итд. в общем делов хватает. Но ускоряет пересчеты. История стакана на кэшэ сидит иначе бы тормозила дико.
_________________________
__


Наверх
#63404 - Mon Jul 21 2014 01:55 PM Re: Заметка про реальное использование кеша для ускоре [Re: ra81]
Andrey Beliakov Offline
journeyman

Registered: Thu Jun 12 2014
Записи: 65
Думал все проще. Придется сейчас поанализировать.

Наверх
#63407 - Mon Jul 21 2014 03:25 PM Re: Заметка про реальное использование кеша для ускоре [Re: Andrey Beliakov]
ra81 Offline
Carpal Tunnel

Registered: Thu Sep 27 2012
Записи: 2860
ну гарантий никто не дает что все будет идеально, а деньги ваши. поэтому надо предусматривать и анализировать smile
_________________________
__


Наверх
#63421 - Mon Jul 21 2014 11:51 PM Re: Заметка про реальное использование кеша для ускоре [Re: Andrey Beliakov]
jhgjrht Offline
writer

Registered: Sun Nov 21 2010
Записи: 428
Originally Posted By: Andrey Beliakov
Code:
...
(int i = bar_count+1; i < source.Bars.Count; i++)
...


Про себя скажу, такие манипуляции ускорили мой скрипт с 400млсек до 3млсек.
"+1" - лишнее, видимо.
Выигранные миллисекунды не всегда стоят роста сложности логики скрипта, как мне думается.
_________________________
Не пишите мне! Никому ничего делать не буду.

Наверх
#63423 - Tue Jul 22 2014 07:58 AM Re: Заметка про реальное использование кеша для ускоре [Re: jhgjrht]
ra81 Offline
Carpal Tunnel

Registered: Thu Sep 27 2012
Записи: 2860
Originally Posted By: jhgjrht

Выигранные миллисекунды не всегда стоят роста сложности логики скрипта, как мне думается.

Не всегда. Но иногда без оптимизации не обойтись.
_________________________
__


Наверх
#63425 - Tue Jul 22 2014 01:20 PM Re: Заметка про реальное использование кеша для ускоре [Re: jhgjrht]
Andrey Beliakov Offline
journeyman

Registered: Thu Jun 12 2014
Записи: 65
Originally Posted By: jhgjrht
Originally Posted By: Andrey Beliakov
Code:
...
(int i = bar_count+1; i < source.Bars.Count; i++)
...


Про себя скажу, такие манипуляции ускорили мой скрипт с 400млсек до 3млсек.
"+1" - лишнее, видимо.
Выигранные миллисекунды не всегда стоят роста сложности логики скрипта, как мне думается.
про +1 возможно. Писал на скорую. У меня в скрипте чуть другая логика.

насчет млсек. у меня например тайм = каждый тик. Мне архи важно

Наверх
#63426 - Tue Jul 22 2014 01:24 PM Re: Заметка про реальное использование кеша для ускоре [Re: ra81]
Den Commander Offline
member

Registered: Sat Sep 28 2013
Записи: 130
Originally Posted By: ra81
тока ваш код не предусмотрел еще разные там варианты smile. А они бывают. Типо того что кэш скривился. Или поехал относительно свечек итд. в общем делов хватает. Но ускоряет пересчеты. История стакана на кэшэ сидит иначе бы тормозила дико.

А как может кеш скривиться или поехать? Если мы записали в кеш объект X, то мы либо извлечем его же, либо не извлечем ничего. Каким образом в кеше объект может скривиться и превратиться в объект Y ?

Наверх
#63442 - Wed Jul 23 2014 03:17 PM Re: Заметка про реальное использование кеша для ускоре [Re: Den Commander]
ra81 Offline
Carpal Tunnel

Registered: Thu Sep 27 2012
Записи: 2860
у вас число свечек может быть другое. Неожиданно где нить в середине вылезла новая свечка. Да мало ли что может быть?? Думаете как баги находятся? Делаем тупо в лоб как выше. Потом ставим ограничения и доп проверки и вуаля баги тслаба/нашего скрипта детектед. Ну или не ставим проверки и торгуем по хрен знает каким расчетам smile.

Если бы весь софт работал так как от него ожидается был бы рай. А ТСЛаб вообще нифига не гарантирует что ваши свечки будут такие же на след пересчете как на предыдущем. Ведь брокер может прислать хрень, а брокер это может вообще легко сделать. Транзак иногда шутит и присылает котиры с уже прошедшим временем. Ага.


Отредактировано ra81 (Wed Jul 23 2014 03:18 PM)
_________________________
__


Наверх


Moderator:  ViL, sar