概述
, w1 H# F7 H: _9 Q0 e作为 MQL5 程序员或开发人员,我们发现我们需要很好地理解和使用策略测试器,才能获得有效的结果。 通过使用这款颇具价值的工具,我们可以获得有关我们所创建 MQL5 程序的性能的宝贵认知,这对获得更好的交易结果颇具影响。 故此,我们发现在进行测试之前,我们需要充分了解重要的主题,例如处理所有错误类型,因为作为开发人员,我们犯糊涂导致出错是很正常的。 我们还需要深刻理解的另一个主题是调试,它让我们以交互方式执行我们创建的程序。 然后,我们来到最重要和最有价值的工具,即策略测试器,用于测试和评估我们创建的程序,其功能比 MetaTrader 4 版本的更有趣。 因此,在本文中,学习使用 MQL5 策略测试器的最重要方面会是一次了不起的学习之旅
4 R B, o% c0 T4 P9 M( |错误
8 l) @" F4 n. a5 i9 x在本主题中,我们将学习在创建、执行和运行 MQL5 程序时可能发现的错误。 理解这个主题的一个要点是,MQL5 会正确报告这些错误,但如果我们不知道这些错误意味着什么,或者在程序的哪个阶段,相较于我们已经知道它们的含义,我们就要花费更多的时间来处理或解决它们。
7 j% n" p- W1 q我们将根据我们在 MQL5 程序上的工作阶段来讲述这个主题,在我们编写代码时,可能会遇到错误和警告,即编译错误和警告。 我们在执行 MQL5 程序时也可能会遇到运行时错误,当我们的 MQL5 程序尝试交易时,我们也可能会遇到其它类型的错误,即交易服务器错误。; u3 @* r9 T3 ?0 }1 A6 ?6 N7 n
左括号不平衡错误:
" a6 |9 ^. V# p1 l D: X% s3 S! l当我们缺少右括号、或多用了额外的右括号时,就会发生此类错误。 我们可以通过以下示例发现该错误。8 ]9 g/ p: q2 Q" a W, s* _1 n
出错的错误代码:2 c, D- Z. z; T r1 _) f; g
bool a=7;5 j* U$ {7 H* s! H) I
if (a=5
( R3 o f9 X! n! ]! Ea=5' A5 V" b& }/ u3 V/ P' e/ C" n8 g7 p
更正无错误代码:
, B' h" m f& ebool a=7;$ [$ x6 I9 N: \1 e% o5 p/ [
if (a=5)8 a% H1 u( @9 A6 X4 o) b) s
a=5;
& v) G/ F5 c' x更正代码后,我们会发现编译时没有错误。
( \0 w% X1 Z+ Q+ J) C7 K程序意外结束错误:6 w Z+ m! h# \0 T
有时我们在代码中遗漏了一个右括号,继而发生意外的程序结束错误,我们必须检查我们的代码,查看需要添加的内容,或者我们需要确保每个左括号匹配一个右括号来解决此错误。 下面是该代码的示例。
+ C7 y+ m) A2 v出错的错误代码:
* {* y) L' R8 _6 [2 f% z' y+ Lvoid OnStart()6 m, q: X$ W- E$ n( E
{8 s( N( j! m, ~2 I
bool a=7;
. b, @- T: E! m T {if (a=5)+ q1 E1 B/ Q* B9 M8 q8 s# I
a=5;' F% o- \( J& }% P( O
更正无错误代码:; m" U0 g& O! `! b& ]# f
void OnStart()
: g i: W' i" F9 l" {+ Y! n{: f! c1 k2 R& L- a+ W( I, b
bool a=7;" X0 b9 e9 p+ [4 ]% r8 e
if (a=5)
* }* `2 R9 ?7 [a=5;; O [! y5 b. {
}
2 I" Q6 r2 a7 T5 N9 K$ ~* m6 ]' |添加右括号更正代码后,我们会发现代码成功编译没有错误。6 X- E% O: U8 j( W7 M- a4 I H2 x. X! O
表达式不允许出现在全局范围错误:
" r! ]7 @# j& C/ X, J2 Q; F+ }3 J当我们在复合运算符中缺少左括号时,就会发生该错误,或者当我们在特定函数范围之外编写语句或表达式时,可能会发生该错误,因为我们只能在函数范围内使用表达式。 以下示例示意此类错误。
5 g* H7 B) T- Q出错的错误代码:( U; A* z! L) n" L8 n
int a=(7+5);3 V5 j+ [. d% Y, d( X7 ]3 T8 D
if (a<7)
% ]( F+ |9 D1 Q! R: J$ ~! Ka=7;& e, b" S I; A
}
; F% z9 n# [( B) w: l在前面的代码中,我们遗漏了与(})配对的起始({),故系统报告 “表达式不允许出现在全局范围” 错误。 以下是 “错误” 选项卡中的错误。, \4 V" A$ d; G' j; q
更正无错误代码:- A0 g, K2 c: q0 c+ S; o
int a=(7+5);! ? C2 q( m" C7 ^
if (a<7)
B! T6 Q6 b5 h7 E" b0 L2 m{; H1 C& n& L3 A; f8 G: R4 G- i
a=7;* z6 D/ _2 C- c* g# B0 r- ^* Q% L
}
: G& ~0 I) g6 a更正代码后,与前面的代码模块相同,我们会发现代码编译后没有任何错误。
5 ? L* a O3 L# n0 m2 g+ i错误的参数计数错误:8 m- p: c, O- S- t1 p2 o
当我们用到拥有指定参数的特定函数时,若我们未正确指定这些参数,意即或多或少,我们会体验到这种类型的错误代码。 如果我们使用预定义的函数或我们创建的函数,则会出现此错误。 以下是该错误的示例。
2 ~+ F0 \7 @# F) e* @) E" P" u9 T有错误的代码:
6 C: Z9 v, y4 R4 m/ l3 H% B! y如果我们创建了一个 “myVal” 函数,返回两个整数值求和的结果,这意味着该函数中有两个参数? 故此,当我们调用此函数时传递个数的参数时,我们将得到此类错误,其与以下代码相同( s, m/ ~7 u& X" F
void OnStart(); ~- d3 Y! @7 Q2 p5 C, W8 l
{
8 N6 x: S" }: B+ c+ bint example=myVal(10);
/ X( C9 m C8 z: ]8 Q4 |2 A}
1 k. Q7 V4 M3 v/ y- Y6 h; b" r" Z//+------------------------------------------------------------------+
. |# d$ H* {0 z9 R0 lint myVal(int a, int b)
- p& C" E# Q6 w8 y3 Z; l7 a{- E* m! T+ D7 L, R2 `1 a5 i- K5 ^
return a+b;
' T! I/ t7 s& Z5 I+ o! C, {} @" N) a! }$ T Z# S- v$ [1 M- u6 ~
无错误代码:
4 v) T* |6 `( S- F5 m为了正确编写此代码,我们需要为这个创建的函数传递相应个数的参数,如下所示
% O( m6 K. ]# ~void OnStart()6 L/ y, O; R8 n# b: R8 V. G
{
5 @& {. i1 F, o2 B/ Kint example=myVal(10,20);
( ?& z, p5 [# g7 b. H8 Z}
8 i/ ~+ d B. O4 x8 t) M//+------------------------------------------------------------------+/ p: n4 D; H+ }9 q. ~# M
int myVal(int a, int b)* i( Y6 m, X' @; E( V% R
{* w8 O9 C3 J/ ~" m
return a+b;
9 d& _7 ~( F* \9 T}
7 C# g* I. H. T) a7 f, N编译此正确代码后,我们不会发现任何错误。9 k& k- W. T) N! U0 d; i9 r
某些操作符预期错误:# C3 @5 B/ v% {. P3 e
当我们在特定位置完全遗漏或放错操作符时,我们就会遇到这种类型的错误。 以下是该类错误的示例。
% V% \: u4 k! R有错误的代码:
, j/ [' C% g5 B+ l. y) b9 j2 _int a= 7 10; |