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

 

夜中、バーの開始時刻がエラーで反映されてしまうという、とても不思議なことに気づきました。今度はそれを確認したいので、テスト用のインジケータを作りました

#property indicator_chart_window
datetime old_time=0;
int      MaxBars=10;    // ограничение 
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()  {return(0);}
//+------------------------------------------------------------------+
//| 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[])
  {
   if(rates_total<10) return(0);  // ничего не считаем и ничего не рисуем на графике         
   
   int      start_pos,   // точка старта
            count_tick;
   MqlDateTime str1,str2;
   

   if(prev_calculated==0) 
      {
      old_time=0;
      count_tick=0;
      start_pos=rates_total-3;
      }
   else start_pos=prev_calculated-1;
//--- расчет 
   for(int i=start_pos;i<rates_total;i++)
     {
      TimeToStruct(TimeCurrent(),str1); // время сервера
      TimeToStruct(time[i],      str2); // время бара  
      if(str1.min!=str2.min) {
      // Сбой - тик принадлежит не своему бару
         count_tick++;
         Print("тик №=",count_tick," i=", i," c=",close[i]," time[i]=",time[i]," time=",TimeCurrent()," delta=",str1.sec);
      }   
      } // end for(...
   return(rates_total);
  }
ログ

2010.06.18 10:42:03 prov_tick (EURUSD,M1) tick #=6 i=50558 c=1.23797 time[i]=2010.06.18 08:41:00 time=2010.06.18 08:42:05 delta=5

2010.06.18 10:40:59 prov_tick (EURUSD,M1) tick #=5 i=50557 c=1.23848 time[i]=2010.06.18 08:40:00 time=2010.06.18 08:41:01delta=1 です。

2010.06.18 10:40:01 prov_tick (EURUSD,M1) tick #=4 i=50556 c=1.23862 time[i]=2010.06.18 08:39:00 time=2010.06.18 08:40:04delta=4

2010.06.18 10:39:03 prov_tick (EURUSD,M1) tick #=3 i=50555 c=1.23881 time[i]=2010.06.18 08:38:00 time=2010.06.18 08:39:05delta=5を 設定。

2010.06.18 10:38:30 prov_tick (EURUSD,M1) tick#2 i=50554 c=1.23859 time[i]=2010.06.18 08:37:00 time=2010.06.18 08:38:31 delta=31

2010.06.18 10:38:30 prov_tick (EURUSD,M1) tick#1 i=50553 c=1.23858 time[i]=2010.06.18 08:36:00 time=2010.06.18 08:38:31 delta=31

最初の2ティックがはっきりしているのは、インジケータースタートですね。しかし、次のものは・・・。サーバーの時間に従って新しいバーが 存在し、このティックは古いバーに属していることが判明しました。夜、このデルタは悪夢のようだ...。

開発者への質問は、バグですか? それとも、そう考えられていたのですか?

ログにそう書きながらZ.I.

2010.06.18 10:45:09 prov_tick (EURUSD,M1) tick #=9 i=50561 c=1.23787 time[i]=2010.06.18 08:44:00 time=2010.06.18 08:45:12delta=12

ファイル:
prov_tick.mq5  2 kb
 
Prival:

夜中、バーの開始時刻がエラーで反映されてしまうという、とても不思議なことに気づきました。今度はそれを確認しようと思い、テスト用のインジケータを作成しました


rates_totalの値をoutputに追加すると、現在のバーの分と前のバーの分を比較するときにエラーが発生することがわかります。

2010.06.18 11:53:18     prov_tick_src (EURUSD,M1)       тик №=4 i=51420 rates_total=51422 c=1.23997 time[i]=2010.06.18 09:51:00 time=2010.06.18 09:52:06 delta=6
2010.06.18 11:52:12     prov_tick_src (EURUSD,M1)       тик №=3 i=51419 rates_total=51421 c=1.24061 time[i]=2010.06.18 09:50:00 time=2010.06.18 09:51:00 delta=0

すなわち、time[rates_total-2]である。

また、デルタの出力も完全にはわからない。

https://www.mql5.com/ru/docs/basis/function/events#oncalculate

パラメータ open[]、high[]、low[]、close[]には、現在のタイムフレームの始値、最大値、最小値、終値を表す配列が格納されます。パラメータtime[]はオープン時間の値の配列を含み、パラメータspread[]はスプレッドの履歴の配列を含みます(取引商品にスプレッドが指定されている場合)。パラメータ volume[] と tick_volume[] には、それぞれ取引量と呼値の履歴が格納される。

Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
Основы языка / Функции / Функции обработки событий - Документация по MQL5
 
Prival:

夜中、バーの開始時刻がエラーで反映されてしまうという、とても不思議なことに気づきました。今すぐ確認しようと思い、テスト用のインジケータを作りました

ログ

2010.06.18 10:42:03 prov_tick (EURUSD,M1) tick #=6 i=50558 c=1.23797 time[i]=2010.06.18 08:41:00 time=2010.06.18 08:42:05 delta=5

2010.06.18 10:40:59 prov_tick (EURUSD,M1) tick #=5 i=50557 c=1.23848 time[i]=2010.06.18 08:40:00 time=2010.06.18 08:41:01delta=1

2010.06.18 10:40:01 prov_tick (EURUSD,M1) tick #=4 i=50556 c=1.23862 time[i]=2010.06.18 08:39:00 time=2010.06.18 08:40:04delta=4

2010.06.18 10:39:03 prov_tick (EURUSD,M1) tick #=3 i=50555 c=1.23881 time[i]=2010.06.18 08:38:00 time=2010.06.18 08:39:05delta=5

2010.06.18 10:38:30 prov_tick (EURUSD,M1) tick #=2 i=50554 c=1.23859 time[i]=2010.06.18 08:37:00 time=2010.06.18 08:38:31delta=31

2010.06.18 10:38:30 prov_tick (EURUSD,M1) tick #1 i=50553 c=1.23858 time[i]=2010.06.18 08:36:00 time=2010.06.18 08:38:31delta=31

最初の2ティックがはっきりしているのは、インジケータースタートですね。しかし、次のものは・・・。サーバーの時間に従って新しいバーが存在し、このティックは古いバーに属していることが判明しました。夜、このデルタは悪夢のようだ...。

開発者に質問ですが、これはバグですか、それともそのように設計されているのですか?

Z.I.を書きながら、ログに表示されるのはこんな感じです。

2010.06.18 10:45:09 prov_tick (EURUSD,M1) tick #=9 i=50561 c=1.23787 time[i]=2010.06.18 08:44:00 time=2010.06.18 08:45:12delta=12

以下のようにテストしてみてください。ループなし。

      TimeToStruct(TimeCurrent(),      str1); // время сервера
      TimeToStruct(time[rates_total-1],str2); // время последнего бара  

さらに本文に。

 
stringo:

以下のように確認してみてください。サイクルなし。

次は本文です。

おっと、了解です、ありがとうございますループ内のチェックを行いました。

   if(old_time<time[i]) 
         {
         Print("НОВЫЙ бар");
         old_time=time[i];
         //...
         }  
// а нужно вот так
   if(old_time<time[rates_total-1]) // работаем только по завершенным барам
         {
         Print("НОВЫЙ бар");
         old_time=time[rates_total-1];
         //...
         } 

新バーiの時点では変わっていない。経済的ではなく、同じデータを繰り返し計算しています。とはいえ...

https://book.mql4.com/ru/samples/icustom fig.119はMQL5では除外されているのでしょうか? そしてこのインジケーターテンプレートは常に正しい終値を出力するのでしょうか? それとも何か落とし穴があるのでしょうか?

input int   MaxBars=240;
datetime old_time=0;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()  {return(0);}
//+------------------------------------------------------------------+
//| 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[])
  {
//---
   if(prev_calculated==0) 
      {
      //... расчитать историю
      //...
      old_time=time[rates_total-1];
      }
// работаем только по завершенным барам
   if(old_time<time[rates_total-1]) 
      {
      old_time=time[rates_total-1];
      Print("НОВЫЙ бар close[1]=", close[rates_total-2]);
      }  
//--- return value of prev_calculated for next call
   return(rates_total);
  }
追伸:科学をありがとう
Создание пользовательских индикаторов - Простые программы на MQL4 - Учебник по MQL4
  • book.mql4.com
Создание пользовательских индикаторов - Простые программы на MQL4 - Учебник по MQL4
 
sergey1294:
EAを実行し始めると、テスターではターミナル全体がクラッシュしてしまいますが、チャートに表示させるとすべてうまくいきます。

約110のパラメータを消化できることが経験上証明されている(質問もある)。120で、Expert Advisorをテスターで指定すると端末がクラッシュします。


すでに非公開でいくつかの解決策を示しましたが、何かあれば開発者に聞くこともできます。この制限に対応してくれるかもしれない...。

 
Interesting:

約110のパラメータを消化できることが経験上証明されている(質問もある)。120では、Expert Advisorをテスターで指定すると端末がクラッシュします。


すでに非公開でいくつかの解決策を示しましたが、何かあれば、開発者に聞いてみてください。この制限に対応してくれるかもしれない...。

もちろん、このような制限がテスターに影響するのは不思議なことです。例えば、クアッドでは、そのような問題はありません
 

スクリプトを実行すると、週末の相場が表示されなくなります。

Print(TimeCurrent())を実行します。

出来栄え

2010.06.20 00:26:06 00 (usdjpy,m1) 2010.06.18 22:35:52

最後のバーには2010.06.18 23:00:00の時刻が表示されていますが

というのは不思議なもので、ある機能の正しさをテストするのにとても不便なのです。

 

インジケーター設定ウィンドウの「適用」ボタンが見当たらない。


 
Interesting:

約110のパラメータを消化できることが経験上証明されている(質問もある)。120では、Expert Advisorをテスターで指定すると端末がクラッシュします。

すでに非公開でいくつかの解決策を示しましたが、何かあれば、開発者に聞いてみてください。この制限に対応してくれるかもしれない...。

最大64個のパラメータを最適化することができます。
 
stringo:
最大64個のパラメータを最適化することができます。
64を 最適化し、テスターで約110を 使用(最適化なし)。もちろん、110というのはExpert Advisorにとってすでに「悪夢」のようなパラメータ数ですが(でも、よくあることです)...。