CGraphicのテスト - 質問と提案 - ページ 5 12345678910111213 新しいコメント fxsaber 2016.12.20 18:48 #41 o_O:- zoomoでは難しいですね。スクロールバーがないため正直なところ、このクラスには実装してほしくありません。今はCCanvasだけを使っていて、他のオブジェクトは問わない。そして、これは非常に良いことです。ズームは継承で独立して実装し、スクロールバーをつけ、必要に応じて再スケールする予定です。スクロールバーは 悪だ。マウスとキーボードで、バーのない通常のチャートを回転させることができます。 --- 2016.12.20 19:15 #42 fxsaber: スクロールバーは悪だ。マウスとキーボードで、バーのない通常のチャートを回転させることができます。スクロールのためのチャートイベントがない。 MQLはそれを送信しない。しかし、ホイールを回す代わりに、マウスでドラッグドロップするだけでいいのです。 fxsaber 2016.12.20 19:33 #43 o_O:が、ホイールを回すのではなく、マウスでドラッグドロップするだけでいいのです。 はい、ZoomPriceではそのようにスクロールやズームを行っています。 --- 2016.12.22 09:08 #44 ロマン・コノペルコ36番は どうですか? そして、もう一つのゼロ除算を発見 --- 2016.12.22 11:08 #45 明確にできる(再現できる)CurveAdd(arrY, CURVE_HISTOGRAM, "P/L") 曲線が追加されました; これは、サイズ1または0要素の配列arrYを持っています。であり、このカーブコンストラクタから判断してm_xmax=m_xmin=0である。 Roman Konopelko 2016.12.22 13:59 #46 o_O:ロマン・コノペルコ36番は どうですか? そして、もう一つのゼロ除算を発見36を 実装し、ゼロ除算エラーを修正しました。ValuesFunctionFormatがに変更されていないだけです。void ValuesFunctionFormat(DoubleToStringFunction func, void* cbdata) { m_values_func=func; m_cbdata=cbdata; }そして、関数へのポインタとそれに対するオブジェクトへのポインタを別々に取得/設定するメソッドを実装しました。 DoubleToStringFunction ValuesFunctionFormat(void) const { return(m_values_func); } void ValuesFunctionFormat(DoubleToStringFunction func) { m_values_func=func; } void *ValuesFunctionFormatCBData(void) const { return(m_values_cbdata); } void ValuesFunctionFormatCBData(void *cbdata) { m_values_cbdata=cbdata; } ファイル: Axis.mqh 12 kb ColorGenerator.mqh 4 kb Curve.mqh 21 kb Graphic.mqh 86 kb --- 2016.12.25 11:56 #47 kanvasのカラーハンドリングを修正してください。アルファチャンネルを考慮しないようになったので、uintの 代わりにcolorが いたるところにあります。このため、キャンバスに描画すると、いたるところにチャートの隙間ができてしまいます(カラーではアルファチャンネル=0、つまり完全に透明なため、グリッドやフレームが透明になってしまうのです)。一部の関数だけ、ColorToARGBを常に呼び出すことで修正しました。 たとえば void CGraphic::CreateBackground(void) {...//--- create background m_canvas.FillRectangle(0,0,m_width,m_up-1,ColorToARGB(m_background.clr,255)); m_canvas.FillRectangle(0,m_height-m_down+1,m_width,m_height,ColorToARGB(m_background.clr,255)); m_canvas.FillRectangle(0,m_up,m_left-1,m_height-m_down,ColorToARGB(m_background.clr,255)); m_canvas.FillRectangle(m_width-m_right+1,m_up,m_width,m_height-m_down,ColorToARGB(m_background.clr,255));しかし、なぜかというと、カラーをuint型にして アルファチャンネルを設定したい場合です。ここでも(他のカラー機能でも)そうですがvoid CGraphic::SetDefaultParameters(void) {...//--- sets the default values for grid m_grid.clr_line=ColorToARGB(clrWhiteSmoke); m_grid.clr_axis_line=ColorToARGB(clrSilver); m_grid.clr_frame=ColorToARGB(clrBlack); m_grid.clr_background=ColorToARGB(clrWhite);----PS.キャンバス自体がCOLOR_FORMAT_XRGB_NOALPHAを持っていることは、この場合重要ではありません。 Testing CGraphic - questions トレーディングにおけるOLAPの適用(その4)。テスターレポートの定量的・視覚的分析 MQLアプリケーションでのCCanvasクラスの使用 --- 2016.12.31 16:34 #48 ターミナルアップデート1502の修正点を確認することにしました。改善点はどこにあるのでしょうか?ValuesFunctionFormatがない、バグフィックスがない zerodevide笑ハッピーホリデー) --- 2017.01.24 10:47 #49 は1510をインストールしました。ValuesFunctionFormatがあればOKです。--Roman Konopelko さん、47番の 文章をご覧ください。CGraphicのコードでは、いくつかの変数と関数に過ぎません。代用は難しくありません。 しかし、レンダリング時の透明度の問題は解消されます。カラーではアルファチャンネル=100%の透明度なので、これは間違いです。 Roman Konopelko 2017.01.31 13:46 #50 o_O:Roman Konopelko さん、47番の 文章をご覧ください。CGraphicのコードには、変数と関数がわずかしかありません。代用は難しくありません。 しかし、レンダリング時の透明度の問題は解消されます。実は、カラーではアルファチャンネル=透明度100%というのは間違いなのです。 CGraphicクラスでは、ご指摘の通り、すべての箇所でカラータイプをuintに置き換えています。 また、CCanvas クラスに新しいメソッドを追加し、プリミティブを指定した厚みで描画できるようにしました。 void LineThickVertical(const int x,const int y1,const int y2,const int size,const uint clr,const uint style,ENUM_LINE_END end_style); void LineThickHorizontal(const int x1,const int x2,const int y,const int size,const uint clr,const uint style,ENUM_LINE_END end_style); void LineThick(const int x1,const int y1,const int x2,const int y2,const int size,const uint clr,const uint style,ENUM_LINE_END end_style); void PolylineThick(const int &x[],const int &y[],const int size,const uint clr,const uint style,ENUM_LINE_END end_style); void PolygonThick(const int &x[],const int &y[],const int size,const uint clr,const uint style,ENUM_LINE_END end_style); CCanvasの革新性に合わせて、CCurveのプロパティを拡張しました。 ENUM_LINE_END LinesEndStyle(void) const { return(m_lines_end_style); } int LinesWidth(void) const { return(m_lines_width); } void LinesEndStyle(ENUM_LINE_END end_style) { m_lines_end_style=end_style; } void LinesWidth(const int width) { m_lines_width=width; } 直線で曲線を描く際に、線の太さや両端のスタイルを指定できるようになりました。 例#include <Graphics\Graphic.mqh>//+------------------------------------------------------------------+//| Script program start function |//+------------------------------------------------------------------+void OnStart() { double x[] = { -100, -40, -10, 20, 30, 40, 50, 60, 70, 80, 120 }; double y[] = { -5, 4, -10, 23, 17, 18, -9, 13, 17, 4, 9 }; CGraphic graphic; graphic.Create(0,"G",0,30,30,780,380);//--- plot curve CCurve *curve=graphic.CurveAdd(x,y,CURVE_LINES); curve.LinesSmooth(true); curve.LinesStyle(STYLE_DOT); curve.LinesEndStyle(LINE_END_ROUND); curve.LinesWidth(10); graphic.CurvePlotAll(); graphic.Update(); } 結果 これらの方法の実装は、選択されたフィルターに基づいて線の滑らかさの程度を決定するFast Prefiltered Lines アルゴリズムに基づくものである。必要であれば、さらに詳しく説明します。 ファイル: Canvas.mqh 144 kb Axis.mqh 12 kb ColorGenerator.mqh 4 kb Curve.mqh 22 kb Graphic.mqh 86 kb Testing CGraphic - questions CCurve - LinesWidth CCurve - TrendLineVisible 12345678910111213 新しいコメント 取引の機会を逃しています。 無料取引アプリ 8千を超えるシグナルをコピー 金融ニュースで金融マーケットを探索 新規登録 ログイン スペースを含まないラテン文字 このメールにパスワードが送信されます エラーが発生しました Googleでログイン WebサイトポリシーおよびMQL5.COM利用規約に同意します。 新規登録 MQL5.com WebサイトへのログインにCookieの使用を許可します。 ログインするには、ブラウザで必要な設定を有効にしてください。 ログイン/パスワードをお忘れですか? Googleでログイン
- zoomoでは難しいですね。スクロールバーがないため正直なところ、このクラスには実装してほしくありません。今はCCanvasだけを使っていて、他のオブジェクトは問わない。そして、これは非常に良いことです。
ズームは継承で独立して実装し、スクロールバーをつけ、必要に応じて再スケールする予定です。
スクロールバーは悪だ。マウスとキーボードで、バーのない通常のチャートを回転させることができます。
スクロールのためのチャートイベントがない。 MQLはそれを送信しない。
しかし、ホイールを回す代わりに、マウスでドラッグドロップするだけでいいのです。
が、ホイールを回すのではなく、マウスでドラッグドロップするだけでいいのです。
ロマン・コノペルコ
36番は どうですか?
そして、もう一つのゼロ除算を発見
明確にできる(再現できる)
CurveAdd(arrY, CURVE_HISTOGRAM, "P/L") 曲線が追加されました; これは、サイズ1または0要素の配列arrYを持っています。
であり、このカーブコンストラクタから判断してm_xmax=m_xmin=0である。
ロマン・コノペルコ
36番は どうですか?
そして、もう一つのゼロ除算を発見
36を 実装し、ゼロ除算エラーを修正しました。
ValuesFunctionFormatがに変更されていないだけです。
void ValuesFunctionFormat(DoubleToStringFunction func, void* cbdata) { m_values_func=func; m_cbdata=cbdata; }
そして、関数へのポインタとそれに対するオブジェクトへのポインタを別々に取得/設定するメソッドを実装しました。
void ValuesFunctionFormat(DoubleToStringFunction func) { m_values_func=func; }
void *ValuesFunctionFormatCBData(void) const { return(m_values_cbdata); }
void ValuesFunctionFormatCBData(void *cbdata) { m_values_cbdata=cbdata; }
kanvasのカラーハンドリングを修正してください。
アルファチャンネルを考慮しないようになったので、uintの 代わりにcolorが いたるところにあります。
このため、キャンバスに描画すると、いたるところにチャートの隙間ができてしまいます(カラーではアルファチャンネル=0、つまり完全に透明なため、グリッドやフレームが透明になってしまうのです)。
一部の関数だけ、ColorToARGBを常に呼び出すことで修正しました。
たとえば
{
...
//--- create background
m_canvas.FillRectangle(0,0,m_width,m_up-1,ColorToARGB(m_background.clr,255));
m_canvas.FillRectangle(0,m_height-m_down+1,m_width,m_height,ColorToARGB(m_background.clr,255));
m_canvas.FillRectangle(0,m_up,m_left-1,m_height-m_down,ColorToARGB(m_background.clr,255));
m_canvas.FillRectangle(m_width-m_right+1,m_up,m_width,m_height-m_down,ColorToARGB(m_background.clr,255));
しかし、なぜかというと、カラーをuint型にして アルファチャンネルを設定したい場合です。
ここでも(他のカラー機能でも)そうですが
{
...
//--- sets the default values for grid
m_grid.clr_line=ColorToARGB(clrWhiteSmoke);
m_grid.clr_axis_line=ColorToARGB(clrSilver);
m_grid.clr_frame=ColorToARGB(clrBlack);
m_grid.clr_background=ColorToARGB(clrWhite);
----
PS.
キャンバス自体がCOLOR_FORMAT_XRGB_NOALPHAを持っていることは、この場合重要ではありません。
ターミナルアップデート1502の修正点を確認することにしました。
改善点はどこにあるのでしょうか?
ValuesFunctionFormatがない、バグフィックスがない zerodevide
笑
ハッピーホリデー)
は1510をインストールしました。
ValuesFunctionFormatがあればOKです。
--
Roman Konopelko さん、47番の 文章をご覧ください。
CGraphicのコードでは、いくつかの変数と関数に過ぎません。代用は難しくありません。
しかし、レンダリング時の透明度の問題は解消されます。カラーではアルファチャンネル=100%の透明度なので、これは間違いです。
Roman Konopelko さん、47番の 文章をご覧ください。
CGraphicのコードには、変数と関数がわずかしかありません。代用は難しくありません。
しかし、レンダリング時の透明度の問題は解消されます。実は、カラーではアルファチャンネル=透明度100%というのは間違いなのです。
また、CCanvas クラスに新しいメソッドを追加し、プリミティブを指定した厚みで描画できるようにしました。
void LineThickHorizontal(const int x1,const int x2,const int y,const int size,const uint clr,const uint style,ENUM_LINE_END end_style);
void LineThick(const int x1,const int y1,const int x2,const int y2,const int size,const uint clr,const uint style,ENUM_LINE_END end_style);
void PolylineThick(const int &x[],const int &y[],const int size,const uint clr,const uint style,ENUM_LINE_END end_style);
void PolygonThick(const int &x[],const int &y[],const int size,const uint clr,const uint style,ENUM_LINE_END end_style);
int LinesWidth(void) const { return(m_lines_width); }
void LinesEndStyle(ENUM_LINE_END end_style) { m_lines_end_style=end_style; }
void LinesWidth(const int width) { m_lines_width=width; }
例
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
double x[] = { -100, -40, -10, 20, 30, 40, 50, 60, 70, 80, 120 };
double y[] = { -5, 4, -10, 23, 17, 18, -9, 13, 17, 4, 9 };
CGraphic graphic;
graphic.Create(0,"G",0,30,30,780,380);
//--- plot curve
CCurve *curve=graphic.CurveAdd(x,y,CURVE_LINES);
curve.LinesSmooth(true);
curve.LinesStyle(STYLE_DOT);
curve.LinesEndStyle(LINE_END_ROUND);
curve.LinesWidth(10);
graphic.CurvePlotAll();
graphic.Update();
}
これらの方法の実装は、選択されたフィルターに基づいて線の滑らかさの程度を決定するFast Prefiltered Lines アルゴリズムに基づくものである。必要であれば、さらに詳しく説明します。