キャンバスがカッコいい! - ページ 28

 
Evgeny Potapov:

ありがとうございました。このオプションはかなりリアルに見えますね

この質問に答えることで、私は知らなかったとても重要なことに気づいたからです。
全く知らない人がいたら驚きです。

ObjectSetIntegerを 使用してキャンバスやその位置のサイズを変更した場合、再描画する必要はありません。

  • 生成されたキャンバスをリサイズして元に戻しても、キャンバスのデータは元の描画が保持されます。
  • シェイプドカンヴァスのサイズを大きくするとデータは消えてしまいますが、元のサイズに戻すと再び表示されます。
  • カンヴァスのサイズを変更したり、位置を変えたりする場合、Update() や ChartRedraw() を実行する必要さえなく、新しいティックやウィンドウの変更に伴って更新されることになります。

この指標はそれを示しています。キャンバスは一度だけ生成されます。しかし、そのサイズと位置は変更可能で、値の配列は保持される。マウスを画面上に移動させるだけ

#property indicator_chart_window

#define protected public  // увы, это необходимо, чтобы расширить наши возможности 
#include <Canvas\Canvas.mqh> 
#undef protected
CCanvas C;
int OnInit()
  {
   if(!C.CreateBitmapLabel(0,0,"_Canvas",100,100,600,400,COLOR_FORMAT_ARGB_NORMALIZE))
      Print("Error creating canvas: ",GetLastError());
   DrawCanvas(600,400);
   ChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,true);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   C.Destroy();
  }
//+------------------------------------------------------------------+
int OnCalculate (const int rates_total,       
                 const int prev_calculated,   
                 const int begin,             
                 const double& price[])       
  {
    return prev_calculated;               
  }

void OnChartEvent(const int id,          
                  const long& lparam,   
                  const double& dparam, 
                  const string& sparam) 
  {
   if (id==CHARTEVENT_MOUSE_MOVE)  DrawCanvas((int)lparam,(int)dparam);
  }
//+------------------------------------------------------------------+
void DrawCanvas(int x, int y)
{
 static bool first=true;
 //Comment(string(x)+"   " +string(y));
 ObjectSetInteger(C.m_chart_id,C.m_objname,OBJPROP_XDISTANCE,x/5);
 ObjectSetInteger(C.m_chart_id,C.m_objname,OBJPROP_YDISTANCE,y/5);
 ObjectSetInteger(C.m_chart_id,C.m_objname,OBJPROP_XSIZE,x);
 ObjectSetInteger(C.m_chart_id,C.m_objname,OBJPROP_YSIZE,y);  
 if(first) // канвас формируется только один раз
 {
   C.Erase();
   C.FillCircle(100,100,70,ColorToARGB(clrViolet,200));
   C.FillCircle(300,200,100,ColorToARGB(clrLightBlue,100));
   C.Rectangle(140,50,250,150,ColorToARGB(clrAqua));
   C.Update(); 
   first=false;
 }
 ChartRedraw(); // можно обойтись и без этого, но тогда перерисовка будет только с каждым тиком или изменением чарта
}
ファイル:
 
は、ビデオに保存することは可能ですか?
 
Andrey Dik:
ビデオに保存できますか?
よろしい
 
Nikolai Semko:
よろしい

100万枚の画像を作って、それをビデオエディターで組み立ててビデオにする、みたいなやり方でなければいいのですが......。)

差し支えなければ、詳しく教えてください。

 
Andrey Dik:

100万枚の画像を作って、それをビデオエディターで組み立ててビデオにする、みたいなやり方でなければいいのですが......。)

差し支えなければ、詳しく教えてください。

いいえ、もちろんそんなことはありません。
そうなります。

 
Nikolai Semko:

いいえ、もちろんそんなことはありません。
めんどくさいから。

コードはいらないから、どうすればいいのかヒントをくれ。

 
Nikolai Semko:
  • キャンバスのサイズを変更したり、位置を変更した場合、Update()やChartRedraw()を実行しなくても、新しいティックやウィンドウの 変更に伴って更新されます。

まあ、これらのイベントに応じて、端末が 勝手にChartRedraw()を呼び出すわけですが;)

 
Andrey Dik:

コード不要、ヒントあり

どのような映像を撮りたいかによって、さまざまな選択肢があります。マウスポインタ、インジケータ、オブジェクト、GUIでリアルタイムにウィンドウの中で何が起こっているのか?それとも他の何か?

 
このチップの本当の効用は何なのでしょうか?価格チャートのパターンを見つけることは、取引に役立つのでしょうか?
 
Andrey Khatimlianskii:

まあ、ターミナル 自体がこれらのイベントで ChartRedraw() を呼び出すのですが ;)

それはわかるのですが、ただ、細かいことは言いたくなかったのです。
chartRedraw()ではキャンバスオブジェクトは再描画されず、Update() の時にのみ再描画されるので注意を喚起したのです。また、ObjectSetInteger を使ってキャンバスオブジェクトを再描画する場合は、ChartRedraw() が発生したときに、強制的に ChartRedraw() を実行するか、チャートの変化や新しいティックの到来を待てばよいのです。

理由: