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 :
Creates a graphical resource without binding to a chart object |
You need to use CreateBitmap() or CreateBitmapLabel().
This is a simple -
Forum on trading, automated trading systems and testing trading strategies
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(); } //+------------------------------------------------------------------+
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Nikolai Semko, 2018.02.18 08:43
Как говорится: Почувствуйте разницу на реальном примере:
- Визуализация особенно важна на этапе проектирования и создания стратегиии, особенно когда речь идет о сложных алгоритмах. Язык цифр непонятен человеку. При грамотной наглядной визуализации процессов программисту легче найти ошибки алгоритма, легче возникают правильные идеи усовершенствования алгоритма.
- Пример 4 мерного пространства, в котором движется цена: Время, цена, соотношение быков и медведей, реальные объемы. Для простоты визуализации достаточно эту модель упростить до трехмерного пространства Цена-соотношение быков и медведей- объёмы. Каждый тик формирует в таком пространстве точку и рисуется линия, последовательно соединяя все точки (тики), и эта последовательность по сути и будет 4-м измерением Временем. Таким образом будут формироваться облака в виде каналов и трехмерных спиралей. Информативность и предсказательность такой визуализации гораздо выше классической 2мерной Цена-Время. Это только один из бесконечного числа примеров, на что хватит вашего воображения.
- Это ошибка - думать, что для визуализации движения цены в N-мерном пространстве требуется N-мерный массив. Для любой мерности пространства требуется лишь 2-мерный массив, первая мерность которого это количество тиков или баров. А вторая это количество измерений(координат). Т.е. для каждого тика (бара) существует N значений (характеристик). В вышеназванном примере каждый тик будет содержать 4 параметра: время, цена, текущее соотношении быков и медведей и реальные общие объёмы, формируя таким образом 2-х мерный массив Tick[n][4], где n- кол-во тиков (баров). Или же можно обойтись просто четырьмя одномерными массивами . Т.е. если сравнивать движение цены в 4х-мерности в сравнении с классической двумерностью, то памяти требуется всего в два раза больше, а не в кубе раз.
![MQL5 - Language of trade strategies built-in the MetaTrader 5 client terminal](https://c.mql5.com/i/registerlandings/logo-2.png)
- Free trading apps
- Over 8,000 signals for copying
- Economic news for exploring financial markets
You agree to website policy and terms of use
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???