概述
Y7 m W N: j作为 MQL5 程序员或开发人员,我们发现我们需要很好地理解和使用策略测试器,才能获得有效的结果。 通过使用这款颇具价值的工具,我们可以获得有关我们所创建 MQL5 程序的性能的宝贵认知,这对获得更好的交易结果颇具影响。 故此,我们发现在进行测试之前,我们需要充分了解重要的主题,例如处理所有错误类型,因为作为开发人员,我们犯糊涂导致出错是很正常的。 我们还需要深刻理解的另一个主题是调试,它让我们以交互方式执行我们创建的程序。 然后,我们来到最重要和最有价值的工具,即策略测试器,用于测试和评估我们创建的程序,其功能比 MetaTrader 4 版本的更有趣。 因此,在本文中,学习使用 MQL5 策略测试器的最重要方面会是一次了不起的学习之旅 |. G. k' Q+ o" n8 e( C! t
错误
& h8 J- [ r5 x1 m$ w在本主题中,我们将学习在创建、执行和运行 MQL5 程序时可能发现的错误。 理解这个主题的一个要点是,MQL5 会正确报告这些错误,但如果我们不知道这些错误意味着什么,或者在程序的哪个阶段,相较于我们已经知道它们的含义,我们就要花费更多的时间来处理或解决它们。4 F- ?/ y) R% s. _) e" s, P
我们将根据我们在 MQL5 程序上的工作阶段来讲述这个主题,在我们编写代码时,可能会遇到错误和警告,即编译错误和警告。 我们在执行 MQL5 程序时也可能会遇到运行时错误,当我们的 MQL5 程序尝试交易时,我们也可能会遇到其它类型的错误,即交易服务器错误。' u) K' j8 d2 S
左括号不平衡错误:
3 S* E5 [. e" G7 M0 L1 K% m1 \3 G2 I当我们缺少右括号、或多用了额外的右括号时,就会发生此类错误。 我们可以通过以下示例发现该错误。
9 r4 B$ N* i# v% G+ X M" F出错的错误代码:2 O3 i% [+ I" y H$ m
bool a=7;
" I7 r" T1 B" }; ^if (a=5
7 E/ q5 j2 L. M& J7 Ca=5! e1 }9 x3 g, B0 l0 r0 W/ p t
更正无错误代码:- @. r2 C6 w# c
bool a=7;9 |7 l* z& y7 H5 N
if (a=5)
2 i& o; @; B* X c) ha=5;
& C8 J2 e O* c更正代码后,我们会发现编译时没有错误。* `! L1 K/ _& S; u
程序意外结束错误:. [; a4 n$ y3 t* i8 t
有时我们在代码中遗漏了一个右括号,继而发生意外的程序结束错误,我们必须检查我们的代码,查看需要添加的内容,或者我们需要确保每个左括号匹配一个右括号来解决此错误。 下面是该代码的示例。1 r9 `; x/ G# E& |1 p
出错的错误代码:
( q) r( v k2 c# ?4 xvoid OnStart()
2 E2 n" x" i- H* M; j; I- y$ c{
0 h5 W* q3 }; \8 t& d* Qbool a=7;8 `6 S0 _3 F1 e% B+ k
if (a=5)4 E% F0 f3 A$ T- z! {
a=5;# |* D! X; H: z& ?/ V
更正无错误代码:8 \3 X/ E$ ?2 l3 x
void OnStart()7 I1 o$ k/ M! Z" h) @$ U4 N
{- A+ o7 o3 c9 Y. c! y" N# r
bool a=7;1 c m1 p' K: g/ k
if (a=5)
! w8 x9 p h5 a& D+ Oa=5;% S5 D8 `4 V+ F' n3 h D
}
- @0 P' F) l4 r- v( [' |+ Y添加右括号更正代码后,我们会发现代码成功编译没有错误。
# H* r, a8 V& P3 r- e/ Z1 z表达式不允许出现在全局范围错误:
) y6 V9 v4 ^% F) I当我们在复合运算符中缺少左括号时,就会发生该错误,或者当我们在特定函数范围之外编写语句或表达式时,可能会发生该错误,因为我们只能在函数范围内使用表达式。 以下示例示意此类错误。
) C# n0 f1 g. B2 V/ Y出错的错误代码:
f2 \* p, F+ W6 Aint a=(7+5);
* J/ Q* K7 G) m/ wif (a<7)
2 b% r5 \' Q8 w# r# ^a=7;
4 A8 c" D3 t0 H" Y6 u' t" n}* {5 u; L F7 U0 R- ^: ?& i
在前面的代码中,我们遗漏了与(})配对的起始({),故系统报告 “表达式不允许出现在全局范围” 错误。 以下是 “错误” 选项卡中的错误。! m$ i4 ^; h9 U1 g$ \0 o8 `
更正无错误代码:$ o+ h! g# Q0 `# R8 u3 j
int a=(7+5);3 T( {: H8 ?+ C+ W: u/ p- ^4 C1 \6 k
if (a<7)* `8 i3 \& a+ ?' x
{8 E0 M4 I, c2 n5 ]6 ]2 c
a=7;- n! a1 `9 D0 b* v" M5 C
}
. L% S9 C4 C% Q6 X更正代码后,与前面的代码模块相同,我们会发现代码编译后没有任何错误。3 s; N$ Z9 g3 p4 O3 r
错误的参数计数错误:3 b. _/ I9 [' W, |
当我们用到拥有指定参数的特定函数时,若我们未正确指定这些参数,意即或多或少,我们会体验到这种类型的错误代码。 如果我们使用预定义的函数或我们创建的函数,则会出现此错误。 以下是该错误的示例。
7 n' v8 B- ?& i- p% s4 _有错误的代码:* v! X; A& [! Y! F0 x# P% l
如果我们创建了一个 “myVal” 函数,返回两个整数值求和的结果,这意味着该函数中有两个参数? 故此,当我们调用此函数时传递个数的参数时,我们将得到此类错误,其与以下代码相同" V8 h: ^* l& w7 l
void OnStart()
9 J; A8 H% x3 t+ p/ f$ f; n9 u{
4 B. t. J$ M$ V7 _/ ?( Dint example=myVal(10);5 w- [( f6 i3 Q
}. s+ u% L+ j3 H. }4 A4 d
//+------------------------------------------------------------------+
& \& D% Y4 O% k% } Uint myVal(int a, int b)
8 d9 j6 L2 c) X4 J+ J, K: q# ^' \{1 ^/ m( Z3 I, i! o
return a+b;
- I+ f2 U- x; x, F& s}
) @1 b4 p3 l, D( o4 e无错误代码:
+ |+ g4 d$ Z7 Y为了正确编写此代码,我们需要为这个创建的函数传递相应个数的参数,如下所示
* L$ p( H; X# \3 O- x, Cvoid OnStart()9 u+ T" }6 E/ e& `
{' T" R* M+ {3 ~' k2 ?2 W
int example=myVal(10,20);5 a, D) P5 S9 ]$ ~
}
! M$ H$ a9 R( {3 h" _+ l1 j! B//+------------------------------------------------------------------+! L7 `. l/ j- C1 Z1 {
int myVal(int a, int b)
; D4 p& A) o4 A+ l' C$ W{
; T# |* m9 J( p. S8 F: W+ b4 p- j$ {return a+b;! l G7 U/ X" g
}
7 B2 h- t1 |( A/ u编译此正确代码后,我们不会发现任何错误。
; g- f% U6 u8 k: U; c; l某些操作符预期错误:/ h) Q1 z$ I7 z5 S) C
当我们在特定位置完全遗漏或放错操作符时,我们就会遇到这种类型的错误。 以下是该类错误的示例。
: j7 Y. f: l$ t有错误的代码:
C4 W- P% ^2 Q( h+ D' y2 A6 gint a= 7 10; |