错误、漏洞、问题 - 页 2801

 
Roman:

试着只打印(

而printf似乎也能工作。
在printf中,第一个参数指定要打印的值的类型。


打印 作品!谢谢你!))

但printf并不总是工作


 

我想在画布上显示一个字符并移动它,源。

#property indicator_chart_window
#property indicator_plots 0

#include <Canvas\Canvas.mqh>


CCanvas canvas;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
{
   canvas.CreateBitmapLabel(ChartID(), 0, "canvas", 0, 0, 900, 400);
   canvas.FontSet("Courier New", 32);
   canvas.Erase(0);
   canvas.Update();
   EventSetMillisecondTimer(250);
//---
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{
//---

//--- return value of prev_calculated for next call
   return(rates_total);
}
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
{
   static int x = 0;
   static const uint col_black = ColorToARGB(clrBlack);
   static const uint col_red = ColorToARGB(clrRed);
   canvas.TextOut(x, 100, "S", col_black);
   x+=10;
   canvas.TextOut(x, 100, "S", col_red);
   canvas.Update();
}
//+------------------------------------------------------------------+


为什么我用黑色覆盖了以前的渲染图像,而人工痕迹仍然存在?


 
Igor Makanu:

我想在画布上显示一个字符并移动它,源。


为什么我用黑色覆盖了之前的渲染图像,但仍然有伪影?


最好一次就把整个画布重新填满。最好是一次性重绘整个画布。

 
Andrey Barinov:

最好是一次性重绘整个画布。反正事后都会重新绘制。

我已经想好了,但这个问题纯属技术问题

事实证明,字体的抗锯齿是有效的,而目标是移动精灵,总的来说,我想了解为什么它能如此工作。

 

我不知道从哪里挖,谁能建议一个搜索方向。 我在写一个指标,但第一次点击 "编译 "后,计算部分给出的是废话,我再次编译,似乎是真的。

2020.07.13 14:12:05.987 ZigZag_MP (USDJPY,M15)  Average wave size = -2147483648 points; less then average: 1/100 min=99999999.0 max=107.1 steps=-2147483648
2020.07.13 14:12:27.179 ZigZag_MP (USDJPY,M15)  Average wave size = 273 points; less then average: 65/100 min=106.422 max=107.848 steps=57

2020.07.13 14:18:38.001 ZigZag_MP (USDJPY,M15)  Average wave size = -2147483648 points; less then average: 1/100 min=99999999.0 max=107.1 steps=-2147483648
2020.07.13 14:18:46.751 ZigZag_MP (USDJPY,M15)  Average wave size = 273 points; less then average: 65/100 min=106.422 max=107.848 steps=57

我没有做什么特别的事情--我只是计算最后100个Zig-Zag的膝盖。 我不止一次地反转代码,但问题是,它是一样的,但结果却不同。

预计可能的版本之一:指标缓冲区 被强制初始化,里面没有垃圾。

 
Igor Zakharov:

预计可能的版本之一:指示器缓冲区 被强行初始化,里面没有垃圾。

问题是,你在哪里初始化

如果prev_calculated == 0,则一切正常,如果是在OnInt()中,则在切换TF和编译过程中会出现故障。

 
Igor Makanu:

问题是,你在哪里初始化

如果通过prev_calculated == 0,那么一切正常,如果在OnInt()中,那么在切换TF和编译时就会出现闪退。

尝试了所有的变体(包括onInt和oncalculated);目前的情况是:在循环中,每个值都是单独分配的。我通过数据窗口 检查了 - 没有奇怪的/垃圾的值。

 
Igor Makanu:

我想在画布上显示一个字符并移动它,源。


为什么我把以前渲染的图像打成黑色,而伪影仍然存在?


这是因为抗锯齿的原因。最可靠的方法是在符号的顶部画一个背景色 的矩形。然后输出带有新坐标的符号。在这样的情况下,通常会这样做。

 
Igor Makanu:
Mihail Matkovskij:

这是因为抗锯齿的缘故。最可靠的方法是在符号的顶部画一个背景色 的矩形。然后输出带有新坐标的符号。在这样的情况下,通常会这样做。

不要忘记简单的移动画布,不需要任何重绘和绘画。
这是最快速的移动方式。

#include <Canvas\iCanvas.mqh> //https://www.mql5.com/ru/code/22164

void OnStart() {
// Формируем какой-то фон
   for (int i = 0; i<1000; i++) Canvas.Circle(rand()%2048, rand()%2048,50+rand()%50,ARGB(255,rand()%256,rand()%256,rand()%256));
   Canvas.Update();
// -----------------------
   int x=100, y=100;
   iCanvas c(0,x,y,"symbol",50,50); // создаем дополнительный канвас размером 50х50
   c.TextPosition(0,0);
   c.CurentFont("Tahoma",50);
   c.Comm("S");
   c.Update();
   while(!IsStopped()&& x<W.Height) {
      c.MoveCanvas(++x,++y);        // перемещаем данный канвас
      c.Update();
      Sleep(50);
   }
}
 
Nikolai Semko:

不要忘了可以简单地移动画布而不需要重画或重涂的能力。
这是最快的移动方式。

没有人否认这一点。只是有一个概念,就是有一个单一的屏幕作为画布。反过来,同样的自定义画布(像素阵列)被画在一个窗口画布(图表)上。更确切地说,它首先是使用ResourceCreate(在OBJ_BITMAP或OBJ_BITMAP_LABEL 中)传递给图表(复制)。在图表窗口中,所有的东西都是用Win API绘制的(如果我没有弄错的话)。虽然,它也可以使用其他API来完成。但CCanvas类有自己的方法在m_pixels数组的元素上绘图。

事实证明,画一个小的矩形,那么你还是要用ResourceCreate 传递大量的像素(只在画图时节省时间)而这样一来,你可以简单地在图表周围 移动OBJ_BITMAP_LABEL,而不需要处理m_pixels数组,然后将其复制到OBJ_BITMAP_LABEL。