エラー、バグ、質問 - ページ 2801

 
Roman:

Print()だけで試してみてください。

そして、printfも動作するようです。
printfでは、第1引数に表示する値の種類を指定します。


印刷が 効く!ありがとうございました。))

しかし、printfは常に動作するわけではありません


 

キャンバス上に1つのキャラクターを表示し、移動させたいのですが、ソースは?

#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:

キャンバス上に1つのキャラクターを表示し、移動させたいのですが、ソースは?


前のレンダリング画像を黒で 上書きしても、アーチファクトが発生するのはなぜですか?


一度にキャンバス全体を塗り直す方がよいでしょう。キャンバス全体を一度に再描画したほうがよいでしょう。

 
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() にある場合は、TF の切り替え時やコンパイル時に不具合が発生します。

 
Igor Makanu:

問題は、どこで初期化するかです。

prev_calculated == 0 であれば問題ないが、OnInt() であれば、TFの切り替え時やコンパイル時に不具合が発生する。

ループの中で各値が個別に割り当てられます。データウィンドウで 確認しましたが、変な値やゴミのような値はありませんでした。

 
Igor Makanu:

キャンバス上に1つのキャラクターを表示し、移動させたいのですが、ソースは?


なぜ、前のレンダリング画像を黒く塗りつぶすと、アーティファクトが残るのでしょうか?


それは、アンチエイリアスのせいです。最も確実な方法は、シンボルの上に背景色 で長方形を描くことです。そして、新しい座標を持つシンボルを出力します。このような場合、通常はこのようなことが行われます。

 
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:

再描画やオーバーペイントをすることなく、キャンバスを簡単に移動できることも忘れてはいけません。
これが最速の移動手段です。

誰も否定はしていない。ただ、キャンバスとして1つの画面があるというコンセプトはあります。今度は、同じカスタムキャンバス(画素の配列)をウィンドウキャンバス(チャート)に描画します。より正確には、まず ResourceCreate を使って(OBJ_BITMAP またはOBJ_BITMAP_LABEL で)チャートに渡される(コピーされる)。チャートウィンドウでは、すべてWin APIを使って描画されます(私の勘違いでなければ)。ただし、他のAPIを使用しても可能です。しかし、CCanvas クラスは、m_pixels 配列の要素に描画する独自のメソッドを持っています。

小さな矩形を描画しても、ResourceCreateを 使用して多くのピクセルを渡さなければならないことがわかりました(描画時のみ時間を節約できます)そして、この方法では、 m_pixels配列を 処理してOBJ_BITMAP_LABELにコピーすることなく、単にOBJ_BITMAP_LABELをチャート上で 移動させることができます。