Новая версия платформы MetaTrader 5 build 2755: Улучшения в окне котировок и отладчике - страница 30

 
Vladimir Pastushak:

Начать профилирование и Начать профилирование - как то не красиво. Лучше вообще убрать текст и оставить кнопки.

Общая активность ЦП и Собственная активность ЦП - что это и как в этом ориентироваться? 

Может лучше сделать что то типа PR?

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

т.е. функция задержала вызов и таймер в нее попадает чаще чем в любую другую

по мне так это важно только для разработчиков, я и так знаю что CopyBuffer много сожрет, но с этим таймером я не увижу легкие утечки 

 
fxsaber:

Возможно ли пару-тройку тормозных примеров, где профилировщик показывает проблему?

И демонстрация исправления тормозного исходника, чтобы профилировщик показал, что тормоза убраны?

Наверно, можно вот этот попробовать, если я правильно понял, о чем речь.

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Ускорение работы экспертов в тестере

Stanislav Korotky, 2017.10.25 22:53

Это зависит от используемого алгоритма. В качестве тривиального примера можно, например, привести МА-шку, которую суммировать не по всем значениям периода, а со сдвигом на одно значение, сохраняя все время промежуточную сумму для N-1 значений.

Если кто-то использует нейросеть, то можно её не обучать целиком, а дообучать.

Или вот еще один пример, видимо, довольно актуальный, потому что часто на форуме приходится слышать, что тестирование эксперта постоянно замедляется по ходу теста - это явный признак неоптимальных расчетов. Приведу фрагмент из своей давнишней неопубликованной статьи. Поскольку статья давняя, все исходники следует рассматривать как псевдо-код - могут уже не компилироваться.

=====

Часто применяется схема, когда размеры лотов определяются прибылью конкретного символа. Функция вычисления прибыли по символу может иметь примерно такой вид:

// collect data about trades and calculate profits by instrument
double CalculateProfit(string CurrentSymbol)
{
  HistorySelect(0, TimeCurrent());
  int n = HistoryDealsTotal();
  
  ulong ticket;
  string symbol;
  long entry;
  double profit = 0;
  
  for(int i = 0; i < n; i++)
  {
    ticket = HistoryDealGetTicket(i);
    if(ticket != 0)
    {        
      entry  = HistoryDealGetInteger(ticket, DEAL_ENTRY);
      if(entry == DEAL_ENTRY_OUT)
      {
        symbol = HistoryDealGetString(ticket, DEAL_SYMBOL);
        if(symbol == CurrentSymbol)
        {
          profit += HistoryDealGetDouble(ticket, DEAL_PROFIT);
        }
      }
    }
  }
  
  return(profit);
}

Функция представляет собой типичный пример скрытого источника проблемы. Это бомба замедленного действия. На первый взгляд она работает корректно. И даже на второй, и на третий, потому что проблема относится не к результату, а к тому, какой ценой он получен. По мере работы эксперта эта функция тормозит все больше и больше в геометрической прогрессии, потому что история сделок увеличивается. Разумеется, более оптимальным способом подсчета прибыли было бы её накопление в массиве по символам, с добавлением изменений из свежей части истории, не обработанной с предыдущего раза (например, бара).

double SymbolProfits[];

// TODO: распределение и инициализация массива нулями в OnInit

datetime lastProfitCalculation = 0;

void CalculateProfits()
{
  datetime dt = TimeCurrent();
  if(dt == lastProfitCalculation) return;
  HistorySelect(lastProfitCalculation, dt);
  int n = HistoryDealsTotal();
  
  ulong ticket;
  string symbol;
  long entry;
  
  for(int i = 0; i < n; i++)
  {
    ticket = HistoryDealGetTicket(i);
    if(ticket != 0)
    {        
      entry  = HistoryDealGetInteger(ticket, DEAL_ENTRY);
      if(entry == DEAL_ENTRY_OUT)
      {
        symbol = HistoryDealGetString(ticket, DEAL_SYMBOL);
        int index = FindSymbolIndex(symbol);
        if(index != -1)
        {
          SymbolProfits[index] += HistoryDealGetDouble(ticket, DEAL_PROFIT);
        }
      }
    }
  }
  lastProfitCalculation = dt;
}

double CalculateProfit(int index)
{
  return(SymbolProfits[index]);
}

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

=====


 
Stanislav Korotky:

Наверно, можно вот этот попробовать, если я правильно понял, о чем речь.

Наверное, это великолепный пример полезности Code Coverage, который бы показал зашкаливающее количество вызовов HistoryDealGet*-функций.

Не в курсе, как новый профилировщик справился бы. Спасибо за пример.

 
fxsaber:

Наверное, это великолепный пример полезности Code Coverage, который бы показал зашкаливающее количество вызовов HistoryDealGet*-функций.

Не в курсе, как новый профилировщик справился бы. Спасибо за пример.

опять развалились тут,

 

Решили добавить еще одну галочку для профайлинга, отключающую оптимизацию.

Это даст гораздо более полную картину профилировки, но про корректность скоростных характеристик уже нельзя будет говорить. Разница между неоптимизированной и оптимизированными версиями огромная.

 
Renat Fatkhullin:

Решили добавить еще одну галочку для профайлинга, отключающую оптимизацию.

Это даст гораздо более полную картину профилировки, но про корректность скоростных характеристик уже нельзя будет говорить. Разница между неоптимизированной и оптимизированными версиями огромная.

Спасибо.

 

Каждый раз, когда после запуска Терминала открываю Тестер (CTRL+R) происходит зависание Терминала на 5-10 секунд.

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

 
fxsaber:

Каждый раз, когда после запуска Терминала открываю Тестер (CTRL+R) происходит зависание Терминала на 5-10 секунд.

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

Скорее всего это построение списков ваших предыдущих тестов. Которых у вас наверняка много.

Проверим и перепишем.

 

Здравствуйте, в версии 2775 есть ошибка. При настройке графики на передний план она не сохраняется при изменении таймфрейма или символа.



 

Я нашёл причину, почему при профилировании показывало только одну функцию (да и та вызывается единожды при инициализации).

После удалении файла mqproj или сброса галочки "Максимальная оптимизация" стало выдавать реальную информацию.