概述
4 L4 D* H! n* ?/ ]作为 MQL5 程序员或开发人员,我们发现我们需要很好地理解和使用策略测试器,才能获得有效的结果。 通过使用这款颇具价值的工具,我们可以获得有关我们所创建 MQL5 程序的性能的宝贵认知,这对获得更好的交易结果颇具影响。 故此,我们发现在进行测试之前,我们需要充分了解重要的主题,例如处理所有错误类型,因为作为开发人员,我们犯糊涂导致出错是很正常的。 我们还需要深刻理解的另一个主题是调试,它让我们以交互方式执行我们创建的程序。 然后,我们来到最重要和最有价值的工具,即策略测试器,用于测试和评估我们创建的程序,其功能比 MetaTrader 4 版本的更有趣。 因此,在本文中,学习使用 MQL5 策略测试器的最重要方面会是一次了不起的学习之旅9 D+ l- A4 d1 J7 K' B* q8 b
错误2 B( G+ X+ X: [9 |8 o2 D5 `$ c
在本主题中,我们将学习在创建、执行和运行 MQL5 程序时可能发现的错误。 理解这个主题的一个要点是,MQL5 会正确报告这些错误,但如果我们不知道这些错误意味着什么,或者在程序的哪个阶段,相较于我们已经知道它们的含义,我们就要花费更多的时间来处理或解决它们。
' g2 ]+ E) Q! @4 l2 Y我们将根据我们在 MQL5 程序上的工作阶段来讲述这个主题,在我们编写代码时,可能会遇到错误和警告,即编译错误和警告。 我们在执行 MQL5 程序时也可能会遇到运行时错误,当我们的 MQL5 程序尝试交易时,我们也可能会遇到其它类型的错误,即交易服务器错误。9 c9 [+ \+ g$ @+ k1 {1 _
左括号不平衡错误:. `" ^/ o# T1 g7 `' h
当我们缺少右括号、或多用了额外的右括号时,就会发生此类错误。 我们可以通过以下示例发现该错误。4 J: [3 v4 \! e- u: v
出错的错误代码:, l$ O* y9 ?; j1 M% D
bool a=7;/ O# D: L$ c3 A
if (a=51 x0 a5 S2 b( H, ]5 i
a=5
1 r3 O4 d9 u) J/ G更正无错误代码:4 r* y+ u" C: G- k- p
bool a=7;, p+ N- O, |; | k( z$ R
if (a=5)# ^) w! w0 O2 K% ]4 U1 Z: ~- v
a=5;" J! Z% C6 U1 t, F
更正代码后,我们会发现编译时没有错误。8 n6 A ?3 T0 \* q8 T7 C' B
程序意外结束错误:
' c7 N- m, P5 y( s B2 W有时我们在代码中遗漏了一个右括号,继而发生意外的程序结束错误,我们必须检查我们的代码,查看需要添加的内容,或者我们需要确保每个左括号匹配一个右括号来解决此错误。 下面是该代码的示例。2 ^: q' F3 S2 [/ X& P% P# c
出错的错误代码:9 C' M- }9 C. |2 C# B
void OnStart()
, A7 @# C7 f9 ~{
, c5 u8 c6 f5 E; a3 `bool a=7;2 [" T0 O5 w, ~: v. }
if (a=5)7 F% q5 R" x, ?
a=5;! ?* n% J: x, g3 k7 R4 \: t
更正无错误代码:- y6 B5 Q' R' B: N0 ~
void OnStart()0 m! m6 r; E; L
{. q# E' b, d* ?3 y4 B9 m
bool a=7;
7 i6 d) e( M& }( y. h# d6 tif (a=5)$ e& P/ ?8 i1 Q" O0 O8 S/ B# |
a=5;5 J$ i( b' B3 L7 A
}! G$ j/ h& m% \4 ~& N
添加右括号更正代码后,我们会发现代码成功编译没有错误。
' K2 g6 w+ O1 v: W表达式不允许出现在全局范围错误:
5 I8 e. B1 L& o) |( K/ m; e当我们在复合运算符中缺少左括号时,就会发生该错误,或者当我们在特定函数范围之外编写语句或表达式时,可能会发生该错误,因为我们只能在函数范围内使用表达式。 以下示例示意此类错误。
+ t3 U' q! a; @8 }出错的错误代码:
! @% ~$ N% Q: f: _int a=(7+5);1 j- a0 }% C. a4 m8 [& F5 O
if (a<7)
' M) W# Q3 W: Y: ~2 Qa=7;3 y& Q. ^6 I7 b9 W
}5 E! i7 O. q9 i, Y
在前面的代码中,我们遗漏了与(})配对的起始({),故系统报告 “表达式不允许出现在全局范围” 错误。 以下是 “错误” 选项卡中的错误。
; F8 T8 O, r- S更正无错误代码:
3 S* U2 @+ k0 y; Y: e4 X/ q; zint a=(7+5);* k( T0 t( d6 C' N8 x( Y! v/ @7 ]
if (a<7)
3 z5 a9 M4 o; J. r{. q9 b' L6 \9 i B. `: n* u
a=7;8 l$ y3 I$ I H5 {0 R
}0 m- R# N. l* B- z
更正代码后,与前面的代码模块相同,我们会发现代码编译后没有任何错误。
2 }4 Y+ ~, `; R% h" G- V错误的参数计数错误:2 I ?: [4 E+ b% ^
当我们用到拥有指定参数的特定函数时,若我们未正确指定这些参数,意即或多或少,我们会体验到这种类型的错误代码。 如果我们使用预定义的函数或我们创建的函数,则会出现此错误。 以下是该错误的示例。
, P) x1 @4 R* _& T有错误的代码:& w& X! P$ H% ], R5 F) h1 u
如果我们创建了一个 “myVal” 函数,返回两个整数值求和的结果,这意味着该函数中有两个参数? 故此,当我们调用此函数时传递个数的参数时,我们将得到此类错误,其与以下代码相同5 q. J1 w! y- r0 C ?( N8 y" [- y- h
void OnStart()
, Q, o) x5 D" P8 }, I: A. n{
$ P6 `: _3 o8 M- P# I+ |int example=myVal(10);2 x1 _8 G% Q: z/ F4 u2 M
}2 V9 W- I5 H4 G. b" y
//+------------------------------------------------------------------+3 F `" g& z0 ~: T9 X1 [# D3 v
int myVal(int a, int b): \, d {) g& a0 @" X! x3 m+ q
{
% z8 q1 P7 U! E9 ] {9 {return a+b;8 u; p& z; M& F4 _$ t& P
}" ]+ i) q6 \, \: o- ^% \4 H
无错误代码:
4 v' Q! c: e4 q0 c( v4 F, S" G为了正确编写此代码,我们需要为这个创建的函数传递相应个数的参数,如下所示) F8 {" _/ a. C. k8 j" Y; E
void OnStart()7 \+ r, y7 ~; F# i* s
{/ e& I) ~& J4 }; N/ c& F2 B
int example=myVal(10,20);$ I3 z; `4 e, v* [' O% u
}
7 Z `0 Q6 z9 [+ S1 ~4 K8 z! }//+------------------------------------------------------------------+
+ `' U# O5 ^1 `2 H& Hint myVal(int a, int b)) H9 w3 ~8 ~8 q
{
3 j/ r S4 g* b2 A/ v4 _/ l, E1 Kreturn a+b;
: d) z1 B4 P4 F! g0 {1 a, I}
' W( ~2 W/ N+ A1 y: [& Y$ [编译此正确代码后,我们不会发现任何错误。# o1 l, ?. u& o) m: Q1 f
某些操作符预期错误:
3 N" X% C* a2 `' E当我们在特定位置完全遗漏或放错操作符时,我们就会遇到这种类型的错误。 以下是该类错误的示例。
9 d. o; P% J0 v有错误的代码:1 U4 F6 r/ w# G- w2 H7 l! A' [, C
int a= 7 10; |