概述
U/ o" i/ a$ c' z% d作为 MQL5 程序员或开发人员,我们发现我们需要很好地理解和使用策略测试器,才能获得有效的结果。 通过使用这款颇具价值的工具,我们可以获得有关我们所创建 MQL5 程序的性能的宝贵认知,这对获得更好的交易结果颇具影响。 故此,我们发现在进行测试之前,我们需要充分了解重要的主题,例如处理所有错误类型,因为作为开发人员,我们犯糊涂导致出错是很正常的。 我们还需要深刻理解的另一个主题是调试,它让我们以交互方式执行我们创建的程序。 然后,我们来到最重要和最有价值的工具,即策略测试器,用于测试和评估我们创建的程序,其功能比 MetaTrader 4 版本的更有趣。 因此,在本文中,学习使用 MQL5 策略测试器的最重要方面会是一次了不起的学习之旅9 D$ x) w) w. s3 e9 M
错误
/ T# S7 l' t+ t8 l2 K& _# x在本主题中,我们将学习在创建、执行和运行 MQL5 程序时可能发现的错误。 理解这个主题的一个要点是,MQL5 会正确报告这些错误,但如果我们不知道这些错误意味着什么,或者在程序的哪个阶段,相较于我们已经知道它们的含义,我们就要花费更多的时间来处理或解决它们。
- h; V$ P% r( z, T7 H: G8 _我们将根据我们在 MQL5 程序上的工作阶段来讲述这个主题,在我们编写代码时,可能会遇到错误和警告,即编译错误和警告。 我们在执行 MQL5 程序时也可能会遇到运行时错误,当我们的 MQL5 程序尝试交易时,我们也可能会遇到其它类型的错误,即交易服务器错误。4 z& m- ^* ^9 }7 `' q7 ]
左括号不平衡错误:
8 _& p6 j/ W5 L+ g: g当我们缺少右括号、或多用了额外的右括号时,就会发生此类错误。 我们可以通过以下示例发现该错误。
) i8 L# T( X" C( T/ V* m出错的错误代码:
- A: g4 T. P& Z. v6 Q- wbool a=7;' I- ]2 o) Q; T$ g. b& z
if (a=5" p2 R5 l4 ^0 t/ d# Z/ j( b5 V
a=58 W$ a/ L' K) y5 W. P
更正无错误代码:# y0 G; y& X7 b% x" Z. [) s
bool a=7;
5 u$ X4 G1 S* g$ ~( ^2 Nif (a=5)% a5 r' Q0 O* t4 B3 z+ ]
a=5;
9 k$ [0 r8 E1 _更正代码后,我们会发现编译时没有错误。3 i7 z' z8 W. q# S
程序意外结束错误:4 `: C' ]0 L* D* ?/ O/ X
有时我们在代码中遗漏了一个右括号,继而发生意外的程序结束错误,我们必须检查我们的代码,查看需要添加的内容,或者我们需要确保每个左括号匹配一个右括号来解决此错误。 下面是该代码的示例。3 y }& Y! ^$ b) }
出错的错误代码:$ i# k$ J, s+ ~, W5 r/ }+ j! F+ {
void OnStart()
+ Y" A8 J" p1 Q0 L! J. z{: H3 b1 c) C# M6 u2 D; w& |- t9 D
bool a=7;8 l9 a- n/ a' F ~' b W5 `: A' ]+ i" Z
if (a=5)! l) W; d& a3 n! l* O( U( E6 X
a=5;9 v3 \6 G$ d* Y1 F6 f( u, B
更正无错误代码:
( F. M4 M7 e# _void OnStart()6 ^9 v9 v1 F: d' b7 w4 x' {
{- V7 k5 j( K9 y# N& X
bool a=7;3 H3 B2 \+ w1 n$ i, q
if (a=5)
, p$ ^- P& o- w3 r; d% pa=5;
- A( y8 d& [% D6 ~7 L3 `2 t}
: ^* }% ` b0 R5 w) V添加右括号更正代码后,我们会发现代码成功编译没有错误。* r: b+ t4 W, W c. ^ ~
表达式不允许出现在全局范围错误:; ]2 |* o# G" a& K$ w; }# W( j
当我们在复合运算符中缺少左括号时,就会发生该错误,或者当我们在特定函数范围之外编写语句或表达式时,可能会发生该错误,因为我们只能在函数范围内使用表达式。 以下示例示意此类错误。* i6 t- D) L7 I3 w1 j
出错的错误代码:+ E' A, w, w& F, w& ?
int a=(7+5);
5 C# _3 I. G* _& F, dif (a<7)# h" K3 Y- Q% d* L$ T6 l; v# P
a=7;
" [* J. x' R5 B, h2 K- o* _}2 M0 d: S* F) }
在前面的代码中,我们遗漏了与(})配对的起始({),故系统报告 “表达式不允许出现在全局范围” 错误。 以下是 “错误” 选项卡中的错误。
* _3 F" I( O) f2 X7 \更正无错误代码:# Y5 q. a) H0 g6 P: p
int a=(7+5);8 Z3 N2 `5 M( o- `! F1 L$ Z
if (a<7)
0 c' Y( g1 W2 W6 b1 d2 d6 M{: O! O b6 s! ]: F2 L t
a=7;* d$ x% O3 Q, N: l6 ^
}! G; |5 F; q; b; s; j
更正代码后,与前面的代码模块相同,我们会发现代码编译后没有任何错误。/ ^* w+ k+ N% e$ t/ L
错误的参数计数错误:
% J" S- [5 A0 [& N' J% j- U当我们用到拥有指定参数的特定函数时,若我们未正确指定这些参数,意即或多或少,我们会体验到这种类型的错误代码。 如果我们使用预定义的函数或我们创建的函数,则会出现此错误。 以下是该错误的示例。
7 H- b! V& C K4 }8 w- e1 _9 P! Z/ z有错误的代码:
" S5 | K( M# D+ b# u' V- S2 S如果我们创建了一个 “myVal” 函数,返回两个整数值求和的结果,这意味着该函数中有两个参数? 故此,当我们调用此函数时传递个数的参数时,我们将得到此类错误,其与以下代码相同! J2 T& i" z0 S7 Y8 w
void OnStart()
" I K7 y5 L% ]* J) p{
$ e6 Z8 S8 i" n' F$ X) B" ~7 nint example=myVal(10);* E( l0 H e( s+ l$ C
}( b" `& a" D- H
//+------------------------------------------------------------------+
- E: v% }* @ ~$ P0 Hint myVal(int a, int b)& Y. q! o2 q. T' v& E
{
# q$ P3 K3 f. J& z( L! D$ x; y2 p' ?return a+b;# `' i; x- F4 ?# w/ L9 V% J' N
}. @/ J( {9 \. _9 j2 p5 n
无错误代码:" d ` j: G6 g8 z ]
为了正确编写此代码,我们需要为这个创建的函数传递相应个数的参数,如下所示" {! @' _2 J9 h1 e) L
void OnStart()
$ L% l. ~$ ^7 l p) N{
. t- o0 t" A$ C, n% E, {. wint example=myVal(10,20);* ~) B6 Z% X$ e
}6 ]" L2 ]- Q! Y' a8 o6 y
//+------------------------------------------------------------------+
1 W- W, T5 p$ F$ ~5 \+ _% ~int myVal(int a, int b)9 P+ z% c3 @6 x; f5 e
{$ \3 E7 O$ D/ u; ~9 a
return a+b;- s, X8 a8 R. i1 c8 r
}
& X! S" g3 _! |2 }1 v/ Z; F4 M! q编译此正确代码后,我们不会发现任何错误。
8 Q/ t# F$ ~8 Z6 l( R0 N( L某些操作符预期错误:
4 u. W, B7 P1 d ^& O: ]当我们在特定位置完全遗漏或放错操作符时,我们就会遇到这种类型的错误。 以下是该类错误的示例。* {! X3 Q) E5 R6 U: ?; v7 s4 U6 x
有错误的代码:7 M. p9 D% `! {. X
int a= 7 10; |