У вас не стоит Flash Player
Настройки
#78952 - Sat Jul 09 2016 06:16 PM Как увеличить скорость работы скрипта?
Batalex Offline
newbie

Registered: Mon Dec 28 2015
Записи: 30
Добрый день!
При разработке и использовании скрипта на апи возник вопрос - как увеличить скорость его расчета.
Когда скрипт работает с большим количеством обсчитываемых баров на истории возникают тормоза в работе агента.
Это проблема решается, если поставить ограничение макс. баров, например, равное 1000 считается относительно быстро. Но вот если считать все бары, которые есть на истории, то это занимает уже более 20 секунд на расчет, что никуда не годиться. Хочется понять общую методологию поиска "узких" мест в коде, которые и тормозят расчёт? Или может так быть, что эта скорость для такого количества баров, с учетом конкретных условий алгоритма вполне нормальна?
Списки в коде при расчетах условий входа-выхода, стопов и индикаторов не применяю, вместо них использую массивы.
Также не использую доступ ценам вида sec.ClosePrices[i], использую доступ через sec.Bars[i].
Что еще упустил из того, что может тормозить расчёты, и главное какими способами эти участки кода можно поискать при помощи откладки, чтобы понять какой из методов считается быстро, а какой долго?

Вот сообщения лога:
18:06:11.27 127 Агент 'Плазма': Скрипт выполнен успешно за 24341мс. (14575 баров, время 08.07.2016 23:49:00)
18:14:46.37 127 Агент 'Плазма': Скрипт выполнен успешно за 86мс. (1000 баров, время 08.07.2016 23:49:00)

Тут явно какая-то нелинейная зависимость, 1000 баров считается 86мс, но 14000 баров считается значительно дольше 86*14мс... Как будто что-то подвисает или забивается ) Хотелось бы понять, где можно поискать решение проблемы.

Наверх
#78953 - Sat Jul 09 2016 07:02 PM Re: Как увеличить скорость работы скрипта? [Re: Batalex]
jhgjrht Offline
writer

Registered: Sun Nov 21 2010
Записи: 428
Методом пристального взгляда и с помощью секундомера ищите долгие расчеты индикаторов. Ну а потом - по обстоятельствам.
Code:
using System.Diagnostics;
...
  var sw = new Stopwatch();
  sw.Start();
  for (int i = 0; i < barsCount; i++) {
    ...
  }
  sw.Stop();
  context.Log("Расчет индикатора ХХХ: " + sw.Elapsed, 0);
  ...

Нелинейная зависимость времени расчета от количества свечей - это 99% из-за вложенных циклов.
_________________________
Не пишите мне! Никому ничего делать не буду.

Наверх
#78955 - Sat Jul 09 2016 07:22 PM Re: Как увеличить скорость работы скрипта? [Re: jhgjrht]
Batalex Offline
newbie

Registered: Mon Dec 28 2015
Записи: 30
Спасибо!

Наверх
#78973 - Mon Jul 11 2016 11:01 AM Re: Как увеличить скорость работы скрипта? [Re: Batalex]
ra81 Offline
Carpal Tunnel

Registered: Thu Sep 27 2012
Записи: 2860
запрос позиций может сильно тормозить если сделать некоторым способом. про это статья будет на днях я уже написал просто не выложил.
_________________________
__


Наверх
#78988 - Mon Jul 11 2016 04:13 PM Re: Как увеличить скорость работы скрипта? [Re: jhgjrht]
Groshev Offline
journeyman

Registered: Sun Apr 28 2013
Записи: 67
Originally Posted By: jhgjrht
Методом пристального взгляда и с помощью секундомера ищите долгие расчеты индикаторов. Ну а потом - по обстоятельствам.
Code:
using System.Diagnostics;
...
  var sw = new Stopwatch();
  sw.Start();
  for (int i = 0; i < barsCount; i++) {
    ...
  }
  sw.Stop();
  context.Log("Расчет индикатора ХХХ: " + sw.Elapsed, 0);
  ...

Нелинейная зависимость времени расчета от количества свечей - это 99% из-за вложенных циклов.


Ещё можно без System.Diagnostics:
Code:
...
  var start = Environment.TickCount;
  for (int i = 0; i < barsCount; i++) {
    ...
  }
  var stop = Environment.TickCount;

  context.Log("Расчет индикатора ХХХ: " + (stop - start), 0);
  ...

Наверх
#78997 - Mon Jul 11 2016 05:54 PM Re: Как увеличить скорость работы скрипта? [Re: Groshev]
jhgjrht Offline
writer

Registered: Sun Nov 21 2010
Записи: 428
Можно, но точность такого замера (также как и посредством DateTime.Now) будет значительно хуже (раз в 10).
_________________________
Не пишите мне! Никому ничего делать не буду.

Наверх
#79001 - Mon Jul 11 2016 08:01 PM Re: Как увеличить скорость работы скрипта? [Re: jhgjrht]
Groshev Offline
journeyman

Registered: Sun Apr 28 2013
Записи: 67
Прогнал оба таймера на разных базах - особой разницы не заметил.


Attachments
Timer.jpg (74 downloads)


Наверх
#79011 - Tue Jul 12 2016 01:29 PM Re: Как увеличить скорость работы скрипта? [Re: Groshev]
ra81 Offline
Carpal Tunnel

Registered: Thu Sep 27 2012
Записи: 2860
там в долях секунды неточность может быть. для нас это на самом деле совершенно пофиг. Можно и так и эдак.
_________________________
__


Наверх
#79189 - Thu Jul 28 2016 09:54 AM Re: Как увеличить скорость работы скрипта? [Re: ra81]
Groshev Offline
journeyman

Registered: Sun Apr 28 2013
Записи: 67
да, Environment.TickCount выдаёт результат в целых милисекундах, а Diagnostics - в милисекундах с дробной частью.

Наверх


Moderator:  ViL, sar