MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 - ページ 1041

 
Igor Makanu:

質問が明確でない可能性があるので、質問を変えてみてください。

説明してみる。しかし、私は実質的にプログラマーではないことを心に留めておいてください。

入札値でカーブを構築するティックインジケーターがあります。

#property  indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Aqua
double x[];
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int init()
  {
   IndicatorBuffers(1);
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,x);
   SetIndexDrawBegin(0,0);
   SetIndexLabel(0,"x");
   SetIndexShift(0,0);
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   double b=MarketInfo(Symbol(),MODE_BID);
   x[0]=b;
   for(int j=ArraySize(x)-1;j>=1;j--){x[j]=x[j-1];}
   return(0);
  }
//+------------------------------------------------------------------+

今、私がやりたいこと。

インジケータをチャートに 貼り付けます。bid1の最初の値を最初のティックで取得します。それを覚えておいてください(私はそうしました - 2番目のバッファy[0]を入力し、init()でその値を記録します)。

2回目のティックでは、bid2の2回目の値を取得します。

それから、点差をつけることです。delta=bid1-bid2(私はこうしました:delta=x[0]-x[1])です。

ここで、y[0]にデルタを加え、y[1]の値を求めると、実際にはbid2の値に相当する。

指標となる曲線は、求めているものと同じはずですが、入札差の計算値を使ってプロットされています。

この指標は、さらなる計算のためのテンプレートとして必要です。

石を投げてはいけない。私はできる限り説明した。

ありがとうございます。

 
Oleg Bondarev:

説明してみる。しかし、私は実質的に素人のプログラマーであることを念頭に置いてください。

入札値でカーブを構築するティックインジケーターを搭載しています。

今、私がやりたいこと。

チャート上にインジケータを 固定する。bid1の最初の値を最初のティックで取得します。それを覚えておいてください(私はそうしました:2番目のバッファy[0]を入力し、init()でその値を規定しました)。

2回目のティックでは、bid2の2回目の値を取得します。

それから、点差をつけることです。delta=bid1-bid2(私はこのようにしました:delta=x[0]-x[1])。

ここで、y[0]にデルタを加え、実際にbid2の値に対応するy[1]の値を求めます。

指標となる曲線は、求めているものと同じはずですが、入札差の計算値を使ってプロットされています。

この指標は、さらなる計算のためのテンプレートとして必要です。

石を投げてはいけない。私はできる限り説明しようとした。

ありがとうございます。

何をしたいのかが明確でない

一般的な問題点として、ティック(Bid)を格納する配列としてインジケータバッファを使用し、インジケータバッファのサイズはターミナル自体を変更し、さらに、ターミナルは新しいバーの出現時にインジケータバッファ自体をシフトさせることです。

ティックの格納には配列を使用し、描画にはインジケーターバッファを使用する必要があります。

私はあなたのコードと同じようなコードを作成しました、私は配列に刻みを保存する

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Label1
#property indicator_label1  "Label1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- input parameters
input int      TickCount=10;  //Размер массива тиков
//--- indicator buffers
double         Label1Buffer[];
double TickArr[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,Label1Buffer,INDICATOR_DATA);
   ArrayResize(TickArr,TickCount);                                   //изменим размер массива
   ArrayInitialize(TickArr,SymbolInfoDouble(_Symbol,SYMBOL_BID));    // проинициализируем массив значением текущего Bid
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
  {
   for(int i=ArraySize(TickArr)-1;i>0;i--)
   {
      TickArr[i] = TickArr[i-1]; // сдвинули массив
   }
   TickArr[0] = SymbolInfoDouble(_Symbol,SYMBOL_BID); // в 0-й элемент массива запомнили новый Bid
   
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

このコードに計算を追加し、あなたのアイデア通りにインジケータバッファ Label1Buffer を使って描画する必要があります。

 
他のインジケーターのプロパティをプログラムで変更できる機能を追加してもらえるとうれしいです。大雑把に言うと、(プログラムで)別のインジケータをチャートに追加した後、その色、スタイル、線の太 さを設定することができます。
 
Igor Makanu:

なにがしたいのかがわからない

インジケータバッファをティック(Bid)を格納する配列として使用し、インジケータバッファのサイズはターミナル自体を変更し、さらに、新しいバーが表示されるとターミナルはインジケータバッファ自体をシフトさせるというものです。

ティックの格納には配列を使用し、描画にはインジケーターバッファを使用する必要があります。

私はあなたのコードと同じようなコードを作成しました、私は配列に刻みを保存する

このコードに計算を追加し、インジケータバッファ Label1Buffer を使って描画する必要があります。

ご返信ありがとうございます。もうちょっと拷問してやる。

ここで計算を足せばいいのか?

int OnCalculate()

以下は私の計算です。

   if(TickArr[0]>TickArr[1])
     {
      Label1Buffer[0]=Label1Buffer[1]+(TickArr[0]-TickArr[1]);
     }
   if(TickArr[0]<TickArr[1])
     {
      Label1Buffer[0]=Label1Buffer[1]-(TickArr[0]-TickArr[1]);
     }
   if(TickArr[0]==TickArr[1])
     {
      Label1Buffer[0]=Label1Buffer[1];
     }

追加しても何もない。

 
Yevhenii Levchenko:
他のインジケーターのプロパティをプログラムで変更できる機能を追加してもらえるとうれしいです。大雑把に言うと、チャートに別のインジケータを(プログラムで)追加した後、線の 色、スタイル、 さを設定することができます。

キャンバスを使い、マンガを描く。

 

もっと写真を添付します。

インド

 
Oleg Bondarev:

追加され、何もない。

そういうわけにもいかないし ))))

MQLでインジケータ・バッファを使って 描画するには、インジケータ・バッファに値を入れることを意味します - 私の例では、それはLabel1Buffer(値を代入する)です。

この例では、条件を満たしたときのみ値を割り当て、条件を満たさないときは値を割り当てないのですか?- だから、何も印刷されない。


また、TickArrという配列にはBidの値が含まれていますが、あなたの条件では、インジケータバッファの前の値を使用しています - そして、誰がこれらのバッファにどの値を入れたのですか?


インジケーターのバッファに線を引いてみて、ティックを比較してみてください。

 
Oleg Bondarev:

もっと写真を添付します。


角度が逆になったら?どのように計算するのでしょうか?

 
Oleg Bondarev:

もっと写真を添付します。


プログラミングが実質0点だと言うのなら、なぜそんな規格外の仕事を引き受けるのか、簡単なものから始めたらいいのでは?それとも、基礎知識を高めるため?やってもらうと楽ですね、はい。
 
Igor Makanu:

それはダメだ ))))

MQLでインジケーターバッファを使って 描画するには、インジケーターバッファに値を入れる(代入する)ことを意味します - 私の例では、Label1Buffer

この例では、条件を満たしたときのみ値を割り当て、条件を満たさないときは値を割り当てないのですか?- だから、何も印刷されない。


また、TickArrという配列にはBidの値が含まれていますが、あなたの条件では、インジケータバッファの前の値を使用しています - そして、誰がこれらのバッファにどの値を入れたのですか?


インジケーターのバッファで線を引いてみて、ティックを比較します。

ハッカーであることを警告した)

そんな感じでやってました。

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Label1
#property indicator_label1  "Label1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- input parameters
input int      TickCount=100000;  //Размер массива тиков
input int      TickCountb=100000;
//--- indicator buffers
double Label1Buffer[];
double TickArr[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,Label1Buffer);
   ArrayResize(TickArr,TickCount);
   ArrayResize(Label1Buffer,TickCountb);                                   //изменим размер массива
   ArrayInitialize(TickArr,MarketInfo(Symbol(),MODE_BID));    // проинициализируем массив значением текущего Bid

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
  {
   for(int i=ArraySize(TickArr)-1;i>0;i--)
   {
      TickArr[i] = TickArr[i-1]; // сдвинули массив
   }
   TickArr[0] = MarketInfo(Symbol(),MODE_BID); // в 0-й элемент массива запомнили новый Bid
   
   for(int j=ArraySize(TickArr)-1;j>0;j--)
   {
      Label1Buffer[j] = Label1Buffer[j-1]; // сдвинули массив
   }
   
   Label1Buffer[0]= TickArr[0];   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

これでティックチャートが描画されましたが、一部改行があります。

4をやってます。