28の通貨ペア、1人のエキスパート。もうひとつ、これは誰も見せたことがないと思うのですが、グレイルです。+ デモアカウント - ページ 12

 
Rosh:
ご質問の「EURUSDを2007.07.10~2007.07.14の範囲で、別途2007.07.09~2007.07.14の範囲で」検証してみましたが、違いはありません。


私も最新ビルドにアップデートする必要がありました。:-)確かに、時間に関する問題はなくなりましたね、よかったです。しかし、結論から言うと、話はそれだけでは終わらない。

同じ期間でEAを実行したところ、M1とH1/D1のHighとLowの間に差はありませんでした。注 - このテストは、通常の無傷のデータで実行しました。 同期などはしていません。だから、それが不一致の理由であるはずがない。

そこで、念のため別の間隔で試してみることにした(まあ、私の性格が悪いのだが)。そして、それはまだ終わっていないことがわかった。

2007.08.06から 2007.08.11まで、つまり先週までの区間を試してみてください。しかも、比較対象はD1ではなく、H1です。Expert Advisorのテキストには、コメントアウトすべき演算子が4つ、コメントアウトしない演算子が4つあります。未来へのスパイの可能性が証明されたわけでは、ありません。しかし、不具合は存在する。

また、1週間 単位で問題がないとは言い切れないようでしたので、もっと長い間隔、例えば1年とか半年とかでテストを行うべきでしょうか。

 
貴社のSimple Prospection EAのコードを確認しました。残念ながら、完璧ではなかったので、少し直しました。

 
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {   
//----
  if (start)
   {
     curHi=NormalizeDouble(Bid,Digits);
     curLo=NormalizeDouble(Bid,Digits);
     curM1 = TimeMinute(TimeCurrent());
     curH1 = TimeHour(TimeCurrent());
     curD1 = TimeDay(TimeCurrent());
     start=false;
   }
 
  mm = TimeMinute(TimeCurrent());
  hh = TimeHour(TimeCurrent());
  dd = TimeDay(TimeCurrent());
  if (mm!=curM1)
  {  if (hh!=curH1)
     {  if (dd!=curD1)
        {  
           Print("Новые сутки наступили");
           curHi=NormalizeDouble(Bid,Digits);
           curLo=NormalizeDouble(Bid,Digits);
           curD1=dd;
        }
        //curHi=NormalizeDouble(Bid,Digits);
        //curLo=NormalizeDouble(Bid,Digits);
        curH1=hh;
     }
     curM1=mm;
  }
  if (NormalizeDouble(Bid,Digits)==0) Print(TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS),"  Bid=",Bid);
  if (NormalizeDouble(Bid,Digits)>curHi) curHi=NormalizeDouble(Bid,Digits);
  if (NormalizeDouble(Bid,Digits)<curLo) curLo=NormalizeDouble(Bid,Digits);
  //HiH1 = iHigh(NULL,PERIOD_H1,0);
  //LoH1 =  iLow(NULL,PERIOD_H1,0);
  HiH1 = iHigh(NULL,PERIOD_D1,0);
  LoH1 =  iLow(NULL,PERIOD_D1,0);
  HiH1 = NormalizeDouble(HiH1,Digits);
  LoH1 = NormalizeDouble(LoH1,Digits);
 
  str = TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS);
  mHi = ", curHi=" + DoubleToStr(curHi,Digits);
  mLo = ", curLo=" + DoubleToStr(curLo,Digits);
  hHi = ", HiH1="  + DoubleToStr(HiH1, Digits);
  hLo = ", LoH1="  + DoubleToStr(LoH1, Digits);
  if (curLo==0) Print("Curlo=",curLo);
  if (curHi==0) Print("curHi=",curHi);
 
  if (HiH1!=curHi||LoH1!=curLo) 
  {  //Print(str,mHi,hHi,mLo,hLo);
     if (handle>0) FileWrite(handle,TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS),curHi,HiH1,curLo,LoH1);
  }
//----
   return(0);
  }
 
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
{  Print("Работа закончена");
   if (handle>0)
      {FileWrite(handle,"записано ",TimeToStr(TimeLocal()));
      FileClose(handle);
      } 
//---- done
   return(0);
}
シミュレーションの正しさのチェックがテスト開始直後に始まるのに対して、新しい日が来るという事実は、あなたのコードでは遅すぎる、実際には2日目に修正されています。この非対称性を排除するために、ブール変数startを導入し、テストの開始時にすべてのテスト値を固定するようにした。

  if (start)
   {
     curHi=NormalizeDouble(Bid,Digits);
     curLo=NormalizeDouble(Bid,Digits);
     curM1 = TimeMinute(TimeCurrent());
     curH1 = TimeHour(TimeCurrent());
     curD1 = TimeDay(TimeCurrent());
     start=false;
   }
ご覧の通り、一度だけ動作し、EAにはもう影響を与えません。 さらに、すべてはあなたのアルゴリズムに従って行われます。 もし、一次初期化を行わないのであれば、チェックストリングス

  if (curLo==0) Print("Curlo=",curLo);
  if (curHi==0) Print("curHi=",curHi);
は値curLo=0を与え、curHiは0に等しくない。説明は簡単で、変数curLoとcurHiは初期化されていないため、両方とも最初は0に等しい。最初のティックでは、条件

  if (NormalizeDouble(Bid,Digits)>curHi) curHi=NormalizeDouble(Bid,Digits);
がトリガされ、現在のBidが0より大きいため、curHiはすでに0と異なっています。同時に、現在のBidは0以下にはならない(curLoは初期化されていないので0)ので、条件として

  if (NormalizeDouble(Bid,Digits)<curLo) curLo=NormalizeDouble(Bid,Digits);
は、curLoを一切変更することができません。私のバージョンのExpert Advisorを自分で実行し、エラーファイルFu.xlsに1行だけ含まれることを確認します - テスターで最後にシミュレートされた引用符の時間です。

フルコードは投稿に添付されていますが、投稿に収まらないのでダウンロードした方が良いです。
ファイル:
 

もちろん、Rosh さんの修正には感謝しますが、その必要はなかったと思います。

もしかしたらお気づきでないかもしれませんが、私のコードでは、関数init()の中に次のようなブロックがあります。

  curHi=0.0;
  curLo=1000.0;
  curD1=-1;
  curH1=-1;
  curM1=-1;

このブロックの実行の結果、EA の実行開始時にいずれの条件も満たすことができない。

if (mm!=curM1)
  {  if (hh!=curH1)
     {  if (dd!=curD1)
 

したがって、EAが履歴のどこから始まっても、常に新しい分、新しい時間、新しい日になるのです。そして、前述のブロックの最初の演算子の組は、あなたの発言「簡単に説明すると、変数curLoとcurHiは両方とも初期化されていないため、最初は0に等しい」の理由を説明しています。最初のティックのビッドは0より大きく1000より小さいので、対応する両方の条件文が必然的にトリガーされ、変数curLoとcurHiはif(start)ブロック{...}で割り当てたのと同じ初期値を取得します。

あなたのバージョンも同様に機能しますが、アルゴリズムには何ら影響を与えません。そのため、この改変はエラーの有無に影響を及ぼさない。

前回の記事をもう一度ご覧ください。問題は、新しい日に移行するときでもなく、EAの開始時でもなく、t/f H1をテストするときに発生します。この問題は、2007年8月10日に一度だけ発生し、17:00から17:03までの3分間続きます。この間、M1とH1のHigh値の乖離で28ティックが発生しています。適切な写真をお見せしています。

差し支えなければ、私が依頼したその間隔でEA(修正したコード)を実行してみてください。ただ、コメントの使い方を訂正してください。現在、あなたのコードでは、t/f D1と比較され、このモードではエラーは発生しません。H1との比較のために必要です。

 

特に病的なケースでの正しさを保つために、少しコードを変更しました(2007.01.01のM1にはローソクが1本だけ、H1とD1も同じです)。2007.01.01~2007.08.11の期間でテストを行ったところ、D1で4件、H1で2件の誤検出がありました。すべてのエラーは、より高いTFの新しいキャンドルへの 移行時に発生します。自分の目で確かめたい人。

それは、未来を見通す可能性を与えないからです。少なくとも私がチェックしたピーピングバリアントでは。

ファイル:
future-2h.mq4  4 kb
 
Yurixx:

もちろん、Rosh さんの修正には感謝しますが、その必要はなかったと思います。

もしかしたらお気づきでないかもしれませんが、私のコードではinit()関数の中に以下のブロックがあります。

  curHi=0.0;
  curLo=1000.0;
  curD1=-1;
  curH1=-1;
  curM1=-1;

難しいことでなければ、私がお願いした間隔でEA(修正したコード)を動かしてみてください。ただ、コメントの使い方を訂正してください。現在、あなたのコードでは、t/f D1と比較され、このモードではエラーは発生しません。H1との比較のために必要です。


自分でコードを投稿してください。お気づきのように、私のコードをH1でテストすると、値が初期化されません。
  if (Period()>PERIOD_M1)
  {  Print("Период тестирования не соответствует задаче");
     return(-1);
  }
  Print("Период тестирования ",Period()," минут");
  FileWrite(handle,"Date","Time","curHi","HiH1","curLo","LoH1");
  nn=D'2007.07.12 23:58:59';
  FileWrite(handle,TimeToStr(nn,TIME_DATE|TIME_SECONDS),
                   TimeSeconds(nn),TimeMinute(nn),TimeHour(nn),TimeDay(nn));
  nn=D'2007.07.13 00:58:59';
  FileWrite(handle,TimeToStr(nn,TIME_DATE|TIME_SECONDS),
                   TimeSeconds(nn),TimeMinute(nn),TimeHour(nn),TimeDay(nn));
  nn=D'2007.07.13 00:02:00';
  FileWrite(handle,TimeToStr(nn,TIME_DATE|TIME_SECONDS),
                   TimeSeconds(nn),TimeMinute(nn),TimeHour(nn),TimeDay(nn));
 
  curHi=0.0;
  curLo=1000.0;
  curD1=-1;
  curH1=-1;
  curM1=-1;

つまり、私が書いたとおりの内容になるのです。私が何のことか推測できないようにコードを並べるのが難しいのなら、あなた自身が理解すればいい、私はテレパシーの練習より他にすることがある。
 

本当に、なぜイライラするのか理解できません。

前ページで結果付きのEAを掲載した時に書きましたが、テスト用です 専ら をM1上に配置しました。同時にそれは、自分自身で生成したHighとLowを、それに応じてH1であったりD1であったりする、より高いt/fのHighとLowを比較する。 start()プロシージャのテキストにコメントを配置する方法です。

正直、init() でreturn(-1); するとEAの動作が止まるので、M1のみ起動できるのではと思ったのです。しかし、今は、先生の投稿のおかげで、どのTFでも動作することを確信しました。 このEAのアイデアは、低いt/f(具体的にはM1)から高いt/f(具体的にはH1またはD1)へ未来をスパイしようとするものです。.したがって、M1でのみ実行する必要があります。H1のテストが何を示すかは、私にもわかりません。

このコードは、M1データとH1データを比較するために直接使用することができます。EAのテキストには、M1データとD1データを比較するために必要な(初歩的な)変更が明確に示されている。だからここでも、何が不満なのかよくわからない。

最後にもうひとつ。あなたのコードは、私のコードと同じようにテスターでの実行に適しています。ただ、それを実行に移すだけなのです。

他にやることがあるなら、邪魔はしませんよ。私は個人的な依頼ではなく、MQの代表として、テスターに何らかの不具合が発見される可能性があることに関連して、あなたに話しかけたのです。

 
Yurixx:

本当に、なぜイライラするのか理解できません。

前ページで結果付きのEAを掲載した時に書きましたが、テスト用です 専ら をM1上に配置しました。同時にそれは、自分自身で生成したHighとLowを、それに応じてH1であったりD1であったりする、より高いt/fのHighとLowを比較する。 start()プロシージャのテキストにコメントを配置する方法です。

正直 Expert Advisorの動作が止まってしまうので、M1のみ起動できるようにしようと思っていました 。しかし、今は、先生の投稿のおかげで、どのTFでも動作することを確信しました。 このEAのアイデアは、低いt/f(具体的にはM1)から高いt/f(具体的にはH1またはD1)へ未来をスパイしようとするものです。.したがって、M1でのみ実行する必要があります。H1のテストが何を示すかは、私にもわかりません。

このコードは、M1データとH1データを比較するために直接使用することができます。EAのテキストには、M1データとD1データを比較するために必要な(初歩的な)変更が明確に示されている。だからここでも、何が不満なのかよくわからない。

最後にもうひとつ。あなたのコードは、私のコードと同じようにテスターでの実行に適しています。ただ、それを実行に移すだけなのです。

他にやることがあるなら、邪魔はしませんよ。個人的な依頼ではなく、MQの代表としてテスターに何らかの不具合が発見される可能性があることに関連し、あなたに声をかけたのです。

このテストを実行するために、どのような時間枠を使用すべきかがわかりません。コードを介さずに3つのタイムフレームで実行しました。

2007.08.14 16:29:03 2007.08.10 23:59 future-2h EURUSD,Daily:作業終了。
2007.08.14 16:29:03 2007.08.10 23:59 future-2h EURUSD,Daily: 2007.08.10 23:59:59, curHi=1.3693, HiH1=1.3702, curLo=1.3693, LoH1=1.3689.
2007.08.14 16:29:02 2007.08.03 23:59 EURUSD,Daily: 2007.08.03 23:59:59, curHi=1.3773, HiH1=1.3787, curLo=1.3773, LoH1=1.3772.
2007.08.14 16:29:02 2007.07.27 23:59 EURUSD,Daily: 2007.07.27 23:59:59, curHi=1.3635, HiH1=1.3641, curLo=1.3635, LoH1=1.3627。
2007.08.14 16:29:02 2007.07.20 23:59:59 EURUSD,Daily: 2007.07.20 23:59:59, curHi=1.3826, HiH1=1.3827, curLo=1.3826, LoH1=1.3821.
2007.08.14 16:29:01 2007.07.16 23:59:59 EURUSD,Daily: 2007.07.16 23:59:59, curHi=1.3772, HiH1=1.3773, curLo=1.3772, LoH1=1.3772.
2007.08.14 16:29:01 2007.07.13 23:59:59 EURUSD,Daily: 2007.07.13 23:59:59, curHi=1.3782, HiH1=1.3787, curLo=1.3782, LoH1=1.3780。
2007.08.14 16:29:01 2007.07.06 23:59:59 EURUSD,Daily: 2007.07.06 23:59:59, curHi=1.3625, HiH1=1.3630, curLo=1.3625, LoH1=1.3623。
2007.08.14 16:29:01 2007.07.02 00:00 EURUSD,Daily:テスト期間は適切ではありません。
2007.08.14 16:29:01 future-2hテスト開始
2007.08.14 16:28:34 2007.08.10 22:59 future-2h EURUSD,H1: 作業終了しました。
2007.08.14 16:28:32 2007.07.02 00:00 future-2h EURUSD,H1: テスト期間が適切でありません。
2007.08.14 16:28:32 future-2hテスト開始
2007.08.14 16:28:22 2007.08.10 22:59 future-2h EURUSD,M1: 作業終了しました。
2007.08.14 16:28:19 2007.07.02 00:00 future-2h EURUSD,M1:テスト期間1分。
2007.08.14 16:28:19 future-2hのテスト開始
2007.08.14 16:24:28 2007.08.10 22:59 future-2h EURUSD,M1: 作業終了しました。
2007.08.14 16:24:28 2007.08.06 00:00 future-2h EURUSD,M1:テスト期間1分。
 
ここで、
を変更します。
  if (NormalizeDouble(Bid,Digits)>curHi) curHi=NormalizeDouble(Bid,Digits);
  if (NormalizeDouble(Bid,Digits)<curLo) curLo=NormalizeDouble(Bid,Digits);
  HiH1 = iHigh(NULL,PERIOD_H1,0);      // Закомментировать при тесте D1
  LoH1 =  iLow(NULL,PERIOD_H1,0);      // Закомментировать при тесте D1
  //HiH1 = iHigh(NULL,PERIOD_D1,0);    // Раскомментировать при тесте D1
  //LoH1 =  iLow(NULL,PERIOD_D1,0);    // Раскомментировать при тесте D1



  else if (hh!=curH1)
  {  //curHi=NormalizeDouble(Bid,Digits);  // Закомментировать при тесте D1
     //curLo=NormalizeDouble(Bid,Digits);  // Закомментировать при тесте D1
     curH1=hh;
     curM1=mm;
  }
  else if (mm!=curM1) curM1=mm;
  
  if (NormalizeDouble(Bid,Digits)>curHi) curHi=NormalizeDouble(Bid,Digits);
  if (NormalizeDouble(Bid,Digits)<curLo) curLo=NormalizeDouble(Bid,Digits);
  //HiH1 = iHigh(NULL,PERIOD_H1,0);      // Закомментировать при тесте D1
  //LoH1 =  iLow(NULL,PERIOD_H1,0);      // Закомментировать при тесте D1
  HiH1 = iHigh(NULL,PERIOD_D1,0);    // Раскомментировать при тесте D1
  LoH1 =  iLow(NULL,PERIOD_D1,0);    // Раскомментировать при тесте D1
で、2007.07.01から2007.08.11までの同じ時間間隔の3つの 期間について再度テストしてみました。
<br/ translate="no">
2007.08.14 16:32:03 2007.08.10 23:59 future-2h EURUSD,Daily: 作業終了
2007.08.14 16:32:03 2007.07.27 23:59 future-2h EURUSD,Daily: 2007.07.27 23:59:59, curHi=1.3753, HiH1=1.3753, curLo=1.を実行した。3627, LoH1=1.3626
2007.08.14 16:32:01 2007.07.02 00:00 future-2h EURUSD,Daily: The testing period is not appropriate
2007.08.14 16:32:01 future-2h start for testing
2007.08.14 16:31:56 2007.08.10 22:59 future-2h EURUSD,H1: 作業終了
2007.08.14 16:31:54 2007.07.02 00:00 future-2h EURUSD,H1: テスト期間はタスクに準拠しない
2007.08.14 16:31:54 future-2h テスト用開始
2007.2007.08.14 16:31:48 2007.08.10 22:59 future-2h EURUSD,M1: 作業完了
2007.08.14 16:31:46 2007.07.02 00:00 future-2h EURUSD,M1: テスト期間1分
2007.08.14 16:31:46 future-2h テスト用開始
なんて書いてあるんだ?エラーの有無について、もう一度コードを解析 する必要がありますね。
 

なるほど。あなたはすべて正しいことをしたのです。そして、このEAはM1のみで動作させる必要があります。エキスパートアドバイザーはM1で実行され、M1期間の高値と安値のデータがH1またはD1期間と一致するかどうかをテストするものです。もし、未来を覗くことができるのであれば、M1でそのHighとLowに到達する前に、先輩のt/fデータでHighとLowを知ることができるはずです。それだけです。

D1のテスト結果は私と同じで、D1のこのインターバルでは私もエラーは出ませんでした。しかし、H1テストでは、私が得て少し前に投稿した内容を確認することはできません。コードを解析する必要はありません。ご覧のようにテスターの正常な動作を確認することができます。

もし、これで十分だと思うのであれば、ここでやめてもかまいませんが、もし、このテストが偶然ではないこと、期間が短すぎることを確認したいのであれば、同じ2つのテストをより長い期間で実行してみてください。例えば1年以上とか、2007年の初めからとか。

追記

念のため、繰り返します。テスト M1期のみ. 全ティックモードのみ.

ご参加ありがとうございました。

 
テストEAをありがとうございます。テストの選択肢が多すぎて、何をテストしたらいいのかわからないことがあるので、自分で考えるのは難しいですね。そして、その煩わしさ...。自国民の方がイライラするだろ、理解してもらえると思ってるから。知らず知らずのうちに強くなり、他人を許したところで、自分のはイライラする。申し訳ございません。

これらのテストは、MetaTrader 4テスターの改良に本当に役立っています。特にソースコードで。