概述: G2 r/ C+ q d# t: i$ ]( i
作为 MQL5 程序员或开发人员,我们发现我们需要很好地理解和使用策略测试器,才能获得有效的结果。 通过使用这款颇具价值的工具,我们可以获得有关我们所创建 MQL5 程序的性能的宝贵认知,这对获得更好的交易结果颇具影响。 故此,我们发现在进行测试之前,我们需要充分了解重要的主题,例如处理所有错误类型,因为作为开发人员,我们犯糊涂导致出错是很正常的。 我们还需要深刻理解的另一个主题是调试,它让我们以交互方式执行我们创建的程序。 然后,我们来到最重要和最有价值的工具,即策略测试器,用于测试和评估我们创建的程序,其功能比 MetaTrader 4 版本的更有趣。 因此,在本文中,学习使用 MQL5 策略测试器的最重要方面会是一次了不起的学习之旅; Z6 k' F2 x- `2 n
错误* Z6 {% {* B" k3 o% b
在本主题中,我们将学习在创建、执行和运行 MQL5 程序时可能发现的错误。 理解这个主题的一个要点是,MQL5 会正确报告这些错误,但如果我们不知道这些错误意味着什么,或者在程序的哪个阶段,相较于我们已经知道它们的含义,我们就要花费更多的时间来处理或解决它们。! l: A- q9 t8 h2 ~' } x' k3 v
我们将根据我们在 MQL5 程序上的工作阶段来讲述这个主题,在我们编写代码时,可能会遇到错误和警告,即编译错误和警告。 我们在执行 MQL5 程序时也可能会遇到运行时错误,当我们的 MQL5 程序尝试交易时,我们也可能会遇到其它类型的错误,即交易服务器错误。
1 a$ d/ k+ Q- \% X6 |8 O6 l左括号不平衡错误:
3 Z$ r2 A( K* c( U# E# ]当我们缺少右括号、或多用了额外的右括号时,就会发生此类错误。 我们可以通过以下示例发现该错误。: K/ s+ E' r6 [ j( @
出错的错误代码:
/ U8 l8 d/ M) W" Z0 O- cbool a=7;; ~& |6 X. t9 e; s. z) G% {
if (a=5
4 q- ]% w+ R n5 G$ b) f q Ha=54 h5 X: i/ x) d! v; D
更正无错误代码:
/ r' I) h- Q% X" X% q6 I( Tbool a=7;
1 W8 A/ r' u7 _* Y7 e5 c/ d% sif (a=5)
" \4 z5 r/ H6 m% v9 a. h/ T; y, @a=5;
- T/ D, u; Q; y3 G% {9 z) _1 b: W更正代码后,我们会发现编译时没有错误。
* d9 G( ^+ Z2 p/ A- z/ @程序意外结束错误:' F( W! |6 K4 @. Y0 y7 g( X
有时我们在代码中遗漏了一个右括号,继而发生意外的程序结束错误,我们必须检查我们的代码,查看需要添加的内容,或者我们需要确保每个左括号匹配一个右括号来解决此错误。 下面是该代码的示例。3 a* h% _; J5 l* @
出错的错误代码:
5 w3 m9 N* w7 L* Mvoid OnStart()
! H' D* w# ~; z+ X( H6 c1 v{: T% k8 w" d1 [ ]
bool a=7;
0 W* I, C- _1 {" W% sif (a=5)
0 K; M( I: [6 f! l' Ca=5;
! h: I# t4 F- {6 ?; g) U更正无错误代码:4 p. t/ X9 Y/ G1 g" g& M4 }
void OnStart() G7 u1 c/ T" A. \
{
) r2 t1 r. X: x1 f+ {# n; f3 M+ Gbool a=7;
0 Y! f7 l9 _& Pif (a=5)
. s- [% K* ~3 e/ ?a=5;
' o4 d! F' [6 k0 M}+ _) b; a# {% k, b7 o
添加右括号更正代码后,我们会发现代码成功编译没有错误。
6 K& ]0 c; M4 x6 p7 g0 E' e. ]表达式不允许出现在全局范围错误:7 ^2 m" u6 |: X! `1 U
当我们在复合运算符中缺少左括号时,就会发生该错误,或者当我们在特定函数范围之外编写语句或表达式时,可能会发生该错误,因为我们只能在函数范围内使用表达式。 以下示例示意此类错误。7 \# |+ }& p" R1 a1 E+ D
出错的错误代码:) w- x! C" _( X3 v- Y
int a=(7+5);0 l6 |4 K5 B9 W% f3 L- D
if (a<7)
$ {% a3 h" X1 d$ y% M9 ha=7;
& l, G$ `2 j8 O$ i}, y4 ~+ u" I% {9 l" l
在前面的代码中,我们遗漏了与(})配对的起始({),故系统报告 “表达式不允许出现在全局范围” 错误。 以下是 “错误” 选项卡中的错误。" X* x$ Y/ c* G( e2 R
更正无错误代码:
5 A6 o. A( z2 ~/ q* hint a=(7+5);1 x$ _- \# W7 v7 y- y
if (a<7)& U( w4 G4 A1 C, r
{
# q% H7 T. G$ M4 \1 o' qa=7;/ m6 C" g$ h" F8 o
}
5 G' B. b! X- v更正代码后,与前面的代码模块相同,我们会发现代码编译后没有任何错误。% y) ^: \/ {* b3 ^# b
错误的参数计数错误:3 v9 l7 c& {- {; a# Z8 ~& P
当我们用到拥有指定参数的特定函数时,若我们未正确指定这些参数,意即或多或少,我们会体验到这种类型的错误代码。 如果我们使用预定义的函数或我们创建的函数,则会出现此错误。 以下是该错误的示例。
- r% O. d: e+ f4 H% U有错误的代码:# d5 ~% E( b& k- A+ a
如果我们创建了一个 “myVal” 函数,返回两个整数值求和的结果,这意味着该函数中有两个参数? 故此,当我们调用此函数时传递个数的参数时,我们将得到此类错误,其与以下代码相同
$ W2 Y" u, S& @void OnStart()
: L+ \4 z/ Y2 i/ X/ }' m" q( |{( K( `2 \: h; U/ m9 |+ }$ r, m
int example=myVal(10);* k- ~( S$ }4 I
}
1 E0 ]' z2 ^- I7 V7 ^- R6 a//+------------------------------------------------------------------+
" U3 D- y8 T4 n2 @. |int myVal(int a, int b)9 y' ]2 c7 G5 }$ D/ i
{
9 t4 v+ \" ?4 O1 T/ Treturn a+b;' e7 y. h: f j
}8 n6 s4 `; `4 O+ }4 x
无错误代码:
) }# P$ o6 v6 g4 M1 N5 \为了正确编写此代码,我们需要为这个创建的函数传递相应个数的参数,如下所示
% Q$ \% |' a; m P+ ~void OnStart()+ W! L5 l x5 u4 r2 L; m/ K
{- \8 o- c0 u7 t0 s
int example=myVal(10,20);
v0 z$ A {# n1 _) ?( }}
, }' O& d' F; L1 B8 H" y//+------------------------------------------------------------------+% Q+ v1 A! x4 g7 Q
int myVal(int a, int b)
# @) m8 \$ A+ ~' u{& u# P# H1 Y6 P$ N' u6 V1 w
return a+b;
3 O/ ^9 W1 v- K9 q7 j}0 X% Q( t T3 s! P* Y
编译此正确代码后,我们不会发现任何错误。0 D7 c/ Y" z9 o$ p! e6 s2 x
某些操作符预期错误:! o6 J" F! k8 L' u; ^6 ~
当我们在特定位置完全遗漏或放错操作符时,我们就会遇到这种类型的错误。 以下是该类错误的示例。
- g' Y9 l7 Z! }1 d有错误的代码:
* O1 n t5 u' Q9 t/ X% eint a= 7 10; |