Fast iBarShift and Bars for MT5 - MetaTrader 5 库


MetaTrader 5 的 iBarShift 函数有许多版本。但是,这个版本特别简单、快速且正确。
整数 iBarShift(常量 细绳符号,常量 ENUM_TIMEFRAMES大体时间,日期时间时间,布尔值准确=错误的) { 整数分辨率=酒吧(符号、时间范围、时间+1,UINT_MAX); 如果(精确的)如果((时间范围!=PERIOD_MN1||时间>时间当前()) && 资源==酒吧(符号、时间范围、时间周期秒数(时间框架)+1,UINT_MAX))返回(-1); 返回(研究); }

截至此代码发布时,此 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小时后评论,即可解锁附件下载
立即登录
