概述
3 }' B- X m" d: g7 R作为 MQL5 程序员或开发人员,我们发现我们需要很好地理解和使用策略测试器,才能获得有效的结果。 通过使用这款颇具价值的工具,我们可以获得有关我们所创建 MQL5 程序的性能的宝贵认知,这对获得更好的交易结果颇具影响。 故此,我们发现在进行测试之前,我们需要充分了解重要的主题,例如处理所有错误类型,因为作为开发人员,我们犯糊涂导致出错是很正常的。 我们还需要深刻理解的另一个主题是调试,它让我们以交互方式执行我们创建的程序。 然后,我们来到最重要和最有价值的工具,即策略测试器,用于测试和评估我们创建的程序,其功能比 MetaTrader 4 版本的更有趣。 因此,在本文中,学习使用 MQL5 策略测试器的最重要方面会是一次了不起的学习之旅' ~. k) z* K. U
错误
, J4 j+ f% A `在本主题中,我们将学习在创建、执行和运行 MQL5 程序时可能发现的错误。 理解这个主题的一个要点是,MQL5 会正确报告这些错误,但如果我们不知道这些错误意味着什么,或者在程序的哪个阶段,相较于我们已经知道它们的含义,我们就要花费更多的时间来处理或解决它们。# v6 {( _1 l; q; u0 y# V- R
我们将根据我们在 MQL5 程序上的工作阶段来讲述这个主题,在我们编写代码时,可能会遇到错误和警告,即编译错误和警告。 我们在执行 MQL5 程序时也可能会遇到运行时错误,当我们的 MQL5 程序尝试交易时,我们也可能会遇到其它类型的错误,即交易服务器错误。# q7 I! q" _7 P) k! x
左括号不平衡错误:
8 ^4 U6 W# w6 c0 q; e当我们缺少右括号、或多用了额外的右括号时,就会发生此类错误。 我们可以通过以下示例发现该错误。$ f& c) z6 }- z f4 r
出错的错误代码:
& ?; J7 k6 M! y' i- a! {bool a=7;
* C- E' [: e6 W+ ]if (a=5% g- U! O8 Q: N% |$ `
a=5
- F) u' H+ [) ]- ^6 c }9 ]更正无错误代码:
$ i* Q: J; ?" N- j7 J) lbool a=7;5 r. B( J6 Z& r2 T4 N3 F
if (a=5)5 r2 x0 P; B8 z% h# T. R) R2 y5 L1 T
a=5;7 `+ g) `5 U5 O1 K" V5 P
更正代码后,我们会发现编译时没有错误。
# ]; A, f4 z7 Q D6 W8 J% Y8 u程序意外结束错误:- d+ `/ |5 u( [# G, A9 e
有时我们在代码中遗漏了一个右括号,继而发生意外的程序结束错误,我们必须检查我们的代码,查看需要添加的内容,或者我们需要确保每个左括号匹配一个右括号来解决此错误。 下面是该代码的示例。% }- ?2 j/ F. z; v
出错的错误代码:& F2 O7 z6 U* a
void OnStart()
6 u1 y* i- _3 I; C8 A$ f{! ]/ q. G8 J1 I
bool a=7;
- s/ p1 B _, e& O; @: e iif (a=5)
( R' f' w3 j V5 @a=5;
F5 d7 `3 y+ {更正无错误代码:3 M# y$ Z+ A) R- u3 p9 H0 h' W
void OnStart()
) x3 O! j4 \- N. K' W; c8 _8 I{
' d/ ?/ Q0 |* H3 a; V+ Vbool a=7;
: ?" h# {- W9 ^' _4 F8 J, Iif (a=5)5 W* f& O, Z$ w. A6 P' H8 C7 z
a=5;& Y8 Q9 m$ x8 i
}' r' r3 ]$ |5 }0 ?, {. Z+ ?
添加右括号更正代码后,我们会发现代码成功编译没有错误。
0 \: ?# D3 }: a表达式不允许出现在全局范围错误:5 [/ Q) ]0 m% Y2 _' { i0 d, ]; b
当我们在复合运算符中缺少左括号时,就会发生该错误,或者当我们在特定函数范围之外编写语句或表达式时,可能会发生该错误,因为我们只能在函数范围内使用表达式。 以下示例示意此类错误。! V, i0 R3 A: F8 E8 Z
出错的错误代码:6 l0 Y9 d' i& I5 P( k: v! Y
int a=(7+5);
; h+ K( ^8 J' `( K! H; B2 Cif (a<7)
1 h: }. n, i1 X3 s. g. p( C/ Aa=7;
# r0 z5 a# v# }# C}
- l5 h e* B$ E在前面的代码中,我们遗漏了与(})配对的起始({),故系统报告 “表达式不允许出现在全局范围” 错误。 以下是 “错误” 选项卡中的错误。
4 `: }7 i7 v7 a5 ^# p+ n: v% a, m更正无错误代码:
" q y: W1 b$ S0 D' M0 Yint a=(7+5);
( T9 F/ z' F3 F* Bif (a<7): C9 ^, X, L, X+ q2 Z( p) }0 U- p! @
{
_0 i" F) u$ i5 k9 ^+ j/ G5 _6 B1 ja=7;
- x& P+ M$ ^ }3 x}4 K& H" V6 H% b! n+ p' _
更正代码后,与前面的代码模块相同,我们会发现代码编译后没有任何错误。" L6 M$ R$ v( P2 n0 c! |
错误的参数计数错误:5 _3 S: C( O0 U
当我们用到拥有指定参数的特定函数时,若我们未正确指定这些参数,意即或多或少,我们会体验到这种类型的错误代码。 如果我们使用预定义的函数或我们创建的函数,则会出现此错误。 以下是该错误的示例。
2 F! u3 o; D8 i/ U有错误的代码:( z) Y2 G7 y& g$ o( ~& U
如果我们创建了一个 “myVal” 函数,返回两个整数值求和的结果,这意味着该函数中有两个参数? 故此,当我们调用此函数时传递个数的参数时,我们将得到此类错误,其与以下代码相同4 Q! W1 R3 |/ y5 P9 \* x
void OnStart()
- k3 b, ~6 @2 m- ]{3 g( k+ E) A7 F+ ?) B
int example=myVal(10);" }$ _6 a7 C. m: Z) z: B3 K
}- J0 D \% j( {7 E+ ]
//+------------------------------------------------------------------+
5 T; y4 y; V6 L6 L* k. {$ Xint myVal(int a, int b)
" x4 y, K& r# m. V+ w/ w$ N. J{
' V8 ]" e( b5 W% ?( X# d ~return a+b;, ?; x/ G" X' v2 `6 R' M% P
}
) b) o- u) i. f, R! D% a无错误代码:) ?* [& {, ~! c0 T
为了正确编写此代码,我们需要为这个创建的函数传递相应个数的参数,如下所示3 R) m' _! w' T
void OnStart()
' e3 Y5 u8 Y5 G N- J{* n0 T: m) V J8 f
int example=myVal(10,20);
' b+ [3 M8 O4 l' N}# V( _ ~4 L& e9 R' a5 `- H7 o
//+------------------------------------------------------------------+
/ A9 |" h0 }, y5 v, Xint myVal(int a, int b)
' Z, E8 W: G+ l" r- ^{( e7 |, M6 @7 t
return a+b;) F4 G2 y( c$ y& p( G7 @9 F
}
! P: D6 T4 J6 c: S' E/ j编译此正确代码后,我们不会发现任何错误。
, p0 D( B+ B/ k某些操作符预期错误:
" A7 j d5 S) i; }, `: w当我们在特定位置完全遗漏或放错操作符时,我们就会遇到这种类型的错误。 以下是该类错误的示例。; }4 h m% _# d
有错误的代码:& R1 q- O6 X& Z# {& g
int a= 7 10; |