概述1 m. P7 D$ p7 E9 ~$ q9 |2 W/ D( l
作为 MQL5 程序员或开发人员,我们发现我们需要很好地理解和使用策略测试器,才能获得有效的结果。 通过使用这款颇具价值的工具,我们可以获得有关我们所创建 MQL5 程序的性能的宝贵认知,这对获得更好的交易结果颇具影响。 故此,我们发现在进行测试之前,我们需要充分了解重要的主题,例如处理所有错误类型,因为作为开发人员,我们犯糊涂导致出错是很正常的。 我们还需要深刻理解的另一个主题是调试,它让我们以交互方式执行我们创建的程序。 然后,我们来到最重要和最有价值的工具,即策略测试器,用于测试和评估我们创建的程序,其功能比 MetaTrader 4 版本的更有趣。 因此,在本文中,学习使用 MQL5 策略测试器的最重要方面会是一次了不起的学习之旅$ M- O' G0 M+ E+ \- O
错误8 Z' M% X( A% r2 C# ^
在本主题中,我们将学习在创建、执行和运行 MQL5 程序时可能发现的错误。 理解这个主题的一个要点是,MQL5 会正确报告这些错误,但如果我们不知道这些错误意味着什么,或者在程序的哪个阶段,相较于我们已经知道它们的含义,我们就要花费更多的时间来处理或解决它们。
& E; q6 z* c2 q' E' b' X0 D U我们将根据我们在 MQL5 程序上的工作阶段来讲述这个主题,在我们编写代码时,可能会遇到错误和警告,即编译错误和警告。 我们在执行 MQL5 程序时也可能会遇到运行时错误,当我们的 MQL5 程序尝试交易时,我们也可能会遇到其它类型的错误,即交易服务器错误。
6 ~' ~. D& d- C0 n左括号不平衡错误:
. u0 T. M z8 m当我们缺少右括号、或多用了额外的右括号时,就会发生此类错误。 我们可以通过以下示例发现该错误。* c7 _0 j) {& z$ [
出错的错误代码:$ S, J3 d4 o- e& o! o( Z
bool a=7;
" F9 I4 _# L* {8 }5 sif (a=56 H9 \* C5 r( ]3 i- n! X' x4 _' p
a=5
k# z2 ^$ b. ]0 G8 C7 P9 g更正无错误代码:
) @$ M! j2 u4 M1 Ibool a=7;
% A0 Q& S8 V/ d/ d( Vif (a=5)* _6 p/ F8 L; @8 {0 ]- U
a=5;( w, |# v8 q w! m' r
更正代码后,我们会发现编译时没有错误。$ k" }1 G' Y0 ~+ S% S
程序意外结束错误:. e# i7 r' c1 |% E
有时我们在代码中遗漏了一个右括号,继而发生意外的程序结束错误,我们必须检查我们的代码,查看需要添加的内容,或者我们需要确保每个左括号匹配一个右括号来解决此错误。 下面是该代码的示例。% t$ u9 \8 N7 ^* W
出错的错误代码:
1 Z$ N( N" c9 I4 Ovoid OnStart()
/ R$ P! _* v- ^: o( f{: {; I8 I' j$ `% M* o/ ?" P
bool a=7;
4 l5 `( g5 m1 oif (a=5)
8 o' g. K3 [* l' Sa=5;
* P* X) C8 h% A) X! N8 g5 n' s. n更正无错误代码:
/ g, a2 ], |1 I% s4 O% ~1 Xvoid OnStart(), s& D' k, T$ d H3 q
{
* P3 _$ r" F7 ~" c( H+ Dbool a=7;
8 ^$ z1 k. h) R% ~if (a=5)$ }$ a8 f6 |! m/ t# X
a=5;
3 J/ {1 q+ Y! N9 y4 r}) @, e2 R4 n! K% s) F( W
添加右括号更正代码后,我们会发现代码成功编译没有错误。
9 G, `1 B' F$ [3 n+ c表达式不允许出现在全局范围错误:
( \3 m! c7 q& p) e6 ]6 o当我们在复合运算符中缺少左括号时,就会发生该错误,或者当我们在特定函数范围之外编写语句或表达式时,可能会发生该错误,因为我们只能在函数范围内使用表达式。 以下示例示意此类错误。" \3 c% }7 N! O ?
出错的错误代码:7 n3 v# `, J, i2 o( V9 }; M
int a=(7+5);
! ^$ ]6 `7 X/ }4 w( \& a1 xif (a<7)) H- p( d% H* c5 [! w
a=7;
7 h( T; V+ ~$ U: C1 @9 v}/ R/ O+ n3 T$ S( q
在前面的代码中,我们遗漏了与(})配对的起始({),故系统报告 “表达式不允许出现在全局范围” 错误。 以下是 “错误” 选项卡中的错误。
/ D+ c$ D2 t W6 I% s更正无错误代码:# c/ B/ u0 H! \7 B$ _
int a=(7+5);
. s0 x9 {- n- l$ D1 M1 {if (a<7)# @' b/ D ~" A0 O! p
{
0 S- B/ o( U$ [& ]( oa=7;
$ X3 b3 S6 F3 ]1 B- e D- y& T}
7 O# c9 k1 m) P: E, w4 v+ ~更正代码后,与前面的代码模块相同,我们会发现代码编译后没有任何错误。 r9 N' \! o. f2 g+ i+ t3 e
错误的参数计数错误:
- g, q* c0 Q3 P ^9 x当我们用到拥有指定参数的特定函数时,若我们未正确指定这些参数,意即或多或少,我们会体验到这种类型的错误代码。 如果我们使用预定义的函数或我们创建的函数,则会出现此错误。 以下是该错误的示例。( c3 p$ H# P8 E
有错误的代码:) `/ {' c. R8 Q8 n
如果我们创建了一个 “myVal” 函数,返回两个整数值求和的结果,这意味着该函数中有两个参数? 故此,当我们调用此函数时传递个数的参数时,我们将得到此类错误,其与以下代码相同
; _7 |; D8 g! ^- t; P4 C% nvoid OnStart(). q6 r( P5 Z+ M) O+ G: w% N( ^
{ d5 ?! H0 o+ ]9 A2 s9 a, m* p
int example=myVal(10);! T2 k# Y+ g9 }7 c; a' H
}
9 F; b! w5 \$ F# r2 d//+------------------------------------------------------------------+
8 Z3 o4 c4 b# H | n! c8 Lint myVal(int a, int b)
; B8 ]* ?2 P" o& I( @{* G/ B8 V6 @# I& R, t& E
return a+b;
8 r* \" }3 b- F}2 p; F2 S0 s: F: L* `! q# P) f
无错误代码:) X& g6 d1 [0 Q# v) ]' Z4 g2 `# }& h
为了正确编写此代码,我们需要为这个创建的函数传递相应个数的参数,如下所示
* D; Z C: W/ J3 xvoid OnStart()
' t# {0 w4 D+ B{2 {$ y( U6 D3 h0 M5 V: ~
int example=myVal(10,20);
, c( z( z6 o4 j' j}
. N1 x" u0 y7 c: g1 \2 B1 t4 f//+------------------------------------------------------------------+
. n' g+ B, k( D1 l* sint myVal(int a, int b)
/ \1 m" v# \+ T6 a8 _{
8 E2 n9 F, C6 l4 S# m! Kreturn a+b;
- w$ R( r' U( |/ a1 S}
& O7 c% ~% i' Z6 T编译此正确代码后,我们不会发现任何错误。& }9 i& P3 q7 W: {, J1 _) ?0 y: ]+ ~6 e
某些操作符预期错误:: e) i% Z+ X# x$ _% M9 H8 n$ y/ r
当我们在特定位置完全遗漏或放错操作符时,我们就会遇到这种类型的错误。 以下是该类错误的示例。
& p' ~0 H0 D2 V. {* v9 G有错误的代码:
( H7 N1 t& U* pint a= 7 10; |