概述
) C. K2 h! x( x- ~* d2 v2 g2 Q作为 MQL5 程序员或开发人员,我们发现我们需要很好地理解和使用策略测试器,才能获得有效的结果。 通过使用这款颇具价值的工具,我们可以获得有关我们所创建 MQL5 程序的性能的宝贵认知,这对获得更好的交易结果颇具影响。 故此,我们发现在进行测试之前,我们需要充分了解重要的主题,例如处理所有错误类型,因为作为开发人员,我们犯糊涂导致出错是很正常的。 我们还需要深刻理解的另一个主题是调试,它让我们以交互方式执行我们创建的程序。 然后,我们来到最重要和最有价值的工具,即策略测试器,用于测试和评估我们创建的程序,其功能比 MetaTrader 4 版本的更有趣。 因此,在本文中,学习使用 MQL5 策略测试器的最重要方面会是一次了不起的学习之旅
0 q( d7 R9 v% O- H9 B' J错误0 C/ `% }4 m8 W! f- w
在本主题中,我们将学习在创建、执行和运行 MQL5 程序时可能发现的错误。 理解这个主题的一个要点是,MQL5 会正确报告这些错误,但如果我们不知道这些错误意味着什么,或者在程序的哪个阶段,相较于我们已经知道它们的含义,我们就要花费更多的时间来处理或解决它们。
" Q& B2 }' C1 W我们将根据我们在 MQL5 程序上的工作阶段来讲述这个主题,在我们编写代码时,可能会遇到错误和警告,即编译错误和警告。 我们在执行 MQL5 程序时也可能会遇到运行时错误,当我们的 MQL5 程序尝试交易时,我们也可能会遇到其它类型的错误,即交易服务器错误。+ h; ]' \4 ~( v4 P
左括号不平衡错误:
( V* ~; z, _' m# {) N- j. m当我们缺少右括号、或多用了额外的右括号时,就会发生此类错误。 我们可以通过以下示例发现该错误。* \3 t) L# }5 V, S) K9 `0 I/ l/ s
出错的错误代码:
2 ^) ^# }7 ^; ^+ s% o% ybool a=7;
& E$ x% N& h. u3 O% Yif (a=5
6 `, \' R9 Z$ S( p/ g$ L/ ya=50 `" ~. H4 f e+ v6 c' ], c2 J7 u
更正无错误代码:
8 q! ~/ B. i: A4 @bool a=7;
5 i" {1 k; D; t$ l. \ ?if (a=5)
5 {( C1 f* K: B' s* m) i c( c+ ha=5;2 b$ }4 v% Q g8 C" c" |" O
更正代码后,我们会发现编译时没有错误。$ b1 L( F, {, [
程序意外结束错误:
: d- B7 ]- i6 E [4 u9 X3 R) |有时我们在代码中遗漏了一个右括号,继而发生意外的程序结束错误,我们必须检查我们的代码,查看需要添加的内容,或者我们需要确保每个左括号匹配一个右括号来解决此错误。 下面是该代码的示例。
2 M! L+ X% j* ^4 c出错的错误代码:
/ I3 K5 P' w0 {9 S; X. x2 Q' mvoid OnStart() ]4 E& }5 ~5 U! G: i+ Z5 ~
{
8 t& f! Q: a/ j& hbool a=7;! J$ ~5 G# C/ u7 P; g+ [
if (a=5)
; z: D* p3 }* ?4 g* ~& Sa=5;
- S, @# L( \1 D更正无错误代码:+ Q; ~% V8 R! \* ^- G
void OnStart()
9 X: ]* [" U G2 J{$ a/ W; W1 I/ a* x7 W: G1 J
bool a=7;/ p. L8 I3 H" p7 s) M* Z7 h" n
if (a=5)
, |: h) ]4 R& b" }4 {a=5;
+ p, _& G! Z2 n/ b}8 t/ Z" A- Y5 a: u' h
添加右括号更正代码后,我们会发现代码成功编译没有错误。% n! Z: m; `8 W3 O- o+ C
表达式不允许出现在全局范围错误:3 T2 E5 ]$ U% s
当我们在复合运算符中缺少左括号时,就会发生该错误,或者当我们在特定函数范围之外编写语句或表达式时,可能会发生该错误,因为我们只能在函数范围内使用表达式。 以下示例示意此类错误。
% |5 v: s. d+ x, D; V( k出错的错误代码:
0 U, C' s7 R1 }2 ~; u8 wint a=(7+5);
) u% |+ f) x" O0 s4 Nif (a<7)% S; ^% M! U5 T( _/ X x( W
a=7;
4 s. l, g. K C+ i% _; |}
% i O% _, K% j, \/ x* M& T' J在前面的代码中,我们遗漏了与(})配对的起始({),故系统报告 “表达式不允许出现在全局范围” 错误。 以下是 “错误” 选项卡中的错误。* W2 m: n* z, L3 ?) {
更正无错误代码:
- f6 m0 O0 {3 Aint a=(7+5);9 p6 \4 M, R# r
if (a<7)
) \/ \3 s; y" }2 T{
$ o, P) e9 k: Z* k" Ra=7;
, N% m9 v( P) _) a8 X- P4 N}: }5 x! s5 P1 m
更正代码后,与前面的代码模块相同,我们会发现代码编译后没有任何错误。* \, ~3 b3 y' X
错误的参数计数错误:7 J3 H/ f, w8 j: u# H. n
当我们用到拥有指定参数的特定函数时,若我们未正确指定这些参数,意即或多或少,我们会体验到这种类型的错误代码。 如果我们使用预定义的函数或我们创建的函数,则会出现此错误。 以下是该错误的示例。
7 U) ?1 m+ ~3 `/ A! `有错误的代码:
/ ~* k# z# V+ L+ P+ l. C6 Z如果我们创建了一个 “myVal” 函数,返回两个整数值求和的结果,这意味着该函数中有两个参数? 故此,当我们调用此函数时传递个数的参数时,我们将得到此类错误,其与以下代码相同
0 k* X& {, q1 V% U8 kvoid OnStart()
! e! B0 y6 g9 ?9 s{
) B2 y) m5 E9 o$ k7 Q4 f8 {8 wint example=myVal(10);1 n! T* q2 L+ R# D, b! e% z5 P
}5 e2 k# Y" ^+ }3 J( D! E; @
//+------------------------------------------------------------------+
& t: `$ N A/ F5 ^9 J+ q7 c6 wint myVal(int a, int b)1 I; ~, t3 y" w3 a( h; Y( U
{
# `: ^- S# E8 `, n4 ^) Creturn a+b;5 F# k% G) @2 p' e2 Q4 Z( l! t
}# `( c2 S* u; ^& q
无错误代码:
% o! R6 f" K! ]3 [& Y为了正确编写此代码,我们需要为这个创建的函数传递相应个数的参数,如下所示' ]( f. y$ h% a% N0 H) C Q
void OnStart()& c: s; c- W" \. a6 Z, V
{2 O' q$ q7 |, \: c' Y
int example=myVal(10,20);
H1 ^9 d. e1 L8 ]6 a}
% W7 F- s. r" D; Q( d7 f7 m//+------------------------------------------------------------------+6 M3 |7 X4 A' {9 x1 m6 d
int myVal(int a, int b)
K) O+ c! k5 S" {" b{
6 B$ \5 r/ G: C; |" }, C qreturn a+b;1 h* G7 z4 _6 L; E; K: |
}
: t9 f9 M0 t& G' {编译此正确代码后,我们不会发现任何错误。
; Q6 N3 K: j5 Y( n$ g% R; y$ Z某些操作符预期错误:" i4 H; G D9 h5 e: O
当我们在特定位置完全遗漏或放错操作符时,我们就会遇到这种类型的错误。 以下是该类错误的示例。
# y* }9 u7 }- s) J7 S5 K5 n有错误的代码:6 N) d+ ^' L" u( L
int a= 7 10; |