iBarShiftのアナログ - ページ 14

 
fxsaber:

ではなぜ、18:00:01はM1-bar 18:01に属し、18:00には属さないとBarsが考えるのか理解できない。

そして、ここでの論理は、娘が1週間前に1歳になったばかりなのに、2歳の誕生日を迎えたことと同じである。あるいは、今日は2018.04.09ですが、01 Jan 00は2017年3ヶ月と8日前ですが.

ちなみに、TimeCurrentはSYMBOL_TIMEに置き換える必要があります。

ありがとうございます。そんな識別子があるなんて、本当に知りませんでした。

 

ところで、iBarsの アルゴリズムの正しさを、MQL4のBarsベンチマークと比較しながら、さまざまなバリエーションをランダムに試してみたところ、Barsにバグがあることがわかりました。

Print(Bars(_Symbol,PERIOD_MN1,D'2005.08.31 00:00:00',D'2005.08.31 23:00:00')); // 1  должен быть 0, т.к. временной диапазон находиться внутри одного бара.
Print(Bars(_Symbol,PERIOD_MN1,D'2006.08.31 00:00:00',D'2006.08.31 23:00:00')); // 0

MQL5には、そのようなバグはありません。

もちろん、タイムフレーム=MN1、日付30と31、stop_time=23、そして2005年以前にしか表示されないので、重要ではありません :)))

これをキャッチするMQL4用のスクリプトがこちらで、iBarsはネイティブのBarsよりも参考になることが分かりました。

ファイル:
TestiBars.mq4  10 kb
 
fxsaber:


ちなみに、TimeCurrentはSYMBOL_TIMEに置き換える必要があります。

いいえ、その必要はありません。
TimeCurrent() はすべてのシンボルに対して普遍的なものであり、現在の時刻ではなく、すべてのシンボルに対する気配値の最終到着時刻を返すため、正しさを加えることはできないでしょう。

同時に SymbolInfoInteger(symbol_name,SYMBOL_TIME) は TimeCurrent() に比べて非常に遅く、この時間はiBars の呼び出しの たびに必要となります。

 

ご興味のある方へ。

iBarsの編集版(内蔵のBarsに似ているが、不具合がなく高速であることのみ)。

いくつかのバグを修正しました。

もし、あなたのMQL5コードが突然10-20秒間ハングアップし、0を返すことができるBars関数を持って いることに気づいたなら、このバージョンに置き換えることを強くお勧めします。
ハングアップすることなく、高速に動作するようになります。

int iBars(string symbol_name,ENUM_TIMEFRAMES  timeframe,datetime start_time,datetime stop_time)
  {
   static string LastSymb=NULL;
   static ENUM_TIMEFRAMES LastTimeFrame=0;
   static datetime LastTime=0;
   static datetime LastTime0=0;
   static int PerSec=0;
   static int PreBars=0;
   static datetime LastBAR=0;
   static datetime LastTimeCur=0;
   datetime TimeCur;
   if(stop_time<start_time) {TimeCur=stop_time; stop_time=start_time; start_time=TimeCur; }
   TimeCur=TimeCurrent();
   if(LastTimeFrame!=timeframe) if(timeframe==PERIOD_MN1) PerSec=2419200; else PerSec=::PeriodSeconds(timeframe);
   if(timeframe<PERIOD_W1) TimeCur-=TimeCur%PerSec;
   if(start_time>TimeCur) {LastSymb=NULL; return(0);}
   if(LastTimeFrame!=timeframe || LastSymb!=symbol_name || ((TimeCur-LastBAR)>0 && TimeCur!=LastTimeCur))
      LastBAR=(datetime)SeriesInfoInteger(symbol_name,timeframe,SERIES_LASTBAR_DATE);

   LastTimeCur=TimeCur;
   if(PerSec==0) return(0);
   if(start_time>LastBAR)
     {LastTimeFrame=timeframe; LastSymb=symbol_name; return(0);}

   datetime tS,tF=0;
   bool check=true;
   if(timeframe<PERIOD_W1) tS=start_time-(start_time-1)%PerSec-1;
   else if(timeframe==PERIOD_W1) tS=start_time-(start_time-259201)%PerSec-1;
   else
     {
      PerSec=2678400;
      MqlDateTime dt;
      TimeToStruct(start_time-1,dt);
      tS=dt.year*12+dt.mon;
     }
   if(stop_time<=LastBAR)
     {
      if(timeframe<PERIOD_W1) tF=stop_time-(stop_time)%PerSec;
      else if(timeframe==PERIOD_W1) tF=stop_time-(stop_time-259200)%PerSec;
      else
        {
         MqlDateTime dt0;
         TimeToStruct(stop_time,dt0);
         tF=dt0.year*12+dt0.mon;
        }
      if(tS==tF) {PreBars=0; check=false;}
     }
   if((LastTimeFrame!=timeframe || LastSymb!=symbol_name || tS!=LastTime || tF!=LastTime0) && check)
      PreBars=Bars(symbol_name,timeframe,start_time,stop_time);
   LastTime=tS; LastTime0=(datetime)tF;
   LastTimeFrame=timeframe;
   LastSymb=symbol_name;
   return(PreBars);
  }
 
Nikolai Semko:

iBarsの編集版(内蔵のBarsに似て いるが、不具合がなく、より高速である)。

いくつかのバグを修正しました。

内蔵のBars()がオーバーロードされる。

1. int Bars(const string symbol_name,ENUM_TIMEFRAMES timeframe)
2. int Bars(const string symbol_name,ENUM_TIMEFRAMES timeframe,datetime start_time,datetime stop_time)

コールフォームは1つしかありません。

 
Artyom Trishkin:

組み込みのBars()はオーバーロードされています。

呼べる形は1つだけです。

短いフォームが必要な場合は、内蔵のものを使用しても問題ありません。そこには、ほとんど不具合はありません。

 
Nikolai Semko:

いいえ、その必要はありません。
TimeCurrent()はすべてのシンボルに対して普遍的なものであり、現在のものでなく、すべてのシンボルに対する引用の最終到着時刻を返すので、正しさを加えることはできない。

SymbolInfoInteger(symbol_name,SYMBOL_TIME) は TimeCurrent() に比べて非常に遅く、iBars が呼ばれるたびにこの時間が必要です。

Cotypesは、興味のあるキャラクター以外のすべてのキャラクターに行くことができます。

OK、新しいソースを見ました。議論されていた編集が行われていないことを見た。出てきました。

 
なぜ開発者が自分でやらないのか?
 
一つの関数を呼び出すだけで、複数の楽器にまたがる同期した(時間軸の揃った)行の配列を得ることができれば、ユーザーにとってはるかに便利です。
 
ところで、Bars()関数について。これが決め手と なったのかもしれません。