初心者の方からの質問 MQL5 MT5 MetaTrader 5 - ページ 440

 

こんにちは 2015.09.17_19:07GMT+3 です。EAプログラムでダイナミックアレイの次元を設定しました。そして、コンパイラはエラーを出す。"コンマ期待"。また、プログラム文中に変数がある場合、--は「変数 such-and-such hides variable declaration at global level」という警告を出す。理解できない。ヘルプのように、すべてが正しく表示されているようです。以下は、コードの一部です。

//--- 最大バー価格の配列

bool ArraySetAsSeries(double &High[],bool);

//---

bool ArraySetAsSeries(double &Low[],bool)。

//--- リザーブ(reserve)で配列のサイズを設定します.

int ArrayResize(double &mrate[],int 16,int 9);

int ArrayResize(double &maVal[],int 16,int 9);

int ArrayResize(double &fVal[],int 3,int 2);

int ArrayResize(double &zVal[],int 3,int 0);

int ArrayResize(double &High[],int 1,int 0);

int ArrayResize(double &Low[],int 1,int 0);

//+------------------------------------------------------------------+

//| 専門家による初期化関数

//+------------------------------------------------------------------+

void OnDeinit(const int reason)

//--- массив максимальных цен баров
bool ArraySetAsSeries(double &High[],bool);
//---  
bool ArraySetAsSeries(double &Low[],bool);
//--- устанавливаю размеры массивов с запасом (reserve)
int  ArrayResize(double &mrate[],int 16,int 9);
int  ArrayResize(double &maVal[],int 16,int 9);
int  ArrayResize(double &fVal[],int 3,int 2);
int  ArrayResize(double &zVal[],int 3,int 0);
int  ArrayResize(double &High[],int 1,int 0);
int  ArrayResize(double &Low[],int 1,int 0);  
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {コンパイラがエラーを発生させる

{

 
Николай Никитюк:

こんにちは 2015.09.17_19:07GMT+3 です。EAプログラムでダイナミックアレイの次元を設定しました。そして、コンパイラはエラーを出す。"コンマ期待"。そして、もしプログラムテキストの中に

  1. High[]、Low[]という名前の配列は、array-timeseriesの予約システム名であるため、宣言できない。
  2. ArrayResize のスペルが間違っている。こうでなければならない。
    //--- устанавливаю размеры массивов с запасом (reserve)
    ArrayResize(mrate,16,9);
    ArrayResize(maVal,16,9);
    ArrayResize(fVal,3,2);
    ArrayResize(zVal,3);
  3. また、配列に時系列フラグを設定すると、次のようになります。
    //--- массив максимальных цен баров
    ArraySetAsSeries(High,true);
    //---  
    ArraySetAsSeries(Low,true);
 
2015.09.17_19:45 GMT+3.念のため、.pngファイルを添付しておきます。
ファイル:
 
Karputov Vladimir:
  1. High[]、Low[]という名前の配列は、タイムストリーム配列のシステム名として予約されているため、宣言できません。
  2. ArrayResize のスペルが間違っている。このように書くべきでしょう。
ありがとうございました。回答が早かったですね。午後8時に退社。残りは後で見ます。19:54 MSC
 
Karputov Vladimir:
私のコードを指しているのであれば、はい、私のコードは新しいバーをチェックしています。
私は添付したコードに興味があります - それが何をするのか理解したいです。
 
-Aleks-:
私は、添付したコードに興味があります。

いただいたコードでは何もできない、というか動きません。エラーです。

if(TimeN==0)
      TimeN=TimeC;

この条件は一度だけ、つまり最初にプログラムを実行したときだけ機能します。この時点で、スタティック変数は 初期化されます。

あなたのコードの変数TimeNは永遠のゼロ(というより1970年1月1日の日付)に等しく、この永遠のゼロは現在のバーが開く時間に等しい変数TimeCと比較されるので、以下の条件はチェックする意味が全くありません。)

   if(TimeN==TimeC)
      return;
 
Karputov Vladimir:

いただいたコードでは何もできない、というか動きません。エラーです。

この条件は一度だけ、つまりプログラムの初回起動時にのみ機能します。この時点で、スタティック変数は 初期化されます。

あなたのコードの変数TimeNは永遠のゼロ(というより1970年1月1日の日付)に等しく、この永遠のゼロは現在のバーの開始時間に等しい変数TimeCと比較されるので、以下の条件はチェックする意味が全くありません。)

今思うと、なんで書けばよかったんだろう...。をExpert Advisorに追加しました。

分かりやすい説明ありがとうございました

 
Karputov Vladimir:

新しいバーがM1タイムフレーム上にある場合、メッセージを表示します。

私は完全なコードを与えていなかったことが判明した、正しいものは次のとおりです。

 

int init()

  { 

   static datetime TimeN=0;

   return(INIT_SUCCEEDED);

  }

 

int start()

  { 

   datetime TimeC=iTime(NULL,TF,0);

   if(TimeN==0)TimeN=TimeC;

   if(TimeN==TimeC) return(0);

   TimeN=TimeC;

  // Код программы исполняется при появлении нового бара

   return(INIT_SUCCEEDED);

  } 

その場合はうまくいきますよね?
 
-Aleks-:

私は完全なコードを与えていなかったことが判明した、正しいコードは次のとおりです。

 

int init()

  { 

   static datetime TimeN=0;

   return(INIT_SUCCEEDED);

  }

 

int start()

  { 

   datetime TimeC=iTime(NULL,TF,0);

   if(TimeN==0)TimeN=TimeC;

   if(TimeN==TimeC) return(0);

   TimeN=TimeC;

  // Код программы исполняется при появлении нового бара

   return(INIT_SUCCEEDED);

  } 

その場合、効果はあるんですよね?
このコードをコンパイルしてみましたか?OnInit()の中でTimeNという変数が宣言されており、OnInit()を終了するとこの変数は破棄されます。 そのためOnTick()関数で エラーが発生しています。
'TimeN' - undeclared identifier

以下は、その動作コードです。

//+------------------------------------------------------------------+
//|                                                         Test.mq4 |
//|                        Copyright 2015, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   static datetime TimeN;
   datetime TimeC=iTime(NULL,PERIOD_M1,0);
   if(TimeN==TimeC)
      return;
   TimeN=TimeC;
// новый бар, выполняем код
   Print("New bar");
   return;
  }
//+------------------------------------------------------------------+
 
Karputov Vladimir:
このコードをコンパイルしてみましたか?OnInit()内で変数TimeNが宣言されており、この変数はOnInit()の終了時に破棄されます。 したがって、OnTick()関数 内でエラーが発生するのです。

以下は、動作するコードです。

int OnInit() の前、つまり外部変数などが宣言されて いる部分にstatic datetime TimeN=0;と書きました。

理由: