概述
/ D/ F; q V! s9 p+ N作为 MQL5 程序员或开发人员,我们发现我们需要很好地理解和使用策略测试器,才能获得有效的结果。 通过使用这款颇具价值的工具,我们可以获得有关我们所创建 MQL5 程序的性能的宝贵认知,这对获得更好的交易结果颇具影响。 故此,我们发现在进行测试之前,我们需要充分了解重要的主题,例如处理所有错误类型,因为作为开发人员,我们犯糊涂导致出错是很正常的。 我们还需要深刻理解的另一个主题是调试,它让我们以交互方式执行我们创建的程序。 然后,我们来到最重要和最有价值的工具,即策略测试器,用于测试和评估我们创建的程序,其功能比 MetaTrader 4 版本的更有趣。 因此,在本文中,学习使用 MQL5 策略测试器的最重要方面会是一次了不起的学习之旅 c7 J5 f- l4 |, L6 E, l6 `- h
错误2 k: E& ?% R V1 o0 Y; S
在本主题中,我们将学习在创建、执行和运行 MQL5 程序时可能发现的错误。 理解这个主题的一个要点是,MQL5 会正确报告这些错误,但如果我们不知道这些错误意味着什么,或者在程序的哪个阶段,相较于我们已经知道它们的含义,我们就要花费更多的时间来处理或解决它们。
7 B" x" r8 y# h& P我们将根据我们在 MQL5 程序上的工作阶段来讲述这个主题,在我们编写代码时,可能会遇到错误和警告,即编译错误和警告。 我们在执行 MQL5 程序时也可能会遇到运行时错误,当我们的 MQL5 程序尝试交易时,我们也可能会遇到其它类型的错误,即交易服务器错误。
. `- s1 G7 a: g5 g6 G+ ~$ ^& b' r: j1 _左括号不平衡错误:# k2 n7 C& y! a8 V% O3 Q
当我们缺少右括号、或多用了额外的右括号时,就会发生此类错误。 我们可以通过以下示例发现该错误。
1 M1 Z. [" \% z+ R% W: g" i出错的错误代码:
0 M$ B" ~$ A7 Dbool a=7;
v! W9 i! T8 tif (a=5! h7 n6 m- U% w
a=5- P: w4 ~6 _! C0 c
更正无错误代码:
, o8 d- o, Y1 B. U. Bbool a=7;
5 S7 ^& Z; s s2 y( H! X. qif (a=5)! P" U# B) m y8 q$ @
a=5;
3 F# z4 X+ v! {0 S" |* H! ~. r- q更正代码后,我们会发现编译时没有错误。
9 s2 A( n5 J' Z+ i! U; G程序意外结束错误:
( o/ u5 }5 y9 [- r: r8 a' ^有时我们在代码中遗漏了一个右括号,继而发生意外的程序结束错误,我们必须检查我们的代码,查看需要添加的内容,或者我们需要确保每个左括号匹配一个右括号来解决此错误。 下面是该代码的示例。
8 p: E- g# A7 d* m& v! R出错的错误代码:
! p8 R4 }, C# |: H4 {8 B$ ovoid OnStart(), I2 z% u- R, T: d/ E
{% i: x8 M9 H# p3 ^- s" h% U
bool a=7;
% H5 p# W, P+ P; X, `if (a=5)
4 ] M* k5 R( t9 V! t1 na=5;
. B1 ]& f% x; ]4 a' d; S7 [9 b更正无错误代码:
" Q+ S2 V3 o+ q( Zvoid OnStart()
6 j! _, E' @$ K; K- t0 J2 _{5 C2 d) @# x% S/ V/ U
bool a=7;
: o- m* n0 L* S( ^if (a=5)
9 h: p/ N* o4 I) l* S4 da=5;/ o& I( S: r% Z/ u# X
}
! R2 d2 ]8 G& a添加右括号更正代码后,我们会发现代码成功编译没有错误。
+ _* Y$ q. b% P表达式不允许出现在全局范围错误:
% ~" x/ D6 }+ Y7 F" X$ m9 p* ?2 L5 a当我们在复合运算符中缺少左括号时,就会发生该错误,或者当我们在特定函数范围之外编写语句或表达式时,可能会发生该错误,因为我们只能在函数范围内使用表达式。 以下示例示意此类错误。 T# K2 Y- o7 h4 q X! G
出错的错误代码:
1 ]; e, S, ~# E/ i5 G+ Oint a=(7+5);
9 S4 B f; Q' l8 Rif (a<7)7 k1 O# T1 Y. _- D8 y% q% F
a=7;; B, }# i2 p: Q U6 B# [& ^7 F
}9 k' Q! ]# }. G9 f* m! Q
在前面的代码中,我们遗漏了与(})配对的起始({),故系统报告 “表达式不允许出现在全局范围” 错误。 以下是 “错误” 选项卡中的错误。* s+ f9 T# Z! |0 {
更正无错误代码:
- O6 v4 H) e* A' nint a=(7+5);
% D; [+ W3 L! |- P7 |if (a<7)
& _5 e3 F- U6 w{: r. Z( Y/ O8 w Y* p
a=7;
5 @ ~; m( ~* B6 P2 ?}
, Y* O4 Z- [1 D1 \更正代码后,与前面的代码模块相同,我们会发现代码编译后没有任何错误。& t& Q# q$ L6 G; m5 y4 ]% T2 H
错误的参数计数错误:, u* d9 B) K8 D- H. G
当我们用到拥有指定参数的特定函数时,若我们未正确指定这些参数,意即或多或少,我们会体验到这种类型的错误代码。 如果我们使用预定义的函数或我们创建的函数,则会出现此错误。 以下是该错误的示例。& u& k+ ~8 a4 K F/ X
有错误的代码:: Z# y0 l8 j( S. @7 Q# D" b X
如果我们创建了一个 “myVal” 函数,返回两个整数值求和的结果,这意味着该函数中有两个参数? 故此,当我们调用此函数时传递个数的参数时,我们将得到此类错误,其与以下代码相同2 S9 h- j+ w+ D8 i
void OnStart()
2 D! e6 n% T# k) T! ~{% w+ ]2 I4 ?$ f3 q# N: t8 G
int example=myVal(10);: U5 h. g( n. Q
}
. q+ `+ O; d2 ? e/ u+ L8 i//+------------------------------------------------------------------+
( T: y( H2 V% Xint myVal(int a, int b)/ v* S( g/ k5 l- n' }
{
$ {; x2 F6 ~4 s& A* a. D) q: \return a+b;* Y' c5 S' D$ O2 J
}
4 h2 V, g- S: \# F: R' Z无错误代码:
# L+ B. m) G# W. q' G' [: _ d为了正确编写此代码,我们需要为这个创建的函数传递相应个数的参数,如下所示
}3 W5 R6 f$ b% x8 z0 m: j2 R8 [void OnStart()$ o0 D1 A- ]6 b! |; V
{5 e2 I5 r% j: z' @. O& g
int example=myVal(10,20);
2 K9 V/ r% k t2 o1 K# N6 u}$ Y3 Q, g% | }
//+------------------------------------------------------------------+
4 I% [+ e y6 X, {5 u; ?: ^ J3 p+ Fint myVal(int a, int b)
; S2 ]; q" U* G2 R: A{
& ` I* d0 {5 S8 s$ t. w0 Yreturn a+b;
, w t+ A) u- P}
8 e5 ]; ^/ o$ D+ a- A! l) O+ t编译此正确代码后,我们不会发现任何错误。
2 I( }- J+ C+ Q5 D+ a3 C2 h* G某些操作符预期错误:
( t ~% C; F" U( s! q当我们在特定位置完全遗漏或放错操作符时,我们就会遇到这种类型的错误。 以下是该类错误的示例。( y, |5 f8 S& U! L2 L" O6 K' w
有错误的代码:1 @- a* y# @/ D
int a= 7 10; |