类似于iBarShift - 页 6

 
Vasiliy Pushkaryov:

我得到的TimeCurrent() 只是作为一种特殊情况。

我现在更仔细地阅读了Bars() 函数的这个注释。

"当要求在一个给定的日期范围内的酒吧数量,只考虑那些开盘时间在该范围内的酒吧。例如,如果当前的工作日是星期六,当要求获得start_time=lastTuesday和stop_time=lastFriday的周线数量时,函数返回0,因为周线时间框架的开盘时间总是在星期天,没有周线落入指定范围"。

由于TimeCurrent() 几乎所有的时间都晚于当前条形的开盘时间,所以Bars() 函数返回0。因此,如果我们将小时时间框架上的02:05所对应的时间作为start_time 参数传递,并且我们希望2点钟开始的条形有效,那么我们必须通过CopyTime() 获得条形的开盘时间(02:00:00)。否则 ,函数Bars() 将忽略此条

例如,如果时间是3:30,我的理解是,每小时时间框架中的2:05时间指的是索引为1的条形。第2页上的所有函数都不会返回这个索引。通过这一修正,雷纳特-阿赫蒂亚莫夫的 函数返回了我预期的结果。

我附上一个脚本,有4个索引查找功能的选项,我把它作为一个测试。

试了一下所提出的功能,结果发现,如果它要求的是一个不在图表上的时间的条形图,它就会说谎。例如,如果我们想知道当天的第一条,并要求提供时间 "28.03.2018 00:00"但没有该时间段的条形图,我们将得到前一天的最后一条条形图的指数。

还是注定要这样的?

 
Aleksey Vyazmikin:

我尝试了所提出的功能,结果发现,如果要求的时间不在图表上,它就会谎报一个柱状。例如,如果我们想知道一天中的第一条,并要求提供时间 "28.03.2018 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 - 为了标准化,它不会影响任何东西 :)说实话,我不知道为什么在一些函数中根本就需要这种假的?

 
Aleksey Vyazmikin:

到目前为止,我已经确定了这个代码,它似乎工作得很快。

有没有人发现这个代码有什么缺点,或者有没有更快的选择?

啊,好吧,唯一的缺点是,如果你对一个尚未出现在图表上的条形图提出请求,即今天的时间,例如.....。也许这也有一个解决方案?在这里,返回最后一个已知的条形图就很有意义了。这可能与在当前时间 上工作的算法有关。

返回一个不存在的酒吧号码是不好的。

返回-1比较容易

 
Aleksey Vyazmikin:

false - 为了标准化,不影响任何东西 :)说实话,我不知道为什么在一些函数中根本就需要这种假的?

我在那里迷路了,我是一个简单代码的追随者,没有冒号。
 
Renat Akhtyamov:

返回一个不存在的酒吧号码不是很好。

返回-1是比较容易的

不,它应该只是返回最后一个已知的条形图,即索引为0的条形图,但现在它要花很长时间才能弄清在那里返回什么。

下面是代码,它错了一格,返回的是正确的一格--0。

还是你指的是当历史要求按时间划分的酒吧不存在的情况?然后我认为,最常见的情况是,你需要获得那些可用的最接近我们时间的条形图,在这种情况下,代码返回历史上偏移量为-1的条形图,但它工作正常,如果没有进一步的历史 - 它很快返回零条形图。

 
Aleksey Vyazmikin:

不,它应该只是返回最后一个已知的条形图,即索引为0的条形图,但现在它要花很长时间才能弄清在那里返回什么。

错了一格的代码,返回正确的一格--零。

还是你指的是当历史要求按时间计算的酒吧不存在的时候? 然后我认为,最常见的是我们应该得到最接近我们时间的条形图,在这种情况下,代码返回历史上偏移量为-1的条形图,但它工作正常,如果没有进一步的历史--它很快返回零条。

是的(强调)。

-1是一个减号(我澄清了),函数返回的错误是没有这样的条子

就是说,我的职能。

关于交易、自动交易系统和策略测试的论坛

iBarShift的模拟

Renat Akhtyamov, 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() 函数时,具有指定参数的时间序列的数据尚未在终端生成,或者在调用函数的时刻,时间序列的数据没有与交易服务器同步,那么 函数 将返回0值。"

====

如果res==0,我们将从函数中捕获-1,因为它是。

===

因此,这一切都很有效,利用它来发挥你的优势吧!