Ошибки, баги, вопросы - страница 1658

 
Alexey Volchanskiy:

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

Безотносительно к этой очевидности, вопрос был об инлайне функций. Т.е. не заменяется ли при компиляции OrderType() чем-то вроде order.type.

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

Как показали замеры, это лишнее. 

 
Sergei Vladimirov:

Безотносительно к этой очевидности, вопрос был об инлайне функций. Т.е. не заменяется ли при компиляции OrderType() чем-то вроде order.type.

Как показали замеры, это лишнее. 

Судя по внутренней реализации массивов, тот же ArraySize должен инлайниться. Но использую у себя всегда так (не замерял)

Вместо

for (int i = 0; i < ArraySize(Array); i++)

делаю

const int Amount = ArraySize(Array);

for (int i = 0; i < Amount; i++)
По производительности недавно удивил такой факт

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

Как последовательно перебрать перечисление?

fxsaber, 2016.08.22 09:13

Добавил к массиву static. Стало работать почти в три раза быстрее switch! На помойку такой switch. Спасибо за подсказку!
Так что лучше, похоже, не рассчитывать на оптимизацию компилятора, а всегда "помогать" ему через наименьший вызов функций и использование везде, где можно и логично const и static.
 
Sergei Vladimirov:

Безотносительно к этой очевидности, вопрос был об инлайне функций. Т.е. не заменяется ли при компиляции OrderType() чем-то вроде order.type.

Как показали замеры, это лишнее. 

Сами же написали: 

Sergei Vladimirov 2016.09.01 02:53      RU

Проверил сам. Второй код выполняется в 4 раза быстрее. Всё ясно, вопрос снят. 

 
Sergei Vladimirov:
Проверил сам. Второй код выполняется в 4 раза быстрее. Всё ясно, вопрос снят.
Не замеряйте только в режиме профилирования/дебага. Там никакого инлайна нет и в помине. Только Release-вариант должен быть.
 
Inv Андрей Иващенко:

Добрый день!

Господа офицеры, подскажите, с чего начать ловлю бага?

Мультивалютный советник. После первой сделки тестер стопится.

Выдаёт ошибку, код которой не могу найти.

Да, тестер отлично работает с начальной даты 2016.05.01. Если эту дату меняю - идет стопинг тестера и ошибка, лог ниже. 

 Помогите пожалуйста! 

Отвечаю сам себе:

Это баг тестера. Пока нужно добавить  хендл любого технического индикатора в OnInit во всем символам, по каким работает советник.

 
Alexey Volchanskiy:

Сами же написали: 

Sergei Vladimirov 2016.09.01 02:53      RU

Проверил сам. Второй код выполняется в 4 раза быстрее. Всё ясно, вопрос снят. 

В следующем комментарии я написал цифры: выигрыш при однократной операции - 1 наносекунда. При оптимизации стратегии по тикам на двухлетнем участке и нескольких тысячах прогонов экономия одной нс, возможно, и имеет смысл. А вот в реальной торговле...
 
A100:

В build 1398 ошибка 'EX5 loading failed' осталась (видимо не была связана с тем примером)

В исправленном build 1400 ошибка в похожем случае теперь воспроизводится как 'pure virtual function call'. А без комментария - нормально

//Script1.mq5
typedef void (*fn)();
#import "Script2.ex5"
        void g( fn );
#import
void h() /*export*/ {} //если export без комментария - нормально
void OnStart() { g( h ); }
//Script2.mq5
#property library
typedef void (*fn)();
void g( fn f ) export { f(); }
 

Нельзя применить :: для разрешения неоднозначности


#import "Script1.ex5"
        void g();
#import "Script2.ex5"
        void g();
#import
typedef void (*fn)();
void OnStart()
{
        Script1::g(); //нормально
        Script2::g(); //нормально
        fn f = Script1::g; //Error
}
 
Inv Андрей Иващенко:

Отвечаю сам себе:

Это баг тестера. Пока нужно добавить  хендл любого технического индикатора в OnInit во всем символам, по каким работает советник.

Причем похоже проблема возникает при получении только первого тика на новом баре, тестер как бы "застревает" и отстаёт еще на 1 бар, то есть эксперт думает что бара еще нет и в визуализации его действительно нет, а спустя пару секунд бар появляется, в случае теста на М1 корректное значение приходит на втором тике (если я правильно понял), надеюсь разработчики исправят это досадный момент поскорее...

добавление:

получается чтобы обойти этот момент сейчас нужно искусственно пропускать первый тик нового бара... 

 
Невозможно на RTS-9.16 BCS-MetaTrader5 сделать отладку советника по CTRL+F5. Тестер пишет
Tester  Leverage 1:1 set error