RefreshRates()の更新内容 - ページ 6

 
Mikhail Nazarenko:

MT4はダークボックスなので、そこで何が起こるかは実際の条件でのテストでしか判断できない。当初はスリープを全く使っていなかったのですが、いくつかのアワーバーででたらめになったときにスリープを追加 したら問題が解消されました。MT4の時系列が どのような順番で、どのように更新 されるのかがわからない。これを機に自分の問題を解決し、他の人にも伝えていこうと思います。

私自身もこの問題を経験しています。テスターではすべてうまくいっているのに、実際の市場では何も起こらないのです。

月曜日からExpert Advisorを動かしていますが、驚いています。

何度か利益の出る建て玉をしては、売りから買いに戻ったり、その逆もありました。

トレーディング、自動売買システム、ストラテジーテストに関するフォーラム

MQL4やMQL5に関する初心者からの質問、アルゴリズムやコードに関するTipsやディスカッションがあれば教えてください。

ヴィタリー・ムジチェンコ, 2021.02.15 21:48

私はすでにMQL4を使ってアルゴリズムのチェックを始めています。

今まで試したことはないのですが、このようなアルゴリズムが正しく使われているのを見たことがありません。シンプルなコード、2つのインジケーターバッファのみ



コードは非常にシンプルです

   double poi=Point();
   for(int i = limit-2; i>0; i--) {
      if(open[i+0] > close[i+0] && MathAbs(open[i+0] - high[i+0]) < 0.1 * poi)
         Dn[i] = high[i+0] + 30 * poi;
      if(open[i+0] < close[i + 0] && MathAbs(open[i+0] - low[i+0]) < 0.1 * poi)
         Up[i] = low[i+0] - 30 * poi;
   }
 
Vitaly Muzichenko:

テスターではうまくいっても、実際の市場ではゴミになってしまうというのは、私自身も直面したことがあります。

月曜日からEAを動かしていて、驚いています。

オープンも当たりますが、それ以降は売りから買い、またその逆もあります。


インジケーターのコードはシンプルです。

これは、私がこのスレッドを立ち上げる前に抱えていた問題と同じです。上のisRefresh()関数を作りました。試してみてください。私の場合、問題なく使えました。

そして、それは滑り止めではないのですか?

 
Vitaly Muzichenko:

インジケーターのコードはシンプルです

インジケーターはトレードを開始しますか?

矢印は同じです - 問題はEAコードにあります。

 
Mikhail Nazarenko:

もしあなたが教え始めたら、コード、テスト、フォーラムのトピックやドキュメントへのリンクで確認し、手助けしてください。それ以外は、ただの脳内オナニーです。

不明な点は明らかにしてください。読み終えて、本題は解決したようで、あとは4がいかに時代遅れであるかを議論することになりそうです)。

このようなタイムフレームのロードを挿入しても、問題は発生しませんでした。

bool HistoryCheck(int TF)
  {
   int err=0;   
   int i=0;
   datetime d1=0,d2=0;
   while(i<10)
    { 
    if((d1=iTime(NULL,TF,0))==0 || (d2=iTime(NULL,TF,InpPeriod*2))==0)          
        PrintFormat("itime=0, %s, %s", TimeToString(d1),TimeToString(d2)) ; 
   err=GetLastError();    
   if(err==4066)    
    {
    	PrintFormat("Error=4066") ; 
    	 Sleep(500);     	
    }
   else break;	
      SleepA(100);
      i++;                 
    } // while
   if(i==10)
	 { Comment("Update failed. Go to the next attempt."); return(false); }
   PrintFormat("HistoryCheck %d , %s, %s",i,TimeToString(d1),TimeToString(d2)) ;
   Comment(""); 
   return(true);
  }

タイムフレームに滅多にアクセスする必要がない場合は、(チャートを開いて いる場合は必ずしもそうではありませんが)この読み込みを再度行ってから

  if((iTime(NULL,TF,0)+PeriodSeconds(TF))<TimeCurrent()
   || (iTime(NULL,TF,1)+PeriodSeconds(TF)*2)<TimeCurrent())
   HistoryCheck(TF)
Документация по MQL5: Операции с графиками / ChartOpen
Документация по MQL5: Операции с графиками / ChartOpen
  • www.mql5.com
ChartOpen - Операции с графиками - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Mikhail Nazarenko:

これは、このスレッドを開く前に遭遇したのと同じことです。なぜか端末がrealで古いデータを出すので、上のisRefresh()関数を書きました。試してみてください。私の場合、問題なく使えました。

でも、滑り止めにはならない?

いいえ、新しい0本のバーで開き、シグナルは閉じたバー、つまり1本で探されます。

EAがiCustom()で期待したものを取得できない場合、そのような状況になることがあります。もう一度言いますが、時々ですが、頻繁ではありません。

もうひとつ、新鮮なものをご紹介します。シグナルに従って正しく買いポジションを持ち、インジケータからの次のシグナルも買いです(下の矢印)。 しかし、iCustom() を介したEAが売りシグナルを受信し、別の買いポジションが開いているはずなのに、買いポジションを閉じ、売りポジションを開いて います。

時系列がおかしい、まだ理解していない、4日前に発見されたので、おそらく変更しようとは思わない。テスターでは不具合は確認されていません

今すぐ

--- そして、私は今、見つけました。


 

そしてまた、しかしすでに売りの代わりに買いが開かれている。やはり、滅多にないことですが、よくあることです

インジケーターのコードはシンプルで、複雑なものはありません。


 
Aleksey Mavrin:

不明な点は明らかにしてください。これを読んで、本題は解決したようで、まだ4がいかに時代遅れであるかを議論する必要があるようだ)

こんな感じで読み込んだタイムフレームを挿入したら問題なかったです。

めったに、そして不定期にタイムフレームにアクセスする必要がある場合は、(チャートが開いている 場合は必ずしもそうではありませんが)チェックする前に再度この読み込みを行うか、そのようなチェックが有効でしょう

これは正しい。

これはヘルプに書いてあることです。

インジケーターとタイムシリーズのデータは、要求されたデータが準備できたかどうかとは無関係にアクセスされます(いわゆる非同期アクセス)。これは、カスタム・インジケータの計算には不可欠であり、要求されたデータがない場合、Copy...()のような関数は直ちにエラーを返します。ただし、Expert Advisorやスクリプトからアクセスする場合は、データの受信を何度か試みますが、必要な時系列のダウンロードや指標値の計算に必要な時間を確保するために、少し間を置いてからアクセスします。


他のチャートから情報を要求した場合(商品名やタイムフレームの値が現在のチャートと異なる場合)、クライアント端末に適切なチャートがなく、必要なデータをサーバーに要求しなければならない状況が発生する場合があります。この場合、エラー ERR_HISTORY_WILL_UPDATED (4066 - request history data in update state) が _Last_error 変数に格納され、しばらくしてからリクエストをやり直す必要があります (ArrayCopySeries() の例を参照ください)。

 
Vitaly Muzichenko:

そしてまた、しかしすでに売りの代わりに買いが開かれている。やはり、滅多にないことですが、よくあることです

インジケーターのコードはシンプルで、複雑なことは一切ありません。


最も確実な方法は、ログを書き込む ことです。各トランザクションで、ファイルにキー変数の値を書き込む。経験上、<0>ではなく<0>という厳密な条件でないと、ひどい湾曲が発生します。

 
Vitaly Muzichenko:

テスターではうまくいっても、実際の市場ではゴミになってしまうというのは、私自身も直面したことがあります。

月曜日からEAを動かしていて、驚いています。

オープンも当たりますが、それ以降は売りから買い、またその逆もあります。


インジケーターのコードは簡単です

   double poi=Point();
   for(int i = limit-2; i>0; i--) {
      if(open[i+0] > close[i+0] && MathAbs(open[i+0] - high[i+0]) < 0.1 * poi)
         Dn[i] = high[i+0] + 30 * poi;
      if(open[i+0] < close[i + 0] && MathAbs(open[i+0] - low[i+0]) < 0.1 * poi)
         Up[i] = low[i+0] - 30 * poi;
   }


なぜ、[i + 0]に0を足すのですか?

 
Aleksey Mavrin:

不明な点は明らかにしてください。これを読んで、本題は解決され、4がいかに時代遅れであるかを議論することになったようだ)

このように読み込んだタイムフレームを挿入しても、特に問題はありません。

タイムフレームを稀に不定期に参照する必要がある場合、この読み込みは(チャートを開いて いる場合は必ずしもそうではないが)チェック前に再度行うべきであり、またはそのようなチェックが有効である。

ありがとうございます、そこがポイントです。iTime経由で更新されていない時系列にアクセスすると、ターミナルで本当に4066エラーになるのでしょうか?iCloseがゼロではなく、未更新の情報を与えることに遭遇したことがあります。