概述& b q" D: D/ e
作为 MQL5 程序员或开发人员,我们发现我们需要很好地理解和使用策略测试器,才能获得有效的结果。 通过使用这款颇具价值的工具,我们可以获得有关我们所创建 MQL5 程序的性能的宝贵认知,这对获得更好的交易结果颇具影响。 故此,我们发现在进行测试之前,我们需要充分了解重要的主题,例如处理所有错误类型,因为作为开发人员,我们犯糊涂导致出错是很正常的。 我们还需要深刻理解的另一个主题是调试,它让我们以交互方式执行我们创建的程序。 然后,我们来到最重要和最有价值的工具,即策略测试器,用于测试和评估我们创建的程序,其功能比 MetaTrader 4 版本的更有趣。 因此,在本文中,学习使用 MQL5 策略测试器的最重要方面会是一次了不起的学习之旅6 v5 e) n( q5 h* e2 N; }
错误4 D7 C: x* k2 I+ ^+ J! @
在本主题中,我们将学习在创建、执行和运行 MQL5 程序时可能发现的错误。 理解这个主题的一个要点是,MQL5 会正确报告这些错误,但如果我们不知道这些错误意味着什么,或者在程序的哪个阶段,相较于我们已经知道它们的含义,我们就要花费更多的时间来处理或解决它们。. f; V, m' w) c! ^8 a( u& c( X
我们将根据我们在 MQL5 程序上的工作阶段来讲述这个主题,在我们编写代码时,可能会遇到错误和警告,即编译错误和警告。 我们在执行 MQL5 程序时也可能会遇到运行时错误,当我们的 MQL5 程序尝试交易时,我们也可能会遇到其它类型的错误,即交易服务器错误。
8 U9 D3 M$ ?5 U5 n左括号不平衡错误:& T- `% c* e: t9 T& \5 J
当我们缺少右括号、或多用了额外的右括号时,就会发生此类错误。 我们可以通过以下示例发现该错误。0 W, n/ P- |6 `
出错的错误代码:
6 G$ J5 E1 z7 C1 P. _bool a=7;+ u+ f7 n: \! b& G) Y9 |/ S
if (a=5
& K' ]9 P/ U$ `/ ] na=5
) ]# J) G- q- d" K' l更正无错误代码:
# v+ Q# y4 a! g C0 ybool a=7;& @3 Q; S8 q! y% T0 A
if (a=5)
& {* ?# t i, Q6 M2 R3 N; ra=5;+ `" H, J7 p" \& p
更正代码后,我们会发现编译时没有错误。1 \# b! R, d/ j7 n& m
程序意外结束错误:
" U' C% H+ J7 ]; M5 Y- x1 r有时我们在代码中遗漏了一个右括号,继而发生意外的程序结束错误,我们必须检查我们的代码,查看需要添加的内容,或者我们需要确保每个左括号匹配一个右括号来解决此错误。 下面是该代码的示例。
. k1 d5 u3 N2 L, d. k% c7 U出错的错误代码:
: ]. v! ?, w+ z2 A8 lvoid OnStart(); o1 K7 Z+ |; v- b7 L3 Y1 d
{
( N; g& q4 I1 w, b' Pbool a=7;
' v9 p# I% W3 Q, Nif (a=5)
2 {( ?$ y# d7 |3 |- W" |( @* ba=5;4 S' w1 Z+ E, g8 j. J
更正无错误代码:6 u) m& U. G5 [. I& `6 U. p
void OnStart()" @ \; \, h( V8 ?* S, }4 ~" F
{9 J* y0 q0 ]' ^, w' s+ M! n( k
bool a=7;
! X( Z* p2 ^& j2 Lif (a=5)7 c5 ]0 \) Z- H" j1 r. v7 X
a=5;
' D- e2 f2 m( ~2 X' v}
1 U& o0 u) g0 a) k( s0 G添加右括号更正代码后,我们会发现代码成功编译没有错误。9 A- n0 g' c* K
表达式不允许出现在全局范围错误:! m" p: \! ^% J
当我们在复合运算符中缺少左括号时,就会发生该错误,或者当我们在特定函数范围之外编写语句或表达式时,可能会发生该错误,因为我们只能在函数范围内使用表达式。 以下示例示意此类错误。
* z; { t/ K) A$ O7 u+ R- m出错的错误代码:* q% R4 s) f: ?/ q
int a=(7+5);
7 ?% X6 u( W% g! _$ Gif (a<7)
7 ~4 |) o0 v9 O8 ?* Ma=7;
3 Y, ?8 }% ?5 Q4 A}" ^. Q& c5 J/ r- c$ k* R
在前面的代码中,我们遗漏了与(})配对的起始({),故系统报告 “表达式不允许出现在全局范围” 错误。 以下是 “错误” 选项卡中的错误。
1 |( V5 \- ]/ w" Y& v7 H I% }6 p( |更正无错误代码:
+ S8 O u$ F$ f. P% r& @& mint a=(7+5);
4 ^0 a8 U! L6 h$ S4 o& qif (a<7)
! Q0 @' ~0 o, [$ ^" A w) z2 d{+ b& h! }: O7 j: w
a=7;
$ ]- c9 A: X1 r* { W. n/ p# m}
8 E4 W& }: B, W M更正代码后,与前面的代码模块相同,我们会发现代码编译后没有任何错误。
A& i: V9 s+ \) J7 T! `5 q错误的参数计数错误:
0 l3 ]4 n( q0 m0 ] H& ~5 F. H7 h8 r当我们用到拥有指定参数的特定函数时,若我们未正确指定这些参数,意即或多或少,我们会体验到这种类型的错误代码。 如果我们使用预定义的函数或我们创建的函数,则会出现此错误。 以下是该错误的示例。8 O- X) ~2 y' X8 G# y X
有错误的代码:+ }4 b; _. l' @
如果我们创建了一个 “myVal” 函数,返回两个整数值求和的结果,这意味着该函数中有两个参数? 故此,当我们调用此函数时传递个数的参数时,我们将得到此类错误,其与以下代码相同+ d, [9 \4 r b7 b0 l, x
void OnStart()5 R3 |# f# ]8 s8 f
{
& i, A2 D* D; }7 N6 wint example=myVal(10);2 Q$ I0 B/ A( f, X7 L7 Z
}; E& w+ Q5 I* _% r, P! z U( y
//+------------------------------------------------------------------+! |, k# O, P3 a0 L( c$ d
int myVal(int a, int b)
+ R! _% i; N/ z0 o8 {; I{
! S6 W9 m1 h$ ` z$ t2 L7 ]5 Kreturn a+b;& K" u6 M; o2 { C8 @
}6 X9 P- r$ r4 A% W, }! H
无错误代码: X; D/ G' y% |
为了正确编写此代码,我们需要为这个创建的函数传递相应个数的参数,如下所示
: N7 o- v: K- i0 I7 V, f3 U2 c$ cvoid OnStart()# @) M) z, k' [. e d
{
. J9 ~) H9 {# k: \+ Jint example=myVal(10,20);' Q9 u- b R: k- {) }. e, C3 c0 V. ]
}. Q* y, X; B+ W! l5 q/ A
//+------------------------------------------------------------------+
3 Z9 H+ B& e0 \8 S* M) Zint myVal(int a, int b)" p2 i9 K4 A* @ Q* N: S. [% g
{. }9 M2 a( F) ], Y
return a+b;
+ U1 l+ P0 _6 g+ X5 |}
( j# |/ E3 z6 v# q编译此正确代码后,我们不会发现任何错误。
! {, p* }! @; p+ d, u某些操作符预期错误:
2 X4 ~# B/ s$ K# q* M+ a当我们在特定位置完全遗漏或放错操作符时,我们就会遇到这种类型的错误。 以下是该类错误的示例。
; L9 x& W- `4 h; h! r有错误的代码:* S+ K$ h3 L5 D3 J3 ?$ U
int a= 7 10; |