欢迎访问 外汇EA下载与MT4/MT5自动交易资源 - 聚合外汇EA、黄金EA、量化交易工具与自动化交易实战内容。
登录 注册

Fast iBarShift and Bars for MT5 - MetaTrader 5 库

author emer | 658 人阅读 | 0 人评论 |

Fast iBarShift and Bars for MT5 - library for MetaTrader 5

Fast iBarShift and Bars for MT5 - library for MetaTrader 5

MetaTrader 5 的 iBarShift 函数有许多版本。但是,这个版本特别简单、快速且正确。

整数 iBarShift常量 细绳符号,常量 ENUM_TIMEFRAMES大体时间,日期时间时间,布尔值准确=错误的)
  {
  整数分辨率=酒吧(符号、时间范围、时间+1,UINT_MAX);
  如果(精确的)如果((时间范围!=PERIOD_MN1||时间>时间当前()) && 资源==酒吧(符号、时间范围、时间周期秒数(时间框架)+1,UINT_MAX))返回(-1);
  返回(研究);
  }

Fast iBarShift and Bars for MT5 - library for MetaTrader 5

截至此代码发布时,此 iBarShift 函数中使用的集成 Bars 函数存在一个错误,表现为程序滞后超过 10 秒。基本上,这种情况发生在 Bars 函数必须返回零的情况下。

例如,在执行代码时:

打印“1”);
  打印酒吧_象征,PERIOD_D1,D'2018.05.02 01:58:03',D'2018.05.02 12:56:11'));
  打印“2”);

“2”将在“1”上超过10秒后打印。

我建议您用 iBars 函数替换程序中的标准 Bars 函数,特别是如果您注意到奇怪的延迟 10 秒或更长时间。

该包含文件中包含的 iBars 函数既解决了这种不便,又由于保存前面值的算法而工作得更快。

整数 酒吧细绳符号名称,ENUM_TIMEFRAMES  大体时间,日期时间开始时间,日期时间停止时间)// 停止时间 > 开始时间  {
  静止的 细绳最后符号=无效的;
  静止的 ENUM_TIMEFRAMES最后时间帧=0;
  静止的 日期时间最后时间=0;
  静止的 日期时间最后时间0=0;
  静止的 整数每秒=0;
  静止的 整数前柱=0,PreBarsS=0,PreBarsF=0;
  静止的 日期时间最后条=0;
  静止的 日期时间上次时间=0;
  静止的 布尔值标志=真的;
  静止的 整数最大条数=终端信息整数TERMINAL_MAXBARS);
  日期时间时间曲线;
  如果(时间范围==0) 时间范围=_时期;
  常量 布尔值changeTF=LastTimeFrame!=时间范围;
  常量 布尔值changeSymb=LastSymb!=symbol_name;
  常量 布尔值改变=改变TF ||更改符号 ||旗帜;

   LastTimeFrame=时间范围; LastSymb=符号名称;
  如果(changeTF) PerSec=::周期秒数(大体时间);如果(每秒==0) { 标志=真的;返回0);}

  如果(停止时间<开始时间)
     {
      TimeCur=停止时间;
      停止时间=开始时间;
      开始时间=当前时间;
     }
  如果(更改符号)
     {
      如果(!符号信息整数(符号名称,符号选择))
        {
        符号选择(符号名称,真的);
        图表重绘();
        }
     }
   时间电流=时间当前();
  如果(时间范围==PERIOD_W1) 时间Cur-=(时间Cur+345600)%每秒;// 1970 年 1 月 1 日 - 星期四。减去4天。  如果(时间范围<PERIOD_W1) TimeCur-=TimeCur%PerSec;
  如果(start_time>TimeCur) { 标志=真的;返回0);}
  如果(时间范围==PERIOD_MN1)
     {
      Mql日期时间dt;
      构建时间(时间Cur,dt);
      TimeCur=dt.year*12+dt.mon;
     }

  如果(changeTF || changeSymb || TimeCur!=LastTimeCur)
      最后条=(日期时间系列信息整数(交易品种名称、时间范围、SERIES_LASTBAR_DATE);

   LastTimeCur=当前时间;
  如果(start_time>LastBAR) { 标志=真的;返回0);}

  日期时间tS,tF=0;
  如果(时间范围==PERIOD_W1) tS=开始时间-(开始时间+345599)%每秒-1;
  别的 如果(时间范围<PERIOD_MN1) tS=开始时间-(开始时间-1)%每秒-1;
  别的  //  PERIOD_MN1     {
      Mql日期时间dt;
      构建时间(开始时间-1,dt);
      tS=dt.年*12+dt.mon;
     }
  如果(改变 || tS!=LastTime) { PreBarsS=酒吧(交易品种名称、时间范围、开始时间、UINT_MAX);最后时间=tS;}
  如果(停止时间<=LastBAR)
     {
      如果(PreBarsS>=max_bars) PreBars=酒吧(交易品种名称、时间范围、开始时间、停止时间);
      别的        {
        如果(时间范围<PERIOD_W1) tF=stop_time-(stop_time)%PerSec;
        别的 如果(时间范围==PERIOD_W1) tF=停止时间-(停止时间+345600)%每秒;
        别的 //  PERIOD_MN1           {
            Mql日期时间dt0;
            构建时间(停止时间-1,dt0);
            tF=dt0.年*12+dt0.mon;
           }
        如果(改变 || tF!=LastTime0)
           { PreBarsF=酒吧(交易品种名称、时间范围、停止时间+1,UINT_MAX);最后时间0=tF; }
         PreBars=PreBarsS-PreBarsF;
        }
     }
  别的PreBars=PreBarsS;
   标志=错误的;
  返回(PreBars);
  }//+------------------------------------------------------------------+
整数 酒吧细绳符号名称,ENUM_TIMEFRAMES  大体时间) {返回酒吧(交易品种名称、时间范围));}//+------------------------------------------------------------------+



附件下载

📎 ibars.mqh (4.31 KB)

📎 testbarshift.mq5 (13.23 KB)

Source: MQL5 #20417

🔐
请登录后参与评论
注册满12小时后评论,即可解锁附件下载
立即登录