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

 

皆さん、こんにちは。

初心者がクラスでの配列の使い方を理解するのにお役立てください。キーコードを小さく切って問題を表現してください。

class base
{
protected:
int Stf_ZZ_Handle;
double Stf_ZZ_Val[];
public:
void InitArray()
  {
   Stf_ZZ_Handle=iCustom(_Symbol,_Period,"Examples\\ZigZag",12,0,0);
   ArraySetAsSeries(Stf_ZZ_Val,true);
   CopyBuffer(Stf_ZZ_Handle,0,0,200,Stf_ZZ_Val);
   Print("array[0]= ",Stf_ZZ_Val[0]);
  }
};
class second : public base
  {
    public:
    void Printer() {Print("array[0]= ",Stf_ZZ_Val[0]);}
  };
int OnInit()
  {
//---
base Cbase;
second Csecond;
Cbase.InitArray();
Csecond.Printer();
//---
   return(0);
  }

実行時に、継承したクラスの文字列でArray out of rangeというエラーが発生し、親クラスでは期待通りの0が表示されます。

2012.02.13 00:41:25 2011.01.01 00:00:00 'test1.mq5' の配列が範囲外である (29,36)
2012.02.13 00:41:25 2011.01.01 00:00:00 array[0]= 0.0

   void Printer() {Print("array[0]= ",Stf_ZZ_Val[0]);}

通常の変数ではこのような処理でエラーになることはないのですが、継承元のクラスへの配列の渡し方(アドレス)が間違っていることは理解しています。

私は何を間違えているのだろう?

 

最近、*.mq5 ファイルを実行すると、このメッセージが頻繁に表示されるようになりました。

何が問題なのでしょうか?

 
Radix:

みなさん、こんにちは。

base Cbase;
second Csecond;
Cbase.InitArray();
Csecond.Printer();

私は何を間違えているのだろう?

ほら、2行目で「second Csecond;」と宣言しても、InitArray()メソッドは呼ばれないでしょ?同時に、Csecondオブジェクト自体もすでに生成されている。 つまり、「Csecond.File」を呼び出すと、「Csecond.File」が生成されることが判明したのだ。Printer();" は、初期化されていない無次元配列 Stf_ZZ_Val[] を指しています。

 
テスト時に、開始日からの利用可能な履歴の1000バー制限(MT4と同様)を解除したかどうか教えてください。
 
muallch:

MT4のように、開始日から1000本の履歴を利用できるという制限は、テスト中に削除されたのでしょうか?

どういう意味か説明してください。

ファイブでは、テスト開始時から前年度のデータを読み込む。そのため、2012.02.01からテストする場合、データは2011.01.01から読み込まれます。

唯一の例外は、日、週、月でのテストです。そこでのデータの開始は、テスト開始前に100本のバーを持つ必要性に基づいて計算されます。

 
stringo:

どういうことなのか説明してください。

日足で 2011.01.01などから実行する場合、少なくとも3000本以上の履歴が必要です。そのため、テストに必要な期間よりも長い期間を承知の上で設定し、プログラム的に「開始点」をトレースする必要があるのです。検査時に全履歴を提供することの難しさとは(あるいは要求に応じて)?
 
また、テストではなく、実際の自動売買で履歴が使えるかどうかという問題もあります。この場合、どうしたらいいのでしょうか?テスターは裏をかかれる...。
 
muallch:
例えば2011.01.01から日足データで 実行する場合、最低でも3000本の履歴が必要です。つまり、テストに必要な期間より長い期間を承知の上で設定し、プログラム的に「開始点」を追跡する必要があるのです。検査時に全履歴を提供することの難しさとは(あるいは要求に応じて)?

難しさはまったくありません。テスト設定 に余分なチェックボックスを導入すると、多くのユーザーにとって理解しがたく、誤用されるケースが多くなるため、避けました。

承知の上で長い期間を指定するのは正常な解答です。

別の解決策 - 月単位でテストを注文し、日次指標と価格データを使用する(すなわち、PERIOD_CURRENTの代わりにPERIOD_D1を明示的に設定する)ことです。

 
muallch:

また、テストではなく、実際の自動売買で履歴が使えるかどうかという問題もあります。この場合、どうしたらいいのでしょうか?テスターは裏をかかれる...。
利用可能なすべての履歴をダウンロードすることができます。ドキュメントにあるデータアクセス組織を ご覧ください。
 

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

余談ですが、私はインターネット経由でリモートエージェントとテストしています。開店 価格でテストしているのに、なぜエージェントは完全な分履歴を取得するのですか?テスト開始前の準備時間は1時間など、ただただ猥雑である。10〜100メガビットのパイプを持つ人には良いが、ここではわずかなメガビットに留まっている...。

Документация по MQL5: Стандартные константы, перечисления и структуры / Константы индикаторов / Ценовые константы
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы индикаторов / Ценовые константы
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы индикаторов / Ценовые константы - Документация по MQL5