概述
: D {5 B; J7 k" \) l作为 MQL5 程序员或开发人员,我们发现我们需要很好地理解和使用策略测试器,才能获得有效的结果。 通过使用这款颇具价值的工具,我们可以获得有关我们所创建 MQL5 程序的性能的宝贵认知,这对获得更好的交易结果颇具影响。 故此,我们发现在进行测试之前,我们需要充分了解重要的主题,例如处理所有错误类型,因为作为开发人员,我们犯糊涂导致出错是很正常的。 我们还需要深刻理解的另一个主题是调试,它让我们以交互方式执行我们创建的程序。 然后,我们来到最重要和最有价值的工具,即策略测试器,用于测试和评估我们创建的程序,其功能比 MetaTrader 4 版本的更有趣。 因此,在本文中,学习使用 MQL5 策略测试器的最重要方面会是一次了不起的学习之旅! s- _3 h% S9 z
错误
7 T0 j6 i, a$ V在本主题中,我们将学习在创建、执行和运行 MQL5 程序时可能发现的错误。 理解这个主题的一个要点是,MQL5 会正确报告这些错误,但如果我们不知道这些错误意味着什么,或者在程序的哪个阶段,相较于我们已经知道它们的含义,我们就要花费更多的时间来处理或解决它们。
( y" A8 [! Y: \' E2 e, [! G我们将根据我们在 MQL5 程序上的工作阶段来讲述这个主题,在我们编写代码时,可能会遇到错误和警告,即编译错误和警告。 我们在执行 MQL5 程序时也可能会遇到运行时错误,当我们的 MQL5 程序尝试交易时,我们也可能会遇到其它类型的错误,即交易服务器错误。7 _! {$ c- q/ o" y0 F6 z' u
左括号不平衡错误:
1 Y: ?. r/ N8 o3 G( D) Y5 c- r当我们缺少右括号、或多用了额外的右括号时,就会发生此类错误。 我们可以通过以下示例发现该错误。0 x+ m8 R! ]( S% C3 J2 B7 G5 m e
出错的错误代码:
; }. A( U5 C$ C6 }- L0 Vbool a=7;# J0 r( U* H# J% G& o$ H+ N" o
if (a=5; o& X" B, P P# E! g0 i7 h6 b/ K
a=5
5 T- D0 E4 J9 z p7 P0 a m) a更正无错误代码:7 d/ B P* g- J7 M" t+ [8 E
bool a=7;3 R$ H0 j7 D7 |. C3 N; l
if (a=5)7 ^( g3 [" a& J3 M
a=5;
3 L! f. h9 y+ O& O/ J更正代码后,我们会发现编译时没有错误。
9 _1 Z/ [7 a! b, p' h2 a程序意外结束错误:
3 b* q: ^1 w& M' f8 L有时我们在代码中遗漏了一个右括号,继而发生意外的程序结束错误,我们必须检查我们的代码,查看需要添加的内容,或者我们需要确保每个左括号匹配一个右括号来解决此错误。 下面是该代码的示例。
3 O+ T2 [5 F, j出错的错误代码:
# N( I2 W s; n; U F3 u' i: avoid OnStart()
. B5 }, R# B; @ r{+ f" K; E9 L7 U( K4 S4 q* ` s2 z
bool a=7;+ Q6 d# ^, N3 W4 [9 Z8 _7 L
if (a=5): X1 g" b* W) v j+ B
a=5;8 d6 }% x7 l/ {4 x2 N; K
更正无错误代码:
& L1 m* R; E0 i* Dvoid OnStart() t- }$ _1 g! u9 y: j
{
m1 c: @8 L5 |2 wbool a=7;
4 k: E% {: q8 l, i1 s! Iif (a=5)
5 S8 ]3 J3 t# G6 Ra=5;+ i2 h4 z) |! c5 @# E1 @
}
) w- h; R) Q! B添加右括号更正代码后,我们会发现代码成功编译没有错误。, U% G7 u5 W2 q+ V+ n
表达式不允许出现在全局范围错误:
/ D, y& }+ k3 v$ }8 q( S2 v8 ~当我们在复合运算符中缺少左括号时,就会发生该错误,或者当我们在特定函数范围之外编写语句或表达式时,可能会发生该错误,因为我们只能在函数范围内使用表达式。 以下示例示意此类错误。: d# K" C: n4 u3 M7 U' r5 W
出错的错误代码:9 I$ Y8 B3 U8 \) B. T8 `+ Z
int a=(7+5);* u8 A! `" Q0 Z, E4 y/ n9 K& f
if (a<7)1 L. v8 n, Z4 }# D* y( C6 x0 e" K# |
a=7;6 s# W a6 m. b- {/ Z2 L8 a6 q) S
}- L4 k3 Q& m0 R1 R
在前面的代码中,我们遗漏了与(})配对的起始({),故系统报告 “表达式不允许出现在全局范围” 错误。 以下是 “错误” 选项卡中的错误。7 |5 _) \1 f8 z* I- s+ ^
更正无错误代码:
, h2 V( z. u9 V& z* Xint a=(7+5);. b: ? i3 a, }: ^! J) B' R: Y! c
if (a<7)( O: _% `9 U6 I) r* X: N' J
{
% u9 D/ T% P* K( }0 L# p$ ha=7;
# ~3 x9 F2 Y8 A- o2 I8 h- i}. I D% }( d Q" m5 M3 [, |
更正代码后,与前面的代码模块相同,我们会发现代码编译后没有任何错误。3 Y$ v! P* H% t7 z' J$ D
错误的参数计数错误:, A! p7 A b3 X% P1 k* g
当我们用到拥有指定参数的特定函数时,若我们未正确指定这些参数,意即或多或少,我们会体验到这种类型的错误代码。 如果我们使用预定义的函数或我们创建的函数,则会出现此错误。 以下是该错误的示例。
& i& B9 G% W6 C5 c: F有错误的代码:: {! P3 C2 Q: k0 V" y
如果我们创建了一个 “myVal” 函数,返回两个整数值求和的结果,这意味着该函数中有两个参数? 故此,当我们调用此函数时传递个数的参数时,我们将得到此类错误,其与以下代码相同# x, _) F' M! D& H; D) q# A2 W
void OnStart()3 @1 k# A1 q" i" R$ V4 E
{! C4 G' j. j! U5 w% Q6 v l
int example=myVal(10);3 {7 w: D: S* e8 t7 Q2 U( X
}
3 H! Q9 e; W y* a! [0 R//+------------------------------------------------------------------+
9 s- |% q& U ~) p: {6 vint myVal(int a, int b)
6 [( a3 z8 T2 t7 J: d, Z: }' M' ?{- x% T; h0 N# @9 h; S5 v) \1 R+ j( e
return a+b;- }- u D3 R% y0 q
}$ c0 s) }5 U! V6 [" Y1 u- q
无错误代码:- Z. A& |5 [+ E7 T* B; y
为了正确编写此代码,我们需要为这个创建的函数传递相应个数的参数,如下所示
* n0 l& @. C9 L6 R/ [8 B9 H: |void OnStart()
: X& h- S% K( \4 v: u" }{
1 I9 J! I1 M R& Dint example=myVal(10,20);" P9 V, U" ?" C3 J$ r8 D" d
}
1 ?6 Z' Z1 ?' P3 m5 ], `0 v+ }//+------------------------------------------------------------------+
5 B! N! ^ Q4 Hint myVal(int a, int b)& _# @2 F/ p$ _3 ^. R% O& h
{
% O! v$ t; Z Creturn a+b;! @9 [6 w2 z# R3 r4 e
}
9 a- ]+ o# P- f- k, e编译此正确代码后,我们不会发现任何错误。9 ` u( I" p' H$ k- e
某些操作符预期错误:
3 X4 T: w# H' b' @: ^当我们在特定位置完全遗漏或放错操作符时,我们就会遇到这种类型的错误。 以下是该类错误的示例。! x6 k3 M7 A* A) ~- m
有错误的代码:
/ \: B' s3 p" cint a= 7 10; |