概述/ F4 f" M' D+ y& ~ a
作为 MQL5 程序员或开发人员,我们发现我们需要很好地理解和使用策略测试器,才能获得有效的结果。 通过使用这款颇具价值的工具,我们可以获得有关我们所创建 MQL5 程序的性能的宝贵认知,这对获得更好的交易结果颇具影响。 故此,我们发现在进行测试之前,我们需要充分了解重要的主题,例如处理所有错误类型,因为作为开发人员,我们犯糊涂导致出错是很正常的。 我们还需要深刻理解的另一个主题是调试,它让我们以交互方式执行我们创建的程序。 然后,我们来到最重要和最有价值的工具,即策略测试器,用于测试和评估我们创建的程序,其功能比 MetaTrader 4 版本的更有趣。 因此,在本文中,学习使用 MQL5 策略测试器的最重要方面会是一次了不起的学习之旅5 x: B0 ]9 s8 Q* K/ ?" j5 h4 Z( ~
错误1 F9 K( ]) @; I
在本主题中,我们将学习在创建、执行和运行 MQL5 程序时可能发现的错误。 理解这个主题的一个要点是,MQL5 会正确报告这些错误,但如果我们不知道这些错误意味着什么,或者在程序的哪个阶段,相较于我们已经知道它们的含义,我们就要花费更多的时间来处理或解决它们。. J! }/ ?1 M' b* S( W
我们将根据我们在 MQL5 程序上的工作阶段来讲述这个主题,在我们编写代码时,可能会遇到错误和警告,即编译错误和警告。 我们在执行 MQL5 程序时也可能会遇到运行时错误,当我们的 MQL5 程序尝试交易时,我们也可能会遇到其它类型的错误,即交易服务器错误。' K* F9 e% X! u% i# j
左括号不平衡错误:4 ?) {) a# L# W1 M. H' e
当我们缺少右括号、或多用了额外的右括号时,就会发生此类错误。 我们可以通过以下示例发现该错误。/ x" T7 s! K4 V+ L; b( |+ O
出错的错误代码:! m% V0 g. l/ x. ]$ z* N
bool a=7;
0 |, ~& v* }5 k9 _) Cif (a=5
- g( C- s9 F; v }$ ra=5# s8 m" q5 X8 Q4 q3 O
更正无错误代码:
8 C; }# u) P+ y; _1 e. mbool a=7;
4 G( d% _* Y' j& J) R+ k% Q7 } ]' {7 Sif (a=5)8 Q0 I/ C1 Y/ X! U
a=5;
) Y8 C F1 h& F# F- e* v6 M更正代码后,我们会发现编译时没有错误。
3 U& o3 z t @5 J# d- O a程序意外结束错误:
* l, A- ]6 q6 I N有时我们在代码中遗漏了一个右括号,继而发生意外的程序结束错误,我们必须检查我们的代码,查看需要添加的内容,或者我们需要确保每个左括号匹配一个右括号来解决此错误。 下面是该代码的示例。6 \& i3 h: I7 l8 t' l1 q/ B: ~
出错的错误代码:$ {+ z1 C4 O8 f* j# T& ?7 c! ]' H! c
void OnStart()( w. }! w/ q- \* c H
{1 W7 J8 M) E( n3 J" T( j" d7 i$ f% t& ~
bool a=7;
5 w' G5 W. w9 |3 {' X! f% wif (a=5)
- @2 ?( v8 a" R! ` X% {a=5;5 U: Z7 ]% _5 Q5 B( _8 Q
更正无错误代码:; s; E/ U; w) b& ]" t0 C+ `
void OnStart()
: |+ W8 y# L' \5 F! S" _{
: l$ s" y$ b6 O! Y$ ^' k; Bbool a=7;
- T+ ~, ~5 R1 L1 E' nif (a=5)) g& [# i+ H5 \/ y* l4 S' D
a=5;
" D2 @ q6 i9 R( t) K}. P- A8 u! Z3 |+ ~
添加右括号更正代码后,我们会发现代码成功编译没有错误。
: b5 i2 u0 d; L$ n; g. `; G( K6 U表达式不允许出现在全局范围错误:
* o7 \2 c, [0 X当我们在复合运算符中缺少左括号时,就会发生该错误,或者当我们在特定函数范围之外编写语句或表达式时,可能会发生该错误,因为我们只能在函数范围内使用表达式。 以下示例示意此类错误。; s( g/ `, y6 E5 T& E
出错的错误代码:
% o% y# C6 k' Pint a=(7+5);# `$ J& A' E2 U, J' a
if (a<7)9 l3 k ], E2 ~( S& {% {! I( |
a=7;
: m3 c2 F' K9 x, n& d}
* i! h" ? m% e0 }' r) z在前面的代码中,我们遗漏了与(})配对的起始({),故系统报告 “表达式不允许出现在全局范围” 错误。 以下是 “错误” 选项卡中的错误。
; i) a& M& |( S更正无错误代码:
) D M ^, c4 Z/ P! bint a=(7+5);: f4 W }8 l# U" l: k/ V/ i
if (a<7)
N1 h% V2 k7 }- H' H5 S{
, ^9 y0 ]" H7 p3 ~6 ]& aa=7;
1 J, z1 h' X4 T& y% P}
4 m( k: D" F# _6 m, S更正代码后,与前面的代码模块相同,我们会发现代码编译后没有任何错误。
/ `6 N3 n/ p# w+ L4 ~/ J错误的参数计数错误:! h( W6 |8 l6 P$ F9 I: \
当我们用到拥有指定参数的特定函数时,若我们未正确指定这些参数,意即或多或少,我们会体验到这种类型的错误代码。 如果我们使用预定义的函数或我们创建的函数,则会出现此错误。 以下是该错误的示例。
% d' [! I* x. s' ^: t( t. u有错误的代码:" r/ L" X% R! x! p
如果我们创建了一个 “myVal” 函数,返回两个整数值求和的结果,这意味着该函数中有两个参数? 故此,当我们调用此函数时传递个数的参数时,我们将得到此类错误,其与以下代码相同& A/ l1 [: b! j* a+ T
void OnStart()
& L( y0 I+ A1 @7 D{4 ]: g; A |2 M" H
int example=myVal(10);* q% y3 F& r x" m: V" |( C$ g
}
# J- w& s' ~) Y9 X//+------------------------------------------------------------------+
- L3 e6 g9 I' ]4 B+ a5 lint myVal(int a, int b)) K0 c# h _9 L# j
{: R6 v, a) g4 u0 {- J
return a+b;
" Q% o' I# a! G0 [}
2 }# T8 u+ H5 U, ]3 e& l5 ^无错误代码:
/ b$ ~7 {9 m# ?" v7 }7 F ]; W" n为了正确编写此代码,我们需要为这个创建的函数传递相应个数的参数,如下所示
* V' X# A6 G" V; Y; ~void OnStart()4 M1 ]9 k' f2 Y
{
( X- G* p: A3 y- v5 x# {' X7 S8 dint example=myVal(10,20);
% }2 [" m0 N1 @9 ]+ L1 c: |}
6 U0 C6 O& O) a" {//+------------------------------------------------------------------+
+ o( H5 q4 a/ k+ ^' G6 uint myVal(int a, int b)/ M8 v, O* _1 R
{
; j: ^( ^/ U0 z! e+ m! treturn a+b;# ?" l$ w, c; Y5 i3 c
}& H) N; P% z% |; b) U
编译此正确代码后,我们不会发现任何错误。
1 @3 j$ x2 z7 h$ t9 C某些操作符预期错误:
: v* c$ C9 |0 M当我们在特定位置完全遗漏或放错操作符时,我们就会遇到这种类型的错误。 以下是该类错误的示例。
( a' V) n6 Q* }2 V! I# R* D. Y2 [有错误的代码:. O7 g; F3 p j h
int a= 7 10; |