Автор |
Сообщение |
laplas
Зарегистрирован: 14.07.2012
Сообщения: 6
|
Уважаемые форумчане, возможно ли в Ами оптимизировать процесс расчета формул? Поясню о чем идет речь.
Допустим мы имеем базу данных размером в 100.000 значений и формулу, в которой считаем МА. Судя по всему, при каждом изменении цены участвующих в расчете бумаг, либо при очередном запуске Scan/Explore происходит пересчет 100.000 значений МА, что разумеется расходует аппаратные ресурсы и требует определенного времени. Конечно, если формула предполагает расчет только одного МА, то эти факторы не критичны, но если в ней будет считаться с десяток стратегий, каждая из которых использует синтетические цены третьего и более порядка да еще и с несколькими индикаторами, то это уже представляет проблему.
Вопрос в следующем, можно ли каким то образом на уровне Ами (без вывода в текстовый файл) использовать полученные в предудущей итерации значения всех индикаторов, и рассчитывать только вновь прибывшие или изменившиеся значения? |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Ами не расчитывает все значения. Он это делает только когда необходимо.
Обычно, например в индикаторе, он расчитывает только видимую на графике часть и немного за пределами. Это называется квик АФЛ. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
laplas
Зарегистрирован: 14.07.2012
Сообщения: 6
|
Олег, спасибо за ответ! А как Ами поступает, когда приходит новый бар, он просто смещает прошлые данные или все таки рассчитывает их по новой? |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Код AFL каждый проход считает все по новому не зависимо от того, пришел ли новый бар. Но, как правило, он заново расчитает все быстрее, чем если прочитает заранее расчитанные данные из другого источника.
Хотя, в принципе, если есть такая необходимость, можно запоминать расчитанный массив в статическую переменную (StaticVarSet()) и читать данные оттуда не пересчитывая. Это не трудно. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
laplas
Зарегистрирован: 14.07.2012
Сообщения: 6
|
Спасибо, попробовал реализовать, но видимо допускаю ошибку при обращении к плагину AS_File.
Код: |
FirstStart=AS_READ_PARAM("test","Start","FirstStart");
PastBarCount=AS_READ_PARAM("test","Count","PastBarCount");
if(FirstStart==0) for(i=0;i<BarCount;i++) Average[i]=1000;
else
{
for(i=0;i<PastBarCount;i++) Average=StaticVarGet("PastAverage");
for(i=PastBarCount;i<BarCount;i++) Average[i]=2000;
}
StaticVarSet("PastAverage",Average);
AS_WRITE_PARAM("test","Start","FirstStart",1);
AS_WRITE_PARAM("test","Count","PastBarCount",round(i/2));
Plot(Average,"Average",colorBlack,styleLine); |
Смысл такой, при первом запуске все Average должны стать равны 1000, после чего в test.ini пишется номер бара с которого в следующем проходе надо будет пересчитывать значения. После повторного прогона первая половина значение должна быть равна 1000, а вторая 2000. У меня же после первого запуска значения сразу разбиваются. Но если залочить строку
Код: |
AS_WRITE_PARAM("test","Start","FirstStart",1); |
то первый запуск проходит правильно. Подскажите, пожалуйста где я допустил ошибку? |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Код: |
SetBarsRequired(sbrAll, sbrAll);
FirstStart = AS_READ_PARAM("test","Start","FirstStart");
PastBarCount = AS_READ_PARAM("test","Count","PastBarCount");
if(FirstStart == 0)
{
for(i = 0; i < BarCount; i++)
Average[i] = 1000;
AS_WRITE_PARAM("test", "Count", "PastBarCount", round((BarCount - 1)/2));
}
else
{
Average = StaticVarGet("PastAverage");
for(i = PastBarCount; i < BarCount; i++)
Average[i] = 2000;
}
StaticVarSet("PastAverage", Average);
AS_WRITE_PARAM("test","Start", "FirstStart", 1);
Plot(Average, "Average", colorBlack, styleLine);
|
|
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
laplas
Зарегистрирован: 14.07.2012
Сообщения: 6
|
Спасибо большое за помощь! Оказалось, что предыдущий код тоже работает, просто он не срабатывает при нажатии Apply Indicator |
|
|
Посмотреть профиль Отправить личное сообщение |
|
laplas
Зарегистрирован: 14.07.2012
Сообщения: 6
|
Олег, подскажите пожалуйста, правильно ли я понимаю, что когда мы задаем в Range n_last_quotations=1 и жмем Explore, то предыдущие значения переменных не пересчитываются (остаются прежними)? И второй вопрос, если по какой-то причине при экспорте котировок вместо одного бара придут несколько, что будет делать Ами при таких настройках, он пересчитает только последний или все таки все пришедшие бары? |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Ами автоматически оценивает сколько надо пересчитать для того, чтобы результат был адекватным и пересчитывает сколько надо. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
laplas
Зарегистрирован: 14.07.2012
Сообщения: 6
|
Спасибо, это в корне меняет дело. |
|
|
Посмотреть профиль Отправить личное сообщение |
|
|