記事"可視化の可能性 Rのプロットに似たMQL5のグラフィックス ライブラリ"についてのディスカッション

 

新しい記事 可視化の可能性 Rのプロットに似たMQL5のグラフィックス ライブラリ はパブリッシュされました:

トレードロジックを勉強する際、チャートの視覚的な表現は非常に重要です。科学分野で人気のある数々のプログラミング言語 (R や Python など) は可視化のための関数”プロット”があります。これらは視覚化するために、線、点の分布、ヒストグラムなどを描くことができます。MQL5でも、CGraphics クラスを使用して、同じことができます。

ゼロの除算エラーが発生する可能性があります。この問題に対処する 2 つの方法があります。

  • metaeditor.ini でゼロ除算のチェックを無効にします。
    [Experts]
    FpNoZeroCheckOnDivision=1
  • または、関数で使用される式を分析し、このような場合に有効な値を返します。3Functions.mq5bat.mq5の添付ファイルからマクロを使用して、このような処理の例を見つけることができます。




作者: MetaQuotes Software Corp.

 
よくやった!ありがとう。私はすでにCircleAAアルゴリズムを修正するつもりだった
ところで、CircleWu関数は簡略化し、高速化することができる:

void CCanvas::CircleWu(const int x,const int y,const double r,const uint clr,const uint style=UINT_MAX)
  {
   if(r<=0)
      return;
//--- 予備計算
   double r2=r*r;
   double quarter=round(r*M_SQRT1_2);
//--- 行のスタイルを設定する
   uint prev_style=m_style;
   if(style!=UINT_MAX)
      LineStyleSet(style);
   uint mask=1<<m_style_idx;
//--- ドロー
   for(int dx=0; dx<=quarter; dx++)
     {
      double dy=sqrt(r2-dx*dx);
      double alpha1=dy-floor(dy);
      double alpha2=1-alpha1;
      if((m_style&mask)==mask)
        {
         PixelTransform4(x,y,dx,(int)(dy)+1,clr,alpha1);
         PixelTransform4(x,y,dx,(int)(dy),clr,alpha2);
         PixelTransform4(x,y,(int)dy+1,dx,clr,alpha1);
         PixelTransform4(x,y,(int)dy,dx,clr,alpha2);
        }
      mask<<=1;
      if(mask==0x1000000)
         mask=1;
     }
  
//--- 前の行のスタイルを設定する
   if(style!=UINT_MAX)
      m_style=prev_style;
  }
 
Nikolai Semko:
よくやった!ありがとう。すでにCircleAAアルゴリズムを修正するつもりだったんだ。 ところで、CircleWu関数は簡略化し、高速化することができる:

アイデアをありがとう!
 

グラフ自体や各関数のプロパティはいつでも変更できる。例えば、グラフの軸にキャプションを追加し、曲線の名前を変更し、スプライン近似モードを有効にしてみましょう:

#include <Graphics\Graphic.mqh>
//+------------------------------------------------------------------+
//| スクリプト番組開始機能|
//+------------------------------------------------------------------+
void OnStart()
  {
   CGraphic graphic;
   graphic.Create(0,"Graphic",0,30,30,780,380);
   double x[]={-10,-4,-1,2,3,4,5,6,7,8};
   double y[]={-5,4,-10,23,17,18,-9,13,17,4};
   CCurve *curve=graphic.CurveAdd(x,y,CURVE_LINES);
   curve.Name("Example");                 
   curve.LinesIsSmooth(true);             
   graphic.XAxis().Name("X - axis");      
   graphic.XAxis().NameSize(12);          
   graphic.YAxis().Name("Y - axis");      
   graphic.YAxis().NameSize(12);
   graphic.YAxis().ValuesWidth(15);
   graphic.CurvePlotAll();
   graphic.Update();
   DebugBreak();
  }

 У меня метод называется LinesSmooth LineIsSmooth нету. Продолжаю изучать дальше :)

 

 
Orangetree:

グラフ自体や各関数のプロパティはいつでも変更できる。例えば、グラフの軸にキャプションを追加し、曲線の名前を変更し、スプライン近似モードを有効にしてみよう:

  {
   curve.LinesIsSmooth(true);             

 У меня метод называется LinesSmooth LineIsSmooth нету. Продолжаю изучать дальше :)

 

メソッドの名前は後で変更しました。ありがとうございます。
 

チャート上に曲線が再描画されると、スケールも更新されるようにするにはどうすればよいですか?

curve5.Update(resultPrices);
    
graphicfirst.Redraw(); и Update()


カーブ自体は更新されますが、古い価格の目盛りが残り、チャートがキャンバスの枠外に移動してしまいます。

見つけました。CalculateMaxMinValues() を実行する必要があります。)

 
Maxim Dmitrievsky:
例えば、配列の値を変更した場合に、既に作成されたチャートを正しく再描画する方法を教えてください。Redraw()やUpdate()は効果がありません。

こんにちは。具体的にどのようにチャートを再描画しようとしたのですか?

もし、特定の曲線のデータを変更するだけでよいのであれば、ここに動作例があります:

#include <Graphics\Graphic.mqh>
//+------------------------------------------------------------------+
//| スクリプト番組開始機能|
//+------------------------------------------------------------------+
void OnStart()
  {
//--- データ 1
   double x1[]={-10,-4,-1,2,3,4,5,6,7,8};
   double y1[]={-5,4,-10,23,17,18,-9,13,17,4};
//--- データ 2
   double x2[]={-10,-10,10,10};
   double y2[]={-10,10,-10,10};
//--- グラフィック
   CGraphic graph;
   graph.HistoryNameWidth(80);
   graph.Create(0,"Graph",0,30,30,830,430);
//--- ポイント
   CCurve *curve=graph.CurveAdd(x1,y1,CURVE_LINES);
   graph.CurvePlot(0);
   graph.Update();
   Sleep(1000);
   curve.Update(x2,y2);
   graph.Redraw(true);
   graph.Update();
   Sleep(1000);
  }
P.S.グラフィックス・ライブラリに関するスレッドが フォーラムにあります。
 
Roman Konopelko:

こんにちは、具体的にどのようにグラフを描き直そうとしましたか?

もし、特定の曲線のデータを変更するだけでよいのであれば、ここに動作例があります:

P.S.グラフィックス・ライブラリに関するスレッドが フォーラムにありますが、その中でこの質問はすでに提起されています。
ありがとう、もうわかったよ。まったく同じことを1つの配列だけでやっていたんだ...グラフについても同様に、graph.CalculateMaxMinValues() を再計算する必要があるだけで、スケールは更新される
 
Maxim Dmitrievsky:
ありがとうございます。すでに解決しました。1つの配列に対してだけ、まったく同じことをしました。グラフに対しても同様に graph.CalculateMaxMinValues() を再計算する必要があり、その後スケールが更新されます
CGraphic::Redraw(const bool rescale=false)メソッドをパラメータtrueで呼び出すと、スケールは自動的に再計算されます(CalculateMaxMinValuesを 別に呼び出す必要はありません)。
 
Roman Konopelko:
パラメータtrueでCGraphic::Redraw(const bool rescale=false)メソッドを呼び出すと、スケールは自動的に再計算されます(別途CalculateMaxMinValuesを 呼び出す必要はありません)。

分かりました。)
 

定規のように、2つ以上の目盛りをつけることは可能ですか?定規のように、センチメートルとインチで区切り、そのポイントがグラフのプロットに使われた場合のみ値を表示することはできますか?