Новая версия платформы MetaTrader 5 build 4620: исправления ошибок в MQL5 и новые методы OpenBLAS - страница 20

 
Aleksey Vyazmikin #:

По ситуации с Финамом дадите комментарий?

Поставил разбираться.

Похоже там конфликт с тем, что в тиковом потоке есть бид-аски вместе с базовым ласт. В идеальном состоянии должны быть только ласты. Это может сбивать тестер с толку.

 
Renat Fatkhullin #:

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

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

Нет дела до теории. Факт - код работает заметно быстрее на ровном месте, если не использовать через тривиальный const-метод. Т.е. он не инлайнится.

Если готовы разобраться в причинах, скину код в ЛС. Предлагаю конструктив.

 
fxsaber #:

Нет дела до теории. Факт - код работает заметно быстрее на ровном месте, если не использовать через тривиальный const-метод. Т.е. он не инлайнится.

Если готовы разобраться в причинах, скину код в ЛС. Предлагаю конструктив.

Теория права, мы постоянно видим как все работает и в наших проектах. Приходится вручную помогать оптимизатору кода, разбираясь в сгенерированном коде.

Не сейчас, мы работает над новым компилятором. Очень большой объем работы.

После выпуска будем детальнейше все оптимизировать.

 
Renat Fatkhullin #:
Надо многократно и чисто проверять, чтобы делать выводы. У вас очень мало информации и нет возможности воспроизвести.


4 года написано в логах скачки с 2020.01 - тестер ведь обеспечивает наличие предварительной истории, чтобы вы не с нулем баров стартовали.

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

Да, наверное я совсем никудышный специалист, но я не могу понять, почему по массиву содержащему имена символов, создать 17 графиков валютных пар в визуальном тестере всё работает без проблем. Если создать список 17 объектов посредством listObj.Add(obj) и не создавать графики валют, тоже работает без проблем, но далеко не полноценно. А вот если пользуясь списком объектов обратившись к свойствам символа создать 17 графиков всё вылетает. Я подготовил минимальный код. Сегодня посоветуюсь с опытным программистом, продемонстрирую ему что получается и потом, возможно придётся передать коды кому-то из сотрудников.

 
Renat Fatkhullin #:

Поставил разбираться.

Похоже там конфликт с тем, что в тиковом потоке есть бид-аски вместе с базовым ласт. В идеальном состоянии должны быть только ласты. Это может сбивать тестер с толку.

Спасибо, что прокомментировали ситуацию.

Без спреда будут не правдоподобные результаты тестирования. В Открытии такой проблемы не наблюдалось.

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

 
fxsaber #:
b4673, столкнулся с отсутствием инлайна по факту.

Видимо, на какой-то вложенности инлайн перестает работать. Не смог создать лаконичную демонстрацию. Если нужны исходники тормозов - готов в ЛС.

Я никогда не полагался на компилятор касаемо инлайнинга. В подобных случаях делаю примерно так:

#define _isPosition (this.Type <= ORDER_TYPE_SELL)
//---

class Foo
  {
public:
   bool            IsPosition() const    { return(_isPosition);                                                           }
   double          GetCalcProfit() const { return(_isPosition ? (this.ClosePrice - this.OpenPrice) * this.TickValue : 0); }
private:
   ENUM_ORDER_TYPE Type;
   double          ClosePrice;
   double          OpenPrice;
   double          TickValue;
  };

//---
#undef _isPosition

DIY инлайнинг с сохранением DRY принципа😄

 
Vladislav Boyko #:

Я никогда не полагался на компилятор касаемо инлайнинга. В подобных случаях делаю примерно так:

DIY инлайнинг с сохранением DRY принципа😄

Спасибо за вариант. К сожалению, у меня ситуация сложнее.

#define _isPosition (this.Type <= ORDER_TYPE_SELL)
//---

class Foo_base
{
public:
   ENUM_ORDER_TYPE Type;

   bool            IsPosition() const    { return(_isPosition);                                                           }
};

class Foo : public Foo_base
  {
public:
   double          GetCalcProfit() const { return(_isPosition ? (this.ClosePrice - this.OpenPrice) * this.TickValue : 0); }
private:
   double          ClosePrice;
   double          OpenPrice;
   double          TickValue;
  };

//---
#undef _isPosition

Класс-родитель идет отдельным mqh-файлом.

 
b4673, неправильная работа точки останова.
class A
{
public:
  int Amount;

  void Func( void ) {}
  
  A() : Amount(0)
  {    
    this.Func(); // Без этого вызова будет работать правильно.
    
    for (int i = 0; i < this.Amount; i++) // Сюда поставить точку останова (F9).
      ;    
  }

} a;

void OnStart() {}

Ставим точку останова (см. исходник) и запускаем в дебаг-режиме (F5). Проход точки останова через F5/F10 вернет нас на это же место.

Если убрать вызов метода, то будет работать правильно - нажатие на F5/F10 вызовет проход кода ниже.


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

Строка для поискаOshibka 122.

 
fxsaber #:
b4673, неправильная работа точки останова.

Ставим точку останова (см. исходник) и запускаем в дебаг-режиме (F5). Проход точки останова через F5/F10 вернет нас на это же место.

Если убрать вызов метода, то будет работать правильно - нажатие на F5/F10 вызовет проход кода ниже.


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

Строка для поискаOshibka 122.

А компилятор не выбрасывает цикл без тела за ненадобностью, бесполезностью?

 
Alexey Viktorov #:

А компилятор не выбрасывает цикл без тела за ненадобностью, бесполезностью?

Нет. Можете его заполнить.