概述
# W d7 V* z9 N, I- k4 }作为 MQL5 程序员或开发人员,我们发现我们需要很好地理解和使用策略测试器,才能获得有效的结果。 通过使用这款颇具价值的工具,我们可以获得有关我们所创建 MQL5 程序的性能的宝贵认知,这对获得更好的交易结果颇具影响。 故此,我们发现在进行测试之前,我们需要充分了解重要的主题,例如处理所有错误类型,因为作为开发人员,我们犯糊涂导致出错是很正常的。 我们还需要深刻理解的另一个主题是调试,它让我们以交互方式执行我们创建的程序。 然后,我们来到最重要和最有价值的工具,即策略测试器,用于测试和评估我们创建的程序,其功能比 MetaTrader 4 版本的更有趣。 因此,在本文中,学习使用 MQL5 策略测试器的最重要方面会是一次了不起的学习之旅
; L, f) e9 a/ @4 s错误 S. T! o9 H- S9 D- o: W
在本主题中,我们将学习在创建、执行和运行 MQL5 程序时可能发现的错误。 理解这个主题的一个要点是,MQL5 会正确报告这些错误,但如果我们不知道这些错误意味着什么,或者在程序的哪个阶段,相较于我们已经知道它们的含义,我们就要花费更多的时间来处理或解决它们。/ r# \ n; S1 z$ u$ j
我们将根据我们在 MQL5 程序上的工作阶段来讲述这个主题,在我们编写代码时,可能会遇到错误和警告,即编译错误和警告。 我们在执行 MQL5 程序时也可能会遇到运行时错误,当我们的 MQL5 程序尝试交易时,我们也可能会遇到其它类型的错误,即交易服务器错误。1 a# x0 F4 ?1 O7 ~
左括号不平衡错误:
: h2 Z! E% p0 j9 v; u当我们缺少右括号、或多用了额外的右括号时,就会发生此类错误。 我们可以通过以下示例发现该错误。
7 o/ O* o" d" s% o1 M& A0 p出错的错误代码:" E# Q- b9 s" s' o! T
bool a=7;$ _, F% U, \( @ B
if (a=5
% X- Z; ^0 A# Y" O6 Ga=5! Q( ~' ^! |' x! }4 F9 S
更正无错误代码:
! ~9 \: G/ ^( g0 Z- \3 A U4 Ubool a=7;
( Q* |! S( q7 E" h& Z/ O) u; ^/ B6 Eif (a=5)! w I$ K! q9 [& z! S1 `
a=5;7 B& Z8 Q4 x6 X5 B# X' a1 B+ D6 U
更正代码后,我们会发现编译时没有错误。
3 `9 \& }( v$ b程序意外结束错误:
/ ^: x# B3 u4 t) W, O* |8 ^有时我们在代码中遗漏了一个右括号,继而发生意外的程序结束错误,我们必须检查我们的代码,查看需要添加的内容,或者我们需要确保每个左括号匹配一个右括号来解决此错误。 下面是该代码的示例。
$ G' C/ Y8 x6 ?; e) w9 }' D$ Q- M出错的错误代码:% H3 \! o! C4 @$ s* A
void OnStart()0 a8 ]1 _: w2 @, X2 r0 N, \% [2 y
{; p. T- f7 L+ B- s X
bool a=7;
, v( R6 ~, c* f+ bif (a=5)
* K' h( k# \( J7 ]5 Q4 Ca=5;# O W. e# ^+ T8 l1 B. ]# N
更正无错误代码:0 M+ G! W S5 N$ ]3 z+ b. z
void OnStart()
5 y( W, N6 }/ ] g8 q" O9 b{& t/ Q% U& x3 [- i4 D
bool a=7;
0 Z, t# u; Z( M) l/ Fif (a=5)' J& W) H- c& D( S
a=5;
; [) X/ \7 K6 U( P/ A9 B}0 `9 w* A' ?' Q |6 w
添加右括号更正代码后,我们会发现代码成功编译没有错误。( }2 x1 ?0 i* ]% ]
表达式不允许出现在全局范围错误:$ T. k9 M8 P% W. J0 j
当我们在复合运算符中缺少左括号时,就会发生该错误,或者当我们在特定函数范围之外编写语句或表达式时,可能会发生该错误,因为我们只能在函数范围内使用表达式。 以下示例示意此类错误。" Z5 q0 S( M! G
出错的错误代码:/ C' G! ` \" w; s
int a=(7+5);
8 U9 r1 P6 D, T: f( I" S/ M" [if (a<7)% C' {+ h8 g& Y* S
a=7;
- Y6 [0 s# p3 U7 T- ]8 X}
2 ^9 B1 b& z0 _. z/ _在前面的代码中,我们遗漏了与(})配对的起始({),故系统报告 “表达式不允许出现在全局范围” 错误。 以下是 “错误” 选项卡中的错误。
3 [7 I5 ^, `" f3 T' w7 }9 R& I更正无错误代码:
- E& S8 b( D8 C t, K% j7 nint a=(7+5);
. j d+ Y' b" b4 D: eif (a<7), l, {& a1 n1 M, Y. r7 Y
{3 v5 B/ K( R6 n8 s& X) Z- P/ g( e6 {
a=7;- J7 V7 Y2 h) w$ e( H: R
}
( v2 n6 |( G! R. Q t0 O更正代码后,与前面的代码模块相同,我们会发现代码编译后没有任何错误。
3 B: v, p- J/ ]错误的参数计数错误:
2 D* m V, s% ]% a8 F% |当我们用到拥有指定参数的特定函数时,若我们未正确指定这些参数,意即或多或少,我们会体验到这种类型的错误代码。 如果我们使用预定义的函数或我们创建的函数,则会出现此错误。 以下是该错误的示例。
! B% H E' W* ~9 a有错误的代码:- B. C1 v6 n* n3 }$ U
如果我们创建了一个 “myVal” 函数,返回两个整数值求和的结果,这意味着该函数中有两个参数? 故此,当我们调用此函数时传递个数的参数时,我们将得到此类错误,其与以下代码相同
6 h0 H5 h/ o& _4 P) \5 Kvoid OnStart() n( S1 j: t! x& u
{1 }5 }1 @, G* M
int example=myVal(10);
/ q* }% R$ |" a* v8 M# @! o( S}3 r" f1 G7 F. j" W7 w
//+------------------------------------------------------------------+
* P3 j7 ?! d5 {9 B+ n3 M: w* C- [- sint myVal(int a, int b), V+ y! `$ `) v: H
{' T$ |/ v, T# O8 c {
return a+b;" Y ]4 f# F/ D W: p# u
}
* ~4 G: v: a1 `/ V o/ J无错误代码:
1 {8 x9 U& ?, t# f) M为了正确编写此代码,我们需要为这个创建的函数传递相应个数的参数,如下所示0 e2 W0 g! |2 I$ R5 e. ]' u
void OnStart()5 |3 j1 P/ e4 ~6 Z1 F9 o0 o& j
{% }+ C/ j& N* c
int example=myVal(10,20);; Y! D" e g" m
}& u# \ A9 Z& x, M9 L/ N
//+------------------------------------------------------------------+
8 l: U" a. t5 G Sint myVal(int a, int b)
2 E a$ d; {4 w5 |6 A( a( g{
) z" L% ?9 V& ]9 B5 R6 ~+ kreturn a+b;$ _2 o! T& q1 D
}
+ k4 R5 w1 ^4 v" c4 m编译此正确代码后,我们不会发现任何错误。
+ e* U" z7 j3 E" M8 `3 v' a6 Q7 `某些操作符预期错误:
3 N6 r+ C X" H8 X U6 x/ S$ J当我们在特定位置完全遗漏或放错操作符时,我们就会遇到这种类型的错误。 以下是该类错误的示例。
, ^, U0 E3 M2 h2 B! z$ A W有错误的代码:% v* f$ A9 C$ L& D4 d" z# |
int a= 7 10; |