概述, _. r, T" ?7 q) F2 a8 u1 I) B, ^
作为 MQL5 程序员或开发人员,我们发现我们需要很好地理解和使用策略测试器,才能获得有效的结果。 通过使用这款颇具价值的工具,我们可以获得有关我们所创建 MQL5 程序的性能的宝贵认知,这对获得更好的交易结果颇具影响。 故此,我们发现在进行测试之前,我们需要充分了解重要的主题,例如处理所有错误类型,因为作为开发人员,我们犯糊涂导致出错是很正常的。 我们还需要深刻理解的另一个主题是调试,它让我们以交互方式执行我们创建的程序。 然后,我们来到最重要和最有价值的工具,即策略测试器,用于测试和评估我们创建的程序,其功能比 MetaTrader 4 版本的更有趣。 因此,在本文中,学习使用 MQL5 策略测试器的最重要方面会是一次了不起的学习之旅
. {. Q+ i8 j s0 N& d错误* _$ a+ _: P' ^. F* E. b0 W
在本主题中,我们将学习在创建、执行和运行 MQL5 程序时可能发现的错误。 理解这个主题的一个要点是,MQL5 会正确报告这些错误,但如果我们不知道这些错误意味着什么,或者在程序的哪个阶段,相较于我们已经知道它们的含义,我们就要花费更多的时间来处理或解决它们。
& s9 ]' h/ v. ?) h我们将根据我们在 MQL5 程序上的工作阶段来讲述这个主题,在我们编写代码时,可能会遇到错误和警告,即编译错误和警告。 我们在执行 MQL5 程序时也可能会遇到运行时错误,当我们的 MQL5 程序尝试交易时,我们也可能会遇到其它类型的错误,即交易服务器错误。
# A4 w8 Q; C4 g+ r左括号不平衡错误:2 f E+ C- }3 z5 g. y5 G* O1 X: P
当我们缺少右括号、或多用了额外的右括号时,就会发生此类错误。 我们可以通过以下示例发现该错误。* G& l* L+ S4 r: ]. V4 f4 [+ C
出错的错误代码:, j2 U$ ?! o6 [. [8 d
bool a=7;3 ?; R# V( Z! b. U
if (a=5
6 t$ u2 a7 ]: O1 c/ H" Va=5
. i1 l5 b1 t+ i7 v' U5 i更正无错误代码:9 c5 s% R/ E F) W7 J. q: t9 ]
bool a=7;7 H5 f! g8 R2 }7 a7 a
if (a=5)3 C. z" ], Y( r3 Z3 S3 V
a=5;
3 D: ]% c$ k% ^3 r3 w. i更正代码后,我们会发现编译时没有错误。
5 h) l5 V. M$ k+ G程序意外结束错误:
- {1 c& `1 T Z+ k1 c- m2 u6 _有时我们在代码中遗漏了一个右括号,继而发生意外的程序结束错误,我们必须检查我们的代码,查看需要添加的内容,或者我们需要确保每个左括号匹配一个右括号来解决此错误。 下面是该代码的示例。
: o0 E7 n4 s% B0 h出错的错误代码:. e" O7 t/ s% S
void OnStart()
% r: j* `7 j! `- S3 x6 S5 l{7 @, V: l, U% }2 J! R
bool a=7;% J9 g% z# h n3 R0 q q' X
if (a=5)3 Z0 C y5 V u, O, _8 R: M
a=5;; }; m0 k4 E( W7 L A
更正无错误代码:/ U6 K2 e9 w7 T( e& v3 z
void OnStart()
e1 Y( ?8 E5 t6 A8 l, \7 i{; \- g* W) S8 D3 {- b9 Q2 C
bool a=7;
( o+ D( _, Q; Y7 g0 Yif (a=5)
% p2 H( }8 H; Y2 R, m0 y! pa=5;
) J: Y, E! ]% {! `* r) f, P0 A}* F8 f5 Z. ^/ {% h2 {
添加右括号更正代码后,我们会发现代码成功编译没有错误。
) j: g, }# O$ V7 b @. t表达式不允许出现在全局范围错误:
+ d W/ q0 S7 t' ?, w) }当我们在复合运算符中缺少左括号时,就会发生该错误,或者当我们在特定函数范围之外编写语句或表达式时,可能会发生该错误,因为我们只能在函数范围内使用表达式。 以下示例示意此类错误。 a9 R1 o$ i U r- e
出错的错误代码:" c' y) p7 t Q; ^0 c) e' ^3 y
int a=(7+5);
& z( g* e7 } t7 Cif (a<7)
' L2 L5 Y6 L. c3 Na=7;6 A$ U( a$ y Y
}
, `; D1 u1 V, K9 i7 b! z3 O+ R: t在前面的代码中,我们遗漏了与(})配对的起始({),故系统报告 “表达式不允许出现在全局范围” 错误。 以下是 “错误” 选项卡中的错误。
# E! R# D0 c3 h8 D7 c更正无错误代码:
: [$ e- ^( Y6 u7 i' U" r* wint a=(7+5);! N' |+ y3 p. U% ~
if (a<7)# h* G7 g& S7 a! f
{
8 G- i& z1 o1 P: Q( p% d% e3 la=7;/ ]6 F- x; A; l+ Q3 U2 d: k
}# v" h0 b$ o/ t l# X7 L
更正代码后,与前面的代码模块相同,我们会发现代码编译后没有任何错误。
R2 e* c- r2 D4 v, `. B/ \8 s错误的参数计数错误:% {9 g" Y4 V9 @* k) {9 r; B5 x
当我们用到拥有指定参数的特定函数时,若我们未正确指定这些参数,意即或多或少,我们会体验到这种类型的错误代码。 如果我们使用预定义的函数或我们创建的函数,则会出现此错误。 以下是该错误的示例。5 v6 J' U4 S6 d+ @
有错误的代码:
# Q) M& `7 V% e! g# m如果我们创建了一个 “myVal” 函数,返回两个整数值求和的结果,这意味着该函数中有两个参数? 故此,当我们调用此函数时传递个数的参数时,我们将得到此类错误,其与以下代码相同 [$ B' n2 s. p( T* N, e ^
void OnStart()) O% ~8 l, w, }" \
{
4 [3 J2 |9 Q1 N6 W6 F* b& N7 dint example=myVal(10);
2 H& u S: g' B" h7 z}7 s3 A( b2 U9 ~7 M% E) @
//+------------------------------------------------------------------+
" h1 @6 Z0 e/ I* N" |5 kint myVal(int a, int b)
' \: j. w* g% u# k2 ^{6 z+ G/ Z5 W8 S% S: W; p
return a+b;
# ~& @3 ^ i/ U* e3 c6 w} K K8 W4 G' |. H( t' @
无错误代码:
+ s2 _% f3 f" `3 s' |; [- r1 V7 m为了正确编写此代码,我们需要为这个创建的函数传递相应个数的参数,如下所示 y# p9 }$ ~# S( b' _
void OnStart()
. ^+ z" \; R) N/ L( h) e{) x3 P9 A% D9 y9 x/ k1 G. y( |
int example=myVal(10,20);5 r/ G7 Z; ]# o! i5 [) Z1 G
}/ E) d4 @/ t( D
//+------------------------------------------------------------------+
3 {# ]. U' s/ l: l4 @# aint myVal(int a, int b)8 `! H7 X. ^+ F( L: x* W& h3 d7 o) F
{% i; _. A& ~- m
return a+b;
O3 ^% l: e% V# w}, ~* B, A8 |. c- b
编译此正确代码后,我们不会发现任何错误。
3 h0 n u7 g$ z5 n某些操作符预期错误:
2 Z* z$ V) o3 m当我们在特定位置完全遗漏或放错操作符时,我们就会遇到这种类型的错误。 以下是该类错误的示例。
! ^& ^5 n0 y5 t3 J$ N$ E有错误的代码:! L3 c. @7 L7 e7 z! s
int a= 7 10; |