Запуск Вашего советника на Idle-CPU, RannForex-Server, 6 чартов с разными символами. Когда вернулся к компу, увидел много такого.
2020.10.3013:50:21.852 Test9 (GBPUSD,H1) SymbolInfoTick max bad time: 2.008 ms; avr bad time: 2.008 ms; bad iterations: 1 total iterations: 100000002020.10.3013:50:22.142 Test9 (EURUSD,H1) GetBid max bad time: 1.125 ms; avr bad time: 1.125 ms; bad iterations: 1 total iterations: 100000002020.10.3013:50:23.072 Test9 (USDCHF,H1) SymbolInfoTick max bad time: 2.245 ms; avr bad time: 2.245 ms; bad iterations: 1 total iterations: 100000002020.10.3013:50:23.288 Test9 (USDCAD,H1) GetBid max bad time: 1.298 ms; avr bad time: 1.182 ms; bad iterations: 2 total iterations: 100000002020.10.3013:50:23.297 Test9 (AUDCAD,H1) GetBid max bad time: 0.977 ms; avr bad time: 0 ms; bad iterations: 0 total iterations: 100000002020.10.3013:50:24.393 Test9 (EURUSD,H1) SymbolInfoTick max bad time: 3.400 ms; avr bad time: 2.862 ms; bad iterations: 2 total iterations: 10000000
У меня условие bad time такое.
if(end>1000)
{
avr_time+=end;
counter++;
}
ЗЫ Для объективности со стороны форумчан прикрепил код.
Запуск Вашего советника на Idle-CPU, RannForex-Server, 6 чартов с разными символами. Когда вернулся к компу, увидел много такого.
Если я правильно понял, то в этом тесте на 4 ядрах цпу работает 6 зацикленных экспертов, и каждый пытается загрузить одно ядро на 100%. Т.е. это безусловно стресс-тест, очень далекий от нормальных условий работы.
При таких условиях 1 или 2 выброса по 1-2мс на 10 миллионов запросов - отличный результат.
И еще раз напоминаю: чем больше нагрузка, тем больше вы тестируете эффективность работы планировщика задач ОС, а не терминала. Не обманывайте себя.
Если я правильно понял, то в этом тесте на 4 ядрах цпу работает 6 зацикленных экспертов, и каждый пытается загрузить одно ядро на 100%. Т.е. это безусловно стресс-тест, очень далекий от нормальных условий работы.
Является ли этот советник стресс-тестом? Спрашиваю, потому что замер в нем
#include <fxsaber\BenchMark\Benchmark.mqh> // https://www.mql5.com/ru/code/31279void GetMarketWatch( MqlTick &Ticks[] )
{
for (int i = ArrayResize(Ticks, Size2) - 1; i >= 0; i--)
_B(SymbolInfoTick(Symbols[i], Ticks[i]), 100);
}
Это типичная довольно ошибка. В текущей реализации ArrayPrint строки печатаются через последовательный вызов нескольких Print. А надо сначала сформировать один большой string со всеми данными, а потом его через только один Print вывести.
19 и 48 мс длилось выполнение SymbolInfoTick. Несколько десятков случаев, когда длительность была сотни микросекунд. Но их не стал приводить.
Видимо, для воспроизведения нужно запускать на сутки боевые советники, а потом только смотреть. По-моему, нереально разобраться, что является инициатором таких лагов.
Посмотрел код Test9 вверху страницы. Зачем 10 миллионов раз без всяких Sleep запрашивать тики с одного символа ? Какое отношение такой тест имеет к реальной торговле ?
На мой взгляд тест должен выглядеть так: Запрашиваем тик с каждого символа из обзора рынка. Делаем паузу Sleep(1) и так по кругу. Немного передел ваш код:
intOnInit()
{
string Symbols[];
int TotalSymbol= SymbolsTotal(true);
ArrayResize(Symbols,TotalSymbol);
for(int i=0;i<TotalSymbol;i++)
Symbols[i]= SymbolName(i, true);
MqlTick Tick;
//---double temp=0;
ulong start,end,max_time=0,avr_time=0,counter=0;
int count=1e4;
for(int i=0; !IsStopped() && (i<count); i++)
{
Sleep(1);
for(int j=0;j<TotalSymbol;j++)
{
start=GetMicrosecondCount();
SymbolInfoTick(Symbols[j], Tick);
// temp++;
end=GetMicrosecondCount()-start;
//---if(end>max_time)
max_time=end;
if(end>1000)
{
avr_time+=end;
counter++;
}
}
}
Comment("SymbolInfoTick max bad time: ",DoubleToString(max_time/1000.0,3)," ms; avr bad time: ",counter ? DoubleToString(avr_time/1000.0/counter,3):"0"," ms; bad iterations: ",counter," total iterations: ",count);
Print("SymbolInfoTick max bad time: ",DoubleToString(max_time/1000.0,3)," ms; avr bad time: ",counter ? DoubleToString(avr_time/1000.0/counter,3):"0"," ms; bad iterations: ",counter," total iterations: ",count);
returnINIT_FAILED;
}
Тест 55 символов в обзоре.
SymbolInfoTick max bad time: 0.212 ms; avr bad time: 0 ms; bad iterations: 0 total iterations: 10000
Anton:
Запуск Вашего советника на Idle-CPU, RannForex-Server, 6 чартов с разными символами. Когда вернулся к компу, увидел много такого.
У меня условие bad time такое.
ЗЫ Для объективности со стороны форумчан прикрепил код.
Запуск Вашего советника на Idle-CPU, RannForex-Server, 6 чартов с разными символами. Когда вернулся к компу, увидел много такого.
Если я правильно понял, то в этом тесте на 4 ядрах цпу работает 6 зацикленных экспертов, и каждый пытается загрузить одно ядро на 100%. Т.е. это безусловно стресс-тест, очень далекий от нормальных условий работы.
При таких условиях 1 или 2 выброса по 1-2мс на 10 миллионов запросов - отличный результат.
И еще раз напоминаю: чем больше нагрузка, тем больше вы тестируете эффективность работы планировщика задач ОС, а не терминала. Не обманывайте себя.
У меня вопрос про актуальность тиков, которые отдает SymbolInfoTick.
Ситуация:
1. Делаем TimeCurretn(); получаем время 18:00:00
2. Делаем SymbolInfoTick по нелеквидному символу. Получаем тик со временем 17:58:00.
3. Sleep(1)
4. Делаем SymbolInfoTick по нелеквидному символу. Получаем тик со временем 17:59:00.
Т.е четвертом пункте мы получили новый тик, который на минуту отличается TimeCurretn().
Видите ли вы проблему в данной ситуации ?
Как в такую ситуацию попадать по реже ?
Проверочный советник.
У меня не Алертит. Результат (запустил на шести чартах).
Проблема есть. Сложно сказать, насколько серьезная.
Если я правильно понял, то в этом тесте на 4 ядрах цпу работает 6 зацикленных экспертов, и каждый пытается загрузить одно ядро на 100%. Т.е. это безусловно стресс-тест, очень далекий от нормальных условий работы.
Является ли этот советник стресс-тестом? Спрашиваю, потому что замер в нем
выдает море Алертов.
Попутно обнаружился баг последовательного вывода в лог ArrayPrint.
Понятно, что это ошибка, т.к. исходник такой.
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
MT5 и скорость в боевом исполнении
fxsaber, 2020.10.30 15:04
У меня Aлерт срабатывает каждую секунду много раз.
19 и 48 мс длилось выполнение SymbolInfoTick. Несколько десятков случаев, когда длительность была сотни микросекунд. Но их не стал приводить.
Видимо, для воспроизведения нужно запускать на сутки боевые советники, а потом только смотреть. По-моему, нереально разобраться, что является инициатором таких лагов.
Посмотрел код Test9 вверху страницы. Зачем 10 миллионов раз без всяких Sleep запрашивать тики с одного символа ? Какое отношение такой тест имеет к реальной торговле ?
На мой взгляд тест должен выглядеть так: Запрашиваем тик с каждого символа из обзора рынка. Делаем паузу Sleep(1) и так по кругу. Немного передел ваш код:
Тест 55 символов в обзоре.
Теперь протестируем вместо SymbolInfoTick temp++;
Посмотрел код Test9 вверху страницы. Зачем 10 миллионов раз без всяких Sleep запрашивать тики с одного символа ?
Не на ровном месте. Подробности - читайте ветку.
Не на ровном месте. Подробности - читайте ветку.
Вас не смущает, что максимальное время выполнения даже temp++ занимает десятки микросекунд, при такой методики замера ?