記事"Canvasクラスを使用したカスタム指標の開発"についてのディスカッション - ページ 2

 
fxsaber:

それは良いニュースだ!どうする?ティック履歴の 代わりにカスタム時系列?

いいえ、ティックヒストリーの横にティックレートのヒストグラムを描きます。

そうすることで、パラメータを弄りながら、活動の期間を視覚的に判断し、おそらくいくつかのパターンを見つけることができます。

 
Dennis Kirichenko:

良いトピックだ。著者に感謝し、キャンバスにティックインジケーターを 作るつもりだ......。

気づいたことがあります。

プライベート・ データ・メンバーm_canvas_nameが あるのに、その値を設定するメソッドName()パブリックになって いる。カプセル化の原則に違反している。このメソッドをprivateにしよう。

たぶんprotected?なぜなら、他のすべてのメソッドはCCanvasBaseを継承しているからだ。そうすると、その中でこのメソッドを使うことができなくなる。私は知らないが、もしかしたら、あなたは一般的な構造で他の何かを変えたのかもしれない。

 
Alexander Fedosov:

もしかしてprotected?なぜなら、他のものはすべてCCanvasBaseを継承しているからだ。そして、それらの中でこのメソッドを使うことはできない。もしかしたら、他の一般的な構造を変更したのかもしれないが。


そう、protected だ。

それから、ここ:

bool CCanvasBase::DeleteCanvas()
  {
   return(ObjectDelete(0,m_canvas_name)?true:false);
  }
//+------------------------------------------------------------------+
//| カスタム・インジケータの初期化関数
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   ind.Delete();
   ChartRedraw();
  }

なぜインジケータがこんなに複雑なのか?キャンバスそのものをきれいにする必要がある。DeleteCanvas()メソッドにChartRedraw()を 追加します

 
fxsaber:

スケッチができたら、スクリーンショットかビデオを送ってください。私自身もそのようなインジケーターを投稿しましたが、人々の手には届きませんでした。もっと良いものは見つかっていませんが。kanvasで他のソリューションを見るのは面白い。


FORTSのために作っているんだ。通常のフォーマットで作りましたが、テスターではEA本体から呼び出すと地獄のように動作します。今、すべてのコードを EA に転送するつもりです。

 
Dennis Kirichenko:

そう、その通りだ。

ではここで:

なぜインジケーターがこんなに複雑なのか?私の考えでは、キャンバス自体をきれいにする必要がある。 DeleteCanvas()メソッドにChartRedraw()を 追加しよう。

そうすれば、無駄な行が減る。キャンバスをすっきりさせて、そこに再描画を送ります。

 

そういうやり方はあまりない:

//+------------------------------------------------------------------+
//|| グラフィックス・リソースを削除する|
//+------------------------------------------------------------------+
bool CCanvasBase::DeleteCanvas()
  {
   return(ObjectDelete(0,m_canvas_name)?true:false);
  }

なぜ三項演算子 なのか?- なぜ三項演算子なのか?

//+------------------------------------------------------------------+
//|| グラフィックス・リソースを削除する|
//+------------------------------------------------------------------+
bool CCanvasBase::DeleteCanvas()
  {
   return ObjectDelete(0,m_canvas_name);
  }

私はこの方法でやった:

//+------------------------------------------------------------------+
//|| グラフィックス・リソースを削除する|
//+------------------------------------------------------------------+
bool CCanvasBase::DeleteCanvas()
  {
   if(ObjectFind(0,m_canvas_name)>-1)
      if(ObjectDelete(0,m_canvas_name))
        {
         ChartRedraw();
         return true;
        }
   return false;
  }


しかし、canvasにはCCanvas::Destroy()を削除する独自のメソッドがある。

なぜ別のメソッドを追加する必要があるのだろう?

 

垂直スケーリングに問題があります。

Y軸の最大値が97784.0、最小値が97756.0となるようなティックチャートをRTSで作りたいのです。

コードではこのようにします:

//--- チャートを更新する
double min_y=NormalizeDouble(min_pr-0.2*diff,_Digits);
double max_y=NormalizeDouble(max_pr+0.2*diff,_Digits);
ticks_ind.YMin(min_y);
ticks_ind.YMax(max_y);
ticks_ind.SetArrayValue(prices);


このようになります:

https://www.mql5.com/ru/charts/7227612/rts-9-17-m1-ao-otkritie-broker

最小値は正しく表示されますが、その後、いくつかのウィズが発生します。

どうやら、CLineGraph::VerticalScale()メソッドは、私が思っているほど、あるいはもっと悪いことに、微調整されていないようだ。

График RTS-9.17, M1, 2017.06.19 15:22 UTC, АО ''Открытие Брокер'', MetaTrader 5, Real
График RTS-9.17, M1, 2017.06.19 15:22 UTC, АО ''Открытие Брокер'', MetaTrader 5, Real
  • www.mql5.com
Символ: RTS-9.17. Период графика: M1. Брокер: АО ''Открытие Брокер''. Торговая платформа: MetaTrader 5. Режим торговли: Real. Дата: 2017.06.19 15:22 UTC.
 
Документация по MQL5: Стандартная библиотека / Научные графики / CGraphic
Документация по MQL5: Стандартная библиотека / Научные графики / CGraphic
  • www.mql5.com
Стандартная библиотека / Научные графики / CGraphic - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 

Anatoly、ありがとう。アイデアが不親切なコードになるのは残念ですが...。