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

 
Ilya Malev:

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

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

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

インジケータでの計算は、OnCalculate()の中だけで行わなければなりません(MUST)。
 
Karputov Vladimir:
インジケータでの計算は、OnCalculate()の中だけで行わなければならない(MUST)。
この場合の石墨インジケーターの読みについてです。私は、現在のもの、つまりOnCalculateで使用 されるインジケーターの読み取りについて話しています。そのため、MT4と同様にOnCalculateの呼び出しの 前に計算されます。あるいは、OnCalculateでその計算を待つことも可能でしょう。そうでなければ、ユーザーはインジケータを構築するために何度もUpdateを押さなければなりません。すべての指標が1秒間の全履歴で成り立っているわけではないので、計算に時間がかかる複雑な指標も存在します。この間、ユーザーは「更新」ボタンの上で待たなければなりませんが、MT4では描画されるのを待つだけでいいのです。
 
Ilya Malev:
この場合のIshimokuインジケーターの読み方についてです。現在使われて いるインジケーターの読み取り、つまりOnCalculateの話です。そのため、MT4と同様にOnCalculateが呼び出さ れる前に計算されます。
OnInit()では、インジケータのための取引環境の準備が行われます。そしてOnCalculate()の中だけでインジケータのデータを使用することができます。
 
Ilya Malev:
この場合の石墨インジケーターの読みについてです。電流の中で、つまりOnCalculateの中で使わ れるインジケーターの読み方についてです。そのため、MT4と同様にOnCalculateの呼び出しの 前に計算されます。あるいは、OnCalculateでその計算を待つことも可能でしょう。そうでなければ、ユーザーはインジケータを構築するために何度もUpdateを押さなければなりません。すべての指標が1秒間の全履歴で成り立っているわけではないので、計算に時間がかかる複雑な指標も存在します。この間、ユーザーは「更新」ボタンの上で待たなければなりませんが、MT4では描画されるのを待つだけでよいのです。

この問題は、フォーラムでも時々出てきます。残念ながら、OnTimer()の中でOnCalculate()を呼び出しても、問題は解決しません。

でも、やってみればいいんです。MQL5 Recipes - Development of Multicurrency Volatility Indicator in MQL5 にその例があります。

その後、うまくいったかどうかを書くことができるようになります。

 
Karputov Vladimir:
OnInit()は、インジケーターの取引環境を準備します。そしてOnCalculate()の中だけでインジケータのデータを使用 することができます。
そのインジケータが他のシンボルやtfの他のインジケータを使用している場合、チャート上の「更新」ボタンを一度か数度押さなければ(または1ティック数分待たなければ)できないことが判明しました。
 
Anatoli Kazharski:

この問題は、フォーラムでも時々出てきます。残念ながら、OnTimer()の中でOnCalculate()を呼び出しても、問題は解決しません。

でも、やってみればいいんです。MQL5 Recipes - Development of Multicurrency Volatility Indicator in MQL5 にその例があります。

その後、うまくいったかどうか、面倒でなければ書いてください。

リンクありがとうございます。試してみますので、お知らせします。
 
Ilya Malev:
そのインジケータが他のシンボルやtfのインジケータを使用している場合、チャート上の「更新」ボタンを1回または数回押さなければ(または1~数ティック待たなければ)できないことが判明しました。

そして、私があげたコードの仕組みをもっと詳しく見てみると?特にエキスパートには?週末に端末を再起動した結果

2015.10.11 14:44:01.672 test (USDCAD,M5)        0
2015.10.11 14:44:01.681 test (USDCAD,M5)        1
2015.10.11 14:44:01.682 test (USDCAD,M5)        Расчитано 16518 баров за 0 секунд
2015.10.11 14:44:01.705 test (USDCAD,M5)        2
2015.10.11 14:44:01.705 test (USDCAD,M5)        Расчитано 16518 баров за 0 секунд

OnCaalculate()の2回目の呼び出しで計算が行われただけであることが完全にわかります。したがって、誰もプログラマからチェックの責任を取り除くことはできません: OncalCulate()でCopyBuffer()の結果を チェックします - 関数が何も返さなかった場合、OnCalculate()の次の入力でチェックする必要があります。

 
Anatoli Kazharski:

この問題は、フォーラムでも時々出てきます。残念ながら、OnTimer()の中でOnCalculate()を呼び出しても、問題は解決しません。

でも、やってみればいいんです。MQL5 Recipes - Development of Multicurrency Volatility Indicator in MQL5 にその例があります。

うまくいったかどうか、面倒でなければ後で書いてください。

まだ記事を読んでいませんが、OnTimerで問題なく動作しています

//+------------------------------------------------------------------+
//|                                                      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()
  {
   EventSetTimer(1);
   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);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+

void OnTimer(){
   datetime Arr1[];
   double Arr2[];
   long Arr3[];
   int Arr4[];
   OnCalculate(0, 0, Arr1, Arr2, Arr2, Arr2, Arr2, Arr3, Arr3, Arr4);
}

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=0;
   static datetime now=0;
   if(now==0)  now=TimeLocal();
   if(count>=0){
      Print(count);
      double temp[];
      int copied=CopyBuffer(i_ich,0,0,1,temp);
      if(copied>0){
         Print("Расчитано ",BarsCalculated(i_ich)," баров за ",int(TimeLocal()-now)," секунд");
         EventKillTimer(); // Индикаторы рассчитались, далее работаем только с OnCalculate
         count=-1;
      }else
         count++;
   }
   if(rates_total==0)   return(0); // Если это вызов из OnTimer, то возврат
   
   // ...
   return(rates_total);
}

OnTimerからOnCalculateの呼び出しが動作することを示す奇妙な絵があります)私は、タイムスリリーに正しい値を追加する必要があります。

 
Ilya Malev:

まだ記事を読んでいませんが、OnTimerでの受信は問題なく動作しています

シンプルな指標では、問題なく動作します。でも、もっと複雑なものでは、なぜか刺さることがあるんです。)
 
Ilya Malev:

まだ記事を読んでいませんが、OnTimerでの受信は問題なく動作しています

Stylerを 使用する - エラーを特定するのに適しています。

   if(count>=0)
     {
      Print(count);
      double temp[];
      int copied=CopyBuffer(i_ich,0,0,1,temp);
      if(copied>0)
        {
         Print("Расчитано ",BarsCalculated(i_ich)," баров за ",int(TimeLocal()-now)," секунд");
         EventKillTimer(); // Индикаторы рассчитались, далее работаем только с OnCalculate
         count=-1;
        }
      else
         count++;
     }
OnCalculate()から終了する前にカウント変数を増加させる - この場合、この変数はOnCalculateのすべての実行を正しくカウントします。