概述
* {: K0 {) _3 A作为 MQL5 程序员或开发人员,我们发现我们需要很好地理解和使用策略测试器,才能获得有效的结果。 通过使用这款颇具价值的工具,我们可以获得有关我们所创建 MQL5 程序的性能的宝贵认知,这对获得更好的交易结果颇具影响。 故此,我们发现在进行测试之前,我们需要充分了解重要的主题,例如处理所有错误类型,因为作为开发人员,我们犯糊涂导致出错是很正常的。 我们还需要深刻理解的另一个主题是调试,它让我们以交互方式执行我们创建的程序。 然后,我们来到最重要和最有价值的工具,即策略测试器,用于测试和评估我们创建的程序,其功能比 MetaTrader 4 版本的更有趣。 因此,在本文中,学习使用 MQL5 策略测试器的最重要方面会是一次了不起的学习之旅2 z& x/ W6 `% F
错误
3 Q6 A' T, X( [7 i6 Y在本主题中,我们将学习在创建、执行和运行 MQL5 程序时可能发现的错误。 理解这个主题的一个要点是,MQL5 会正确报告这些错误,但如果我们不知道这些错误意味着什么,或者在程序的哪个阶段,相较于我们已经知道它们的含义,我们就要花费更多的时间来处理或解决它们。
0 S% j# v/ ]/ w& a我们将根据我们在 MQL5 程序上的工作阶段来讲述这个主题,在我们编写代码时,可能会遇到错误和警告,即编译错误和警告。 我们在执行 MQL5 程序时也可能会遇到运行时错误,当我们的 MQL5 程序尝试交易时,我们也可能会遇到其它类型的错误,即交易服务器错误。! q% b. _6 i& W% `- B
左括号不平衡错误:
4 R- T% b6 S. F& O当我们缺少右括号、或多用了额外的右括号时,就会发生此类错误。 我们可以通过以下示例发现该错误。
( }+ h" M/ o `6 D. o+ u7 W出错的错误代码:
% H) G2 y5 _, w/ P8 Obool a=7;
; b8 Y7 m% W1 y' H4 vif (a=5* G" t3 t- h9 X# n
a=5& ~& V% } j6 i$ W0 N7 h! z
更正无错误代码:
" K& b& x: R& N2 S: xbool a=7;0 `; B' K" ?. J: [3 g* y# @
if (a=5)2 _8 `! X3 K$ w9 B
a=5;& t: |" Q+ y5 v+ p: E
更正代码后,我们会发现编译时没有错误。
+ U, f8 ?' @. n; }/ ]程序意外结束错误:9 y* T: F% Z1 n( D
有时我们在代码中遗漏了一个右括号,继而发生意外的程序结束错误,我们必须检查我们的代码,查看需要添加的内容,或者我们需要确保每个左括号匹配一个右括号来解决此错误。 下面是该代码的示例。
& H4 V4 b/ {6 ]9 m出错的错误代码:1 g) M' e1 P( c3 I i4 Y4 f: j
void OnStart()$ |- w: D+ e' w( v
{
% E. ^$ j; i" a7 L6 Ybool a=7;9 [& M1 }- @# c1 h! d% `' s5 r
if (a=5)
. Y0 [' }7 p0 R: j1 ^a=5;
5 r+ L5 @5 N0 t5 \更正无错误代码:6 R9 s! i7 M0 b2 {
void OnStart(): y* ?$ }6 h8 L: F) Q$ _
{% u, U7 b( O! v9 s
bool a=7;
5 ^% z3 Q: k: k6 J+ Nif (a=5)
* X, c1 r! L) N/ `+ t8 `. Oa=5;
2 _+ n U' F4 ?3 r% T}3 b! a* |( Z: F2 |# }2 e
添加右括号更正代码后,我们会发现代码成功编译没有错误。$ D3 O' r4 i( e- k( @8 K
表达式不允许出现在全局范围错误:
) C% S5 I' e, ] v( i$ w当我们在复合运算符中缺少左括号时,就会发生该错误,或者当我们在特定函数范围之外编写语句或表达式时,可能会发生该错误,因为我们只能在函数范围内使用表达式。 以下示例示意此类错误。
) B% }( L# w N: r: H出错的错误代码:
, ?: |4 H1 ^- s# R9 Y: uint a=(7+5);. E& c/ l- G: K1 [$ V$ i
if (a<7)
' b- w s. H1 M# n$ R9 va=7;, i* W" d& x7 L+ X
}
4 N% |3 }! t& V) l$ D在前面的代码中,我们遗漏了与(})配对的起始({),故系统报告 “表达式不允许出现在全局范围” 错误。 以下是 “错误” 选项卡中的错误。6 ?2 @5 j. \# E
更正无错误代码:# a) T& z8 R$ F+ @1 [
int a=(7+5);
& e! [& h* ?7 Q+ A: J6 @if (a<7)% X* q6 p6 [- h7 C _5 L2 M
{+ M6 Z1 R M' M+ x
a=7;% [2 g' P2 O9 J& c+ |- x( p/ c
}. h+ X5 @6 E$ L- E# H& g8 I
更正代码后,与前面的代码模块相同,我们会发现代码编译后没有任何错误。/ s) S D: l/ w2 X1 j2 W
错误的参数计数错误:* i& i9 H1 i5 z
当我们用到拥有指定参数的特定函数时,若我们未正确指定这些参数,意即或多或少,我们会体验到这种类型的错误代码。 如果我们使用预定义的函数或我们创建的函数,则会出现此错误。 以下是该错误的示例。
& v. @. M* u) m有错误的代码:4 ?, [8 T# R, [! G3 } m
如果我们创建了一个 “myVal” 函数,返回两个整数值求和的结果,这意味着该函数中有两个参数? 故此,当我们调用此函数时传递个数的参数时,我们将得到此类错误,其与以下代码相同
$ u0 x! y$ p# tvoid OnStart()5 T! O$ s+ ^' S
{
: ^2 E- x5 I D$ @& oint example=myVal(10);. v8 k9 k4 Z0 r* D6 @
}
- U$ j- G* O5 E8 k8 b- R1 }//+------------------------------------------------------------------+8 e9 \9 S6 Z3 u9 o& t2 T
int myVal(int a, int b)
5 O: s5 Z4 Q$ A% g; [{
! a2 I/ Z. l W4 T, Lreturn a+b;9 z' J+ \8 ~; D; _% G
}
7 R& _4 ^1 k1 c' h) N/ {6 {; t% m无错误代码:
& i2 B" Z7 e! I* B; e+ j. ?9 |( s+ A为了正确编写此代码,我们需要为这个创建的函数传递相应个数的参数,如下所示
3 H) L5 g" K. h9 h8 R" ivoid OnStart()8 |4 n& t0 Y$ n, k7 X
{) n: t0 U, g w) r' i0 A, C, W
int example=myVal(10,20);
0 v1 G* j; ^. x W3 E}
" @& E+ d3 H4 u5 p, f' a//+------------------------------------------------------------------+2 Q9 _5 z8 e+ q/ g4 L
int myVal(int a, int b)
4 @! o& @3 F) F{
& Y5 y' S& M. Q7 R) Z4 rreturn a+b;6 G$ B0 ]4 [! ]# g6 l2 {
}
8 s' a1 _' V8 x4 J编译此正确代码后,我们不会发现任何错误。
6 o+ W: N7 i) J# t某些操作符预期错误:9 n( Z7 {0 h0 n- m5 ]$ {) c, L
当我们在特定位置完全遗漏或放错操作符时,我们就会遇到这种类型的错误。 以下是该类错误的示例。
1 A3 _( O# t: a/ c5 C有错误的代码:
) D3 P( k/ X w' d* y7 E3 Iint a= 7 10; |