MT5 и скорость в боевом исполнении - страница 16

 
fxsaber:

ЗЫ Интересно было бы сравнить с другими торговыми платформами этот же скрипт.

MT4 b1280.

// Мониторинг длительных пиков выполнения важных функций для торговли.
#include <fxsaber\Benchmark.mqh> // https://c.mql5.com/3/321/Benchmark.mqh

input int inCycle = 10;    // Циклов проверки в одном OnTick
input int inAlertTime = 1; // Нижний порог в миллисекундах

#define _B2(A) _B(A, AlertTime)

void Check( const string Symb, const int AlertTime = 1 )
{
  MqlTick Tick;
  
  if (_B2(SymbolInfoTick(Symb, Tick)))
  {
    _B2(OrdersHistoryTotal());
    _B2(OrdersTotal());
    _B2(OrderSelect(0, SELECT_BY_POS));
    _B2(OrderSelect(0, SELECT_BY_POS, MODE_HISTORY));
    _B2(OrderSelect(0, SELECT_BY_TICKET));
        
    _B2(GetLastError());
    _B2(IsStopped());
    
    _B2(SymbolInfoDouble(Symb, SYMBOL_ASK));
    _B2(SymbolInfoDouble(Symb, SYMBOL_TRADE_TICK_VALUE));
    _B2(SymbolInfoDouble(Symb, SYMBOL_POINT));
    _B2(SymbolInfoInteger(Symb, SYMBOL_DIGITS));

    _B2(TimeCurrent());
    _B2(TimeLocal());
    
    _B2(OrderGetDouble(ORDER_PRICE_CURRENT));
    _B2(OrderGetInteger(ORDER_MAGIC));
    _B2(OrderGetString(ORDER_SYMBOL));
                
    _B2(AccountInfoDouble(ACCOUNT_EQUITY));
        
    _B2(MQLInfoInteger(MQL_TRADE_ALLOWED));
    _B2(AccountInfoInteger(ACCOUNT_TRADE_EXPERT));
    _B2(AccountInfoInteger(ACCOUNT_TRADE_ALLOWED));
    _B2(TerminalInfoInteger(TERMINAL_TRADE_ALLOWED));
    
    _B2(SymbolsTotal(true));
    _B2(SymbolName(0, true));
    _B2(Symbol());
    
    _B2(GlobalVariableCheck(NULL));
    _B2(GlobalVariableGet(NULL));
    
    _B2(ResourceFree(NULL));
  }
}

void OnTick()
{
  for (int i = 0; i < inCycle; i++)
    Check(_Symbol, inAlertTime);      
}


2020.08.27 13:09:46.799 Test6 EURUSD,M1: Alert: Time[Test6.mq4 39: AccountInfoInteger(ACCOUNT_TRADE_EXPERT)] = 7 ms.
2020.08.27 13:09:46.790 Test6 EURUSD,M1: Alert: Time[Test6.mq4 18: OrderSelect(0,SELECT_BY_POS,MODE_HISTORY)] = 2 ms.
2020.08.27 13:09:46.784 Test6 EURUSD,H1: Alert: Time[Test6.mq4 25: SymbolInfoDouble(Symb,SYMBOL_TRADE_TICK_VALUE)] = 1 ms.

Проскачило всего три штуки и потом очень редко выскакивали. Наверное, сложно создать тормоза, посколько нет HistorySelect и CopyTicks.

 
Fast235:

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

узнать бы у разработчиков влияние кеш уровней на скорость работы, да и вообще скорости Zen2 и последних intel


add

Ryzen 3700x у меня есть, можно сделать тесты с Intel

например с помощью этого штатного скрипта MQL5\Scripts\UnitTests\Stat\TestStatBenchmark.mq5 

зациклить его несколько раз с таймером

Здесь речь идет не о тестах, а о задержках в исполнении торговых приказов. Эта задержка есть, причем плавающая. И это достаточно сильно беспокоит, как ТС, так и меня.

 
fxsaber:

Проскачило всего три штуки и потом очень редко выскакивали. Наверное, сложно создать тормоза, посколько нет HistorySelect и CopyTicks.

Дождался и на MT4.

2020.08.27 13:18:00.306 Test6 GBPCAD.rann,M1: Alert: Time[Test6.mq4 26: SymbolInfoDouble(Symb,SYMBOL_POINT)] = 1 ms.
2020.08.27 13:17:39.820 Test6 GBPCAD.rann,M1: Alert: Time[Test6.mq4 30: TimeLocal()] = 2 ms.
2020.08.27 13:17:32.598 Test6 GBPCAD.rann,M1: Alert: Time[Test6.mq4 30: TimeLocal()] = 36 ms.
2020.08.27 13:17:29.676 Test6 GBPCAD.rann,H1: Alert: Time[Test6.mq4 15: OrdersHistoryTotal()] = 1 ms.
2020.08.27 13:17:26.468 Test6 GBPCAD.rann,H1: Alert: Time[Test6.mq4 27: SymbolInfoInteger(Symb,SYMBOL_DIGITS)] = 5 ms.
2020.08.27 13:17:26.460 Test6 GBPCAD.rann,M1: Alert: Time[Test6.mq4 13: SymbolInfoTick(Symb,Tick)] = 1 ms.
2020.08.27 13:17:14.528 Test6 GBPCAD.rann,M1: Alert: Time[Test6.mq4 13: SymbolInfoTick(Symb,Tick)] = 3 ms.
2020.08.27 13:16:52.309 Test6 GBPCAD.rann,H1: Alert: Time[Test6.mq4 15: OrdersHistoryTotal()] = 2 ms.
2020.08.27 13:16:52.308 Test6 GBPCAD.rann,M1: Alert: Time[Test6.mq4 15: OrdersHistoryTotal()] = 2 ms.
2020.08.27 13:16:52.307 Test6 GBPCAD.rann,H1: Alert: Time[Test6.mq4 36: AccountInfoDouble(ACCOUNT_EQUITY)] = 1 ms.
2020.08.27 13:16:42.448 Test6 GBPCAD.rann,M1: Alert: Time[Test6.mq4 17: OrderSelect(0,SELECT_BY_POS)] = 2 ms.
2020.08.27 13:16:32.480 Test6 GBPCAD.rann,H1: Alert: Time[Test6.mq4 36: AccountInfoDouble(ACCOUNT_EQUITY)] = 3 ms.
2020.08.27 13:16:32.479 Test6 GBPCAD.rann,H1: Alert: Time[Test6.mq4 15: OrdersHistoryTotal()] = 3 ms.
2020.08.27 13:16:32.477 Test6 GBPCAD.rann,M1: Alert: Time[Test6.mq4 15: OrdersHistoryTotal()] = 1 ms.
2020.08.27 13:16:29.096 Test6 GBPCAD.rann,H1: Alert: Time[Test6.mq4 26: SymbolInfoDouble(Symb,SYMBOL_POINT)] = 1 ms.
2020.08.27 13:16:14.593 Test6 GBPCAD.rann,H1: Alert: Time[Test6.mq4 15: OrdersHistoryTotal()] = 23 ms.
2020.08.27 13:14:55.398 Test6 GBPCAD.rann,H1: Alert: Time[Test6.mq4 27: SymbolInfoInteger(Symb,SYMBOL_DIGITS)] = 1 ms.
2020.08.27 13:13:34.891 Test6 GBPCAD.rann,M1: Alert: Time[Test6.mq4 25: SymbolInfoDouble(Symb,SYMBOL_TRADE_TICK_VALUE)] = 2 ms.

TimeLocal за 36 миллисекунд. Выбрал символ с тиковым объемом побольше.

 

Кому интересно, здесь инструкция для воспроизведения.

Кто думает, что его не коснется.

2020.08.27 13:17:56.139 Test6 (EURUSD,H1)       Alert: Time[Test6.mq5 48: OrdersTotal()] = 2 ms.
2020.08.27 13:17:56.167 Test6 (EURUSD,M1)       Alert: Time[Test6.mq5 48: OrdersTotal()] = 39 ms.
2020.08.27 13:17:56.198 Test6 (EURUSD,H1)       Alert: Time[Test6.mq5 48: OrdersTotal()] = 54 ms.
2020.08.27 13:18:11.512 Test6 (EURUSD,M1)       Alert: Time[Test6.mq5 48: OrdersTotal()] = 3 ms.
 
fxsaber:

Выбрал символ с тиковым объемом побольше.

Даже проверять не буду. Представьте себе самый популярный символ ФОРТС с подпиской на стакан. Вместо OnTick логика в OnBookEvent. Лаги должны быть жуткие.

Нужны официальные рекомендации, что нужно сделать, чтобы минимизировать лаги.

 
fxsaber:

Чтобы воспроизвести тормоза, нужно скрипт запустить на нескольких чартах ОДНОГО символа - добиться одновременного вызова OnTick. Тогда сыпятся алерты на каждом тике.

График загрузки CPU показывает, что terminal64.exe грузит до 30% восемь логических ядер. Это всего четыре EURUSD-чарта с запущенным скриптом. Хорошо видно, как одномоментно грузит каждый чарт.

Куда столько ресурсов уходит?

На этот вопрос легко ответить.

Вот тут вы копируете много данных:

    HistorySelect(MathRand(), INT_MAX);

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

Но все эти данные вы не используете, а сразу сбрасываете в следующей же строке:

    _B2(HistorySelect(Tick.time, INT_MAX));

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

Все это бессмысленное действие происходит с повтором 10 раз на каждом тике из нескольких потоков одномоментно. Причем вы именно сознательно добиваетесь одновременности этих действий из нескольких потоков.

Так что вы отлично знаете что и почему делаете и куда ресурсы уходят, и при этом утверждаете что "Задержки из-за чрезмерной нагрузки CPU со стороны MT5".

При этом у вас явно есть проблема с вашим компьютером. Т.е., да, вы очень активно двигате существенные объемы памяти, но это не должно так влиять на время выполнения функций, тем более никак не связанных с HistorySelect().

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

Наша тестовая система: Windows 10 build 18363, Intel Xeon E5-2630 v4 @ 2.20GHz

 
Anton:

На этот вопрос легко ответить.

Вот тут вы копируете много данных:

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

Но все эти данные вы не используете, а сразу сбрасываете в следующей же строке:

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

Все это бессмысленное действие происходит с повтором 10 раз на каждом тике из нескольких потоков одномоментно. Причем вы именно сознательно добиваетесь одновременности этих действий из нескольких потоков.

Так что вы отлично знаете что и почему делаете и куда ресурсы уходят, и при этом утверждаете что "Задержки из-за чрезмерной нагрузки CPU со стороны MT5".

При этом у вас явно есть проблема с вашим компьютером. Т.е., да, вы очень активно двигате существенные объемы памяти, но это не должно так влиять на время выполнения функций, тем более никак не связанных с HistorySelect().

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

Наша тестовая система: Windows 10 build 18363, Intel Xeon E5-2630 v4 @ 2.20GHz


Коллеги, 

вам пора выходить с уровня кружка авиамоделизма.

Вот вам боевые условия: 4 терминала, около 300 советников, порядка 30 инструментов. Треть советников подписаны на стаканы. Все это на FORTS. Моделируйте в таких условиях.

 
Dmi3:


Коллеги, 

вам пора выходить с уровня кружка авиамоделизма.

Вот вам боевые условия: 4 терминала, около 300 советников, порядка 30 инструментов. Треть советников подписаны на стаканы. Все это на FORTS. Моделируйте в таких условиях.

"Вот вам" принимается в виде zip файла, плюс подробное описание проблемы. Иначе это пустой разговор.

В данном случае обсуждается код представленного эксперта и эффективность его выполнения. По выявленным проблемам были проведены работы по оптимизации кода терминала.

 
Anton:

"Вот вам" принимается в виде zip файла, плюс подробное описание проблемы. Иначе это пустой разговор.

В данном случае обсуждается код представленного эксперта и эффективность его выполнения. По выявленным проблемам были проведены работы по оптимизации кода терминала.

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

Проблемы есть у fxsaber, он тут уже 16 страниц накатал.

И у Михаила ТАКИЕ ЖЕ проблемы с 2014 года, накатал уже 149 страниц:  https://www.mql5.com/ru/forum/38456/page149

У них у обоих достаточно квалификации, чтобы предоставить вам всю необходимую информацию.

ФОРТС. Вопросы по исполнению
ФОРТС. Вопросы по исполнению
  • 2020.08.20
  • www.mql5.com
С большими проблемами удалось это сделать (начальник отдела по работе с профессиональными клиентами ДЦ Открытие Евгений Сергеевич,.
 
Anton:

На этот вопрос легко ответить.

Вот тут вы копируете много данных:

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

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

Я убрал строку с MathRand. Вот краткий лог.

2020.08.27 22:38:57.920 Alert: Time[Test6.mq5 40: SymbolInfoDouble(Symb,SYMBOL_TRADE_TICK_VALUE)] = 3 ms.
2020.08.27 22:38:57.923 Alert: Time[Test6.mq5 19: CopyTicksRange(Symb,Ticks,COPY_TICKS_ALL,Tick.time_msc)] = 1 ms.
2020.08.27 22:38:57.926 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 3 ms.
2020.08.27 22:38:57.928 Alert: Time[Test6.mq5 61: AccountInfoDouble(ACCOUNT_EQUITY)] = 1 ms.
2020.08.27 22:38:57.940 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 11 ms.
2020.08.27 22:39:02.227 Alert: Time[Test6.mq5 17: CopyTicks(Symb,Ticks,COPY_TICKS_ALL,0,1)] = 1 ms.
2020.08.27 22:39:02.229 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 2 ms.
2020.08.27 22:39:02.238 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 7 ms.
2020.08.27 22:39:02.241 Alert: Time[Test6.mq5 28: HistoryDealSelect(0)] = 1 ms.
2020.08.27 22:40:34.575 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 2 ms.
2020.08.27 22:40:44.407 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 1 ms.
2020.08.27 22:40:44.409 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 9 ms.
2020.08.27 22:40:46.819 Alert: Time[Test6.mq5 40: SymbolInfoDouble(Symb,SYMBOL_TRADE_TICK_VALUE)] = 1 ms.
2020.08.27 22:40:52.760 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 3 ms.
2020.08.27 22:40:52.764 Alert: Time[Test6.mq5 28: HistoryDealSelect(0)] = 3 ms.
2020.08.27 22:40:54.907 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 3 ms.
2020.08.27 22:41:11.415 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 5 ms.
2020.08.27 22:41:13.517 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 1 ms.
2020.08.27 22:41:14.689 Alert: Time[Test6.mq5 18: CopyTicks(Symb,Ticks,COPY_TICKS_ALL,Tick.time_msc)] = 1 ms.
2020.08.27 22:41:45.343 Alert: Time[Test6.mq5 19: CopyTicksRange(Symb,Ticks,COPY_TICKS_ALL,Tick.time_msc)] = 1 ms.
2020.08.27 22:42:12.156 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 3 ms.
2020.08.27 22:42:19.654 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 2 ms.
2020.08.27 22:42:32.581 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 2 ms.
2020.08.27 22:42:48.662 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 1 ms.
2020.08.27 22:42:49.754 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 2 ms.
2020.08.27 22:42:49.756 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 2 ms.
2020.08.27 22:42:50.803 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 1 ms.
2020.08.27 22:42:50.804 Alert: Time[Test6.mq5 32: HistoryOrderGetInteger(0,ORDER_MAGIC)] = 1 ms.
2020.08.27 22:42:50.805 Alert: Time[Test6.mq5 44: TimeCurrent()] = 1 ms.
2020.08.27 22:43:42.143 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 6 ms.
2020.08.27 22:43:42.148 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 4 ms.
2020.08.27 22:43:54.985 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 2 ms.
2020.08.27 22:44:01.402 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 1 ms.
2020.08.27 22:44:01.405 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 2 ms.


Но все эти данные вы не используете, а сразу сбрасываете в следующей же строке:

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

Тестирую на реальных счетах, где ордеров больше 10К - норма. Это не фейковые ордера, т.к. > 70% из них были исполнены.

На скрине, кстати, 9331+576 != 12529.

Все это бессмысленное действие происходит с повтором 10 раз на каждом тике из нескольких потоков одномоментно. Причем вы именно сознательно добиваетесь одновременности этих действий из нескольких потоков.

У меня проблемы на разных символах. Один символ предлагается использовать для более быстрого воспроизведения проблемы.

Повтор 10 раз на каждом тике - это жизненная необходимость. Т.к. нормально, когда один советник содержит в себе десяток ТС с разными мэджиками.

Так что вы отлично знаете что и почему делаете и куда ресурсы уходят, и при этом утверждаете что "Задержки из-за чрезмерной нагрузки CPU со стороны MT5".

При этом у вас явно есть проблема с вашим компьютером. Т.е., да, вы очень активно двигате существенные объемы памяти, но это не должно так влиять на время выполнения функций, тем более никак не связанных с HistorySelect().

Язык не поворачивается обвинить Вас в некомпетентности, но то, что Вы написали, мягко говоря, вызывает недоумение. HistorySelect - это нахождение четырех индексов (начало/конец для таблицы ордеров и начало/конец для таблицы сделок). При этом таблицы отсортированы по времени, поэтому идет (должен) бинарный поиск в худшем случае. Для 10К ордеров - это мгновенно (посчитайте двоичный логарифм). Какое движение объемов памяти?! Здесь никто не говорит про ужасную HistorySelectByPosition. Затрагивается элементарная HistorySelect.

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

Наша тестовая система: Windows 10 build 18363, Intel Xeon E5-2630 v4 @ 2.20GHz

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

Причина обращения: