概述
& B; s* o, H$ e3 A! \作为 MQL5 程序员或开发人员,我们发现我们需要很好地理解和使用策略测试器,才能获得有效的结果。 通过使用这款颇具价值的工具,我们可以获得有关我们所创建 MQL5 程序的性能的宝贵认知,这对获得更好的交易结果颇具影响。 故此,我们发现在进行测试之前,我们需要充分了解重要的主题,例如处理所有错误类型,因为作为开发人员,我们犯糊涂导致出错是很正常的。 我们还需要深刻理解的另一个主题是调试,它让我们以交互方式执行我们创建的程序。 然后,我们来到最重要和最有价值的工具,即策略测试器,用于测试和评估我们创建的程序,其功能比 MetaTrader 4 版本的更有趣。 因此,在本文中,学习使用 MQL5 策略测试器的最重要方面会是一次了不起的学习之旅# x, k8 ~- Q3 Z) F' v, f, E
错误2 r/ N& v( C8 p) h* a6 A
在本主题中,我们将学习在创建、执行和运行 MQL5 程序时可能发现的错误。 理解这个主题的一个要点是,MQL5 会正确报告这些错误,但如果我们不知道这些错误意味着什么,或者在程序的哪个阶段,相较于我们已经知道它们的含义,我们就要花费更多的时间来处理或解决它们。
$ v1 w3 X- v# P4 L我们将根据我们在 MQL5 程序上的工作阶段来讲述这个主题,在我们编写代码时,可能会遇到错误和警告,即编译错误和警告。 我们在执行 MQL5 程序时也可能会遇到运行时错误,当我们的 MQL5 程序尝试交易时,我们也可能会遇到其它类型的错误,即交易服务器错误。
5 C0 R2 Q/ o# M! Z3 b) F' ]) ^1 s1 X) x左括号不平衡错误:
. ?8 N# ~( z6 @# _当我们缺少右括号、或多用了额外的右括号时,就会发生此类错误。 我们可以通过以下示例发现该错误。
! \) v H) ~# E2 [: h出错的错误代码:
! B# S3 \7 k J0 ^' Y$ ?; Q" Rbool a=7;! z0 ~! a% s/ |# e k
if (a=5
/ L2 P( q2 Q8 j, Ta=54 @/ o! O8 e Y, r8 r$ Q
更正无错误代码:
0 O" j1 N6 \% l `- m, X* f+ Y' Nbool a=7;
) S, o4 F t. E X) M4 Sif (a=5)
( l% }, a. V7 v' E2 K6 u0 }3 za=5;
# g) ^! {* z9 l. I/ H1 Q更正代码后,我们会发现编译时没有错误。5 h! Z4 m0 H( m
程序意外结束错误:& j# |; U$ e \8 U$ C; L, F! f1 M$ R
有时我们在代码中遗漏了一个右括号,继而发生意外的程序结束错误,我们必须检查我们的代码,查看需要添加的内容,或者我们需要确保每个左括号匹配一个右括号来解决此错误。 下面是该代码的示例。
" U& l+ c; _' w% T$ }出错的错误代码:; h: G! K `$ q+ V7 m, |; ]6 C
void OnStart()3 Q1 X d% }" p- y, c8 ~8 e# r, _
{) G7 H4 C( N+ u3 [2 t
bool a=7;
: J( S; n/ P t! m) i* @if (a=5)3 c2 \. z- H8 j5 J" @7 o
a=5;
- k# p$ X0 M; Z5 }- n更正无错误代码:' R7 f/ T, l+ J X) H( G! h
void OnStart(): i" g' Z1 O2 A# s! w- A/ \
{" U+ Q; u4 M4 f0 N
bool a=7;1 u/ v9 m# V) k* h" R
if (a=5)
+ q; F6 t: p F- |6 t+ d" Qa=5;
% q6 k: n3 ~& Y$ p}
$ Q( A' x5 {7 W6 }添加右括号更正代码后,我们会发现代码成功编译没有错误。
: q" Y2 W7 C9 r& w% J" `% u2 a表达式不允许出现在全局范围错误:
" @9 h$ b% b, B" I7 j+ k; r4 a当我们在复合运算符中缺少左括号时,就会发生该错误,或者当我们在特定函数范围之外编写语句或表达式时,可能会发生该错误,因为我们只能在函数范围内使用表达式。 以下示例示意此类错误。/ |$ e* n( [8 \( P
出错的错误代码:
& L6 r: t) @( ^' D3 Z( X1 T6 Hint a=(7+5);
) x3 D7 R0 z( k# v3 a/ h! b7 @ d" P6 bif (a<7)
# D- r0 q! s- wa=7;
2 t; W8 |7 l( n) c0 ~3 C8 C. R}8 w1 Y. b1 ?# V
在前面的代码中,我们遗漏了与(})配对的起始({),故系统报告 “表达式不允许出现在全局范围” 错误。 以下是 “错误” 选项卡中的错误。' p( {3 ?; Y9 r5 x
更正无错误代码:
7 |, z: J) U. ]1 O6 Y# Gint a=(7+5);2 o; J) B" i6 t5 L
if (a<7)0 d3 i/ ^, k3 @4 \9 K% H) ]% C
{5 l6 F9 [. G/ I1 x
a=7;
8 V) m8 I' o& w' U3 P" m6 P}: ^' O. l+ G' r. _! Q' D5 u
更正代码后,与前面的代码模块相同,我们会发现代码编译后没有任何错误。8 b6 p0 V! N1 E$ [9 q5 U
错误的参数计数错误:
/ _! W) w( E$ F当我们用到拥有指定参数的特定函数时,若我们未正确指定这些参数,意即或多或少,我们会体验到这种类型的错误代码。 如果我们使用预定义的函数或我们创建的函数,则会出现此错误。 以下是该错误的示例。4 H- G' y0 T8 b9 `$ S3 z7 Q: G, N
有错误的代码:
9 X y& W* V; K- O: C( n4 d如果我们创建了一个 “myVal” 函数,返回两个整数值求和的结果,这意味着该函数中有两个参数? 故此,当我们调用此函数时传递个数的参数时,我们将得到此类错误,其与以下代码相同$ X- ^. o$ k/ d& K. _
void OnStart()
: E1 u0 }8 b. ] K{# Z6 l* \8 j$ X9 |$ S* K4 T
int example=myVal(10);5 @6 p/ d2 a) V4 K# b8 r! D/ f! [
}
6 B5 e# D1 z: Q! C$ n. D//+------------------------------------------------------------------+
4 _! Q6 ^6 B* Q/ `0 M8 Lint myVal(int a, int b)
5 H% b8 C4 q* J' ~& ]9 _) d$ Y' ]{
& |8 Z' i# S% Y# X( g6 z. Ireturn a+b; q& U" V2 O& x
}" C$ v; K( P: q! r
无错误代码:% e( y% U7 o$ f7 W2 `
为了正确编写此代码,我们需要为这个创建的函数传递相应个数的参数,如下所示( V9 {+ n) W% E* D/ l: k0 T7 V
void OnStart()+ G! W7 v1 E: F1 \" ]
{
F j! I6 E( b. J! o- t3 k6 yint example=myVal(10,20);
1 y8 m, Q& v, R: j! s) e: m}. g3 }0 B+ u6 d( e; `- J
//+------------------------------------------------------------------+5 C6 o" ]: @0 S' t, B! Y
int myVal(int a, int b)
$ O3 u" P! B% X+ S( X2 ~- f{- L9 q& o2 T) k7 h$ K6 K: W; D
return a+b;/ C& z, h- M [5 q& L4 s" u# J
}
# K$ \# G" D2 g编译此正确代码后,我们不会发现任何错误。
, i+ K8 N* d* [% n* S某些操作符预期错误:$ E/ i d7 R7 ^3 s$ j2 |7 {
当我们在特定位置完全遗漏或放错操作符时,我们就会遇到这种类型的错误。 以下是该类错误的示例。
8 M2 ~9 o! r! D0 a$ M% A8 m有错误的代码:3 ~: a+ T3 m1 h, r# d
int a= 7 10; |