- 显示:
- 1530
- 等级:
- 已发布:
- 2018.06.20 10:02
-
需要基于此代码的EA交易或指标吗?请在自由职业者服务中订购 进入自由职业者服务
有许多 MetaTrader 5 版本的 iBarShift 函数。 不过,这个版本特别简单、迅速且正确。
int iBarShift(const string Symb,const ENUM_TIMEFRAMES TimeFrame,datetime time,bool exact=false) { int Res=iBars(Symb,TimeFrame,time+1,UINT_MAX); if(exact) if((TimeFrame!=PERIOD_MN1 || time>TimeCurrent()) && Res==iBars(Symb,TimeFrame,time-PeriodSeconds(TimeFrame)+1,UINT_MAX)) return(-1); return(Res); }
在发布代码时,此 iBarShift 函数中调用的集成 Bars 函数有一个程序滞后时间超过 10 秒的错误。 基本上,在 Bars 函数必须返回零的地方就会发生。
例如,在执行代码:
Print("1"); Print(Bars(_Symbol,PERIOD_D1,D'2018.05.02 01:58:03',D'2018.05.02 12:56:11')); Print("2");
输出 "1" 超过 10 秒钟后 "2" 才会输出。
我建议您用这个 iBars 函数替换程序中的标准 Bars 函数,特别是如果您已注意到奇怪的滞后时间大于等于 10 秒。
包含在这个头文件中的 iBars 函数解决了这个不便之处,并且由于会保存以前的数值从而令算法工作得更加快捷。
int iBars(string symbol_name,ENUM_TIMEFRAMES timeframe,datetime start_time,datetime stop_time) // stop_time > start_time { static string LastSymb=NULL; static ENUM_TIMEFRAMES LastTimeFrame=0; static datetime LastTime=0; static datetime LastTime0=0; static int PerSec=0; static int PreBars=0,PreBarsS=0,PreBarsF=0; static datetime LastBAR=0; static datetime LastTimeCur=0; static bool flag=true; static int max_bars=TerminalInfoInteger(TERMINAL_MAXBARS); datetime TimeCur; if (timeframe==0) timeframe=_Period; const bool changeTF=LastTimeFrame!=timeframe; const bool changeSymb=LastSymb!=symbol_name; const bool change=changeTF || changeSymb || flag; LastTimeFrame=timeframe; LastSymb=symbol_name; if(changeTF) PerSec=::PeriodSeconds(timeframe); if(PerSec==0) { flag=true; return(0);} if(stop_time<start_time) { TimeCur=stop_time; stop_time=start_time; start_time=TimeCur; } if(changeSymb) { if(!SymbolInfoInteger(symbol_name,SYMBOL_SELECT)) { SymbolSelect(symbol_name,true); ChartRedraw(); } } TimeCur=TimeCurrent(); if(timeframe==PERIOD_W1) TimeCur-=(TimeCur+345600)%PerSec; // 01.01.1970 - Thursday. Minus 4 days. if(timeframe<PERIOD_W1) TimeCur-=TimeCur%PerSec; if(start_time>TimeCur) { flag=true; return(0);} if(timeframe==PERIOD_MN1) { MqlDateTime dt; TimeToStruct(TimeCur,dt); TimeCur=dt.year*12+dt.mon; } if(changeTF || changeSymb || TimeCur!=LastTimeCur) LastBAR=(datetime)SeriesInfoInteger(symbol_name,timeframe,SERIES_LASTBAR_DATE); LastTimeCur=TimeCur; if(start_time>LastBAR) { flag=true; return(0);} datetime tS,tF=0; if(timeframe==PERIOD_W1) tS=start_time-(start_time+345599)%PerSec-1; else if(timeframe<PERIOD_MN1) tS=start_time-(start_time-1)%PerSec-1; else // PERIOD_MN1 { MqlDateTime dt; TimeToStruct(start_time-1,dt); tS=dt.year*12+dt.mon; } if(change || tS!=LastTime) { PreBarsS=Bars(symbol_name,timeframe,start_time,UINT_MAX); LastTime=tS;} if(stop_time<=LastBAR) { if(PreBarsS>=max_bars) PreBars=Bars(symbol_name,timeframe,start_time,stop_time); else { if(timeframe<PERIOD_W1) tF=stop_time-(stop_time)%PerSec; else if(timeframe==PERIOD_W1) tF=stop_time-(stop_time+345600)%PerSec; else // PERIOD_MN1 { MqlDateTime dt0; TimeToStruct(stop_time-1,dt0); tF=dt0.year*12+dt0.mon; } if(change || tF!=LastTime0) { PreBarsF=Bars(symbol_name,timeframe,stop_time+1,UINT_MAX); LastTime0=tF; } PreBars=PreBarsS-PreBarsF; } } else PreBars=PreBarsS; flag=false; return(PreBars); } //+------------------------------------------------------------------+ int iBars(string symbol_name,ENUM_TIMEFRAMES timeframe) {return(Bars(symbol_name,timeframe));} //+------------------------------------------------------------------+
由MetaQuotes Ltd译自俄语
原代码: https://www.mql5.com/ru/code/20417

EA 使用 Pivot-2 指标和 Heiken Ashi 平滑振荡器。

替代简单移动平均线,而使用 EMA (指数移动平均线),且替代平均偏差,而用 EMA 偏差 (最初在这里发表的 EMA 偏差)。

无指标: 仅分析开盘价和收盘价。 输入参数: Stop Loss, Take Profit, 和 Trailing。

ChannelEA2 - 在通道中工作的智能交易系统,使用挂单止损订单。