类似于iBarShift - 页 5

 
Aleksey Vyazmikin:

为什么脚本这么慢?

答案就在剖析器中

 
Andrey Khatimlianskii:

答案就在剖析器中

好了,剖析器提到了这段代码

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

它不喜欢什么?这个功能不是我的,但上面的作者声称它应该能快速工作...

 
Aleksey Vyazmikin:

好了,剖析器提到了这段代码

那它不喜欢什么呢?这个功能不是我的,但上面的作者声称它应该能快速工作...

我不太理解这种幽默,你为什么要重载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日运行,那么一切都很好。
但如果我在另一个TF上运行它,我就会得到令人难以置信的不相称的滞后,我还不能解释,除了编译器的一些错误。
同时,在调试模式或剖析模式 下,没有这些刹车!!。
我现在要做实验,寻找刹车的来源。

 
Nikolai Semko:

哇哦。没有。我在MQL5中尝试了你的代码,但感到很困惑。我现在明白你的意思了。
这里有一张有趣的图片。
如果你的脚本在原生的TF=1日运行,那么一切都很好。
但如果我在另一个TF上运行它,我就会得到令人难以置信的不相称的滞后,我还不能解释,除了编译器的一些错误。
同时,在调试模式或剖析模式 下,没有这些刹车!!。
我现在要做实验,寻找刹车的来源。

通过替换一个正常的日期时间值来开始你的搜索

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

谢谢阿列克谢的意见。
这是Bars()函数中一个明显的错误。
bug、bug、question 线程中开放了问题

 
Nikolai Semko:

谢谢阿列克谢的意见。
这是Bars()函数中一个明显的错误。
bug、bug、question 线程中开设了一个问题

谢谢你的分析,所以我还没有完全疯了......