概述
( M9 U# |7 }# {7 n作为 MQL5 程序员或开发人员,我们发现我们需要很好地理解和使用策略测试器,才能获得有效的结果。 通过使用这款颇具价值的工具,我们可以获得有关我们所创建 MQL5 程序的性能的宝贵认知,这对获得更好的交易结果颇具影响。 故此,我们发现在进行测试之前,我们需要充分了解重要的主题,例如处理所有错误类型,因为作为开发人员,我们犯糊涂导致出错是很正常的。 我们还需要深刻理解的另一个主题是调试,它让我们以交互方式执行我们创建的程序。 然后,我们来到最重要和最有价值的工具,即策略测试器,用于测试和评估我们创建的程序,其功能比 MetaTrader 4 版本的更有趣。 因此,在本文中,学习使用 MQL5 策略测试器的最重要方面会是一次了不起的学习之旅
( K5 c) k$ C) f" L o' A Z错误3 X9 ^& d' J+ @, M" J
在本主题中,我们将学习在创建、执行和运行 MQL5 程序时可能发现的错误。 理解这个主题的一个要点是,MQL5 会正确报告这些错误,但如果我们不知道这些错误意味着什么,或者在程序的哪个阶段,相较于我们已经知道它们的含义,我们就要花费更多的时间来处理或解决它们。0 T& q$ S( z5 B7 P d% X
我们将根据我们在 MQL5 程序上的工作阶段来讲述这个主题,在我们编写代码时,可能会遇到错误和警告,即编译错误和警告。 我们在执行 MQL5 程序时也可能会遇到运行时错误,当我们的 MQL5 程序尝试交易时,我们也可能会遇到其它类型的错误,即交易服务器错误。6 c# V" W8 k" L5 V+ o
左括号不平衡错误:+ r) G! s* b5 N0 N/ X
当我们缺少右括号、或多用了额外的右括号时,就会发生此类错误。 我们可以通过以下示例发现该错误。; }5 z2 m [# w: _9 p9 P* p
出错的错误代码:
; i1 `1 E0 r9 S2 ^( G1 j7 Q. Z6 e% a) dbool a=7;$ g* V* n4 {' f( N
if (a=5
" U! V( a) m Aa=5
W0 r. D4 k O" X7 Q1 ?更正无错误代码:
! ^; m% d( ]8 r ?+ y- }' v6 A y' Tbool a=7;
, N; F% y) p7 ^7 I/ O$ z8 `if (a=5)
- `; a9 ?5 n3 p+ r" l" Ka=5;
; }1 n2 J: m1 E更正代码后,我们会发现编译时没有错误。
0 Q0 v4 X: c) u8 f9 t7 Z程序意外结束错误:9 y" m+ q5 ^ ], k1 E
有时我们在代码中遗漏了一个右括号,继而发生意外的程序结束错误,我们必须检查我们的代码,查看需要添加的内容,或者我们需要确保每个左括号匹配一个右括号来解决此错误。 下面是该代码的示例。
! Y4 @2 T1 x. U9 j0 p9 M: }' W出错的错误代码:$ g6 ~# e; Q' K! e6 V; ^1 p
void OnStart()
2 E1 \- @- b0 L) |, d1 d{7 o! s" T2 d: b& h
bool a=7;3 [- }1 ?; A5 n. z& r. z
if (a=5)3 B+ K9 o7 q2 V) q
a=5;$ u2 R8 R; y5 A/ R* e: q
更正无错误代码: }4 l6 D& [! `; C3 w
void OnStart()
; n. ^- I2 x% j* y m2 _& [; u{
3 Z5 w1 ?+ y+ `3 [9 W( q1 X* [ |$ Ibool a=7;' Z% k9 e/ r9 W: b2 B
if (a=5)2 M5 d1 U/ j. N, I+ z7 h1 @1 K
a=5;
( f. ]3 [# K3 r}
1 q; o1 n% L H添加右括号更正代码后,我们会发现代码成功编译没有错误。6 A, G3 Z Q& X) B7 M
表达式不允许出现在全局范围错误:
5 Q" L+ a: B/ @2 y2 n2 I: K当我们在复合运算符中缺少左括号时,就会发生该错误,或者当我们在特定函数范围之外编写语句或表达式时,可能会发生该错误,因为我们只能在函数范围内使用表达式。 以下示例示意此类错误。7 D5 ^# I4 d; `5 `0 Z2 |
出错的错误代码:: p! a# _/ Q2 i* ^8 d( L
int a=(7+5);
. P7 I1 ^0 o/ ^8 }* N oif (a<7)
. K! c0 Q' E) T, xa=7;4 n3 U( @- u5 ]4 T3 B4 ]7 C
}( q& w9 k; P! H
在前面的代码中,我们遗漏了与(})配对的起始({),故系统报告 “表达式不允许出现在全局范围” 错误。 以下是 “错误” 选项卡中的错误。
0 v! [5 \' |( |5 n( P' u% I( f @+ p更正无错误代码:$ Q z8 w6 t1 w( U2 H
int a=(7+5);
& m6 z$ b0 e9 }: }- ~* E$ H; eif (a<7)
% d1 d5 ?9 K# o5 P8 A" Y{
4 S( n: g# h& Z7 R0 X6 fa=7;
; s8 Z$ A# m, M3 R: }}' M- e1 Z: K& V: k; S
更正代码后,与前面的代码模块相同,我们会发现代码编译后没有任何错误。
0 A" v7 l9 Y3 t$ o错误的参数计数错误:3 x" b* Y9 Y6 p; W2 b
当我们用到拥有指定参数的特定函数时,若我们未正确指定这些参数,意即或多或少,我们会体验到这种类型的错误代码。 如果我们使用预定义的函数或我们创建的函数,则会出现此错误。 以下是该错误的示例。( ]5 O+ q4 P H; y( A) g! W' X8 j
有错误的代码:
# v+ M/ |! r* X2 y1 s2 }/ m, c如果我们创建了一个 “myVal” 函数,返回两个整数值求和的结果,这意味着该函数中有两个参数? 故此,当我们调用此函数时传递个数的参数时,我们将得到此类错误,其与以下代码相同
, e: C2 l; B* J z! o% C3 }) q& Yvoid OnStart() N4 {- |8 R( d4 ]! K0 O/ L4 e
{
( ?4 a2 `6 |$ b) W: ]- Iint example=myVal(10);
" W' _# O: [. J; e9 ~7 v3 J}% a) n; @3 J& M ^
//+------------------------------------------------------------------+
_: z. I- S! H1 q6 I! Oint myVal(int a, int b)
4 M* F \! y5 G7 x{1 S; N; | F! C# m( K: R9 @
return a+b;
! M2 ^. [* r% W+ H B" _0 o}
, F5 P* X0 X) q) M' }1 R无错误代码:
/ K& T t3 }5 D: t为了正确编写此代码,我们需要为这个创建的函数传递相应个数的参数,如下所示6 A% ], y" S8 }
void OnStart()6 H/ o5 ^4 N- o/ l& T* K( ?. u
{: l6 k B- c- T, b% l! L
int example=myVal(10,20);
. k" m0 Z. s2 s [6 Y}
5 b) ^( A9 E7 b/ Z//+------------------------------------------------------------------+: [" M: S0 S5 Y! X
int myVal(int a, int b)8 k) v9 |4 ` p4 Y9 `* ?# B
{
& f0 E* O* K& a" E5 oreturn a+b;
: z4 i: a1 O; q4 D" S Z: ~; m}
4 y" s% V" J5 n% h$ _编译此正确代码后,我们不会发现任何错误。: x) a8 B* y1 b6 l. ~' n
某些操作符预期错误:7 D" A# u# ~; P: V
当我们在特定位置完全遗漏或放错操作符时,我们就会遇到这种类型的错误。 以下是该类错误的示例。
' G! l: M, o) T2 s) G有错误的代码:
E4 s6 ~. j$ O% A' ^# ~" Z! {int a= 7 10; |