iBarShiftのアナログ - ページ 5

 
Aleksey Vyazmikin:

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

その答えはプロファイラーに ある。

 
Andrey Khatimlianskii:

その答えはプロファイラーに ある。

OK、プロファイラーはこのコード片を参照しています。

Res=::Bars(Symb,TimeFrame,time,UINT_MAX)-1;

何が気に入らないのでしょうか?この機能は私のものではありませんが、上の作者は早く動くはずだと主張しています...。

 
Aleksey Vyazmikin:

OK、プロファイラーはこのコード片を参照しています。

そして、何が気に入らないのか?この機能は私のものではありませんが、上記の著者は高速に動作するはずだと主張しています......。

ユーモアがよくわからないのですが、なぜMQL4のiBarShift 関数をオーバーロードしたのでしょうか?そのため、コンパイラはおそらく混乱する。
iBarShift2関数はMQL5用に設計されており、MQL4では標準関数との比較で実行の正しさを検証するのみであった。

 
Nikolai Semko:

ユーモアがわからないのですが、なぜMQL4のiBarShift関数をオーバーロードしたのでしょうか?そのため、コンパイラはおそらく混乱する。

誰もキャンセルしていない

#ifdef __MQL5__
/**************************/
#else
/**************************/
#endif

そして、混乱はあってはならないことです。

 
Nikolai Semko:

ユーモアがわからないのですが、なぜMQL4のiBarShift関数をオーバーロードしたのでしょうか?そのため、コンパイラが混乱することがあります。
iBarShift2関数はMQL5用に設計されており、MQL4では標準関数と比較しながら、実行の正しさをテストするだけでした。

私は注意していなかったに違いないが、私は再びあなたの記事を見た - すなわち、MT4のためのあなたの機能?ただ、トピックがMT5についてだったので、そこが誤解を招いたようです。

追記:くっそー、またコード見つけた!ブレブレだ、申し訳ない。

 
Aleksey Vyazmikin:

私は注意していなかったに違いないが、私は再びあなたの記事を見た - すなわち、MT4のためのあなたの機能?ただ、トピックがMT5についてだったので、そこが誤解を招いたようです。

追記:しまった、これだ!別のコードを発見!全部ボケてしまいました、すみません。

すごい。いいえ。MQL5であなたのコードを試しましたが、混乱しました。今なら意味がわかります。
ここで面白い写真があります。
TF=1 Dayのネイティブ環境でスクリプトが実行されれば、すべてOKです。
しかし、別のTFで実行すると、信じられないほど不釣り合いなラグが発生します。これはまだ説明できませんが、コンパイラに何らかのバグがあるようです。
同時に、デバッグモードやプロファイリングモードでは、これらのブレーキはありません!
これから実験して、ブレーキの原因を探します。

 
Nikolai Semko:

おっといいえ。MQL5であなたのコードを試しましたが、混乱しました。おっしゃることがよくわかりました。
ここで面白い写真があります。
TF=1 Dayのネイティブ環境でスクリプトが実行されれば、すべてOKです。
しかし、別のTFで実行すると、信じられないほど不釣り合いなラグが発生します。これはまだ説明できませんが、コンパイラに何らかのバグがあるようです。
同時に、デバッグモードやプロファイリングモードでは、これらのブレーキはありません!
これから実験して、ブレーキの原因を探します。

通常のdatetimeの値を代入して検索を開始します。

Res=::Bars(Symb,TimeFrame,time,UINT_MAX)-1;
 
Aleksey Vyazmikin:

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


そうですね、意外です。

ブレーキの位置を定位しました。

//+------------------------------------------------------------------+
//|                                                    iBarShift.mq5 |
//|                        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++)
     {
      Print("0");
      datetime T=iTime(_Symbol,PERIOD_CURRENT,index);
      Print("00  "+ TimeToString(T));
      int Day_Shift=iBarShift(_Symbol,TF,T,false);
      Print("1");
      int Start=iBarShift(_Symbol,PERIOD_CURRENT,iTime(_Symbol,TF,Bar+Day_Shift),false);
      Print("2");
      int Stop=iBarShift(_Symbol,PERIOD_CURRENT,iTime(_Symbol,TF,Day_Shift),false);
      Print("3");

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

      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);
     }

   Print("5");

  }
//+------------------------------------------------------------------+ 
//| Получим 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))
     {
      Print("10");
      Res=::Bars(Symb,TimeFrame,time,UINT_MAX)-1;
      Print("11");
      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);
  }
//+------------------------------------------------------------------+

このスクリプトを、例えばH4で実行した場合

にアクセスすると、最初に

Res=::Bars(Symb,TimeFrame,time,UINT_MAX)-1;

フリーズしてしまう。

そしてこの呆けは、プロファイリングやデバッグの時にはありません。

サービス デスクの明確な課題

 
Aleksey Vyazmikin:

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

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

Alexeyさん、ご指摘ありがとうございます。
これは、Bars()関数の明らかなバグです。
バグ、バグ、クエリの スレッドに質問 を開設しました。

 
Nikolai Semko:

Alexeyさん、ご指摘ありがとうございます。
これは、Bars()関数の明らかなバグです。
バグ、バグ、クエリの スレッドに質問 を開設しました。

分析ありがとうございます!まだ完全に狂っているわけではありませんが...。