概述
2 b& w' ^6 G' W: S" ~作为 MQL5 程序员或开发人员,我们发现我们需要很好地理解和使用策略测试器,才能获得有效的结果。 通过使用这款颇具价值的工具,我们可以获得有关我们所创建 MQL5 程序的性能的宝贵认知,这对获得更好的交易结果颇具影响。 故此,我们发现在进行测试之前,我们需要充分了解重要的主题,例如处理所有错误类型,因为作为开发人员,我们犯糊涂导致出错是很正常的。 我们还需要深刻理解的另一个主题是调试,它让我们以交互方式执行我们创建的程序。 然后,我们来到最重要和最有价值的工具,即策略测试器,用于测试和评估我们创建的程序,其功能比 MetaTrader 4 版本的更有趣。 因此,在本文中,学习使用 MQL5 策略测试器的最重要方面会是一次了不起的学习之旅
' \6 x, G( q9 j4 P4 s' d: K错误
$ u1 L7 b2 o. ^& U* s在本主题中,我们将学习在创建、执行和运行 MQL5 程序时可能发现的错误。 理解这个主题的一个要点是,MQL5 会正确报告这些错误,但如果我们不知道这些错误意味着什么,或者在程序的哪个阶段,相较于我们已经知道它们的含义,我们就要花费更多的时间来处理或解决它们。
3 I1 q6 f6 v" G. N$ O我们将根据我们在 MQL5 程序上的工作阶段来讲述这个主题,在我们编写代码时,可能会遇到错误和警告,即编译错误和警告。 我们在执行 MQL5 程序时也可能会遇到运行时错误,当我们的 MQL5 程序尝试交易时,我们也可能会遇到其它类型的错误,即交易服务器错误。0 c+ ~: N( k+ u d
左括号不平衡错误:. L- |* T$ U2 \: H. R2 U) j+ z' U/ \
当我们缺少右括号、或多用了额外的右括号时,就会发生此类错误。 我们可以通过以下示例发现该错误。
0 Z$ M4 ?( E$ {7 J! B; m1 ~3 R# |出错的错误代码:: ~$ E8 Z+ Z0 f
bool a=7;6 p7 d+ j0 K3 m( ]2 G
if (a=5
# ^# k3 \% h- Z$ Ha=5+ r; c% m5 \! P6 V5 q0 D7 O; l
更正无错误代码:% E! r; u/ M7 \. W, D
bool a=7;' S- z% N6 K* d. I( p- u7 L
if (a=5)2 ~( H9 _7 L& E: _/ T, T
a=5;' B: n2 l; R5 I+ l# D& f; x: a
更正代码后,我们会发现编译时没有错误。
" n) E7 d$ {% Q程序意外结束错误:* ~5 ?: I8 ^1 l: ^) Q/ y$ T8 _
有时我们在代码中遗漏了一个右括号,继而发生意外的程序结束错误,我们必须检查我们的代码,查看需要添加的内容,或者我们需要确保每个左括号匹配一个右括号来解决此错误。 下面是该代码的示例。
' L) n( q8 u6 ]' e出错的错误代码:0 P6 S# R2 |2 H4 E. D
void OnStart()
7 ^% a3 n# |) I1 m( K( ]{
4 o! D- x; @2 n. o( pbool a=7;# Z' s9 u( N5 q6 n \( z& _) N# \
if (a=5), j/ f& C6 H/ n. r
a=5;" G* \5 `7 E+ b
更正无错误代码:9 E1 |7 e( Q/ m5 Q" V0 s) v4 I3 c9 _
void OnStart()1 @2 A5 v' ^; _6 z- k
{
+ ]3 f" I! c. ?: W X7 y8 ^/ Sbool a=7;2 L5 D ` M; C
if (a=5), V" f# B2 Z7 {1 u6 f8 y
a=5;& L) W ^2 u; \! t: `9 N1 `9 m' u
}. l) U! b, @* w* P5 s
添加右括号更正代码后,我们会发现代码成功编译没有错误。) m& J8 Q: t5 M- e R1 {9 M* Y
表达式不允许出现在全局范围错误:
4 _% c/ X* O, Z. T+ \9 x- `当我们在复合运算符中缺少左括号时,就会发生该错误,或者当我们在特定函数范围之外编写语句或表达式时,可能会发生该错误,因为我们只能在函数范围内使用表达式。 以下示例示意此类错误。
0 g! `/ ^- e u$ i2 I出错的错误代码:
4 G! e4 L- z4 G$ [; Wint a=(7+5);5 P+ k* }% N5 |; E- T0 A
if (a<7)
" Q4 {( {# ?! r* m* j% m6 {& Ma=7;0 e4 v: q# U- O0 H; `) r
}( X$ S. D( S2 U: H8 n
在前面的代码中,我们遗漏了与(})配对的起始({),故系统报告 “表达式不允许出现在全局范围” 错误。 以下是 “错误” 选项卡中的错误。
* a: t: f5 ~ F, l+ ?更正无错误代码:1 W7 T6 d+ }% e- O5 F" _/ ?
int a=(7+5);
# O. y, F0 F3 i' ~+ A, L- Qif (a<7)% U) s6 ]: Y' G# M" \
{
4 d; R' Y) G2 b4 h: pa=7;$ N" @7 O m" Z3 v* b
}3 W' J* E4 s5 q7 w2 p
更正代码后,与前面的代码模块相同,我们会发现代码编译后没有任何错误。4 `) t, l0 {3 s2 E: l. d; }
错误的参数计数错误:3 `/ z( v/ n% v/ N4 n9 }
当我们用到拥有指定参数的特定函数时,若我们未正确指定这些参数,意即或多或少,我们会体验到这种类型的错误代码。 如果我们使用预定义的函数或我们创建的函数,则会出现此错误。 以下是该错误的示例。: b1 D% `( G" b; d2 l, Y7 Z) T5 y$ d/ W
有错误的代码: {; F) Y3 B+ O. K
如果我们创建了一个 “myVal” 函数,返回两个整数值求和的结果,这意味着该函数中有两个参数? 故此,当我们调用此函数时传递个数的参数时,我们将得到此类错误,其与以下代码相同9 A' ^8 {+ z, s' f: i5 l
void OnStart()
, ~+ i/ W; B+ ]/ b* ]7 w% h{- F+ f3 z P, t* w! g5 m; p
int example=myVal(10);
5 l& t7 G/ I. A) w( r}2 B2 P9 C) l( x& I: Q
//+------------------------------------------------------------------+7 W5 V8 Z$ ^' K
int myVal(int a, int b)
$ H5 K" a/ q, d' i- ^- A{( f3 |, M) @* z6 R! T: P2 Y5 H
return a+b;& @' y$ f+ W9 {0 r$ V
} Q! {8 e6 y, z$ g) Y
无错误代码:# N2 P, K" t7 a( d' E
为了正确编写此代码,我们需要为这个创建的函数传递相应个数的参数,如下所示/ A' N' \9 v V9 I
void OnStart(). k' u% H$ ?9 |7 \) N1 ^2 y0 \4 u9 p
{# R: a( p/ O+ ~: l, X& `1 J
int example=myVal(10,20);5 J. v/ e1 ?% ?. ]9 I/ L% e- _
}* \! ?, G$ }4 _$ Y R( K4 k
//+------------------------------------------------------------------+" u. o6 c/ v1 R& J
int myVal(int a, int b)
9 @1 {9 \% O0 B( o' `3 G- s{
' p3 n3 {- f7 e' K& ~) }4 N1 ]6 s' preturn a+b;# K% \# n- g( h/ D2 N7 {% h H( _+ u
}, }& B/ n% Z- X/ k* }# `
编译此正确代码后,我们不会发现任何错误。7 @! X* ^* Z( I: Y. Q$ n" P
某些操作符预期错误:
, i! }- [; g ^- |当我们在特定位置完全遗漏或放错操作符时,我们就会遇到这种类型的错误。 以下是该类错误的示例。
0 h& O4 D1 ~* ^: |有错误的代码:
9 _- }& p3 o) Y) h; ~int a= 7 10; |