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

 
Sergey Dzyublik:

Думаю, что с использованием WinApi можно реализовать функцию по переключению на нужную вкладку: торговля, баланс, что угодно.
Пробуйте сами реализовать, или закажите в фрилансе, надеюсь, там еще остались умельцы.

Сам практиковал такой изврат. Хочется user-friendly GUI.

 
Aleksey Vyazmikin:

Опять памяти нет ему...

Хотя свободно ещё 7 гигабайт ОЗУ. Что ж это такое то?

Откройте тикет в сервисдеск. Приложите эксперта и настройки оптимизации.

+ опишите операционку, битность, конфигурацию системы.

 
Alexey Da:

Откройте тикет в сервисдеск. Приложите эксперта и настройки оптимизации.

+ опишите операционку, битность, конфигурацию системы.


Да я не знаю как воспроизвести всё это - прошлую неделю каждый день такое сообщение появлялось, при этом советник не работал вообще никакой. А на днях вот с оптимизацией... потом всё заработало после закрытия всех программ.

Может ли это быть конфликт между программами? Заметил, что баг был всегда, когда был открыт браузер Опера.

 

В этой теме выяснилась интересная вещь про быстродействие команды Comment() в MT4 и MT5. В МТ5 эта команда работает в ~2000 раз (!!!) медленнее, чем в MT4. 

Вот тестировочный код, который работает на двух платформах:

#property script_show_inputs
#include <Canvas\Canvas.mqh>

input uint   FontSize=12;                                   // размер шрифта
input uint   Count=1000;                                    // размерность цикла
input ENUM_COLOR_FORMAT format=COLOR_FORMAT_ARGB_NORMALIZE; //Способ обработки цвета

void OnStart()
  {
   CCanvas Text;
   ulong ColorScreen=ChartGetInteger(0,CHART_COLOR_BACKGROUND,0);

   Text.FontSet("Arial",FontSize);
   string str="Необходимо подождать.Выполняется проход цикла №: = ";
   int H=Text.TextHeight(str);
   int W=Text.TextWidth(str+"00000");
   if(!Text.CreateBitmapLabel(0,0,"FONT",2,130,W,H,format)) Print("Error creating canvas: ",GetLastError());

   ulong t1=1,t2=1,t0;
   uint j=0;
   color clr=(color)ARGB(255,255^GETRGBR(ColorScreen),255^GETRGBG(ColorScreen),255^GETRGBB(ColorScreen));
   t0=GetMicrosecondCount();
   for(j=0;j<Count;j++)
     {
      Comment(str+IntegerToString(j));
      if (IsStopped()) break;
     }
   t1=GetMicrosecondCount()-t0;

   t0=GetMicrosecondCount();
   for( j=0;j<Count;j++)
     {
      Text.Erase((color)ColorScreen);
      Text.TextOut(0,0,str+IntegerToString(j),clr);
      Text.Update();
      if (IsStopped()) break;
     }
   t2=GetMicrosecondCount()-t0;
      Text.Erase((color)ColorScreen);
      Text.TextOut(0,0,"Время Comment = "+IntegerToString(t1)+" Время Canvas = "+IntegerToString(t2),clr);
      Text.Update();
      Sleep(30000);
     
   Text.Destroy();
   Comment("");
  }
//+------------------------------------------------------------------+

Это разве ОК?

Файлы:
 
Nikolai Semko:

В этой теме выяснилась интересная вещь про быстродействие команды Comment() в MT4 и MT5. В МТ5 эта команда работает в ~2000 раз (!!!) медленнее, чем в MT4. 

Вот тестировочный код, который работает на двух платформах:

Это разве ОК?

Да, все верно и правильно.

В МТ4 функция Comment просто меняет внутреннее текстовое поле комментария без попыток отобразить его на чарте. То есть, коммент когда-нибудь на очередной штатной отрисовке чарта покажется, но само изменение коммента не вызывает перерисовки чарта. Если быстро менять коммент, то его изменения просто не увидите на чарте.

В МТ5 функция Comment явным образом вызывает перерисовку чарта, так как в приоритет ставится именно отображение коммента на чарте. Иначе функция бесполезна.

Разница как раз в этом.


Если в МТ4 после вызова Comment поставить принудительно ChartRedraw(), то поведение все равно не будет как в МТ5. ChartRedraw() в Метатрейдер 4 игнорирует значение коммента и сам решается, надо ли обновить чарт с последнего кадра. Конечно, при отсутствии сотен котировок в секунду, которые вызывают инвалидацию данных чарта, ChartRedraw решает "зачем отрисовать неизменный график" и пропускает отрисовку кадра.

В Метатрейдер 5 тоже действует такая же система, но гораздо больше случаев, когда отдается приоритет безусловной отрисовке.

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


Отсюда дополнительные выводы при проведении бенчмарков:

  • нельзя считать вызов ChartRedraw реальной отрисовкой чарта

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

  • нельзя во время бенчмарков делать множественные выводы Comment в МТ5, всегда нужно думать о том, как вы влияете на отрисовку

  • в МТ5 более правильная система изменения объектов на чарте и нужно четко понимать последствия микса read/write команд
    рекомендуется не миксовать read/write команды, а делать раздельно массовые read и массовые write.

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

Эти ошибки постоянно совершаются всеми подряд.

 
Renat Fatkhullin:

Да, все верно и правильно.

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

[Удален]  
Anatoli Kazharski:

Индикаторы перестали правильно работать. Смещаются вправо при формировании новых баров без расчёта на новых данных. Заявка #1899266.

Поддерживаю! Идет сдвиг индикатора вправо.
 
Alexey Kozitsyn:
Поддерживаю! Идет сдвиг индикатора вправо.
Вышел новый билд (1689) с исправлением. 
[Удален]  
Anatoli Kazharski:
Вышел новый билд (1689) с исправлением. 

Спасибо, сейчас залью.

 
Alexey Kozitsyn:

Спасибо, сейчас залью.

Протестировал. У себя проблем больше с этим не наблюдаю.