iBarShiftのアナログ - ページ 9

 
Alain Verleyen:

どのような問題があったのでしょうか?

以下は、この関数が "BarShift1" という名前で誤動作している例です。


 
Aleksey Vyazmikin :

以下は、この関数が誤って動作する例です。"BarShift1 "という名前で動作しています。


実際には、その逆で、私のバージョンだけが正しいことを示しています。(そして、このコードから 元のiBarShift1が正しいです)。

私のバージョンはmql4 iBarShiftと 同様に、スタンドアロン関数として設計さ れました。

マルチクエリに最適化されていないので、時間の比較は関係ない。大量呼び出しに最適化された良いライブラリが @nicholishenから 公開されました。


実は、その逆で、私のバージョンだけが正しいことを示しているのです。(また、この コードの元のiBarShift1も正しいです)。

私のバージョンはmql4 iBarShiftと 全く同じようにスタンドアローン機能として使用することを想定して います。

マルチリクエストに最適化されていないので、時間比較は関係ない。バルクコールに最適化された良い ライブラリを@nicholishen が公開しました。

iBarShift
iBarShift
  • 投票: 46
  • 2013.10.25
  • Alain Verleyen
  • www.mql5.com
Многие ищут функцию iBarShift, которая была в языке MQL4 (например, 1,2,3). В языке MQL5 ее нет, но есть все возможности для ее реализации в виде библиотеки. В качестве альтернативы многие программисты предложили свои варианты реализации этой функции на MQL5. Обнаружилось, что все 4 версии содержат ошибки (не воспроизводят в точности работу...
 
Alain Verleyen:

実際には、その逆で、私のバージョンだけが正しいことを示しています。(そして、このコードから 元のiBarShift1が正しいです)。

私のバージョンはmql4 iBarShiftと 同様に、スタンドアロン関数として設計さ れました。

マルチクエリに最適化されていないので、時間の比較は関係ない。大量呼び出しに最適化された良いライブラリが @nicholishenから 公開されました。


実は、その逆で、私のバージョンだけが正しいことを示しているのです。(また、この コードの元のiBarShift1も正しいです)。

私のバージョンはmql4 iBarShiftと 全く同じように、スタンドアローン機能として使用することを想定して います。

マルチリクエストに最適化されていないので、時間比較は関係ない。バルクコールに最適化された良い ライブラリを@nicholishen が公開しました。

処理時間の話ではなく、バーナンバーの話です。

図では、8時37分に最も近いバーが前日23時のバーであるとコードは考えていますが、実際には最も近いバーは10時であることがわかります。数学的にも論理的にもその方が近い。

 
Aleksey Vyazmikin:

処理時間の話ではなく、バーナンバーの話です。

図では、8:37に最も近いバーが前日の23:00のバーであるとコードが判断していますが、実際には最も近いバーは10:00です。数学も論理学も近い。

簡略化 しましょう。

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

iBarShiftのアナログ

アラン・ヴェルレーエン さん 2018.04.05 00:18

実際にはその逆で、私のバージョンだけが正しいことを示しています。(そして、このコードから 元のiBarShift1が正しいです)。

私のバージョンは mql4のiBarShiftと 同様に、スタンドアロン機能として考案さ れました。

mql4を試して、比較、同じです。
 
Alain Verleyen:
簡略化 しよう。
mql4を試して、比較、同じです。

あなたの言い分はわかりました。確認しない。どうやら、私の仕事は、通説と異なるようです。

 
Alain Verleyen:

どのような問題を発見したのでしょうか?

ずいぶん前に書きました。
とりあえず、1つだけ異常な状況を発見しました。
シンボルデータがまだロードされていない場合、-1が返され、本来は0が返されるはずです。

これは、添付しているMQL4用のスクリプトで確認することができます。

このスクリプトは、ランダムな時間、ランダムな時間枠を取ります。iBarShiftXの値が通常のiBarShift関数と 一致しない場合、Print経由でメッセージを表示します。

新しく開いたシンボルでこのスクリプトを実行すると、エラーが表示されます。同じシンボルでスクリプトを再実行しても、エラーは発生しません。

しかし、それは些細なことです。私のバージョンでも、問題は同じです。

あなたのバージョンについて、たったひとつだけ不満があります。

ここで、あなたのバリエーションを紹介します。

int iBarShift2(string symbol,ENUM_TIMEFRAMES timeframe,datetime time,bool exact=false)
  {
   datetime LastBAR;
   if(!SeriesInfoInteger(symbol,timeframe,SERIES_LASTBAR_DATE,LastBAR))
     {
      datetime opentimelastbar[1];
      if(CopyTime(symbol,timeframe,0,1,opentimelastbar)==1)
         LastBAR=opentimelastbar[0];
      else
         return(-1);
     }
   if(time>LastBAR)
      return(0);
   int shift=Bars(symbol,timeframe,time,LastBAR);
   datetime checkcandle[1];

   if(CopyTime(symbol,timeframe,time,1,checkcandle)==1)
     {
      if(checkcandle[0]==time)
         return(shift-1);
      else if(exact && time>checkcandle[0]+PeriodSeconds(timeframe))
         return(-1);
      else
         return(shift);
     }
   return(-1);
  }

そしてこれが私の関数で、同じことをするのですが、シンプルなアルゴリズムでずっと速いのです。

  int iBarShift1(const string Symb,const ENUM_TIMEFRAMES TimeFrame,datetime time)
  {
   return(Bars(Symb,TimeFrame,time+1,UINT_MAX));
  }

機能なしのさらに短いものでもOKです。

Bars(Symb,TimeFrame,time+1,UINT_MAX);

そうでないことを証明してみてください。あなたの関数と私の関数が異なる値を示す場合の、パラメータの単一の組み合わせを見つける。

ただ、最後のパラメータexactは、なぜ必要なのか全く理解できないので、実装していません。私自身は必要ないと思っています。

でも、本当に必要な人がいれば、実装することは可能です。

iBarShift3のバリエーションは、ヒストリーホールの扱いが間違っているので、残しました。修正することは可能ですが、上記のオプションで十分なので、意味がないと思います。

ファイル:
 
Nikolai Semko:


iBarShift3はヒストリーホールを正しく処理できないので、オプションを残しました。修正することは可能ですが、上記のオプションで十分なので、意味がないと思います。

穴が開いているのは、バーにプロトレーダーがいないせいなのか、それとも他のものなのか。また、その不正確さはどのように現れるのでしょうか。

 
Aleksey Vyazmikin:

穴が開いているのは、バーでのプロトレーディングが不足しているためか、それともその他か?そして、その不正確さとは何なのか。

取引のない日曜日をいつでもいいことにしよう。

Print("iBarShift  = "+IntegerToString(iBarShift (_Symbol,PERIOD_H1,D'01.04.2018 10:00:00')));  
Print("iBarShift3 = "+IntegerToString(iBarShift3(_Symbol,PERIOD_H1,D'01.04.2018 10:00:00'))); // показывает на единицу меньше
 
Nikolai Semko:

仮に、取引のない日曜日をいつでもいいことにする。

月曜日が表示されるんですね。それが私の望みです...。:)

 
私の機能を試してみてはいかがでしょうか?そこには、小節の開始と終了を時間的に中和するソリューションがあるのです。すべて正しく計算されているようです。しかも、あなたの最速のバージョン3よりも時間的に速いのです。それとも枝の方が重要なのか?)それともそこにもエラーがあるのでしょうか?)ずっと使っているのですが・・・。