iBarShiftのアナログ - ページ 4

 
Nikolai Semko:

私見ですが、SeriesInfoInteger 関数はフリーではないので、使用は冗長だと思います。

でした。

なった。

約1.5倍のスピードアップを実現。

2%の利得。

は、1970年1月1日からカウントされ、月曜日ではなく木曜日なので、PERIOD_W1およびPERIOD_MN1では正しく動作しない。そして、月ごとに秒数が違う。

これは、PeriodSecondsのドキュメントに 追加する必要があります。

 
Aleksey Vyazmikin:

なぜなら、そのコードが特定の状況下で動作するかどうかを確実に知る必要があるからです。自分でミスをした場合に、他の人のせいにするのは正しくありません。

1日に14時間あるとします(1時間ごとに相場がない場合はそれ以下)、M1チャートを持っていて、前日のM15のバーのシフトを知る必要があります。つまり、1時間に45分とか、1日に14時間とか、時間・スイッチングが落ちても、すべて正しく動作するのでしょうか?

個人的には、このような機能を使うのが適切だと考えています。

int iBarShift(const string Symb,const ENUM_TIMEFRAMES TimeFrame,datetime time)
  {
   static int Res=-1;
   static string LastSymb=NULL;
   static ENUM_TIMEFRAMES LastTimeFrame=0;
   static datetime LastTime=0;

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

      LastTime = time;
      LastSymb = Symb;
      LastTimeFrame=TimeFrame;
     }
   return(Res);
  }

しかし、この関数はMQL4のiBarShift 関数の完全なアナログではないことに注意する必要があります。

それ以外は同一です。

標準関数とこの関数との完全な同一性を示す簡単なMQL4スクリプトを貼り付けます。

標準のiBarShift 関数と私の関数からの値が等しくない場合、Print.私には何も印刷されませんでした。

//+------------------------------------------------------------------+
//|                                                    iBarShift.mq4 |
//|                        Copyright 2017, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   datetime t=TimeCurrent()+1000;
   const ENUM_TIMEFRAMES tf[9]={PERIOD_M1,PERIOD_M5,PERIOD_M15,PERIOD_M30,PERIOD_H1,PERIOD_H4,PERIOD_D1,PERIOD_W1,PERIOD_MN1};
   while(!IsStopped())
     {
      for(int i=0; i<9;i++)
        {
         int i1=iBarShift(NULL,tf[i],t);
         int i2=iBarShift2(NULL,tf[i],t);
         if(i1!=i2) Print(EnumToString(tf[i]),"   ",TimeToString(t),"   ",i1,"   ",i2);
        }
      t-=10;
      Comment(TimeToString(t));
     }

  }
//+------------------------------------------------------------------+
int iBarShift2(const string Symb,const ENUM_TIMEFRAMES TimeFrame,datetime time)
  {
   static int Res=-1;
   static string LastSymb=NULL;
   static ENUM_TIMEFRAMES LastTimeFrame=0;
   static datetime LastTime=0;

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

      LastTime = time;
      LastSymb = Symb;
      LastTimeFrame=TimeFrame;
     }
   return(Res);
  }
//+------------------------------------------------------------------+
 
fxsaber:

勝率2%。

えっ、本当ですか?

GetMicrosecondCount()を入れるのが面倒だったので、プロファイリングを信用した。

 
Nikolai Semko:

そうなんですか?

GetMicrosecondCount()を設定するのが面倒だったので、プロファイリングを信用した。

プロファイリングとは、別のものです。2%が最大の利得です。

私のマシンのテスターで2億5千万回コールすると、1秒の節約になります。

間違いなく、あなたのオプションがベストですしかし、なぜMT5ではバーで作業する必要があるのか、想像もつきません。

 
fxsaber:

しかし、なぜMT5ではバーで作業する必要があるのか、さっぱりわかりません。

マウスを操作するときに使っています。例えばこちら

 
Nikolai Semko:

マウスを操作するときに使っています。たとえば、ここ

ああ、そこが理解できないんだ。

 
fxsaber:

そう、そこがわからないんです。

そして、その誤解が理解できない ))

例えば、あるチャンネルがあり、その特徴のひとつが開始時間(左端)です。そして、このチャンネルを異なるTFで構築する必要があります。さて、新しいTFでバー・ナンバーを見つける以外にどんな方法があるでしょうか?

他にもいろいろあるんです。

例えば、すべてのTFを対数スケールで1つにまとめると。これはとてもクールなテーマです。ここでもiBarShiftの アナログは欠かせない

 
Nikolai Semko:

個人的には、このような機能を使うのは合理的だと思います。

しかし、これはMQL4標準のiBarShift 関数の完全なアナログではないことに注意する必要があります。

それ以外は同一です。

標準関数とこの関数との完全な同一性を示す簡単なMQL4スクリプトを貼り付けます。

標準のiBarShift 関数と私の関数からの値が等しくない場合、Print.印刷はしていません。

いいえ、Comment()のためではありません。

削除すると1だけ不一致になりますが、実際には新しいバーは 半バー分ずれて2つのアルゴリズムで定義されているので、間違いではないと思います。私のバージョンの新しいバー検出は、標準のものよりも論理的だと思います。

 
Nikolai Semko:

そして、その誤解が理解できない ))

バーを使う意味がわからない。CopyRatesなど

 

なぜこんなにスクリプトが遅いのですか?

2018.03.30 09:21:05.208 BS (Si Splice,H4) 1 Start=15 Stop=3 Day_Shift=0 index=0

2018.03.30 09:21:05.208 BS (Si Splice,H4) 1 Start=2018.03.26 00:00 Stop=2018.03.29 00:00 Day_Shift=2018.03.29 20:00 index=0

2018.03.30 09:21:20.209 BS (Si Splice,H4) 2 Start=15 Stop=3 Day_Shift=0 index=0

2018.03.30 09:21:20.209 BS (Si Splice,H4) 2 Start=2018.03.26 00:00 Stop=2018.03.29 00:00 Day_Shift=2018.03.29 20:00 index=0

2018.03.30 09:20:49.300 Scripts script BS (Si Splice,H4) loaded successfully

2018.03.30 09:21:20.209 Scripts script BS (Si Splice,H4) removed

//+------------------------------------------------------------------+
//|                                                    iBarShift.mq4 |
//|                        Copyright 2017, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property script_show_inputs

input ENUM_TIMEFRAMES TF=PERIOD_D1;
input int Bar=3;
input int calcN=1;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   for(int index=0;index<calcN;index++)
     {
      int Day_Shift=iBarShift(_Symbol,TF,iTime(_Symbol,PERIOD_CURRENT,index),false);
      int Start=iBarShift(_Symbol,PERIOD_CURRENT,iTime(_Symbol,TF,Bar+Day_Shift),false);
      int Stop=iBarShift(_Symbol,PERIOD_CURRENT,iTime(_Symbol,TF,Day_Shift),false);

      if(index<3)Print("1 Start=",Start," Stop=",Stop," Day_Shift=",Day_Shift," index=",index);

      if(index<3)Print("1 Start=",TimeToString(iTime(_Symbol,TF,Bar+Day_Shift),TIME_DATE|TIME_MINUTES),
         " Stop=",TimeToString(iTime(_Symbol,TF,Day_Shift),TIME_DATE|TIME_MINUTES),
         " Day_Shift=",TimeToString(iTime(_Symbol,PERIOD_CURRENT,index),TIME_DATE|TIME_MINUTES)," index=",index);
     }



   for(int index=0;index<calcN;index++)
     {
      int Day_Shift=iBarShift2(_Symbol,TF,iTime(_Symbol,PERIOD_CURRENT,index),false);
      int Start=iBarShift2(_Symbol,PERIOD_CURRENT,iTime(_Symbol,TF,Bar+Day_Shift),false);
      int Stop=iBarShift2(_Symbol,PERIOD_CURRENT,iTime(_Symbol,TF,Day_Shift),false);

      if(index<3)Print("2 Start=",Start," Stop=",Stop," Day_Shift=",Day_Shift," index=",index);

      if(index<3)Print("2 Start=",TimeToString(iTime(_Symbol,TF,Bar+Day_Shift),TIME_DATE|TIME_MINUTES),
         " Stop=",TimeToString(iTime(_Symbol,TF,Day_Shift),TIME_DATE|TIME_MINUTES),
         " Day_Shift=",TimeToString(iTime(_Symbol,PERIOD_CURRENT,index),TIME_DATE|TIME_MINUTES)," index=",index);
     }
   return;

  }
//+------------------------------------------------------------------+ 
//| Получим iBarShift для заданного номера бара                      | 
//+------------------------------------------------------------------+  
int iBarShift2(const string Symb,const ENUM_TIMEFRAMES TimeFrame,datetime time,bool exact=false)
  {
   static int Res=-1;
   static string LastSymb=NULL;
   static ENUM_TIMEFRAMES LastTimeFrame=0;
   static datetime LastTime=0;

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

      LastTime = time;
      LastSymb = Symb;
      LastTimeFrame=TimeFrame;
     }
   return(Res);
  }
//+------------------------------------------------------------------+ 
//| Получим iBarShift для заданного номера бара                      | 
//+------------------------------------------------------------------+   
int iBarShift(const string Symb,const ENUM_TIMEFRAMES TimeFrame,datetime time,bool exact=false)
  {
   static int Res=-1;
   static string LastSymb=NULL;
   static ENUM_TIMEFRAMES LastTimeFrame=0;
   static datetime LastTime=0;

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

      LastTime = time;
      LastSymb = Symb;
      LastTimeFrame=TimeFrame;
     }
   return(Res);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
datetime iTime(string symbol,ENUM_TIMEFRAMES tf,int index)
  {
   if(index < 0) return(-1);
   datetime Arr[];
   if(CopyTime(symbol,tf,index,1,Arr)>0)
      return(Arr[0]);
   else return(-1);
  }
//+------------------------------------------------------------------+