Мой подход. Ядро - Движок. - страница 126

 
Nikolai Semko:
Если это МТ4, то да. 
МТ5, как я понимаю, поддерживает полноценно многоядерность и многопоточность в отличии от МТ4.

Похоже, чтобы убрать нагрузку нужно пользоваться OpenCL. Но в МТ4 его нет. Либо просто мириться с ней.

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

 
Реter Konow:

Похоже, чтобы убрать нагрузку нужно пользоваться OpenCL. Но в МТ4 его нет. Либо просто мириться с ней.

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

Пока уже переключаться на МТ5.
Интересно в МТ5 проверить работу двух экспертов, которые установлены на разных окнах, но работают с ресурсами только одного окна. Ведь у каждого советника свой поток, а, как известно, в одно окно не кинешь больше одного эксперта.
 
Nikolai Semko:
Интересно в МТ5 проверить работу двух экспертов, которые установлены на разных окнах, но работают с ресурсами только одного окна. Ведь у каждого советника свой поток, а, как известно, в одно окно не кинешь больше одного эксперта.

Так вроде, в МТ4, у каждого советника тоже свой поток. Если не ошибаюсь...

Поток то свой, а процессор на всех один...

Думаю, потому и создали граф.карту.

 

Есть еще нюанс.

Если анимация цикличная (как гиф), то не обязательно переинициализировать массив пикселей постоянно. Можно пройти один цикл рисования анимации и сохранить каждый кадр в ресурсе. Далее, просто переключать изображение. Частично, я это реализовал и благодаря этому, добился многократного ускорения анимации.  (В начале скорость анимации была ужасной, потому что каждый раз заново рисовал исходное изображение, а потом на нем рисовал новое изображение).

 
Реter Konow:

Так вроде, в МТ4, у каждого советника тоже свой поток. Если не ошибаюсь...

Поток то свой, а процессор на всех один...

Думаю, потому и создали граф.карту.

Просто чтобы оценить разницу МТ4 и МТ5, запусти этот код на обоих платформах (код работает там и там) и ты увидишь, что в МТ4 он работает на порядок медленнее:

#define protected public
#include <Canvas\Canvas.mqh>
#undef protected
#property script_show_inputs 
input uint N=8; // количество центов гравитации
void OnStart()
  {
   ChartSetInteger(0,CHART_FOREGROUND,true);
   CCanvas C;
   int Width=(ushort)ChartGetInteger(0,CHART_WIDTH_IN_PIXELS);                               // get Window width
   int Height=(ushort)ChartGetInteger(0,CHART_HEIGHT_IN_PIXELS);                             // get Window height 
   if(!C.CreateBitmapLabel(0,0,"CanvasExamlple",0,0,Width,Height,COLOR_FORMAT_XRGB_NOALPHA)) // create canvas with the size of the current window
      Print("Error creating canvas: ",GetLastError());
   uint i=0,j=100000;
   int size=Width*Height;
   uchar h[25600];
   ArrayInitialize(h,0);
   uint w;
   for(w=0;w<25600;w++) h[w]=uchar(128+128*sin(double(w)/256)); //create an array to speed up the work
   double SQRT[];
   uint ss=Width*Width+Height*Height;
   Print(ss);
   ArrayResize(SQRT,ss);
   for(w=0;w<ss;w++) SQRT[(int)w]=sqrt(w); //create an array to speed up the work 
   int k[]; ArrayResize(k,N*2);
   for(w=0;w<N*2;w++) k[w]=20+rand()%200;
   double XP[],YP[],D[],D1[];
   ArrayResize(XP,N);
   ArrayResize(YP,N);
   ArrayResize(D,N);
   ArrayInitialize(XP,0);
   ArrayInitialize(YP,0);
   ulong t=0,sum=0, f=0;
   C.FontSet("Verdana",50,FW_MEDIUM);
   while(!IsStopped())
     {
      int pos=int(i%size);
      if(pos==0)
        {
         //Sleep(20); //For those who have a too powerful computer.
         if (i>0) {t=GetMicrosecondCount()-t; sum+=t; f++; 
         C.TextOut(Width/2,Height/2,"Время формирования кадра = "+IntegerToString(sum/f)+" мкс",clrBlueViolet,TA_CENTER|TA_VCENTER);}
         C.Update();
         t=GetMicrosecondCount();
         for(w=0;w<N;w++)
           {
            XP[w]= Width/2-(sin((double)j/k[2*w])*(double)Width/2);
            YP[w]= Height/2-(cos((double)j/k[2*w+1])*(double)Height/2);
           }
         j++;
        }
      int X=pos%Width;
      int Y=int(pos/Width);
      
     // for(int w=0;w<N;w++) D1[w]=SQRT[int((XP[w]-X)*(XP[w]-X)+(YP[w]-Y)*(YP[w]-Y))];
      for(w=0;w<N;w++) D[w]=    sqrt((XP[w]-X)*(XP[w]-X)+(YP[w]-Y)*(YP[w]-Y));
      double S1=0,S2;
      for(w=0;w<N/2;w++) S1+=D[w];
      S2=S1;
      for(w=N/2;w<N;w++) S2+=D[w];
      double d=S1/S2;
      
      //double d= (D[0]+D[1]+D[2]+D[3])/(D[0]+D[1]+D[2]+D[3]+D[4]+D[5]+D[6]+D[7]);
       //d= (D[0]+D[1])/(D[0]+D[1]+D[2]+D[3]);
      C.m_pixels[pos]=XRGB(h[int(d*11520)],h[int(d*17920)],h[int(d*6400)]);// works a little faster, but requires transferring the array m_pixels from protected to public in Canvas.mqh
      //C.PixelSet(X,Y,XRGB(h[int(d*11520)],h[int(d*17920)],h[int(d*6400)]));
      i++;
     }
   C.Destroy();
  }
//+------------------------------------------------------------------+
 
Nikolai Semko:

Просто чтобы оценить разницу МТ4 и МТ5, запусти этот код на обоих платформах (код работает там и там) и ты увидишь, что в МТ4 он работает на порядок медленнее:

Да, поставил там и там. Разница примерно в 10 раз. Именно потому, что в МТ5 массивы инициализируются в 10 и более раз быстрее. Я проверял.

Однако, даже на МТ4 все должно быть гораздо быстрее. Ведь ты просто перерисовываешь изображение. Другое дело, если ты многократно его обрабатываешь в массиве.  

Не знаю, почему у тебя так медленно на МТ4 работает.

 

Впрочем, возможно дело в том, что ты переинициализируешь КАЖДЫЙ пиксель на всем пространстве канваса размером с график.

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

Дело в размере рисунка.  

 
Реter Konow:

Впрочем, возможно дело в том, что ты переинициализируешь КАЖДЫЙ пиксель на всем пространстве канваса размером с график.

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

Дело в размере рисунка.  

Какая разница. Это специально экстримальный пример, который наглядно демонстрирует преимущества МТ5 в скорости канваса. А этот вопрос архиважный в твоем детище. Поэтому уже давно говорю - переходи на MQL5. 
Факт остается фактом. Формирование кадра изображения на мт5 в 10 раз быстрее, чем на мт4. И это очень весомый аргумент.
 
Nikolai Semko:
Какая разница. Это специально экстримальный пример, который наглядно демонстрирует преимущества МТ5 в скорости канваса. А этот вопрос архиважный в твоем детище. Поэтому уже давно говорю - переходи на MQL5. 
Факт остается фактом. Формирование кадра изображения на мт5 в 10 раз быстрее, чем на мт4. И это очень весомый аргумент.

Минусы МТ4, - то что нужно в разработке. От них не нужно бежать. Они заставляют думать и совершенствовать решения.

На МТ5 и стараться особо не надо. Все и так работает быстро. Поэтому, переход на МТ5 запланирован в финале. 

 
Реter Konow:

Наконец то, динамичная таблица сделана. Должен сказать, что это было нелегко. Оказалось, что имеется много нюансов. 

Также, эта таблица "условно" динамичная. То есть, максимальное количество рядов заранее определено. Сделать "абсолютно" динамичную, пока не удалось.

В этой таблице, - 20 возможных рядов. Значит, она может показывать 20 открытых позиций. Можно было сделать и больше, но пока это просто демонстрация.

Нажмите, чтобы посмотреть.

Вот файлы подключения (поместить в инклюд), движок(в папку индикаторов), и тест.советник (в папку экспертов):

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

Итак по-порядку, задание было следующее:

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

Мой подход. Ядро - Движок.

Vasiliy Sokolov, 2018.12.26 13:29

Петр, вот задание. Сделай панель, отображающую текущие открытие ордера в МТ4. Полную копию системной панели делать не надо, отобрази максимально простую таблицу с базовыми свойствами открытых ордеров: цена открытия, направление, профит. Остальное на твое усмотрение. Главное, что бы при закрытии ордера, его отображение в твоей таблице также исчезало. И наоборот, при открытии нового ордера, он появлялся бы в этой таблице.

Что я вижу вместо этого:

Во-первых, сделки можно открыть только в твоей панели, нажимая кнопку buy/sell. Если позицию открыть через стандартное окно, то сделка не появляется.

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

В-третьих, (это вообще жуть), если ордер закрыть через стандартный диалог, то он не исчезает в таблице. Но самое печальное, что при перезагрузки панели, закрытые ордера вновь отображаются как якобы открытые! Это что такое? Зачем ты где-то хранишь нерелевантную информацию, а потом пытаешься ее грузить!?

В-четвертых, какие к черту 20 ордеров? У меня в задании ни слова об этом ограничении! Сделано это было специально, что бы проверить твой движок на работу с динамическим и заранее неизвестным окружением. Задание было выбрано не случайно, ты же изменил мои требования, так, что бы скрыть все "острые углы" твоего движка. Но задание для того и давалось что бы эти острые углы показать.

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

И да, кнопка закрыть позицию (крестик) в твоей панели тоже не работает.

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

Уточню задание еще раз, что бы не было вопросов:

  1. Таблица динамическая и показывает те же ордера что на вкладке Торговля. Если в на вкладке ордеров нет - то и у тебя в таблице нет.
  2. Количество отображаемых ордеров в твоей таблице должно быть любым. Нет ограничений сверху.
  3. Открытие ордера через стандартное диалоговое окно, должно приводить к появлению ордера в твоей таблице. Закрытие ордера стандартными средствами - должно приводить к исчежновению ордера в  твоей таблице.
  4. Неконсистентное состояние недопустимо! Если твоя таблица показывает одно, а вкладка Торговля другое - это ошибка.

Пока жирный незачет. Ждем твоих доработок. И никаких отрисовок 3D, пока с этим не разберешься!
Причина обращения: