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

 
Roman:

Попробуйте просто Print(

Да и printf  отрабатывает вроде.
В printf первым параметром указывается тип выводимого значения.


Print работает! Спасибо! ))

А вот 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 последних колен зиг-зага. код переворошил не раз, но ведь в том-то и дело, что он один и тот же, а результат разный. может пару тиков за это время проходит, но текущий бар игнорируется, так что не верится, что в этом дело.

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

 
Igor Zakharov:

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

вопрос где инициализируете

если по условию prev_calculated == 0 , тогда все ОК, если в OnInt() , то будет глючить при переключении ТФ и при компиляции

 
Igor Makanu:

вопрос где инициализируете

если по условию prev_calculated == 0 , тогда все ОК, если в OnInt() , то будет глючить при переключении ТФ и при компиляции

перебрал все варианты (и он-инит, и он-калкулэйт); текущий: в цикле перебора каждое значение индивидуально присваивается. через окно данных проверял - странных/мусорных значений нет.

 
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.
Причина обращения: