概述
7 ?; s5 j; Y3 X作为 MQL5 程序员或开发人员,我们发现我们需要很好地理解和使用策略测试器,才能获得有效的结果。 通过使用这款颇具价值的工具,我们可以获得有关我们所创建 MQL5 程序的性能的宝贵认知,这对获得更好的交易结果颇具影响。 故此,我们发现在进行测试之前,我们需要充分了解重要的主题,例如处理所有错误类型,因为作为开发人员,我们犯糊涂导致出错是很正常的。 我们还需要深刻理解的另一个主题是调试,它让我们以交互方式执行我们创建的程序。 然后,我们来到最重要和最有价值的工具,即策略测试器,用于测试和评估我们创建的程序,其功能比 MetaTrader 4 版本的更有趣。 因此,在本文中,学习使用 MQL5 策略测试器的最重要方面会是一次了不起的学习之旅& d0 T# X9 C/ z/ f/ i' f3 [, C/ \
错误
& }0 l6 F% z2 m4 p: U" A在本主题中,我们将学习在创建、执行和运行 MQL5 程序时可能发现的错误。 理解这个主题的一个要点是,MQL5 会正确报告这些错误,但如果我们不知道这些错误意味着什么,或者在程序的哪个阶段,相较于我们已经知道它们的含义,我们就要花费更多的时间来处理或解决它们。
+ w6 t4 D1 |4 t- Y! h# O我们将根据我们在 MQL5 程序上的工作阶段来讲述这个主题,在我们编写代码时,可能会遇到错误和警告,即编译错误和警告。 我们在执行 MQL5 程序时也可能会遇到运行时错误,当我们的 MQL5 程序尝试交易时,我们也可能会遇到其它类型的错误,即交易服务器错误。
8 w/ T- V& m& J6 c( Q+ d. Z1 y左括号不平衡错误:
% }' \, w {7 N! k- p5 L- g& W3 d当我们缺少右括号、或多用了额外的右括号时,就会发生此类错误。 我们可以通过以下示例发现该错误。8 l9 ]0 I4 K) k* i5 @# Y+ R3 C
出错的错误代码:* [3 L( y/ N5 Y0 [3 y) Y" ^
bool a=7;/ E6 C$ t3 z+ p, ?+ u
if (a=5+ O9 F& H# m2 E- ^8 C4 a
a=5
7 {7 i2 X' z9 c" o) J更正无错误代码:; w& V) M* d w/ j% g+ y
bool a=7;
2 H7 ~6 B m) t2 X: O* n3 Qif (a=5)4 E- T0 U' f- V# C( C. E' N
a=5;
& W! h8 W2 e7 y+ `9 |3 a更正代码后,我们会发现编译时没有错误。. s: y% C( I3 J- X0 V5 _5 l" m
程序意外结束错误:
( m/ z6 `3 B# ~7 v, P+ C0 }8 ^有时我们在代码中遗漏了一个右括号,继而发生意外的程序结束错误,我们必须检查我们的代码,查看需要添加的内容,或者我们需要确保每个左括号匹配一个右括号来解决此错误。 下面是该代码的示例。. ?; B O' b+ n5 e
出错的错误代码: V5 w' }5 m3 m# }" d
void OnStart()
) _" }0 j1 C. C( R" Q$ Q; h: v1 u{
5 _* ~* u: `0 v: q, D# H) \ Abool a=7;% E4 ~" \" [8 D' d1 U
if (a=5)
8 p* g: s) @! P- o& J5 {; Va=5;
( g2 }! ~ ~" [更正无错误代码:
3 P: W, Y3 e8 ]) T, ?2 mvoid OnStart()
% Y' Y' c: h( c" V6 O{+ u0 e7 w: J$ a& v! X. N& e8 u
bool a=7;) a( Y1 ] B: ^' i R y# z% F
if (a=5)8 a& N `/ N+ p& W) B2 ^
a=5;
0 J: Z9 E; ^# F1 I4 h}
" k3 |4 V* f; a4 D0 |添加右括号更正代码后,我们会发现代码成功编译没有错误。: g/ @! b& a# Z6 G+ M2 ~$ S* V
表达式不允许出现在全局范围错误:) f& o; ?2 A' G6 N# X- s
当我们在复合运算符中缺少左括号时,就会发生该错误,或者当我们在特定函数范围之外编写语句或表达式时,可能会发生该错误,因为我们只能在函数范围内使用表达式。 以下示例示意此类错误。7 ~: v$ _; a. p' s( i) N4 F' N7 P
出错的错误代码:9 n' O* ?6 I5 n' y( y) f
int a=(7+5);
# b3 n# l8 r9 S8 W. K* Q7 j3 n9 xif (a<7)
/ C9 y3 K5 J1 h! Ea=7;
: q5 r a/ A/ j' R}: R; y) \0 W! {1 V
在前面的代码中,我们遗漏了与(})配对的起始({),故系统报告 “表达式不允许出现在全局范围” 错误。 以下是 “错误” 选项卡中的错误。
" N+ u3 n0 f# `* M" z+ `8 q1 F更正无错误代码:
8 S. `) |% }- } B( a3 rint a=(7+5);& v% H% D( t0 z, L! {; v
if (a<7)
- i/ b1 L( d; i7 p( M& h2 p7 a2 G: F{
, b% @& A1 y; B4 Fa=7;
/ U6 R: Q& A- U' _. V# B: _}" l( P2 b! a- d e' _
更正代码后,与前面的代码模块相同,我们会发现代码编译后没有任何错误。
9 ]: E* a/ M) {- W错误的参数计数错误:4 Z# ~ x7 f6 Q" p7 e
当我们用到拥有指定参数的特定函数时,若我们未正确指定这些参数,意即或多或少,我们会体验到这种类型的错误代码。 如果我们使用预定义的函数或我们创建的函数,则会出现此错误。 以下是该错误的示例。
7 j. l8 |( t( v0 D# J有错误的代码:$ \/ L- X* _: E
如果我们创建了一个 “myVal” 函数,返回两个整数值求和的结果,这意味着该函数中有两个参数? 故此,当我们调用此函数时传递个数的参数时,我们将得到此类错误,其与以下代码相同
, B( b5 z/ P4 f" g+ tvoid OnStart()
+ Q2 n# B7 I8 |1 x{
4 f u) m; _8 V* l' } {, X" a) Z7 fint example=myVal(10);5 t( U8 o, Q8 O. U8 v
}
9 l# ?! f; H, h& k//+------------------------------------------------------------------+. b5 k- Y+ N% T' P3 _" E
int myVal(int a, int b) P- S3 L( r+ d' }: Z* f' V. }1 V
{
7 I" q6 |* h+ R. C& g0 @+ Wreturn a+b;# v6 ~* L' ]* q, t: c& y
}
" X Q @5 D% J8 C# o8 r无错误代码:
c& t! E& C4 I7 J) N8 T7 [为了正确编写此代码,我们需要为这个创建的函数传递相应个数的参数,如下所示$ |4 N/ }" x8 U6 e n2 P
void OnStart()# _$ {- ~: | P1 Q
{( x3 a/ E$ D2 S( i% l; L
int example=myVal(10,20);
6 E: \' v1 d/ R6 N}( t0 Z1 Q/ D# H, x
//+------------------------------------------------------------------+
" i) B/ j3 V; U& R K: bint myVal(int a, int b)7 t* U8 d, u( b, H& j8 A
{
( [6 S5 b* N2 O _& M0 B! jreturn a+b;1 r' W# }8 P) N3 X k5 K, X% q0 b& x; i
}
$ w/ d9 g: _8 z4 p( M4 t; _" n8 ~9 `编译此正确代码后,我们不会发现任何错误。
4 z. A. W) w* B% l8 L% q某些操作符预期错误:
5 ?! p: o( F1 p& |2 G当我们在特定位置完全遗漏或放错操作符时,我们就会遇到这种类型的错误。 以下是该类错误的示例。
% u' V4 [% c/ ]有错误的代码:0 ~5 w% Y" f, L2 D+ r+ X
int a= 7 10; |