Чемпионат Automated Trading Championship 2011 стартовал! - страница 4

 
Присоединяюсь к вопросу. Хотелось подробнее и систематизированно узнать про оптимизацию программного кода. Хотелось бы в виде статьи или отдельного раздела в справке. Такой материал мог бы сильно помочь например в написании экспертов для чемпионата, тем паче, что востребованность есть..
 

Что-то фильтр кривовато работает:


 
Yedelkin:
stringo:

Использование вызова функции в том месте цикла, где этот вызов считается (подразумевается) инвариантным - многие прямо в условии цикла лепят проверку с вызовом функции ( for(int i=0; i<TradesTotal(); i++) {...} ), не задумываясь о тормозах на каждой итерации

Поясните, плиз, дотошному. В качестве ликбеза.

В каких ещё местах цикла for() вызовы функций подразумеваются инвариантными? В каких ещё операторах имеет место быть инвариантность вызова функций. Ничего про это ранее в Справочнике не встречал.

"Тормоза на каждой итерации" - это время, теряющееся на вычисление функции, которую можно было посчитать всего один раз перед циклом и закешировать!


А теперь подробнее о инвариантности:

Когда используется цикл, подобный

for (int i = 0; i < TradesTotal(); i++)
{
   ...
}

Мы принимаем условие в цикле

i < TradesTotal()

инвариантным (неизменным).

Но разве это условие может быть инвариантным? Со всеми выходящими с этим последствиями.

Также инвариантность имеет место быть в цикле с предусловием while, например:

i = 0;
while (i < TradesTotal())
{
   i++;
   
   ...
}

А вот инвариантность в операторе if (искусственно построенный цикл с постусловием):

i = 0;
while (true)
{
   i++;
   
   ...
   
   if (i >= TradesTotal())
      break;
}

Придумал ещё пример, когда писал пост ниже:

for (i = 0; i < 10; i += function())
{
   ...
}

или же

i = 0;
while (i < 10)
{
   i += function();
   
   ...
}

Ещё примеры нужны? :)))

И не важно, что за функция стоит в условии... Мы полагаем условие неизменным на всех итерациях!

Вроде всё разжевал.

p.s.: заранее извиняюсь, что влез...


aharata:
Присоединяюсь к вопросу. Хотелось подробнее и систематизированно узнать про оптимизацию программного кода. Хотелось бы в виде статьи или отдельного раздела в справке. Такой материал мог бы сильно помочь например в написании экспертов для чемпионата, тем паче, что востребованность есть..

Зачем же? Мы весьма разумный Вид.

 

Yedelkin:

В каких ещё местах цикла for() вызовы функций подразумеваются инвариантными?

Цитирую документацию:

Оператор for состоит из трех выражений и выполняемого оператора:

for(выражение1; выражение2выражение3)
   оператор;

Выражение1 описывает инициализацию цикла. Выражение2 - проверка условия завершения цикла. Если оно истинно, то выполняется оператор тела цикла for. Все повторяется, пока выражение2 не станет ложным. Если оно ложно, цикл заканчивается и управление передается следующему оператору. ВыражениеЗ вычисляется после каждой итерации.

Оператор for эквивалентен следующей последовательности операторов:

выражение1;
while(выражение2)
  {
   оператор;
   выражение3;
  };


Ответ:

Особое внимание обратите на эквивалент оператору for. Выражение1 не входит в цикл (итерации), всё остальное входит. Заметьте, туда входит и оператор! Если в операторе есть функции, которые Мы полагаем также инвариантными, то смысл их считать n-итераций раз?

for (i = 0; i < 3; i++)
{
   SL = Ask-StopLoss  ()*Point; // тоже инвариантность
   TP = Ask+TakeProfit()*Point; // она окружает Нас везде!!
   OpenBuy(5.0, Ask, SL, TP);
}

Теперь надеюсь точно всё...

:DD

 

Прогнал, я прогнал

 

Посмотрите пожалуйста советник 800232. Сдаётся мне, что есть какие-то проблемы с терминалом, так как советник не выполняет заданные операции и в журнале нет никакой информации об ошибках. 

 
Yedelkin:

Поясните, плиз, дотошному. В качестве ликбеза.

В каких ещё местах цикла for() вызовы функций подразумеваются инвариантными? В каких ещё операторах имеет место быть инвариантность вызова функций. Ничего про это ранее в Справочнике не встречал. 

Это из области эффективного программирования.

Вообще, инвариант цикла программист должен определять для себя сам. Хороший оптимизатор кода сам находит инвариантные выражения и выносит их за пределы цикла с тем, чтобы вычислить их однократно. Однако никакой оптимизатор не может сказать, насколько инвариантым является вызов той или иной функции.

На самом деле вызов гипотетической функции TradesTotal может и не быть инвариантным - здесь программист решает сам. AccountInfoDouble - точно не инвариантная функция из-за асинхронности, но для упрощения расчётов (если программист - не параноик) необходимо предположить, что она инвариантна и перед первым использованием (которым обязательно должна быть проверка на 0) возвращённое значение необходимо закешировать

 

Здравствуйте, модератор!

Пожалуйста, проверьте текущий билд терминала МТ5 на предмет ошибок, связанных с сообщением INVALID STOPS.

Разве может такое быть, чтобы журнал ЭКСПЕРТ до отказа был забит этими сообщениями у такого участника как предыдущий победитель ЧЕМПИОНАТА - BOBSLEY? 

 
ForexMoneyMaker:

Здравствуйте, модератор!

Пожалуйста, проверьте текущий билд терминала МТ5 на предмет ошибок, связанных с сообщением INVALID STOPS.

Разве может такое быть, чтобы журнал ЭКСПЕРТ до отказа был забит этими сообщениями у такого участника как предыдущий победитель ЧЕМПИОНАТА - BOBSLEY? 

Может, лучше код эксперта проверить ? У всех всё нормально модифицируется, только у этого эксперта - проблемы.
 
ForexMoneyMaker:

Разве может такое быть, чтобы журнал ЭКСПЕРТ до отказа был забит этими сообщениями у такого участника как предыдущий победитель ЧЕМПИОНАТА? 

Прикольный подход :) Чемпионство как индульгенция от забития журнала сообщениями INVALID STOPS. 
Причина обращения: