概述
1 C5 K6 J( _4 S4 t% ^& T作为 MQL5 程序员或开发人员,我们发现我们需要很好地理解和使用策略测试器,才能获得有效的结果。 通过使用这款颇具价值的工具,我们可以获得有关我们所创建 MQL5 程序的性能的宝贵认知,这对获得更好的交易结果颇具影响。 故此,我们发现在进行测试之前,我们需要充分了解重要的主题,例如处理所有错误类型,因为作为开发人员,我们犯糊涂导致出错是很正常的。 我们还需要深刻理解的另一个主题是调试,它让我们以交互方式执行我们创建的程序。 然后,我们来到最重要和最有价值的工具,即策略测试器,用于测试和评估我们创建的程序,其功能比 MetaTrader 4 版本的更有趣。 因此,在本文中,学习使用 MQL5 策略测试器的最重要方面会是一次了不起的学习之旅
/ F0 Y( Q* U6 s' h; I F错误
9 p# t2 B8 g+ b& V9 l9 ~: j7 `在本主题中,我们将学习在创建、执行和运行 MQL5 程序时可能发现的错误。 理解这个主题的一个要点是,MQL5 会正确报告这些错误,但如果我们不知道这些错误意味着什么,或者在程序的哪个阶段,相较于我们已经知道它们的含义,我们就要花费更多的时间来处理或解决它们。
: Y; b9 Y9 ?6 i, U. p8 d) b5 C" c我们将根据我们在 MQL5 程序上的工作阶段来讲述这个主题,在我们编写代码时,可能会遇到错误和警告,即编译错误和警告。 我们在执行 MQL5 程序时也可能会遇到运行时错误,当我们的 MQL5 程序尝试交易时,我们也可能会遇到其它类型的错误,即交易服务器错误。2 z, D) x- W- y" G! F c% [
左括号不平衡错误:
. E% a9 }2 Y4 y* \& U当我们缺少右括号、或多用了额外的右括号时,就会发生此类错误。 我们可以通过以下示例发现该错误。
6 v% q6 \+ I7 t( k8 a( T出错的错误代码:
; l* r x5 I" ^$ ?" ~bool a=7;3 L2 o$ B' L( B
if (a=5
. | ^0 r- r) r* R& U* \9 Aa=5
" s$ C @. n5 Q4 H# ^ z0 F更正无错误代码:
7 C& t+ V( P# Y' a, V! q$ ^bool a=7;& ^( p! A& Q, e9 {0 V0 m. B# Q+ V% [$ R
if (a=5)* _2 r) T2 S; F: j+ b. P$ D
a=5;8 S7 b# v0 ?- n5 u
更正代码后,我们会发现编译时没有错误。' l8 C6 R' } g* F& N+ z
程序意外结束错误:( U: A1 p3 @: ?' V1 W5 O0 i" Z
有时我们在代码中遗漏了一个右括号,继而发生意外的程序结束错误,我们必须检查我们的代码,查看需要添加的内容,或者我们需要确保每个左括号匹配一个右括号来解决此错误。 下面是该代码的示例。 ~8 Y/ l5 n: i
出错的错误代码:
6 \* T3 C2 t0 kvoid OnStart()
5 N1 j" {$ h# W7 M: K" w+ ?{
& {4 ]' p8 B1 n6 k9 Xbool a=7;" u! D/ ~" \2 K9 i+ ~$ u
if (a=5)
+ i$ l x1 S; C( q4 ta=5;
) D% |+ r* \ O* @; N2 u更正无错误代码:
# l/ @; Z! q1 f5 q$ v3 w( Xvoid OnStart()* |$ d* `3 I5 b
{1 P6 r( S7 ]$ e6 h
bool a=7;
- B; @ V& C5 [- t) h/ c. R. ^if (a=5)
4 t4 K- L: T- {a=5;6 R! d' _' {" M2 P- X4 a
}
1 r% E/ a. |. w8 q0 ?; `添加右括号更正代码后,我们会发现代码成功编译没有错误。
5 B4 o. R9 ?$ s5 h( E/ @# s表达式不允许出现在全局范围错误:
% G3 S( j" h0 }2 A$ y6 U当我们在复合运算符中缺少左括号时,就会发生该错误,或者当我们在特定函数范围之外编写语句或表达式时,可能会发生该错误,因为我们只能在函数范围内使用表达式。 以下示例示意此类错误。" I6 g& q" F0 d4 a
出错的错误代码:
4 A$ ~2 }2 [+ G: n. B3 H7 \int a=(7+5);9 s5 T; b1 \: W" `, I' y
if (a<7)8 f8 a3 L! ~; r) S7 C) k
a=7;
8 e& J" q0 N, J, t/ q/ a}
/ E4 \# d# c2 r$ ~在前面的代码中,我们遗漏了与(})配对的起始({),故系统报告 “表达式不允许出现在全局范围” 错误。 以下是 “错误” 选项卡中的错误。7 ^: X3 I! |$ P& L' r2 m2 ]/ ]) Q0 Y K
更正无错误代码:4 c( R0 { m# C9 ?$ L6 G X5 G
int a=(7+5);4 K/ u; h: M# N$ I7 b
if (a<7)
" @6 r+ C5 D$ Y! P r0 G" @" Q8 }{
/ g, \0 l: ~' {. U' Qa=7;/ ?7 Y- j8 O L5 q9 b, j$ a; D
}4 {% X/ j7 ]+ R- X7 a: a; ^
更正代码后,与前面的代码模块相同,我们会发现代码编译后没有任何错误。
3 Z5 S) h; Q u* p% J( M错误的参数计数错误:% A2 e! c+ n& F( J
当我们用到拥有指定参数的特定函数时,若我们未正确指定这些参数,意即或多或少,我们会体验到这种类型的错误代码。 如果我们使用预定义的函数或我们创建的函数,则会出现此错误。 以下是该错误的示例。
1 v! L; u$ Y0 Q b, [% h有错误的代码:5 }. e- d5 l! w% U7 Q4 ^; c
如果我们创建了一个 “myVal” 函数,返回两个整数值求和的结果,这意味着该函数中有两个参数? 故此,当我们调用此函数时传递个数的参数时,我们将得到此类错误,其与以下代码相同5 N/ T/ l: K/ R2 q7 y- J$ O; r
void OnStart()
1 d4 u, T( n% z{& A/ X8 ~! {3 @ f+ X
int example=myVal(10);3 H( h& ` Z, a# A% p, Z5 J
} o2 n. H) g7 B4 }3 }: t6 M; J
//+------------------------------------------------------------------+, v. ]( f' i; L: n4 C
int myVal(int a, int b)
( G& F$ y. M- u0 {6 I( l @{" z/ m8 O `0 p" K2 a, M' b! X
return a+b;
, t7 }, w1 g& f0 L/ C) o}( p: O5 a: F- B' W" e; Z9 f" |, h
无错误代码:$ o+ ]- e* @7 r; G
为了正确编写此代码,我们需要为这个创建的函数传递相应个数的参数,如下所示' r/ ? V( c5 v3 }' [* C
void OnStart()
1 f# h) s' n2 k{9 C: M$ Z! u9 K5 @5 H: H3 ]
int example=myVal(10,20);
/ j8 t0 H$ c/ p8 x: P}
0 {' g* t, X6 h+ W//+------------------------------------------------------------------+6 ?6 L$ b. \9 `5 z
int myVal(int a, int b)7 _/ c3 r$ ]) Q% i9 _
{
2 {. U) A' K. m/ n0 p" p- qreturn a+b;
9 O# c F F8 p) Z% s0 C. C7 R}
. h: f" H, E! ~编译此正确代码后,我们不会发现任何错误。. ^7 }; g) @4 o7 k, L
某些操作符预期错误:' e. X/ T) ?. M8 @6 q
当我们在特定位置完全遗漏或放错操作符时,我们就会遇到这种类型的错误。 以下是该类错误的示例。2 M5 e# l/ `1 d6 V3 _
有错误的代码:# E8 p4 n' S/ f) J6 e7 F( z5 x' B
int a= 7 10; |