概述
7 F* R$ z9 z- ~作为 MQL5 程序员或开发人员,我们发现我们需要很好地理解和使用策略测试器,才能获得有效的结果。 通过使用这款颇具价值的工具,我们可以获得有关我们所创建 MQL5 程序的性能的宝贵认知,这对获得更好的交易结果颇具影响。 故此,我们发现在进行测试之前,我们需要充分了解重要的主题,例如处理所有错误类型,因为作为开发人员,我们犯糊涂导致出错是很正常的。 我们还需要深刻理解的另一个主题是调试,它让我们以交互方式执行我们创建的程序。 然后,我们来到最重要和最有价值的工具,即策略测试器,用于测试和评估我们创建的程序,其功能比 MetaTrader 4 版本的更有趣。 因此,在本文中,学习使用 MQL5 策略测试器的最重要方面会是一次了不起的学习之旅
4 `/ n* p% N) Q+ K错误2 b+ w' H& E2 d8 H' I6 N$ G
在本主题中,我们将学习在创建、执行和运行 MQL5 程序时可能发现的错误。 理解这个主题的一个要点是,MQL5 会正确报告这些错误,但如果我们不知道这些错误意味着什么,或者在程序的哪个阶段,相较于我们已经知道它们的含义,我们就要花费更多的时间来处理或解决它们。. e0 z- {, r i1 O
我们将根据我们在 MQL5 程序上的工作阶段来讲述这个主题,在我们编写代码时,可能会遇到错误和警告,即编译错误和警告。 我们在执行 MQL5 程序时也可能会遇到运行时错误,当我们的 MQL5 程序尝试交易时,我们也可能会遇到其它类型的错误,即交易服务器错误。4 f4 m+ ]2 j: P% }& S
左括号不平衡错误:/ ?/ M! G# o* N" M
当我们缺少右括号、或多用了额外的右括号时,就会发生此类错误。 我们可以通过以下示例发现该错误。
1 {( I* v9 d$ \% S! I) q出错的错误代码:: J& M E$ \- \& u& e
bool a=7;; t% e% D6 B. s5 J# N
if (a=5
) K5 W* j" {6 ]" ta=5
, n8 f8 j& y% R( X2 ]5 u更正无错误代码:
. j C. E9 ~& v, d8 D gbool a=7;
4 C7 b8 B m, Cif (a=5)
5 P! B4 t1 |+ ]8 R$ Ea=5;- J7 o$ }& K" T, c7 J6 P d6 Y
更正代码后,我们会发现编译时没有错误。
6 s. m. B! Q( T& N程序意外结束错误:' d0 P# l& y' f
有时我们在代码中遗漏了一个右括号,继而发生意外的程序结束错误,我们必须检查我们的代码,查看需要添加的内容,或者我们需要确保每个左括号匹配一个右括号来解决此错误。 下面是该代码的示例。
+ u/ f' s; [0 f/ W; S+ a; P) Q2 o( `出错的错误代码:
! `, x% P1 u. N: B6 v' Cvoid OnStart()
# g1 z% H, X3 J{' n4 G' x& m& l: e/ j
bool a=7;
: _! c4 H0 ]& r: c7 h# b3 Y' }8 }if (a=5)- t" y& v! o7 [( y. p
a=5;
3 Z: \( m# C% m$ b" \; p: y. }更正无错误代码:
+ s+ o3 V& u zvoid OnStart()8 D$ p/ R' T" S- _% a" ?. n& e
{
3 W; L2 t/ f( k+ i( `6 Xbool a=7;
: W# e( ^9 a6 [+ d- M0 Y$ Rif (a=5)' _( k2 r1 M; W
a=5;, c' Z9 r6 Z& r X# p& |% x+ O( B& ~
}
! f$ \9 A4 X- p% _* E) `3 R( k添加右括号更正代码后,我们会发现代码成功编译没有错误。5 K8 N: }$ s' l t! c2 H
表达式不允许出现在全局范围错误:6 j* J/ d- `0 H$ V6 T' t; E+ B8 g5 G
当我们在复合运算符中缺少左括号时,就会发生该错误,或者当我们在特定函数范围之外编写语句或表达式时,可能会发生该错误,因为我们只能在函数范围内使用表达式。 以下示例示意此类错误。
* ?: w# e; a6 D4 S( O出错的错误代码:3 z g) L; r! b0 V& V2 B
int a=(7+5);* Y6 o% R0 o2 h2 G
if (a<7)
/ d+ B( ?' f$ E$ la=7;
8 r E F; M8 R6 [}; V. f* a) t- ]( ?; V; T2 G% M- L
在前面的代码中,我们遗漏了与(})配对的起始({),故系统报告 “表达式不允许出现在全局范围” 错误。 以下是 “错误” 选项卡中的错误。
' ]2 r( R- _2 J( i7 ~) J更正无错误代码:$ O5 {& L9 Z. U3 Z! ]
int a=(7+5);* l; Z9 V8 g% z" n
if (a<7)3 B( _, C0 H% \& x$ g4 `- k
{9 s! y/ e, M& o/ y) ]& w
a=7;9 h: Y% C" q+ w$ ?4 x
}
4 [) H2 R9 t# H" R7 ^- R7 C更正代码后,与前面的代码模块相同,我们会发现代码编译后没有任何错误。' \* z; f8 c% {" M3 y* ^
错误的参数计数错误:2 C2 M8 P1 T# C% v/ @8 Q
当我们用到拥有指定参数的特定函数时,若我们未正确指定这些参数,意即或多或少,我们会体验到这种类型的错误代码。 如果我们使用预定义的函数或我们创建的函数,则会出现此错误。 以下是该错误的示例。3 R) q) Q) l, F
有错误的代码:
9 c5 K) h" U$ Q& k7 A& o8 T% }如果我们创建了一个 “myVal” 函数,返回两个整数值求和的结果,这意味着该函数中有两个参数? 故此,当我们调用此函数时传递个数的参数时,我们将得到此类错误,其与以下代码相同
7 T6 Q; Y# b0 T- G: u5 {void OnStart()1 g2 W3 K- ]2 Y
{
( o# `( R0 n# h% Sint example=myVal(10);
2 q" F3 t4 |1 I" p}% j6 n+ D& X8 j# ]
//+------------------------------------------------------------------+' V" m2 f* n' m7 N
int myVal(int a, int b)
1 _% P0 E1 K1 m0 q/ w3 Z/ a{
5 f9 Q, R4 s/ J- m5 Areturn a+b;& E/ R9 P' _; V7 r' s) u8 D0 M7 q
}( S1 a) u) X. R
无错误代码:2 U1 j0 v/ f2 A- Y
为了正确编写此代码,我们需要为这个创建的函数传递相应个数的参数,如下所示
6 k; \# A: y1 j+ w" ]0 y1 jvoid OnStart()
: M2 {4 r! L9 E9 w' @: Q{6 V1 p0 J7 C% G0 S9 g* B6 E
int example=myVal(10,20);- J# E% q2 U2 b7 Y+ f5 _& _% K
}# X- F3 ~5 D, E7 n- v
//+------------------------------------------------------------------+; ^7 y Z) I) N! G' N) r; a0 L
int myVal(int a, int b)
; h1 ~$ V) a; i" }2 [{
* @* D$ F; q. K/ k1 {return a+b;% M" i1 a3 P* N1 ^, X9 v
}1 C! `. d% R8 d4 r6 q7 e
编译此正确代码后,我们不会发现任何错误。
g {7 y+ B" i! z7 I" S某些操作符预期错误: l% P) R& ^$ \/ O( W. g
当我们在特定位置完全遗漏或放错操作符时,我们就会遇到这种类型的错误。 以下是该类错误的示例。
6 B/ ]: l6 S$ q2 F5 }+ m有错误的代码:
" }; {% s7 |- U& J9 e* z, xint a= 7 10; |