初心者の方からの質問 MQL5 MT5 MetaTrader 5 - ページ 1129

 
Alexey Viktorov:

なんでそんな大げさなんだ?表示するバッファを先に割り当て、次に補助バッファを割り当てることに何か問題があるのでしょうか?

アルゴリズムの特殊性として、補助バッファは 常に固定数で、表示するバッファの数は変動する。前の記事から、全部正しく指定する方法についてお答えください。


アレクセイ・ヴィクトロフ

DRAW_HISTOGRAM2 では、3 つのバッファが指定され、最初に 2 つの値バッファ、次に色バッファという順序が必須である。しかし、DRAW_HISTOGRAM と DRAW_HISTOGRAM2 には、DRAW_HISTOGRAM がゼロからバッファの値まで描画するのに対し、DRAW_HISTOGRAM2 はある バッファの値から別のバッファの値まで描画するという違いがあります。

https://www.mql5.com/ru/docs/customind/indicators_examples/draw_histogram2 の DRAW_HISTOGRAM2 の記述から。

"DRAW_HISTOGRAM2の構築に必要なバッファの数は2です。"

では、3つ目のバッファーはどこから来るのでしょうか?また、同じリンクの例では、バッファは2つしかありませんが、通常のDRAW_HISTOGRAと同じように色をインターリーブできるかどうかは指定されていないのですね。
 
The_Sheikh:

アルゴリズムの特殊性として、補助バッファは 常に固定数で、マップドバッファの数は変化する。前の記事から、全部正しく指定する方法についてお答えください。


https://www.mql5.com/ru/docs/customind/indicators_examples/draw_histogram2 の DRAW_HISTOGRAM2 の記述から。

"DRAW_HISTOGRAM2の構築に必要なバッファの数は2です。"

では、3つ目のバッファーはどこから来るのでしょうか?また、同じリンクの例では、バッファは2つしかありませんが、通常のDRAW_HISTOGRAと同じように色をインターリーブできるかどうかは指定されていないのですね。

はい、私の注意不足で申し訳ありません。DRAW_COLOR_HISTOGRAM2 と DRAW_COLOR_HISTOGRAM を意味します。

 
The_Sheikh:

アルゴリズムの特殊性で、補助バッファは 常に固定数で、表示バッファは異なる数である。これだけのことを正しく指定するにはどうしたらいいのか、前の記事からの質問に答えてください。

こんな風に自分をバカにしたのは初めてです。意欲があれば、実験してみてください。

 
このトピックに関連しないコメントは、「MQL4 MT4 MetaTrader 4初心者からの質問」に移動しました。
 

PlotIndexSetInteger()で 色を正しく設定するにはどうしたらいいですか?

を設定すると

#property indicator_color3 clrRed,clrGreen

を使用すると、色は正しく設定されます。

PlotIndexSetInteger(2,PLOT_LINE_COLOR,0,clrRed);

PlotIndexSetInteger(2,PLOT_LINE_COLOR,1,clrGreen);

とすると、線の最初の色は赤ですが、2番目(以降)はなぜか緑ではなく黒(デフォルト)になっています。

 
The_Sheikh:

PlotIndexSetInteger()で 色を正しく設定するにはどうしたらいいですか?

を指定すると

#property indicator_color3 clrRed,clrGreen

を使用すると、色は正しく設定されます。

PlotIndexSetInteger(2,PLOT_LINE_COLOR,0,clrRed);

PlotIndexSetInteger(2,PLOT_LINE_COLOR,1,clrGreen);

とすると、線の最初の色は赤になりますが、2番目の色はなぜか緑ではなく黒(デフォルト)になってしまいます。

なぜモディファイアを入れたのか?

 
Alexey Viktorov:

なぜモディファイアを入れたのか?

どれを、どこに?MQL5のドキュメントの 例を見て、同じようにやってみました。書いてみて、どう正しいのか?

 
The_Sheikh:

どれを、どこに?MQL5のドキュメントの 例を見て、同じようにやってみました。書いてみて、どう正しいのか?

インジケータ・バッファの初期化に関するすべてのコードを表示します。
 
The_Sheikh:

どれを、どこに?MQL5のドキュメントの 例を見て、同じようにやってみました。正しいやり方は?

調べました

bool  PlotIndexSetInteger( 
   int  plot_index,        // индекс графического стиля 
   int  prop_id,           // идентификатор свойства 
   int  prop_value         // устанавливаемое значение 
   );

と、こんなことをしました。

bool  PlotIndexSetInteger( 
   int  2,                 // индекс графического стиля 
   int  PLOT_LINE_COLOR,   // идентификатор свойства 
   int  0,                 // модификатор свойства 
   int  clrGreen           // устанавливаемое значение 
   )

とドキュメントに書かれています。

[指定されたプロパティの修飾子。カラーインデックスプロパティのみモディファイアが必要です。


これは、ベースメントインジケーターのレベルやフィボレベルなどの異なる色が割り当てられる場合、モディファイアが必要であることを意味します。
 
Artyom Trishkin:
インジケータ・バッファの初期化に関するすべてのコードを表示します。

こんな感じ

#property indicator_chart_window
//#property indicator_separate_window
#property indicator_buffers 4
#property indicator_plots 2

#define  GreenC 0x00FF00
#define  RedC 0x0000FF
#property indicator_type1 DRAW_NONE
#property indicator_type2 DRAW_COLOR_HISTOGRAM2
//#property indicator_color2 GreenC,RedC

double
Arr11[],
Arr21[],
Arr22[],
Arr23[];

void OnInit()
{
SetIndexBuffer(0,Arr11,INDICATOR_CALCULATIONS);
SetIndexBuffer(1,Arr21,INDICATOR_DATA);
SetIndexBuffer(2,Arr22,INDICATOR_DATA);
SetIndexBuffer(3,Arr23,INDICATOR_COLOR_INDEX);
IndicatorSetInteger(INDICATOR_DIGITS,Digits());
PlotIndexSetInteger(1,PLOT_LINE_WIDTH,4);
PlotIndexSetInteger(1,PLOT_LINE_COLOR,0,GreenC);
PlotIndexSetInteger(1,PLOT_LINE_COLOR,1,RedC);
//PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,0.0);
}

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[]
)
{
ArraySetAsSeries(open,0);
ArraySetAsSeries(close,0);
ArraySetAsSeries(low,0);
ArraySetAsSeries(high,0);
ArrayInitialize(Arr11,0.0);
ArrayInitialize(Arr21,0.0);
ArrayInitialize(Arr22,0.0);
ArrayInitialize(Arr23,0.0);

for (int I=0;I<rates_total;I++)
{
Arr22[I]=low[I];
Arr23[I]=0.0;
//Arr23[I]=1.0;
}

return(rates_total);
}

アレクセイ・ヴィクトロフ

調べました

と、こんなことをしました。

そして、そこには、ドキュメントにこう書かれています。

これは、ベースメントインジケーターのレベル、フィボレベルと同様の何かの異なる色が割り当てられている場合、修飾する必要があることを意味します。

まさに私の場合。

マニュアルにあるDRAW_COLOR_HISTOGRAM2の例の一部を紹介します。

/--- для каждого цветового индекса зададим новый цвет случайным образом
   for(int plot_color_ind=0;plot_color_ind<plot_colors;plot_color_ind++)
     {
      //--- получим случайное число
      int number=MathRand();
      //--- получим индекс в массиве col[] как остаток от целочисленного деления
      int i=number%size;
      //--- установим цвет для каждого индекса как свойство PLOT_LINE_COLOR
      PlotIndexSetInteger(0,                    //  номер графического стиля
                          PLOT_LINE_COLOR,      //  идентификатор свойства
                          plot_color_ind,       //  индекс цвета, куда запишем цвет
                          cols[i]);             //  новый цвет

ここでは plot_colors = 8, cols[] - さまざまな色を持つ配列。しかし、端末は最初の1色以外を知覚しません。

理由: