概述
) f1 O2 c, Y" D5 k8 Q# I1 J作为 MQL5 程序员或开发人员,我们发现我们需要很好地理解和使用策略测试器,才能获得有效的结果。 通过使用这款颇具价值的工具,我们可以获得有关我们所创建 MQL5 程序的性能的宝贵认知,这对获得更好的交易结果颇具影响。 故此,我们发现在进行测试之前,我们需要充分了解重要的主题,例如处理所有错误类型,因为作为开发人员,我们犯糊涂导致出错是很正常的。 我们还需要深刻理解的另一个主题是调试,它让我们以交互方式执行我们创建的程序。 然后,我们来到最重要和最有价值的工具,即策略测试器,用于测试和评估我们创建的程序,其功能比 MetaTrader 4 版本的更有趣。 因此,在本文中,学习使用 MQL5 策略测试器的最重要方面会是一次了不起的学习之旅* V: n. b4 E* c) ?5 {2 |7 v
错误
3 P+ g8 d- C+ D* W! |4 M# j& g在本主题中,我们将学习在创建、执行和运行 MQL5 程序时可能发现的错误。 理解这个主题的一个要点是,MQL5 会正确报告这些错误,但如果我们不知道这些错误意味着什么,或者在程序的哪个阶段,相较于我们已经知道它们的含义,我们就要花费更多的时间来处理或解决它们。" N) T: T! C! v0 Y" U) K
我们将根据我们在 MQL5 程序上的工作阶段来讲述这个主题,在我们编写代码时,可能会遇到错误和警告,即编译错误和警告。 我们在执行 MQL5 程序时也可能会遇到运行时错误,当我们的 MQL5 程序尝试交易时,我们也可能会遇到其它类型的错误,即交易服务器错误。
3 z* f" p! e2 r* y* p4 [" T左括号不平衡错误:
) D5 n, f% R, S" |. v( e当我们缺少右括号、或多用了额外的右括号时,就会发生此类错误。 我们可以通过以下示例发现该错误。
+ Z" ]& f0 L4 g/ A0 ?出错的错误代码:
$ T) m' T2 F' P+ ybool a=7;
) D3 L. V2 I$ l( ^6 M; Fif (a=5
+ ^$ h. h2 q4 P x3 g/ i! C) |$ }( pa=5
- }' c& z/ s6 H7 s0 Z8 b! \更正无错误代码:9 J2 e9 j0 o$ Q" S, Y' `5 z8 @
bool a=7;' Z% J5 O7 P7 ~
if (a=5)$ W7 `2 L* W b9 O3 w5 ^
a=5;; m6 @! H* `/ a1 N# i1 i2 |$ u
更正代码后,我们会发现编译时没有错误。5 z5 r, S% F) Z0 t
程序意外结束错误:
6 T8 q4 u; O, b8 V( [, g有时我们在代码中遗漏了一个右括号,继而发生意外的程序结束错误,我们必须检查我们的代码,查看需要添加的内容,或者我们需要确保每个左括号匹配一个右括号来解决此错误。 下面是该代码的示例。+ O4 ^$ c R6 y
出错的错误代码:
i$ r2 T Q; ?& E$ w( |4 wvoid OnStart(): [3 Q# @) \8 a" I
{
5 Y) b: c# f. z6 E3 ~/ y" Kbool a=7;
/ N3 w! {+ I6 Y6 m' I7 P8 B' E7 \if (a=5)' u9 c3 h% u$ [4 Y- K1 z5 ^
a=5;- M& ?: k8 v2 s* {, L' S! M5 ?0 c& P
更正无错误代码:6 x' j6 I+ @ S' G+ t( x' L
void OnStart()4 j& z) A5 \( R7 v U
{
. q& N) ?% t9 J2 S, z! N8 E% d- u" Q* nbool a=7;
% R( w7 B7 L4 h, d# }, ^ vif (a=5)
$ T+ i/ A$ Y( W9 e' Y" v- q% Ja=5;. p0 ?% X) p# H! p7 {6 w. M7 t
}
( a- r% m8 G6 g7 z" R添加右括号更正代码后,我们会发现代码成功编译没有错误。( b; g; D0 X ^3 q! p
表达式不允许出现在全局范围错误:
- d2 G1 U; H4 W当我们在复合运算符中缺少左括号时,就会发生该错误,或者当我们在特定函数范围之外编写语句或表达式时,可能会发生该错误,因为我们只能在函数范围内使用表达式。 以下示例示意此类错误。
! \; z1 B1 P& Z C出错的错误代码:
5 O! \8 s3 T# O$ L1 vint a=(7+5);
3 x& i6 E- {* T: {if (a<7)
& a( O6 R, [: A5 t) v6 ua=7;
- L$ [9 C9 a: T" V4 M}9 N9 H+ o, o2 k9 W
在前面的代码中,我们遗漏了与(})配对的起始({),故系统报告 “表达式不允许出现在全局范围” 错误。 以下是 “错误” 选项卡中的错误。
9 r' M! z, E0 T' z更正无错误代码:
8 X6 t6 C3 V* L) G W% I) Lint a=(7+5);
3 D3 y' p. Q. d- Lif (a<7)
~) {# i4 V+ ^% ]0 c: k/ G{7 Y! |' s4 [$ k! L0 V
a=7;# J0 F( j7 T7 f
}
& r" ~" }; M) J6 j; F0 L5 Y) K更正代码后,与前面的代码模块相同,我们会发现代码编译后没有任何错误。
, L& s, h% [8 b3 g错误的参数计数错误:
2 R i' m3 @' v4 E4 g. i9 j当我们用到拥有指定参数的特定函数时,若我们未正确指定这些参数,意即或多或少,我们会体验到这种类型的错误代码。 如果我们使用预定义的函数或我们创建的函数,则会出现此错误。 以下是该错误的示例。1 p% W* y& ?7 ~) ]9 m L
有错误的代码:, A% P. S# F# v8 B1 o+ _ u
如果我们创建了一个 “myVal” 函数,返回两个整数值求和的结果,这意味着该函数中有两个参数? 故此,当我们调用此函数时传递个数的参数时,我们将得到此类错误,其与以下代码相同$ D6 |5 o3 {( F7 _2 }
void OnStart(), U' C4 w9 H8 Q8 i
{: x5 ~+ g" ^. z( q9 q& R% {
int example=myVal(10);
( m" d, B! A( W" u+ D$ `5 K9 K( b}+ y. _% B0 y! @1 C4 x# ]7 J& \
//+------------------------------------------------------------------+ v/ x( {. r! A3 |- O1 V Y
int myVal(int a, int b)
) N5 h* |6 Y; F* ]{
, [& q4 Y+ M0 f3 treturn a+b;
; D" a3 G0 p- o! y! N}
& m* k4 e3 s+ K: F. U6 R$ ^+ E无错误代码:
3 I9 P3 O, y' Y/ d为了正确编写此代码,我们需要为这个创建的函数传递相应个数的参数,如下所示
# t- J! ^8 ?# D$ U( i% ]) uvoid OnStart()1 ~0 k2 Z; @; A
{ g: E) q! r& X6 ^5 b& t
int example=myVal(10,20);
. J! [% l% J5 J: D( |. M}
, h0 M1 P* f! G, t: ^7 |//+------------------------------------------------------------------+" `+ e B) R9 }! s! z2 S0 r
int myVal(int a, int b)
. W& C! K2 K0 m6 D3 F6 O& }{
6 o. R0 K9 z, d9 ]& sreturn a+b;1 p6 `6 `4 {% h+ d% H
}' H G0 f# p/ u- _6 B( S6 L+ T _1 d
编译此正确代码后,我们不会发现任何错误。
0 r/ }5 x& }) W8 b K: Y某些操作符预期错误:
$ m0 L1 g8 O( Y1 t当我们在特定位置完全遗漏或放错操作符时,我们就会遇到这种类型的错误。 以下是该类错误的示例。
4 ]8 d, I. j- N有错误的代码:
) y0 m4 F9 _; u7 y( b" p1 Fint a= 7 10; |