Help on simple CCanvas example

To add comments, please log in or register
wokl
89
wokl  

Hello!


mql5 is still a bit of a mystery to me. After using CChart successfully, I am currently trying to draw onto the Chart using the CCanvas class. However, whatever I do, nothing appears on the Chart in the Back Tester.

I put the Code into all relevant On...() functions but regardless where I put it nothing is drawn. What am I missing???

#include <Canvas\Canvas.mqh>

CCanvas canvas;

int OnInit()
  {

   canvas.Create("test",10,10,0);

   canvas.Circle(5,5,5,clrAliceBlue);

   canvas.Update();

   ChartRedraw();

   return(INIT_SUCCEEDED);
  }

void OnStart()
  {

   canvas.Create("test",10,10,0);

   canvas.Circle(5,5,5,clrAliceBlue);

   canvas.Update();

   ChartRedraw();

  }

void OnTick()
  {

   canvas.Create("test",10,10,0);

   canvas.Circle(5,5,5,clrAliceBlue);

   canvas.Update();

   ChartRedraw();

  }

Alain Verleyen
36152
Alain Verleyen  

Forum on trading, automated trading systems and testing trading strategies

Drawing Shapes/Objects using the Canvas Class

Alain Verleyen, 2017.09.27 17:04

Please read documentation :

Create

Creates a graphical resource without binding to a chart object


You need to use CreateBitmap() or CreateBitmapLabel().


Sergey Golubev
Moderator
106139
Sergey Golubev  

This is a simple - 

Forum on trading, automated trading systems and testing trading strategies

What Canvas is capable of

Nikolai Semko, 2018.03.02 23:58

Demonstration of the possibilities of Сanvas in dynamics.

The picture never repeats.

This script also works on MQL4, but much slower.



#include <Canvas\Canvas.mqh>

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];
   for (int w=0;w<25600;w++) 
   h[w]= uchar(128+128*sin(double(w)/256)); //create an array to speed up the work
   double X1=0,Y1=0,X2=0,Y2=0,X3=0,Y3=0,X4=0,Y4=0;
   while(!IsStopped())
     {
      int pos=int(i%size);
      if(pos==0)
        {
         //Sleep(20); //For those who have a too powerful computer.
         C.Update();
         X1= Width/2-(sin((double)j/100)*(double)Width/2);
         Y1= Height/2-(cos((double)j/140)*(double)Height/2);
         X2= Width/2+(cos((double)j/80)*(double)Width/2);
         Y2= Height/2+(sin((double)j/20)*(double)Height/2);
         X3= Width/2+(cos((double)j/85)*(double)Width/2);
         Y3= Height/2+(sin((double)j/65)*(double)Height/2);
         X4= Width/2+(cos((double)j/152)*(double)Width/2);
         Y4= Height/2+(sin((double)j/42)*(double)Height/2);
         j++;
        }
      int X=pos%Width;
      int Y=int(pos/Width);
      double D1=sqrt((X1-X)*(X1-X)+(Y1-Y)*(Y1-Y));
      double D2=sqrt((X2-X)*(X2-X)+(Y2-Y)*(Y2-Y));
      double D3=sqrt((X3-X)*(X3-X)+(Y3-Y)*(Y3-Y));
      double D4=sqrt((X4-X)*(X4-X)+(Y4-Y)*(Y4-Y));
      double d= (D1+D2)/(D1+D2+D3+D4);
      //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();
  }
//+------------------------------------------------------------------+

Sergey Golubev
Moderator
106139
Sergey Golubev  

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

Canvas - это круто!

Nikolai Semko, 2018.02.18 08:43

Как говорится: Почувствуйте разницу на реальном примере:

  • Визуализация особенно важна на этапе проектирования и создания стратегиии, особенно когда речь идет о сложных алгоритмах. Язык цифр непонятен человеку. При грамотной наглядной визуализации процессов программисту легче найти ошибки алгоритма, легче возникают правильные идеи усовершенствования алгоритма. 
  • Пример 4 мерного пространства, в котором движется цена: Время, цена, соотношение быков и медведей, реальные объемы. Для простоты визуализации достаточно эту модель упростить до трехмерного пространства Цена-соотношение быков и медведей- объёмы. Каждый тик формирует в таком пространстве точку и рисуется линия, последовательно соединяя все точки (тики), и эта последовательность по сути и будет 4-м измерением Временем. Таким образом будут формироваться облака в виде каналов и трехмерных спиралей. Информативность и предсказательность такой визуализации гораздо выше классической 2мерной Цена-Время. Это только один из бесконечного числа примеров, на что хватит вашего воображения.
  • Это ошибка - думать, что для визуализации движения цены в  N-мерном пространстве требуется N-мерный массив. Для любой мерности пространства требуется лишь 2-мерный массив, первая мерность которого это количество тиков или баров. А вторая это количество измерений(координат). Т.е. для каждого тика (бара) существует N значений (характеристик). В вышеназванном примере каждый тик будет содержать 4 параметра:  время, цена, текущее соотношении быков и медведей и реальные общие объёмы, формируя таким образом 2-х мерный массив Tick[n][4], где n- кол-во тиков (баров). Или же можно обойтись просто четырьмя одномерными массивами . Т.е. если сравнивать движение цены в 4х-мерности в сравнении с классической двумерностью, то памяти требуется всего в два раза больше, а не в кубе раз.

To add comments, please log in or register