Renat Fatkhullin, 2015.02.10 08:16
我还没有运行代码,但源代码显示了 HistorySelect 中错误的结束日期这一典型错误。
每个第一个调用该函数的程序员都会使用错误的日期,不断点检历史结束时间,并检测 "进入历史的交易时间过长"。
Renat Fatkhullin, 2015.02.10 09:15
错误在于人们没有考虑当前时刻是什么时候,而是用错误的日期替代错误的来源。
只要指定一个已知的遥远日期作为结束日期,而不是过时的 serverTime 就足够了。
Renat Fatkhullin, 2015.02.10 13:56
开始和结束日期的设定都应考虑到误差的实现和强制保证金。也就是说,至少要减 N 秒和加 N 秒。
TimeTradeServer() 并不是一个 rltime 精确时间,而是完全根据进入市场概览的价格刻度进行更新。
如果历史样本中突然没有数据,99% 意味着错误出在查询边界上。
HistorySelect(0, LONG_MAX);
Предопределённые переменные _XXXX переводятся в функции MQL5 при помощи беспараметрической формы #define:
//--- _Digits 变量存储小数点后的位数、 #define _Digits Digits()
//--- 当前符号的最新已知卖方价格(卖出价 double GetAsk() { MqlTick tick; SymbolInfoTick(Symbol(),tick); return(tick.ask); }
太贵了!如果你真的想通过结构来做,你至少应该做过。而且由于某种原因没有进行检查。
SymbolInfoDouble 完全符合 MT4 标准。
#define IsTradeContextBusy true
也许是假的?
也许是假的?fxsaber, 2017.09.26 09:55 pm.
bool RefreshRates( void ) { return(true); } double MarketInfo( const string Symb, const ENUM_SYMBOL_INFO_DOUBLE Property ) { return(SymbolInfoDouble(Symb, Property)); } int MarketInfo( const string Symb, const ENUM_SYMBOL_INFO_INTEGER Property ) { return((int)SymbolInfoInteger(Symb, Property)); } bool IsTesting(void) { return(MQLInfoInteger(MQL_TESTER) || MQLInfoInteger(MQL_OPTIMIZATION)); } bool IsTradeContextBusy( void ) { return(false); } bool IsTradeAllowed(void) { return(MQLInfoInteger(MQL_TRADE_ALLOWED)); } bool IsExpertEnabled(void) { return(AccountInfoInteger(ACCOUNT_TRADE_EXPERT)); } int ObjectFind( const string Name ) { return(ObjectFind(0, Name)); } int ObjectsTotal( void ) { return(ObjectsTotal(0)); } bool ObjectDelete( const string Name ) { return(ObjectDelete(0, Name)); } string ObjectName( const int Pos ) { return(ObjectName(0, Pos)); } double AccountFreeMarginCheck(const string Symb,const int Cmd,const double dVolume) { double Margin; return(OrderCalcMargin((ENUM_ORDER_TYPE)Cmd, Symb, dVolume, SymbolInfoDouble(Symb, (Cmd == ORDER_TYPE_BUY) ? SYMBOL_ASK : SYMBOL_BID), Margin) ? AccountInfoDouble(ACCOUNT_MARGIN_FREE) - Margin : -1); } #define False false #define True true #define Digits _Digits #define Point _Point #define MODE_BID SYMBOL_BID #define MODE_ASK SYMBOL_ASK #define MODE_POINT SYMBOL_POINT #define MODE_DIGITS SYMBOL_DIGITS #define MODE_STOPLEVEL SYMBOL_TRADE_STOPS_LEVEL #define MODE_SPREAD SYMBOL_SPREAD #define StrToTime StringToTime #define StrToInteger StringToInteger #define TimeToStr TimeToString #define DoubleToStr DoubleToString #define Bid SymbolInfoDouble(_Symbol, SYMBOL_BID) #define Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)
fxsaber:
В копилку
#define forEach(element, array) for (int __i = 0, __max = ArraySize((array)); __i < __max && ((element) = array[__i]) == (element); __i++)
有趣而不显眼的技术 )
你能做多少扭曲的事情?
定义是用一种文字代替另一种文字的愚蠢行为。它们没有任何力量!
最好试着在模板上做同样的事情。
你能这样做多少次?
定义是用一种文字代替另一种文字的愚蠢行为。它们没有任何力量!
少写有时很方便
最好尝试在模板上做同样的事情。
这只是一个可行性、可用性和性能的问题。
新文章 交易者生活窍门: 利用 defines (#define) 融合 ForEach已发布:
对于那些仍然使用 MQL4 编程且不想切换到 MQL5 的人来说, 本文是一个过渡步骤。 我们继续寻找以 MQL4 风格编写代码的机会。 这一次, 我们将研究 #define 预处理器的宏替代。
创建智能交易系统几乎总是需要大量的循环工作。 循环随处环绕着我们: 搜索订单, 历史交易, 图表对象, 市场观察品种, 指标缓冲区中的柱线。 为了让程序员的生活更轻松一点, MetaEditor 以 代码片段 (snippets) 为特色, 意即当您输入第一个字符时, 按 Tab 键后它们会自动变成一小段代码。 这就是 'for' 循环片段的工作原理:

不错, 但它尚未覆盖我们的所有需求。 考虑最简单的例子: 假设我们需要搜索市场观察内的所有品种。作者:Vladimir Karputov