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

 
Alexey Viktorov:

時間から時間を引いたものをPeriodSeconds()で割ったもの

ということで、金曜と月曜の移行時に長さが間違っている可能性があります(あるいは履歴にミスバーがある場合)。

ポイントタイムを読み込んでから、バーを定義するのがよいでしょう。

datetime time1=(datetime)ObjectGetInteger(ExtChartID,name,OBJPROP_TIME,0);
datetime time2=(datetime)ObjectGetInteger(ExtChartID,name,OBJPROP_TIME,1);

int bar1=iBarShift(_Symbol,_Period,time1);
int bar2=iBarShift(_Symbol,_Period,time2);
 
Taras Slobodyanik:

ということで、金曜と月曜の移行時に長さが間違っている可能性があります(あるいは履歴にミスバーがある場合)。

ポイントの時刻を読み、バーを特定するのがよいでしょう。

同意見です。自分にも脳にも迷惑をかけなかった。それなら、日付と日付の間のバーの本数を 取る方がいい。

int  Bars( 
   string           symbol_name,     // имя символа 
   ENUM_TIMEFRAMES  timeframe,       // период 
   datetime         start_time,      // с какой даты 
   datetime         stop_time        // по какую дату 
   );
 
int start()
{
  if(Check()==false)
      return;  
      
  int TotalOrders;
  double NewPrice, NewLots, NewTP, NewSL;
  /*****************************************************************************/
  /* Здесь часть кода, которая работает при каждом новом тике                  */ 
  /*****************************************************************************/
  TotalOrders = CountOfOrders(); 
     double sprd = Ask-Bid;
     int tot = CountOfOrders2();
     double spred = spred/Point*(tot-1);

  if(tot > 1)PercCloseDown();


この部分にエラーと書かれています



ロボットの起動方法を教えてください。


 
Ivan Butko:

この部分はエラーを書き込みます

ロボットを起動させる方法は?

ここでは、変数が宣言され、すぐに分割されます。

double spred = spred/Point*(tot-1); 

このエラーは、コンパイラがこの変数(spred)を未宣言として扱っていることを示しています。 また、この(変数)は初期化されていないので、少なくとも良くありません。グローバル変数ではないので、未定義の値を持っているかもしれません...

先に宣言して値を代入してみる
 
Yevhenii Levchenko:

ここでは、変数が宣言され、すぐに共有されます。

このエラーは、コンパイラがこの変数(spred)を未宣言として扱っていることを示しています。 これは、少なくとも、この変数が初期化されていないこと、つまりグローバル変数 ではないので、未定義の値がある可能性があることも良くありません...。

早めに宣言して値を代入してみる

ユージン、心の底から!
出番です、ありがとうございました。

 

MQL5の場合、どうすればいいのか......

if(BarsCalculated(handle) == -1)

...分ほど経ちますが、問題は同じです。なぜそんなに長く?


エラー 4806 - 要求されたデータが見つかりませんでした ...- ...どうすればEAに発見させることができるのでしょうか?

 
Ivan Butko:
int start()
{
  if(Check()==false)
      return;  
      
  int TotalOrders;
  double NewPrice, NewLots, NewTP, NewSL;
  /*****************************************************************************/
  /* Здесь часть кода, которая работает при каждом новом тике                  */ 
  /*****************************************************************************/
  TotalOrders = CountOfOrders(); 
     double sprd = Ask-Bid;
     int tot = CountOfOrders2();
     double spred = spred/Point*(tot-1);

  if(tot > 1)PercCloseDown();


この部分にエラーと書かれています



ロボットの起動方法を教えてください。


61行目、どの行でしょうか?
 

メモリ不足のエラーをキャッチするにはどうすればよいですか?


そもそも、このメッセージは何が原因なのでしょうか?


2万行ほどのプログラムを書きました。いろいろなクラスや配列、構造体があるんです。

2〜3日に1回程度、「メモリ不足」のメッセージが出る。

どの関数がメモリリークの原因になっているのか、追跡する方法がわかりません。

 
Sergey Likho:

メモリ不足のエラーを検出するにはどうすればよいですか?


そもそも、このメッセージは何が原因なのでしょうか?


2万行ほどのプログラムを書きました。いろいろなクラスや配列、構造体があるんです。

2〜3日に1回程度、メモリ不足のメッセージが表示されます。

どの関数がメモリリークを起こしているのか、どのように捕捉すればいいのかわかりません。

それぞれのnewにdeleteがあることを確認する

つまり、あなたのコードを注意深く読むことによってのみ、です。より読みやすく、より楽しくするために、コメントアウトすることができます :-)

また、クラスごとにテストケースのスクリプトを作成し、クラス内部のリークをチェックするのも良い方法です。

 
Maxim Kuznetsov:

各新規に独自の削除があることを確認する

つまり、コードを注意深く読むだけでいいのです。より読みやすく、より楽しくするために、コメントも受け付けています :-)

また、クラスごとにテストケースのスクリプトを書き、クラス内部のリークをチェックするのも良い方法です。

新品、削除は未使用です。クラス要素は最初に定義されているので、作り直しはしない。

主にアレイを扱うことが多いです。


テストケースのスクリプトとは何ですか?