概述; U4 |8 k* a, O) y% T
作为 MQL5 程序员或开发人员,我们发现我们需要很好地理解和使用策略测试器,才能获得有效的结果。 通过使用这款颇具价值的工具,我们可以获得有关我们所创建 MQL5 程序的性能的宝贵认知,这对获得更好的交易结果颇具影响。 故此,我们发现在进行测试之前,我们需要充分了解重要的主题,例如处理所有错误类型,因为作为开发人员,我们犯糊涂导致出错是很正常的。 我们还需要深刻理解的另一个主题是调试,它让我们以交互方式执行我们创建的程序。 然后,我们来到最重要和最有价值的工具,即策略测试器,用于测试和评估我们创建的程序,其功能比 MetaTrader 4 版本的更有趣。 因此,在本文中,学习使用 MQL5 策略测试器的最重要方面会是一次了不起的学习之旅
9 h# x* E* h) {3 Q( g0 @- E错误1 H$ u! l% A$ s- D" f' u6 V
在本主题中,我们将学习在创建、执行和运行 MQL5 程序时可能发现的错误。 理解这个主题的一个要点是,MQL5 会正确报告这些错误,但如果我们不知道这些错误意味着什么,或者在程序的哪个阶段,相较于我们已经知道它们的含义,我们就要花费更多的时间来处理或解决它们。
/ Z) [3 f& d/ k. H! p. l( U1 T我们将根据我们在 MQL5 程序上的工作阶段来讲述这个主题,在我们编写代码时,可能会遇到错误和警告,即编译错误和警告。 我们在执行 MQL5 程序时也可能会遇到运行时错误,当我们的 MQL5 程序尝试交易时,我们也可能会遇到其它类型的错误,即交易服务器错误。* K# Y3 t- j# k* a, p: c/ x: E/ k
左括号不平衡错误:3 `& e; h) o c7 ` H0 h0 K
当我们缺少右括号、或多用了额外的右括号时,就会发生此类错误。 我们可以通过以下示例发现该错误。$ z1 U. L: f, P# u7 F2 {" v
出错的错误代码:
% p2 }2 A2 {5 r: p: abool a=7;
3 F E7 X- w* k/ W# [if (a=5
5 e( r- u! V0 W v' W: j, I: _a=5
- ]. m' y9 Z$ R$ r) [, V1 k更正无错误代码:- \6 x9 c2 \3 i8 \$ N4 z( J6 Z: D
bool a=7;
# i4 X; [. L( b& T8 @if (a=5)
) F5 K2 e( j3 \: x5 S8 W2 Va=5;
8 s4 p# \+ Z: ?8 ]( h更正代码后,我们会发现编译时没有错误。3 V; O. W4 i; }5 A
程序意外结束错误:
9 Y) s+ Z+ v0 L: r* |有时我们在代码中遗漏了一个右括号,继而发生意外的程序结束错误,我们必须检查我们的代码,查看需要添加的内容,或者我们需要确保每个左括号匹配一个右括号来解决此错误。 下面是该代码的示例。/ P- Q: Q1 m' S" ^
出错的错误代码:; ]1 S. R8 {& ] S7 K. d/ ^: r
void OnStart()
1 H. @( \# Z5 n{
) ]: g3 P# w- Tbool a=7;- M* E% W. `+ b4 [2 Q$ l2 a2 k
if (a=5)3 t/ l& J1 U0 g0 ?5 B& T2 X( }
a=5;% i+ K9 K! `0 ~6 Z8 b- _' q% _" e
更正无错误代码:6 l- M- r9 V% S0 A: H
void OnStart()% ^% d: W# s8 v0 ]/ ^- R6 n5 ^
{
# P% W2 T# {5 e# O. `" [bool a=7;% ]4 j; t( L0 G, W
if (a=5)
1 i# r$ L# Y# p1 N+ Za=5;9 U- R( ~5 [5 u* ~& P
}
. V8 r+ U( }* D8 L添加右括号更正代码后,我们会发现代码成功编译没有错误。
7 R1 C! C: t# A. `表达式不允许出现在全局范围错误:
$ }) ?. O& g# ^& F当我们在复合运算符中缺少左括号时,就会发生该错误,或者当我们在特定函数范围之外编写语句或表达式时,可能会发生该错误,因为我们只能在函数范围内使用表达式。 以下示例示意此类错误。
8 q$ v" ] s6 _1 r8 j ], D出错的错误代码:
+ y) M9 s5 y/ J9 Jint a=(7+5);
; _5 N+ `/ v0 M) hif (a<7)# W# h( }$ }" c9 N
a=7;6 H6 C5 y' F4 K7 r) ^5 a' m
}
9 X$ P8 v |+ G0 d9 y在前面的代码中,我们遗漏了与(})配对的起始({),故系统报告 “表达式不允许出现在全局范围” 错误。 以下是 “错误” 选项卡中的错误。
! F" J" P3 @$ {4 L: b! w更正无错误代码:/ g) Q- P" B; h& j4 X5 I( X9 q' M" l
int a=(7+5);
; r* V8 j$ {$ s. lif (a<7)$ d" Z6 x- R& ]
{
7 H: Y; `( I5 B" b' Za=7;, o7 Q7 A4 B' @" A+ ?. T
}
8 o, |5 {4 \- ~& S9 \ a6 }8 b更正代码后,与前面的代码模块相同,我们会发现代码编译后没有任何错误。9 U0 ]" |2 I5 l1 W
错误的参数计数错误:; F- Z' C9 Y, Q( |- E) j: T0 N
当我们用到拥有指定参数的特定函数时,若我们未正确指定这些参数,意即或多或少,我们会体验到这种类型的错误代码。 如果我们使用预定义的函数或我们创建的函数,则会出现此错误。 以下是该错误的示例。8 j6 s. G% s" ~* p4 u. x
有错误的代码:/ u0 L; X, X$ k+ ~# ]
如果我们创建了一个 “myVal” 函数,返回两个整数值求和的结果,这意味着该函数中有两个参数? 故此,当我们调用此函数时传递个数的参数时,我们将得到此类错误,其与以下代码相同! _* n4 C5 B, O: [) L1 w6 `) }
void OnStart()5 P" C; k( o( ]+ h$ H
{
) H" P4 G( Y$ w0 s% Mint example=myVal(10);
$ T$ @0 A( S3 z' `8 ~) h}
6 a" Z! e5 R, j' K3 K//+------------------------------------------------------------------+: p7 L& b' h) i) I( }
int myVal(int a, int b)8 J2 b% Q5 H5 ?2 c( M
{# T. v7 x$ Q. R* }; n
return a+b;
0 n6 J f# w% m; P0 d9 E* e. ]# r}
1 [% z ^/ p" A+ _% Z5 ?) o$ }( W无错误代码:
( ^: o0 b/ x9 c( J% f为了正确编写此代码,我们需要为这个创建的函数传递相应个数的参数,如下所示" r9 |0 l- w: X/ {: c( u; N& l, O* h
void OnStart()
% N8 y9 w; D4 P" G+ y{ e0 v' z, F# ^
int example=myVal(10,20);. S, W9 U8 V U- ?" n
}, s6 |# d# i) y6 ]6 L
//+------------------------------------------------------------------+
+ \0 P0 d/ c. F, m8 ^5 J! Uint myVal(int a, int b)' z8 ]/ J1 a/ u7 B0 k- {
{
" h2 s! A" d) p6 sreturn a+b;8 k! _& ]. J9 ~+ d* \) S
}1 o% t8 O+ `0 [2 C
编译此正确代码后,我们不会发现任何错误。% q1 ?- O' ~8 _8 d
某些操作符预期错误:- t; }, _- R* f/ H2 H% S, R5 i! {
当我们在特定位置完全遗漏或放错操作符时,我们就会遇到这种类型的错误。 以下是该类错误的示例。
, T2 Y: O( b: s) ], [ e有错误的代码:' \! V8 T/ Z. {$ ^; `; v2 h
int a= 7 10; |