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

 

私は同じ種類のオブジェクトを含む大規模なプログラムを持っています。多くの種類があるということです。しかし、それらはプログラムの異なるモジュールで繰り返されます。そして、テストが 終わった後のログには、例えば、xxx undeleted objectsと出ています。などなど、数種類。

オブジェクトが削除されていない箇所を調べるにはどうしたらよいですか?このためのツールキットはありますか?

 
mbjen:

私は同じ種類のオブジェクトを含む大規模なプログラムを持っています。多くの種類があるということです。しかし、それらはプログラムの異なるモジュールで繰り返されます。そして、テストが終わった後のログには、例えば、xxx undeleted objectsと出ています。などなど、数種類。

オブジェクトが削除されていない箇所を調べるにはどうしたらよいですか?このためのツールキットはありますか?

1930年ビルドのバグ

 
テストEAがなぜか価格より下にBUYSTOPをオープン!?今は手動で注文を閉じることもできない。こんなことが可能なのか?
ファイル:
 

MQl5がOpenCLをサポートしていることに驚きました。

この間、誰もロボット用のオプティマイザーを書かなかったのでしょうか。そうすれば、何百万回もの実行が何世紀も続くことはなく、少なくとも何年かは続くはずです。:)

 
Igor Makanu:

それは、あなたが提出したコードで、SredRazmaxとSredRazmin 変数を初期化していない、すべてのtickをカウントしていることを意味します。

変数を使う前に初期化するのは良い習慣です。大学でもそう教えていますし、バグを見つけるのにかかる時間を短縮できます ;)

私は最初にそれらを初期化し、コメントでは、要素ごとに別の配列要素を見ることができます(チェックし、0は変化しないので、式が動作するはずです、)。以下はコードの全文です。

//+------------------------------------------------------------------+
//|                                                           01.mq4 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window

#property indicator_buffers 1
//#property indicator_color1 Red
//#property indicator_width1 1

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+

extern int ExtDepth=12;
extern int ExtDeviation=5;
extern int ExtBackstep=3;
extern int nn=30;

int shift, ww=0;
double zz, SredRazmax, SredRazmin, Sredn; 
double HZZ[];


int OnInit()
  {
//--- indicator buffers mapping
    SetIndexBuffer(0, HZZ);
 // SetIndexStyle(0, DRAW_SECTION);
//---
   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(shift = 0; shift <= Bars-1; shift++)
  {
      zz = iCustom(NULL, 0, "ZigZag", ExtDepth, ExtDeviation, ExtBackstep, 0, shift);
           if(zz > 0.0)
           {
           HZZ[ww]=zz;
           ww++;          
           }
  }
   
  
       for(ww=0;ww<=nn;ww++)
       {
      if(HZZ[ww]>HZZ[ww+1]){SredRazmax += HZZ[ww];}     
      if(HZZ[ww]<HZZ[ww+1]){SredRazmin += HZZ[ww+1];}
      
       
  Comment("Средний размах = ", (SredRazmax-SredRazmin)/nn,",",HZZ[0],",",HZZ[1],",",HZZ[2],",",HZZ[3],",",HZZ[4]); 
        }      
   
//---------------------------------------------+
//расчет среднего значения           
//---------------------------------------------+      

   //    for(ww=0;ww<=nn;ww++){
   //    if(HZZ[ww]>HZZ[ww+1]){Sredn += HZZ[ww]-HZZ[ww+1];}     
   //    if(HZZ[ww]<HZZ[ww+1]){Sredn += HZZ[ww+1]-HZZ[ww];}
       
 // Comment("Средний размах = ", Sredn,",",HZZ[0],",",HZZ[1],",",HZZ[2],",",HZZ[3],",",HZZ[4]); 

            
         
     
       
//--- return value of prev_calculated for next call
    return(0);

  }
 
Artyom Trishkin:

ビルド1930からのバグ

何ですか?MT4を持っています。ビルド1090です。

 
mbjen:

何ですか?MT4を持っています。ビルド1090です。

new で生成されたオブジェクトは、オブジェクト配列に付加されるか、OnDeinit() で自ら削除されなければならない。
 
Dmitry Belov:

私は最初にそれらを初期化し、コメントは要素ごとに別の配列を出力します(見て、0は変化しないので、式が動作するはずです、)。以下はコードの全文です。

最初でもどこでも初期化せず、ただ宣言しただけなんですね

使用前に書きましたが、つまり、変数SredRazmax, SredRazmin, Srednが配列値の合計である場合、正しく合計を計算するためには、変数をゼロにしてから配列値を足して、この変数に保存する必要があります。

即ち

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[])
  {
//---
    SredRazmax = 0.0;
    SredRazmin = 0.0;
    Sredn = 0.0;
    .....

次に、ご質問の件ですが、インジケータでは、1ティックごとにOnCalculate() が呼び出され、1ティックごとにZigZagの先頭を常にカウントすることになります、つまり、1秒間に約40-60回 です。

 
Artyom Trishkin:
new で生成したオブジェクトは、オブジェクト配列にアタッチするか、OnDeinit()で単体で削除する必要があります。

啓発をありがとうございます。でも、私の質問くらい読んでくださいよ。

 
mbjen:

啓発をありがとうございます。でも、私の質問くらい読んでくださいよ。

して、それに答えました。