エラー、バグ、質問 - ページ 1390

 

インジケータを完全に作成 するために、インジケータinitで待機しないでください。

インジケータと リターン制御を作成 し、すべての環境と履歴は後で準備され、あなたの再計算コードが呼び出されることになります。

 
Renat Fatkhullin:

インジケータが完全に作成 されるのをinitiaで待たないでください。

インジケータとリターン制御を作成し、すべての環境と履歴は後で準備され、あなたの再計算コードが呼び出されることになります。

つまり、4806のチェックは、OnInit()から戻った後、すでにデータを受信している場合は、その都度行わなければならないのでしょうか?
 
各データ読み取りポイントにて
 

ここでインジケーターが呼ばれ、OnCalculate 内でその値が計算されます。再計算は行われず、無期限で待つことができます。ピリオドチャートD1上で動作させる場合

int i_ich=INVALID_HANDLE;
double ind_buf[];

int OnInit(){
   i_ich=iIchimoku(Symbol(), PERIOD_H4, 9, 26, 52);
   if(i_ich==INVALID_HANDLE){
      Print("Невозможно создать индиктор Ишимоку!");
      return(INIT_FAILED);
   }
   SetIndexBuffer(0, ind_buf, INDICATOR_DATA);
   ArraySetAsSeries(ind_buf, true);
   return(INIT_SUCCEEDED);
}


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[]){
   double temp[];
   int copied=CopyBuffer(i_ich,0,0,1,temp);
   if(copied<=0){
      datetime now=TimeLocal();
      while(BarsCalculated(i_ich)<=0 && !IsStopped()){  
         Comment("Ждем пересчета индикатора Ишимоку... ",int(TimeLocal()-now));
      }
      if(BarsCalculated(i_ich)>0){
         Print("Расчитано ", BarsCalculated(i_ich), " баров за ",int(TimeLocal()-now)," секунд");
      }
      Comment("");
   } 

   return(rates_total);
}

石墨の読みが計算されない理由を教えてください。

 
Ilya Malev:

ここでインジケーターが呼ばれ、OnCalculate内でその値が計算されます。再計算は行われず、無期限で待つことができます。ピリオドチャートD1上で動作させる場合

石墨の読みが計算されない理由を教えてください。

これはどうでしょう。

//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   0
int i_ich=INVALID_HANDLE;
double ind_buf[];
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
   i_ich=iIchimoku(Symbol(),PERIOD_H4,9,26,52);
   if(i_ich==INVALID_HANDLE)
     {
      Print("Невозможно создать индиктор Ишимоку!");
      return(INIT_FAILED);
     }
   SetIndexBuffer(0,ind_buf,INDICATOR_DATA);
   ArraySetAsSeries(ind_buf,true);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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[])
  {
   static int count;
   Print(count);
   double temp[];
   datetime now=TimeLocal();
   int copied=CopyBuffer(i_ich,0,0,1,temp);
   if(copied>0)
      Print("Расчитано ",BarsCalculated(i_ich)," баров за ",int(TimeLocal()-now)," секунд");
   count++;
   return(rates_total);
  }
//+------------------------------------------------------------------+
?
 

インジケータコードで期待値をループさせてはいけません。スクリプトやExpert Advisorでは可能ですが、インジケータでは絶対に不可能です。

指標の計算と外国データの要求のための戦略は、次のようにする必要があります:データ要求が成功しなかった場合、我々はすぐに終了し、次のティックのために計算を延期する。次回のティック/コールでは、必要なデータを再度要求するようにします。

 
Karputov Vladimir:

そして、もしそうなら。

?
0 "を出力(日曜日なのでOnCalculateの 再開はない)
 
Renat Fatkhullin:

インジケータコードで期待値をループさせてはいけません。スクリプトやExpert Advisorでは可能ですが、インジケータでは絶対に不可能です。

指標における計算と外部データの要求の戦略は次のようにする。データ要求が失敗した場合、すぐに終了し、次のティックのために計算を延期する。次回のティック/コールでは、必要なデータを再度要求するようにします。

しかし、次のティックを待たずに、1回の実行でインジケータの読み取りを 計算する必要がある場合はどうすればよいですか?例えば、週末やちょうど流動性の低い時期があった場合、1分刻みで出ている時?OnCalculateの代わりにOnTimerを使用する?
 
Ilya Malev:
0 "を出力(日曜日なのでOnCalculateの再実行 なし)
テスターで、テスターで!そして週末には、グラフ上で右クリックして「更新」する必要があります。
 

更新]を押すと、すべてが計算されます。イニテで作成したインジケータデータは、OnCalculate/OnTimerなどの 最初の呼び出しの 前に計算されると便利だと思います。

インジケータ内のループで初期化した後、計算を待つことができると便利です。

インジケータを計算するためには、チャート上で「更新」を数回押す必要があります。必要なのか。MT5の利点があるにもかかわらず、彼は古き良きMT4を覚えていて、それを使い続けるでしょう。