記事"MQL5入門: シンプルなExpert Advisorとカスタムインディケーターの書き方"についてのディスカッション - ページ 2

 
Rosh:

インジケーター・バッファーの場合は、SetIndexBufferと 書かれている:

エキスパート・アドバイザーの場合も同様です。

まだ類似していない。このコードをチェックするとき

//+------------------------------------------------------------------+
//|Test002.mq5
//+------------------------------------------------------------------+
double high[];
int bars;
//+------------------------------------------------------------------+
//| エキスパート初期化関数|
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   bars=Bars(Symbol(),PERIOD_CURRENT);
   ArraySetAsSeries(high,true);
//---
   return(0);
  }
//+------------------------------------------------------------------+
|エキスパート初期化関数|
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
  }
//+------------------------------------------------------------------+
//| エキスパートティック機能|
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   int copied=CopyHigh(Symbol(),0,0,bars,high);
   return;
  }
//+------------------------------------------------------------------+

return 演算子の反対側にブレークポイントを置いた。デバッガは次のような結果を出力した。high "dynamic array[8563], S"。Sは "Series "の略だと理解しています。

 
Yedelkin:

類推はまだ働かない。このコードをチェックすると

return 演算子の反対側にブレークポイントを置いた。デバッガは次のような結果を生成した: high "dynamic array[8563], S"。Sが "Series "の略であることは理解している。

では、なぜ動かないのか?疑問があれば、ArrayGetAsSeries 関数で系列を明示的にチェックするように設定する:

//+------------------------------------------------------------------+
//|Test_ArraySetAsSeries.mq5
//| 著作権 © Copyright 2010, MetaQuotes Software Corp.
//|http://mql5.commql5.com
//+------------------------------------------------------------------+
#property copyright "Copyright 2010, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
double high[];
int bars;
//+------------------------------------------------------------------+
//| エキスパート初期化関数|
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   bars=Bars(Symbol(),PERIOD_CURRENT);
   ArraySetAsSeries(high,true);
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| エキスパート・ティック機能|
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   int copied=CopyHigh(Symbol(),0,0,bars,high);
   bool IsSeries=ArrayGetAsSeries(high);
   return;
  }
//+------------------------------------------------------------------+

結果


 
Rosh писал(а) :

うまくいかない理由疑わしい場合は、ArrayGetAsSeries 関数で直列性を明示的にチェックしてください:

何のことか思い出してほしい。私は、配列がコピーされた後にのみ、常にインデックスを付けるべきかどうかを尋ねていたのです。あなたはSetIndexBuffer 関数の注釈を参照し、EAでも同じであるべき だと言いました。このSetIndexBuffer 関数の注釈は、「リンクされた 配列があらかじめ時系列の ようにインデックス付けされるように設定されていたとしても、リンク後、動的配列 buffer[] 通常の配列のようにインデックス付けされる」という ことを意味しています

従って、CopyTime関数、CopyHigh関数、CopyLow関数を使用した後、受信配列も通常の配列のようにインデックスを付けなければならないという点で、EAのアナロジーを見ました。このアナロジーをテストするために、OnInit()関数の中で、CopyHigh関数の前にArraySetAsSeries関数を配置しました。しかし、私の例と、ご指摘のArrayGetAsSeries 関数による明示的な直列化チェックによると、CopyHigh関数を使用した後、受信配列high[]の(時系列として)事前設定されたインデックス付けは変更されていません。このことは、SetIndexBuffer 関数との類似性がまだ観察されていないことを示しています。

 

Yedelkin:

このアナロジーをテストするために、OnInit()関数の中で、CopyHigh関数の前にArraySetAsSeries関数を配置しました。しかし、私の例と、ご指摘のArrayGetAsSeries 関数による明示的な直列化チェックでは、CopyHigh関数を使用した後、受信配列high[]の事前設定されたインデックス(時系列)は変更されていません。

実際には、OnInit()または他の関数でグローバル配列のシリアライズを設定した後、このシリアライズは他のどこでも変更されないという意味です。唯一の例外は、SetIndexBuffer() 関数に関するものです。

この問題については合意が得られたと思いますので、この問題は解決したと考えてよいでしょう。

 

はい、質問は解決しました。明確にしてくれてありがとう!

 

いくつか質問がある。

1.

   if(CopyTime(Symbol(),0,0,i,t)<i || CopyHigh(Symbol(),0,0,i,h)<i || CopyLow(Symbol(),0,0,i,l)<i)
     {
      Print("時系列のコピーに失敗!");
      return;
     }

if... 演算子では、return 演算子がOnTick 関数の実行を終了するために使用されます。" とあります。

OnTickif (......) {...} からではないのですか?

2.

   for(i=0;i<PositionsTotal();i++) {…}

MQL4では 逆引きが推奨されていた。

for(i= PositionsTotal();i>0;i--) {…}
何が良いのでしょうか?

3.Expert Advisorとindicatorをダウンロードした(Opera 10.54モデレーター用、添付ファイルのダウンロードに問題がある)。すべてコンパイルした。先月を選択し、M 5のテスターで開始しました。

ログ

2010.05.15 13:16:02 Core 1 接続切断

2010.05.15 13:16:01 Core 1 ログファイル "D:˶MetaTrader 5TesterAgent-127.0.0.1-3000logs ˶20100515.log "が書き込まれました。

2010.05.15 13:16:01 Core 1 EURUSD,M5: 553908 ticks (2580 bars) generated within 1431016 ms (total bars in history 100352)

2010.05.15 13:16:01 Core 1 OnTester 結果 0

2010.05.15 12:52:13 Core 1 EURUSD,Daily: 履歴は 2009.01.02 00:00 から始まる。

2010.05.15 12:52:13 Core 1 EURUSD,Daily:ヒストリキャッシュは推定355バー分予約済み

2010.05.15 12:52:13 Core 1 EURUSD: 2009.01.02 06:01から2010.05.03 00:00までの484483件のM1レコードを含む。

2010.05.15 12:52:10 コア 1 ロット=0.100000

2010.05.15 12:52:10 コア1 MAper=240

2010.05.15 12:52:10 コア 1 EndHour=19

2010.05.15 12:52:10 コア 1 StartHour=7

2010.05.15 12:52:10 Core 1 EURUSD,M5: Expertsexpert.ex5 のテストを 2010.05.01 00:00 から 2010.05.14 00:00 まで入力で開始:

約定に非常に時間がかかり、一度も取引を開始しませんでした。自動売買は許可されています。ログにはメッセージはありません。インジケータとExpert Advisorはあるべき場所にあります。Windows XP,MT (build 274)

4.デバッグモードを試して みたが、うまくいかない。おそらく土曜日のせいだろう。引用符がない。ストップポイントは記事と同じにしました。もし私が正しければ、営業日にしかデバッグできないことが判明し、残念です。デバッグには、必要なデータと(あるいは)典型的なデータ(1日の歴史の一部としよう)を含む自分のファイルをアップロードできれば十分だろう。

5.コピー 機能を研究された方がいらっしゃいましたら...バーが欠損している場合、どのように機能するのか情報を教えてください。記事を注文したほうがいいかもしれませんが。

 
Prival:

いくつか質問がある。

1. if... 演算子では、return 演算子がOnTick 関数の実行を終了するために使用されます。" とあります。

if (......){...}からではなく、OnTick?

return演算子returnの 説明より

Оператор return прекращает выполнение текущей функции и возвращает управление 
вызвавшей программе. Результат вычисления выражения возвращается вызываемой 
функции. Выражение может содержать оператор присваивания.

この例のreturn 文の現在の関数はOnTick() です

非公開:

4.デバッグモードを試してみたが、うまくいかない。おそらく土曜日のせいだろう。引用なし。停止位置は記事と同じにしました。デバッグができるのは営業日だけなのが残念です。デバッグには、必要なデータと(あるいは)典型的なデータ(1日の歴史の一部としよう)を含む自分のファイルをアップロードできれば十分だろう。

このサイトでは、デバッグに関する似たような質問をすでに取り上げている。興味のある方は、検索で「デバッグ」と検索してください。

 

自動アップデート(ビルド 275)をロードした後、コンパイラーは以下のタイプの条件がチェックされる行で警告を生成し始めました。

if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
警告は同じタイプです:
implicit enum conversion Perito02-04 temp3.mq5 1233 45
質問:コンパイラの正しい動作は、指定された状況でこれらの警告が表示されることを意味するのでしょうか?どのような「変換」について話しているのでしょうか?
 
Yedelkin :

自動アップデート(ビルド275)をロードした後、コンパイラは、型の条件がチェックされる行で警告を生成し始めました。

質問:コンパイラの正しい動作は、指定された状況でこれらの警告が表示されることを意味しますか?どのような「変換」について話しているのでしょうか?

警告は、プログラマーに注意を払わせ、コードを再チェックさせるために導入された。

関数の結果を列挙子に、あるいは列挙子を int に明示的にキャストすることで、警告を取り除くことができます。

 
Prival:

いくつか質問がある。

1. if... 演算子では、return 演算子がOnTick 関数の実行を終了するために使用されます。" とあります。

if (......){...}からではなく、OnTick?

演算子内の条件の少なくとも1つが満たされた場合

if(CopyTime(Symbol(),0,0,i,t)<i || CopyHigh(Symbol(),0,0,i,h)<i || CopyLow(Symbol(),0,0,i,l)<i)

つまり、配列の少なくとも 1 つが完全にコピーできなかった(十分なヒストリカルデー タがない、またはエラーが発生した)場合、OnTick 関数は 終了します。

2.MQL4では 逆の列挙が推奨されていました。

何が良いのでしょうか?

バリエーション

for(i=0;i<PositionsTotal();i++)

и

for(i=PositionsTotal()-1;i>=0;i--)

は等価ですが、最初のバリアントの方がテキスト形式では短いので、それを使いました。

3.Expert Advisorとindicatorをダウンロードした(Opera 10.54では添付ファイルのダウンロードに問題がある)。すべてコンパイルした。M5の テスターで先月を選択して実行した。

実行に非常に時間がかかり、一度も取引を開始しませんでした。自動売買は許可されています。ログにメッセージはありません。インジケータとExpert Advisorはあるべき場所にあります。Windows XP,MT (build 274)

4.デバッグモードを試してみましたが、動きません。おそらく土曜日のせい。引用なし。停止位置は記事と同じにしました。デバッグができるのは営業日だけなのが残念です。デバッグには、必要なデータと(あるいは)典型的なデータ(1日の歴史の一部としよう)を含む自分のファイルをアップロードできれば十分だろう。

5.コピー 機能を研究された方がいらっしゃいましたら...バーが欠損している場合、どのように機能するのか情報を教えてください。記事を注文したほうがいいかもしれませんが。

正直なところ、私のテスターもあまりうまく動作していません。テストはMQL4で同様のEAをテストするよりもはるかに時間がかかります。

OnTick 関数と OnCalculate 関数は新しい気配値を受信すると起動するため、デバッグには気配値を受信する必要があります(週末には動作しません)。そうでなければ、デバッガーは正常に動作します(試してみて、何かあれば私に聞いてください)。

array-timeseriesについて: - 配列の方向はいつでも両方向に変更可能である