概述) J. x$ B9 }3 d' ]$ o
作为 MQL5 程序员或开发人员,我们发现我们需要很好地理解和使用策略测试器,才能获得有效的结果。 通过使用这款颇具价值的工具,我们可以获得有关我们所创建 MQL5 程序的性能的宝贵认知,这对获得更好的交易结果颇具影响。 故此,我们发现在进行测试之前,我们需要充分了解重要的主题,例如处理所有错误类型,因为作为开发人员,我们犯糊涂导致出错是很正常的。 我们还需要深刻理解的另一个主题是调试,它让我们以交互方式执行我们创建的程序。 然后,我们来到最重要和最有价值的工具,即策略测试器,用于测试和评估我们创建的程序,其功能比 MetaTrader 4 版本的更有趣。 因此,在本文中,学习使用 MQL5 策略测试器的最重要方面会是一次了不起的学习之旅* K. O5 D! v1 i5 d% k, |
错误
% O, }* K" n' e5 \6 @在本主题中,我们将学习在创建、执行和运行 MQL5 程序时可能发现的错误。 理解这个主题的一个要点是,MQL5 会正确报告这些错误,但如果我们不知道这些错误意味着什么,或者在程序的哪个阶段,相较于我们已经知道它们的含义,我们就要花费更多的时间来处理或解决它们。
2 B% o7 T e% p" x: l! ` F我们将根据我们在 MQL5 程序上的工作阶段来讲述这个主题,在我们编写代码时,可能会遇到错误和警告,即编译错误和警告。 我们在执行 MQL5 程序时也可能会遇到运行时错误,当我们的 MQL5 程序尝试交易时,我们也可能会遇到其它类型的错误,即交易服务器错误。4 }5 p3 {# z0 n0 D+ ~
左括号不平衡错误:. Y( U" q* h) j5 e8 j2 x8 g
当我们缺少右括号、或多用了额外的右括号时,就会发生此类错误。 我们可以通过以下示例发现该错误。
5 H' f1 l2 f; i# O+ \出错的错误代码:. \ D4 d8 @, z; q
bool a=7; k: D: A( e4 Z5 ]% Q
if (a=5
6 e- o% ^. k7 }# d& |a=5+ j! `$ K: l! Q: I5 D* ]6 ]
更正无错误代码:1 J2 j/ W7 h3 B8 T3 f0 I! E
bool a=7;
# o6 J3 t2 E- [. e. Q/ Sif (a=5)
+ B- b8 a- r5 a8 E5 _' K) j% A+ Ka=5;3 D9 Y/ @& o7 Z9 b6 Q, o) o
更正代码后,我们会发现编译时没有错误。$ I7 Z: M6 c4 h* U
程序意外结束错误:8 F* b Z; R2 {, p, U4 q5 y
有时我们在代码中遗漏了一个右括号,继而发生意外的程序结束错误,我们必须检查我们的代码,查看需要添加的内容,或者我们需要确保每个左括号匹配一个右括号来解决此错误。 下面是该代码的示例。3 ~& t' {# X3 C/ L! z. u: ]
出错的错误代码:" C) M# e, o8 n7 D0 j6 C2 ^
void OnStart()
8 U5 X% E9 l9 M# L; B{
0 |# w$ q" b# B, P3 L3 r8 `bool a=7;! f' B/ ~ e1 B, B" z% O
if (a=5)) P9 E5 ^1 x' a- b! a( X. }* l
a=5;. D' k( h! ^: P" M C1 t
更正无错误代码:2 U# y2 L; |/ e
void OnStart()* ~( @* D5 f1 X' r% A' m
{
0 B/ m: `& O+ {* G6 A0 U( Ibool a=7;
' r v+ I w2 i3 s% D. pif (a=5)+ Y6 o$ O2 }( P1 T
a=5;2 j+ g: R2 s" d9 c
}
% q( V7 \4 f* o3 N& w. F- j# r添加右括号更正代码后,我们会发现代码成功编译没有错误。& Y( V$ E0 k& @$ `% ]8 _
表达式不允许出现在全局范围错误:( c1 w( B! [2 e
当我们在复合运算符中缺少左括号时,就会发生该错误,或者当我们在特定函数范围之外编写语句或表达式时,可能会发生该错误,因为我们只能在函数范围内使用表达式。 以下示例示意此类错误。
" }- V3 B. P" C9 F1 W; X出错的错误代码:
) {; n1 B+ y; a5 L. D3 _5 f, yint a=(7+5);
# Y, b+ I6 _$ M1 x& T* U: jif (a<7)0 C; C4 Q9 L7 Z/ g- B0 k
a=7;
5 m3 }, `+ A5 r}
7 {) G/ i9 u' c) X在前面的代码中,我们遗漏了与(})配对的起始({),故系统报告 “表达式不允许出现在全局范围” 错误。 以下是 “错误” 选项卡中的错误。
: }1 c7 M7 a/ I5 Y. G更正无错误代码:
4 b; j m- R& ~" N7 bint a=(7+5);
) p+ z' _& e; `$ I' }: Wif (a<7), O& U3 l: n `2 j
{
6 h4 `+ b1 ?7 Z/ W& ~( g( b' Oa=7;7 \4 }1 s5 q5 [3 i
}
6 C( `- a% c1 V8 e% f" L" A更正代码后,与前面的代码模块相同,我们会发现代码编译后没有任何错误。
; c Q8 C8 n- R+ @7 ]( D |6 e错误的参数计数错误:
. S# O" Z5 K. h8 W当我们用到拥有指定参数的特定函数时,若我们未正确指定这些参数,意即或多或少,我们会体验到这种类型的错误代码。 如果我们使用预定义的函数或我们创建的函数,则会出现此错误。 以下是该错误的示例。
9 `3 L+ c8 H9 l! {有错误的代码:$ [ D3 n1 z7 W7 l9 {/ s6 c+ M
如果我们创建了一个 “myVal” 函数,返回两个整数值求和的结果,这意味着该函数中有两个参数? 故此,当我们调用此函数时传递个数的参数时,我们将得到此类错误,其与以下代码相同
. c6 k3 p3 J% J1 o. K4 ~void OnStart()
0 i8 R" G3 q9 x3 r' r6 E$ ^{$ @# z6 Q% [4 g6 @1 ^
int example=myVal(10);) V/ {6 |) K& L
}( ]* s- h7 S: U* L. ^4 D3 Q% F( M
//+------------------------------------------------------------------+
" _& r9 \. q- z) Gint myVal(int a, int b)2 l4 Z' ?) C. C) v8 e- `; _% o2 c
{
& s, G1 D5 i0 |7 E( L, ?$ z+ Hreturn a+b;; x+ r& c* {) b7 V
}' h+ ]( {% o. {( l& L) B
无错误代码:
3 c3 t& N: _- v6 B) ~6 ]为了正确编写此代码,我们需要为这个创建的函数传递相应个数的参数,如下所示: o) T2 m! D& H# b0 s$ d- Y
void OnStart()$ I: b, c+ {8 ~
{- V o9 b2 b" N ~6 l
int example=myVal(10,20);
8 T8 {2 R9 U. r6 s+ }& n1 F' g1 j}5 `3 J R7 [5 f( |! J, t2 ]
//+------------------------------------------------------------------+
1 l6 U! [# Z9 Y6 c1 X$ Z" ^int myVal(int a, int b)' p* _$ k' Q |! E$ u
{
! l) B* b# ?5 }2 yreturn a+b;& }7 ?! ?& A' m+ F8 U! N% ^5 ?- g
}1 u, u' f( Y/ d6 I" T$ I0 U
编译此正确代码后,我们不会发现任何错误。
. ^4 w% Q$ J" @) v5 L0 Y6 p某些操作符预期错误:$ j2 W v8 K" v- q! b
当我们在特定位置完全遗漏或放错操作符时,我们就会遇到这种类型的错误。 以下是该类错误的示例。/ Y# b5 [, h4 z! z
有错误的代码:
$ C, ?0 g8 A' s/ ]+ {int a= 7 10; |