Init()およびDeInit()実行シーケンス - ページ 22

 
fxsaber:
問題の解決方法

つまり、全ての問題は、どのインディケータにも同じ行を2つ追加することです。


図書館コード


もっとシンプルで、もっとクリアで、もっと鮮やかなものはないのだろうか。

また、チャート上に異なるパラメータを持つ2つのインジケータがある場合に備えて、インジケータの各インスタンスにグローバル変数名が 必要です)。

 
Dmitry Fedoseev:


もっとシンプルに、わかりやすく、明白にできないものか。

いいえ。

また、チャート上に異なるパラメータを持つ2つのインジケータがある場合、各インスタンスは独自のグローバル変数名を 必要とします)。

なぜなら、1つのチャートに異なるパラメータを持つ2つのインジケータのインスタンスがあると、このブランチで求められている使い方と矛盾してしまうからです。

したがって、2番目のインスタンスを起動しても、1番目のインスタンスがアンロードされるまで、単純に動作しないのです。

 
fxsaber:

まさかね。

...



#property indicator_chart_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

string gvName;

double Label1Buffer[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit(){
   gvName=MQLInfoString(MQL_PROGRAM_NAME);
   
   if(GlobalVariableCheck(gvName)){
      EventSetMillisecondTimer(1);      
   }
   else{
      GlobalVariableSet(gvName,1);
      NewInit();
   }
   return(INIT_SUCCEEDED);
}

void NewInit(){
   // все что было в ините должно быть здесь
   SetIndexBuffer(0,Label1Buffer,INDICATOR_DATA);
}

void OnDeinit(const int r){
   GlobalVariableDel(gvName);
}

void OnTimer(){
   if(!GlobalVariableCheck(gvName)){
      EventKillTimer();      
      GlobalVariableSet(gvName,1);
      NewInit();
   }

}  
//+------------------------------------------------------------------+
//| 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=rates_total-10;i<rates_total;i++)Label1Buffer[i]=close[i];

   return(rates_total);
  }
//+------------------------------------------------------------------+
そうなんですか?
 
Dmitry Fedoseev:
そうなんですか?

いいえ、もちろんそんなことはありません。Handle-chartは必ずグローバル変数 名で記述しなければならない。

そして、私の解決策は、たった2行の追加で実現します。ややシンプルになりましたね。

#include <Init_Sync.mqh> // Делает синхронизированными Init/Deinit индикаторов

#property indicator_chart_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

double Label1Buffer[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit(){
   SetIndexBuffer(0,Label1Buffer,INDICATOR_DATA);
   return(INIT_SUCCEEDED);
}

void OnTimer(){
  CHECK_INIT_SYNC;
   }

//+------------------------------------------------------------------+
//| 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=rates_total-10;i<rates_total;i++)Label1Buffer[i]=close[i];

   return(rates_total);
  }
//+------------------------------------------------------------------+
 
fxsaber:

いいえ、もちろんそんなことはありません。Handle-chartは必ずグローバル変数 名で記述しなければならない。

そして、私の解決策は、たった2行の追加で実現します。これはやや単純な話です。


そして、ロジック(アルゴリズム)そのものは同じなのですか?
 
fxsaber:

....

そして、私の解決策は、たった2行の追加で実現します。これはやや単純な話です。

また、SetIndexBufferのような関数を 標準のinitではなく、ディレイで呼び出す ことは、気にならないのでしょうか?本当に大丈夫なんですか?

 
Dmitry Fedoseev:

ロジック(アルゴリズム)は同じなのでしょうか?
はい。
 
Dmitry Fedoseev:

私が何本、あなたが何本持っているか数えてみてください...。2つの行が追加され、どこにとんでもない無意味なものがあるのか - 2行。

数えていないのか......多いな。

この議論は、どのような指標でも、ちょうど2つ追加すれば十分です。

 
fxsaber:

数えていないのか......多いな。

ちょうど2つ加えることで、どの指標もこの議論の切望される性質を持つようになります。


これが10問目です。好みの問題ですね。しかし、それでも私のコードは5倍小さく、読みやすくなっています :/。

もっと面白いのは、これだ。

SetIndexBuffer関数を 標準のiniteではなく、delayで呼び出すと混乱しないか?本当にこれでいいのでしょうか?

 
Dmitry Fedoseev:

SetIndexBuffer関数の 呼び出しは、標準のinitではなく、ディレイで行っているのでしょうか?本当にこれでいいのでしょうか?

もちろん です。OnCalculateを呼び出すと問題が発生すると思われるが、これは簡単なライブラリ編集で解決する。月曜日には明らかにすることができるだろう。

原則的には1行で十分な場合もあります。