記事"R で 統計分布を MQL5 に -"についてのディスカッション - ページ 11

 
これは5だけですか?4の予定はありますか?
 
Stanislav Korotky:
これは5だけですか?4の予定ですか?

MT4ではすべて動作するはずです。標準のOBJ_BITMAP_LABEL+カスタムリソースです。

ちなみにMT4のコンパイラはMT5より賢いです。

// エラーの可能性があるため、演算子の優先順位をチェックする。優先順位を明確にするには括弧を使用する Canvas.mqh
m_pixels[y*m_width+x]=(r<<16|g<<8|b<<0|255<<24) &0xffffffff;


そして、バグが発生しました(MT5では動作しませんが、MT4では動作します)。

#property strict

#include <Graphics/Graphic.mqh>

double Func1(double x) { return MathPow(x,2); }
double Func2(double x) { return MathPow(x,3); }
double Func3(double x) { return MathPow(x,4); }

void SaveObjects( const long chart_id = 0, const int SubWindow = -1 )
{
  const int Total = ObjectsTotal(chart_id, SubWindow, OBJ_BITMAP_LABEL);
  
  for (int i = 0; i < Total; i++)
  {
    const string Name = ObjectName(chart_id, i, SubWindow, OBJ_BITMAP_LABEL);

    string ResourceName;
    
    if (ObjectGetString(chart_id, Name, OBJPROP_BMPFILE, 0, ResourceName))
      ResourceSave(ResourceName, Name + ".bmp"); // MT5 - false、MT4 - true
  }
}

void OnStart()
  {
   GraphPlot(Func1,Func2,Func3,-2,2,0.05,CURVE_LINES);
      
   SaveObjects();
  }
 
訂正してください。
//+------------------------------------------------------------------+
|画面上のオブジェクトを更新(再描画)|
//+------------------------------------------------------------------+
void CCanvas::Update(const bool redraw)
  {
//--- チェック
   if(m_rcname==NULL)
      return;
//--- リソースを更新し、再描画する
   if(ResourceCreate(m_rcname,m_pixels,m_width,m_height,0,0,0,m_format) && redraw)
      ChartRedraw(this.m_chart_id);
  }
 

これは

//+------------------------------------------------------------------+
//| 呉のポリラインを描く|
//+------------------------------------------------------------------+
void CCanvas::PolylineWu(int &x[],int &y[],const uint clr,const uint style=UINT_MAX);

ゼロによる除算が ある。

 
配列の長さがチャートの幅(ピクセル)より大きいと、がっかりする。
 

CGraphicと CCurveの改善をお願いしたい。これらは弱いクラスです。しかも、必要なものがprivateなので、継承するのはほとんど不可能です。私はそれを理解するのに長い時間がかかったが、適切に動作させるために自分でクラスを書き直さなければならなかった。

私はインタラクティブなティック・チャートを作りたかった。

#include <Graphics/Graphic.mqh>

void GetPrices( double &Bids[], double &Asks[], const int Count = 100 )
{
  MqlTick Ticks[];
  
  const int Amount = CopyTicks(_Symbol, Ticks, COPY_TICKS_INFO, 0, Count);
  
  ArrayResize(Bids, Amount);
  ArrayResize(Asks, Amount);
  
  for (int i = 0; i < Amount; i++)
  {
    Bids[i] = Ticks[i].bid;
    Asks[i] = Ticks[i].ask;
  }
}

CGraphic* Graphic = new CGraphic;
const string Name = "Graphic" +(string)(GetTickCount() + MathRand());

void OnDeinit( const int Reason )
{
  Graphic.Destroy();
  delete Graphic;
  
  ChartRedraw();
}

void GraphTicks( const double &Price1[], const double &Price2[] )
{
   Graphic.Destroy();
   delete Graphic;

   Graphic = new CGraphic;  
   Graphic.Create(0, Name, 0, 0, 0, (int)(ChartGetInteger(0, CHART_WIDTH_IN_PIXELS) * 0.8), (int)ChartGetInteger(0, CHART_HEIGHT_IN_PIXELS));

   Graphic.AddCurve(Price1, CURVE_LINES);
   Graphic.AddCurve(Price2, CURVE_LINES);
  
   Graphic.PlotAllCurves();
   Graphic.Update();
}

void OnTick()
{
  double Bids[], Asks[];
  GetPrices(Bids, Asks);
  
  GraphTicks(Bids, Asks);
}

DeleteCurve、ChangeCurveなどがない。

 
fxsaber:

CGraphicとCCurveの改善をお願いしたい。これらは弱いクラスです。しかも、必要なものがprivateなので、継承するのはほとんど不可能です。私はそれを理解するのに長い時間がかかったが、適切に動作させるために自分でクラスを書き直さなければならなかった。

私はインタラクティブなティック・チャートを作りたかった。

#include <Graphics/Graphic.mqh>

void GetPrices( double &Bids[], double &Asks[], const int Count = 100 )
{
  MqlTick Ticks[];
  
  const int Amount = CopyTicks(_Symbol, Ticks, COPY_TICKS_INFO, 0, Count);
  
  ArrayResize(Bids, Amount);
  ArrayResize(Asks, Amount);
  
  for (int i = 0; i < Amount; i++)
  {
    Bids[i] = Ticks[i].bid;
    Asks[i] = Ticks[i].ask;
  }
}

CGraphic* Graphic = new CGraphic;
const string Name = "Graphic" +(string)(GetTickCount() + MathRand());

void OnDeinit( const int Reason )
{
  Graphic.Destroy();
  delete Graphic;
  
  ChartRedraw();
}

void GraphTicks( const double &Price1[], const double &Price2[] )
{
   Graphic.Destroy();
   delete Graphic;

   Graphic = new CGraphic;  
   Graphic.Create(0, Name, 0, 0, 0, (int)(ChartGetInteger(0, CHART_WIDTH_IN_PIXELS) * 0.8), (int)ChartGetInteger(0, CHART_HEIGHT_IN_PIXELS));

   Graphic.AddCurve(Price1, CURVE_LINES);
   Graphic.AddCurve(Price2, CURVE_LINES);
  
   Graphic.PlotAllCurves();
   Graphic.Update();
}

void OnTick()
{
  double Bids[], Asks[];
  GetPrices(Bids, Asks);
  
  GraphTicks(Bids, Asks);
}

DeleteCurveもChangeCurveもない。

このような短いコードでよいのでしょうか? なぜかシートだと思っていました。 別のソフトで視覚化の例を示しましたが、指定した数のバンドとトレードのテープを組み合わせたスタックを視覚化することは可能でしょうか?
 
Stanislav Korotky:
これは5だけですか?4の計画はあるのか?

5だけです。

4は終わった。

 
ivanivan_11:
このような短いコードなのでしょうか? なぜかシートだと思ったのですが。 指定されたバンド数のスタックを、トレードのテープと組み合わせて視覚化することは可能でしょうか? 別のソフトウェアで視覚化の例を示しましたが。

インタラクティブに何かを描くことは何年も前から可能です。それを使っているのは、誰も(確かに公には)いない。

コードは短くはないが、長く、非常に曲がっている(結果だけでなく、ちらつきもある)。このライブラリは真剣に改善される必要がある。

 

そう、ライブラリーはまだテスト段階に過ぎない。

これから整理し、継承を許可し、メソッドを追加し、不正なインデックスによるクラッシュを取り除く予定だ。