概述) y: q9 a" o2 M; X2 f- S% `$ b
作为 MQL5 程序员或开发人员,我们发现我们需要很好地理解和使用策略测试器,才能获得有效的结果。 通过使用这款颇具价值的工具,我们可以获得有关我们所创建 MQL5 程序的性能的宝贵认知,这对获得更好的交易结果颇具影响。 故此,我们发现在进行测试之前,我们需要充分了解重要的主题,例如处理所有错误类型,因为作为开发人员,我们犯糊涂导致出错是很正常的。 我们还需要深刻理解的另一个主题是调试,它让我们以交互方式执行我们创建的程序。 然后,我们来到最重要和最有价值的工具,即策略测试器,用于测试和评估我们创建的程序,其功能比 MetaTrader 4 版本的更有趣。 因此,在本文中,学习使用 MQL5 策略测试器的最重要方面会是一次了不起的学习之旅& s* y l% }7 J8 K. y& ]$ R5 @
错误
& Y7 q: u5 q8 e/ h在本主题中,我们将学习在创建、执行和运行 MQL5 程序时可能发现的错误。 理解这个主题的一个要点是,MQL5 会正确报告这些错误,但如果我们不知道这些错误意味着什么,或者在程序的哪个阶段,相较于我们已经知道它们的含义,我们就要花费更多的时间来处理或解决它们。# h* l$ s' X, p7 I4 C7 p
我们将根据我们在 MQL5 程序上的工作阶段来讲述这个主题,在我们编写代码时,可能会遇到错误和警告,即编译错误和警告。 我们在执行 MQL5 程序时也可能会遇到运行时错误,当我们的 MQL5 程序尝试交易时,我们也可能会遇到其它类型的错误,即交易服务器错误。
4 x' }# A' I& R* J. [( L3 ^( ~$ L2 `9 e左括号不平衡错误:% A3 m- d9 Y" w
当我们缺少右括号、或多用了额外的右括号时,就会发生此类错误。 我们可以通过以下示例发现该错误。% E& i! @- J) Z+ a0 u$ |
出错的错误代码:
- U, \! x/ L: ?8 g6 X9 N# `& s- x" Nbool a=7;
( I- X0 O, B) sif (a=5
5 x L% A3 i6 O" S. c+ p9 Ja=5
, o% e; i* S( |更正无错误代码:
: A, q8 i, ~$ J* ]bool a=7;2 o$ k# l: r) z2 t8 ?, X4 F
if (a=5)
" p) {5 h% m9 w# J: Ea=5;# i2 N( Q# \$ W" X0 \, g1 [
更正代码后,我们会发现编译时没有错误。+ ?" M: H5 [0 g2 `! Q* ~* x4 D
程序意外结束错误:8 [3 |. u8 A! {8 q
有时我们在代码中遗漏了一个右括号,继而发生意外的程序结束错误,我们必须检查我们的代码,查看需要添加的内容,或者我们需要确保每个左括号匹配一个右括号来解决此错误。 下面是该代码的示例。1 b! \: [) |7 j x( m0 p
出错的错误代码:. b, C# p8 D6 [: j5 v8 c
void OnStart()
. Q& j* Z7 V L; F2 ?% |/ W: U+ F{
Q9 I* c. a1 j K# c- Abool a=7;' m" H+ L. U" L. `$ r- [
if (a=5)
3 M2 v0 l" {$ N" O k3 \' t r( ^a=5;1 M) F& n9 X! `' _
更正无错误代码:
9 y6 H6 `- v. a+ F4 vvoid OnStart(). r7 q1 O8 O1 P+ u) l
{3 I0 k) h3 s a, u* a' ^; t I
bool a=7;# d" x, ^8 C, A1 t
if (a=5)
5 z8 J7 ~2 R' ]$ @; r9 X8 ~/ ha=5;. {6 A- V* i- {! _
}
' Z) ]' D% W( L* w" j }添加右括号更正代码后,我们会发现代码成功编译没有错误。( W7 C. a; H$ O
表达式不允许出现在全局范围错误:
' L- v9 A. f% v2 a" V4 [8 x# L当我们在复合运算符中缺少左括号时,就会发生该错误,或者当我们在特定函数范围之外编写语句或表达式时,可能会发生该错误,因为我们只能在函数范围内使用表达式。 以下示例示意此类错误。
7 q c* Q* N4 G# b( j; j4 g z5 f出错的错误代码:
- E; Q. ^8 o, bint a=(7+5);
, o( |4 f* }6 ]( yif (a<7)/ t) g4 |6 z0 ~0 D+ V) r9 h c! C* ?
a=7;
* D) B, d: t. L4 k# {}
/ c: D& B9 F5 Y+ M在前面的代码中,我们遗漏了与(})配对的起始({),故系统报告 “表达式不允许出现在全局范围” 错误。 以下是 “错误” 选项卡中的错误。
5 @4 V2 U- ]9 M v+ q, ]7 A; h0 V更正无错误代码:. r. A Z4 I8 V4 T
int a=(7+5);! V1 K5 E0 ?, _3 D3 H6 Z+ m
if (a<7)
- w2 A) N( V1 j$ W1 P) \- |" E. p{
6 K7 Q" \6 i; `" A5 Qa=7;
9 ?. [6 @, E( C1 g! D}( N- g5 {5 {1 y7 D
更正代码后,与前面的代码模块相同,我们会发现代码编译后没有任何错误。3 c. t% @6 V2 W: b
错误的参数计数错误:, `: C9 x7 V e! B
当我们用到拥有指定参数的特定函数时,若我们未正确指定这些参数,意即或多或少,我们会体验到这种类型的错误代码。 如果我们使用预定义的函数或我们创建的函数,则会出现此错误。 以下是该错误的示例。
- K. p$ `+ y5 G5 X. o/ G' }有错误的代码:
" x7 b7 e6 G' D2 a2 _4 Y如果我们创建了一个 “myVal” 函数,返回两个整数值求和的结果,这意味着该函数中有两个参数? 故此,当我们调用此函数时传递个数的参数时,我们将得到此类错误,其与以下代码相同
; U! l+ l2 d2 u- z0 o" Ivoid OnStart()' ^- B' L' r) v2 }: f- E
{
" ~; l7 B7 Q. p( J* h2 ^6 `int example=myVal(10);: z5 ]1 z- l! B& \9 p7 o1 _: _
}2 ^* a* F8 X- W$ i0 t: I! @
//+------------------------------------------------------------------+- ? |; w( R4 E! W4 [0 w7 h
int myVal(int a, int b)
& S9 C0 ^: ^' \8 v/ }7 R{
; f* I9 v. u" a$ [0 u& Wreturn a+b;* [! A2 I! D5 N$ k
}& c8 m. N+ | @
无错误代码:, k* e) x* S4 `5 K7 I$ |
为了正确编写此代码,我们需要为这个创建的函数传递相应个数的参数,如下所示
+ _" L: Y. m/ Y; lvoid OnStart()
4 i6 d' F% a" F6 {+ d{
5 k5 f' H. T+ K/ R% K9 E. hint example=myVal(10,20);
6 e7 W9 o/ K* a# s8 [+ [}9 h3 L2 D9 o' E5 ] }5 R
//+------------------------------------------------------------------+3 K/ `* m# j2 ]8 S% e3 m% B
int myVal(int a, int b)5 v X6 o h$ |2 l7 @
{; L& n0 M5 g6 Y
return a+b;
8 Z: Z5 _' {8 ~9 u+ o% g5 O}
" H7 H9 o$ |+ o( j( |% \# a编译此正确代码后,我们不会发现任何错误。
2 M! `+ \ S8 {/ m, M+ e/ ~某些操作符预期错误:' h3 e& p3 j/ Z- R- G# L0 i8 ~
当我们在特定位置完全遗漏或放错操作符时,我们就会遇到这种类型的错误。 以下是该类错误的示例。
* c9 R& P$ t3 G+ h有错误的代码:
5 P! j$ h( H# S/ mint a= 7 10; |