概述" I1 Z, G- f* b0 _
作为 MQL5 程序员或开发人员,我们发现我们需要很好地理解和使用策略测试器,才能获得有效的结果。 通过使用这款颇具价值的工具,我们可以获得有关我们所创建 MQL5 程序的性能的宝贵认知,这对获得更好的交易结果颇具影响。 故此,我们发现在进行测试之前,我们需要充分了解重要的主题,例如处理所有错误类型,因为作为开发人员,我们犯糊涂导致出错是很正常的。 我们还需要深刻理解的另一个主题是调试,它让我们以交互方式执行我们创建的程序。 然后,我们来到最重要和最有价值的工具,即策略测试器,用于测试和评估我们创建的程序,其功能比 MetaTrader 4 版本的更有趣。 因此,在本文中,学习使用 MQL5 策略测试器的最重要方面会是一次了不起的学习之旅 G) _: t R" J
错误
; g- B+ G5 W4 C1 y) ^在本主题中,我们将学习在创建、执行和运行 MQL5 程序时可能发现的错误。 理解这个主题的一个要点是,MQL5 会正确报告这些错误,但如果我们不知道这些错误意味着什么,或者在程序的哪个阶段,相较于我们已经知道它们的含义,我们就要花费更多的时间来处理或解决它们。+ E {% O/ q3 K9 m' `9 } X
我们将根据我们在 MQL5 程序上的工作阶段来讲述这个主题,在我们编写代码时,可能会遇到错误和警告,即编译错误和警告。 我们在执行 MQL5 程序时也可能会遇到运行时错误,当我们的 MQL5 程序尝试交易时,我们也可能会遇到其它类型的错误,即交易服务器错误。8 {( i: A# f0 m6 H ]( C
左括号不平衡错误:
! A2 n& z$ a4 H5 z4 v1 `, z当我们缺少右括号、或多用了额外的右括号时,就会发生此类错误。 我们可以通过以下示例发现该错误。3 u/ ?3 r$ t4 C& w+ N& E
出错的错误代码:9 y% ~" U9 N( `, B
bool a=7;
. I: @2 E8 f% vif (a=5
- w, d* K; U: b6 J$ e0 O# Z: Ea=52 g; N+ m" h, c
更正无错误代码:
9 y) w2 k; l9 T7 [, abool a=7;
) M! i) ]7 ~% f6 J8 o3 m. q+ fif (a=5)
* _, C( P) O2 ?/ g- V2 ?5 ha=5;
, q( V9 } s/ W更正代码后,我们会发现编译时没有错误。" P* W2 _0 @9 e2 N# T( l! k5 R j' T
程序意外结束错误:
8 U' l& [$ E1 X有时我们在代码中遗漏了一个右括号,继而发生意外的程序结束错误,我们必须检查我们的代码,查看需要添加的内容,或者我们需要确保每个左括号匹配一个右括号来解决此错误。 下面是该代码的示例。
7 ~- I0 C! ^/ |出错的错误代码:) U; z& w4 T6 G6 f$ W
void OnStart()- H. r# K( z5 V2 h2 B$ E J
{" e, C' X! l$ u7 x2 V: b
bool a=7;8 x+ v! V0 O8 N; \( x
if (a=5)( \, ~! o/ ?2 F
a=5;$ ?/ k n5 \$ g6 ^9 V+ z. N; d5 i- G
更正无错误代码:0 P+ ~" X* e" U6 Z
void OnStart()
" M0 V/ G: ?. E9 C/ k2 x{
$ v3 y- @* K; m7 vbool a=7;" E4 }" c5 b$ o( \
if (a=5)4 b1 k& Q6 C5 N; L" \
a=5;4 l8 O9 w8 @: K8 A G/ r
}
/ X4 @2 w3 d; f! V添加右括号更正代码后,我们会发现代码成功编译没有错误。
( a$ ~( M" h. C- Y# J! R( ^表达式不允许出现在全局范围错误:
- O' o, N& ~! i# M/ C当我们在复合运算符中缺少左括号时,就会发生该错误,或者当我们在特定函数范围之外编写语句或表达式时,可能会发生该错误,因为我们只能在函数范围内使用表达式。 以下示例示意此类错误。
4 c) L- Z: {2 k" C出错的错误代码:
) a& z+ F9 v' C7 }9 f) aint a=(7+5);; \$ [. _ ?" ^, t$ Z
if (a<7)
0 E7 x% J& U% z4 Ja=7;
5 g4 [* b+ b2 P+ w# @8 Y4 {0 a2 u}" ~3 n# U6 x* ~3 j' Q# R
在前面的代码中,我们遗漏了与(})配对的起始({),故系统报告 “表达式不允许出现在全局范围” 错误。 以下是 “错误” 选项卡中的错误。
' ^' D4 \( m$ x" X. C8 ]更正无错误代码:+ O9 |" B- b7 l& Y S
int a=(7+5);
9 @3 w# ]/ f1 C* W6 A9 b1 Rif (a<7)0 e, n9 s7 ~; j1 k
{
" q3 K; C) o7 R6 N: @a=7;$ ?3 _% [5 H* m0 @
}
# c4 h# V1 I5 z ?: y更正代码后,与前面的代码模块相同,我们会发现代码编译后没有任何错误。' {, X6 c& C6 `$ v
错误的参数计数错误:5 ?6 F( V$ Z/ m& ?2 N) b5 F/ f% v
当我们用到拥有指定参数的特定函数时,若我们未正确指定这些参数,意即或多或少,我们会体验到这种类型的错误代码。 如果我们使用预定义的函数或我们创建的函数,则会出现此错误。 以下是该错误的示例。7 S8 b6 K! E1 e9 f5 G0 x$ l
有错误的代码:: M# H% Q# M6 M! n' D
如果我们创建了一个 “myVal” 函数,返回两个整数值求和的结果,这意味着该函数中有两个参数? 故此,当我们调用此函数时传递个数的参数时,我们将得到此类错误,其与以下代码相同
( o" P+ L+ d- m6 m A1 o% F* Evoid OnStart()! a) W; U* B! X" c' G7 z
{' S/ y0 Q. F3 W
int example=myVal(10);+ g& m. D( {. Y
}8 Z/ A0 m2 j! u5 I: o3 N( {# W, j
//+------------------------------------------------------------------+) A% ~( Y5 U+ \) Z# B( s
int myVal(int a, int b)
9 n( ^- W9 b2 |& \9 T. L{
) _% D1 G# N& ireturn a+b;+ E( A/ J* q; l$ T! X
}- C5 T* |0 O, e
无错误代码:
& q4 c* V$ |% `/ K4 I为了正确编写此代码,我们需要为这个创建的函数传递相应个数的参数,如下所示6 ^& b& L e V4 k$ e
void OnStart()6 Z! K9 I6 F: D/ v8 M
{
j% G( o/ I3 zint example=myVal(10,20);
; J- v* w0 B- a}( p% i: h( n2 [
//+------------------------------------------------------------------+$ j3 B1 }( ]! y" ^3 H3 \' q0 W7 Y
int myVal(int a, int b)# X7 B. M% e/ C" k( @
{5 b) z* `/ ?7 b+ b$ m) T6 K
return a+b; k( W+ L% H- N. z; ~+ _
}' ?: W8 c4 a& i4 ~' ]6 i! }
编译此正确代码后,我们不会发现任何错误。
+ Y0 X8 p3 _- X5 y, q6 V( _9 u某些操作符预期错误:
. _3 ? m6 w; v4 U" X/ j当我们在特定位置完全遗漏或放错操作符时,我们就会遇到这种类型的错误。 以下是该类错误的示例。# r+ b9 m' G% F5 a F X
有错误的代码:
1 ?" U) ?* u" }. \" L: fint a= 7 10; |