iBarShiftのアナログ - ページ 6

 
Vasiliy Pushkaryov:

TimeCurrent() は、あくまで特別なケースとして取得しました。

今、このBars() 関数の注意書きをもっとよく読んでみました。

"指定された日付範囲のバーの 数を要求する場合、開始時刻がその範囲内にあるバーだけが考慮 されます。例えば、現在の曜日が土曜日の場合、start_time=lastTuesday、stop_time=lastFridayで週足の本数を要求すると、「週足のタイムフレームの開始時刻は常に日曜日であり、指定範囲に入る週足はないため、関数は0を返します」とあります。

TimeCurrent() はほとんどすべての時間が現在のバーの開始時間より遅いので、Bars() 関数は0を返します。したがって、1時間足のタイムフレームの02時5分に相当する時間をstart_time パラメータとして渡し、2時に始まったバーを検証したい場合は、CopyTime() によってバーオープン時間(02時0分)を取得しなければならないのです。そうで なければ、関数Bars() このバーを無視 します。

例えば、時刻が3時30分の場合、1時間足の2時5分はインデックス1のバーを指すと理解しています。 2ページ目のどの関数も、このインデックスを返しません。この修正により、Renat Akhtyamovの 関数は私が期待したとおりの結果を返してくれました。

インデックス検索関数の4つのオプションを持つスクリプトをテストとして使用しましたので、添付します。

提示された機能を試したところ、チャート上にない時刻のバーを要求した場合、1本分嘘をつくことが判明しました。例:その日の最初のバーを知りたいと思い、"2018.03.28 00:00 "という時刻を求める場合が、その時刻のバーがない場合、前日の最後のバーのインデックスを取得します。

それとも、そうなるべくしてなったのか?

 
Aleksey Vyazmikin:

提示された機能を試したところ、チャート上にない時刻のバーが要求された場合、1バー分嘘をつくことが判明しました。例:その日の最初の小節を知りたいと思い、「2018.03.28 00:00」という時刻を求める場合。が、その時刻のバーがない場合、前日の最後のバーのインデックスを取得します。

それとも、そうなるべくしてなったのか?

どうやって時間をつぶすの、ひもで?
 
Renat Akhtyamov:
弦楽器で、どうやって時間をつぶすのですか?

文字列を使った場合と、以前掲載したコードのように両方試してみました。

int teset_01=iBarShift(_Symbol,PERIOD_CURRENT,StringToTime("30.03.2018 00:00"),false);
Print ("teset_01=",teset_01);
 
Aleksey Vyazmikin:

文字列と、以前投稿したコードのように、両方試してみました。

を、彼のコードの中に入れています。

int iBarShift2(string symbol, ENUM_TIMEFRAMES timeframe, datetime time)

ということで、「偽」なのか「偽」なのかよくわかりません。

で、もしそうなら

int teset_01=iBarShift 2(_Symbol,PERIOD_CURRENT,StringToTime("30.03.2018 00:00"));
Print ("teset_01=",teset_01);
?
 

今のところ、このコードに落ち着いています、すぐに動作するようです。

//+------------------------------------------------------------------+ 
//| Получим iBarShift для заданного номера бара                      | 
//+------------------------------------------------------------------+    
int iBarShift3(const string Symb,const ENUM_TIMEFRAMES TimeFrame,datetime time,const bool Exact=false)
  {
   static int Res=-1;
   static string LastSymb=NULL;
   static ENUM_TIMEFRAMES LastTimeFrame=0;
   static datetime LastTime=0;
   static bool LastExact=false;
   static int PerSec=::PeriodSeconds(LastTimeFrame);
   
   if (LastTimeFrame!=TimeFrame) PerSec=::PeriodSeconds(TimeFrame);
   time-=time%PerSec;

   if((time!=LastTime) || (Symb!=LastSymb) || (TimeFrame!=LastTimeFrame) || (Exact!=LastExact))
     {
      Res=::Bars(Symb,TimeFrame,time,UINT_MAX)-1;
      if(Res<0) Res=0;

      LastTime = time;
      LastSymb = Symb;
      LastTimeFrame=TimeFrame;
      LastExact=Exact;
     }

   return(Res);
  }  

このコードで何か不都合を確認された方、あるいはもっと速いオプションはないでしょうか?

あ、そうそう、唯一の欠点は、まだチャート上にないバー、つまり今日の時間などでリクエストした場合です...。もしかしたら、その解決策もあるのかもしれませんね。ここでは、最後の既知のバーを返すことに意味があるのです。これは、現在時刻で 動作するアルゴリズムを扱う場合に関連するかもしれません。

 
Renat Akhtyamov:

も持っている。

ということで、偽物の有無はよくわかりません

false - 標準化のためで、何の影響もありません :)正直なところ、なぜこのfalse in some functionsが必要なのか全くわかりません?

 
Aleksey Vyazmikin:

今のところ、このコードに落ち着いています、すぐに動作するようです。

このコードで何か不都合を確認された方、あるいはもっと速いオプションはないでしょうか?

あ、そうそう、唯一の欠点は、まだチャート上にないバー、つまり今日の時間などでリクエストした場合です...。もしかしたら、その解決策もあるのかもしれませんね。ここでは、最後の既知のバーを返すことに意味があるのです。これは、現在時刻で 動作するアルゴリズムを扱う場合に関連する可能性があります。

ありもしないバーを返すのはよくない

を返す方が簡単です。

 
Aleksey Vyazmikin:

false - 標準化のためで、何の影響もありません :)正直なところ、なぜこのfalse in some functionsが必要なのか全くわかりません?

私はそこで迷ってしまい、コロンなしのシンプルなコードの信奉者です。
 
Renat Akhtyamov:

ありもしないバーを返すのはよくない

を返す方が簡単です。

いや、本来は最後の既知のバー、つまりインデックス0を返すべきなのですが、今はそこで何を返すかを考えるのに長い時間がかかっています。

このコードは、1本分間違っていますが、正しいバーであるゼロを返します。

それとも、ヒストリーが存在しない時間によるバーを求める場合のことでしょうか?それから私は、最も頻繁にあなたが利用可能であるものの我々の時間に最も近いバーを取得する必要があると思いますし、コードは歴史のオフセット-1でこの場合のバーを返しますが、それ以上の歴史がない場合は、正しく動作します - それはすぐにゼロバーを返します。

 
Aleksey Vyazmikin:

いや、本来は最後の既知のバー、つまりインデックス0を返すべきなのですが、今はそこで何を返すかを考えるのに長い時間がかかっています。

1本分間違ったコードは、正しいバーであるゼロを返します。

それとも、ヒストリーが存在しない時間によるバーを要求 する場合のことでしょうか?この場合、コードは履歴のオフセット-1のバーを返しますが、それ以上の履歴がない場合は正しく動作します - それはすぐにゼロバーを返します。

はい(ハイライト表示)

-1 は1マイナス(私は明確にしています)であり,関数が返すエラーはそのようなバーがないことです

つまり、私の機能です。

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

iBarShiftのアナログ

レナト・アフティアモフ さん 2017.06.08 01:19

これも可能です

int iBarShift(string symbol, ENUM_TIMEFRAMES timeframe, datetime tm)
   {
        datetime tm0[1];      
        CopyTime(symbol,timeframe,0,1,tm0);
        int res=Bars(symbol,timeframe,tm0[0],tm)-1;
        return(res);
   }

も改善が必要

とはいえ

ドキュメンテーション

"注意"すること

Bars() 関数を呼び出す際に指定したパラメータの時系列のデータがまだ端末に生成されていない場合、または関数呼び出しの瞬間に時系列のデータがトレードサーバーと同期されて いない場合、 関数は ゼロ値を返します。"

====

res==0の場合は、そのまま関数から-1をキャッチすることになります。

===

というわけで、すべてうまくいきますので、ご自由にお使いください。