期货量化软件:理解并有效地使用 MQL5 策略测试器

在涵盖这些错误之前,您需要知道错误出现的位置。 在 MQL5 IDE 中,在最低部分有一个工具箱窗口,如果您未能在默认位置找到它,您可以通过以下方法之一查看它:

1- 单击“查看” ==> 选择“工具箱”

添加图片注释,不超过 140 字(可选)

2- 从键盘按 Ctrl+T

3- 从主工具箱窗口单击 “工具箱” 按钮

添加图片注释,不超过 140 字(可选)

之后,我们可以如下图一般发现它

添加图片注释,不超过 140 字(可选)

编译错误和警告:

赫兹量化软件为特定程序编写代码时,我们可能会犯错误,这是极其正常的,例如,一句编写错误的语法或拼写错误,这都会导致编译代码时出现错误。 在这一部分中,我们将分享最流行和最常遇到的此类错误。 您需要知道的最重要的事情是,在消除或解决错误之前,程序无法编译成功。 我将根据此类错误讲述我们可能面临的最常见的错误:

分号预期错误:

当忘记在行尾写分号时,赫兹量化软件将面临这个错误,故我们少了一个分号,或者如果我们也忘记了左括号。 我们必须正确使用这些类型的符号,从而避免此类错误。 下面的代码是此类错误的一个示例。

出错的错误代码:

 
 

int a=(2+1)

错误将与以下内容相同:

添加图片注释,不超过 140 字(可选)

更正无错误代码:

在代码行末尾添加分号更正代码之后,赫兹量化软件可以得到正确的代码,如下所示:

 
 

int a=(2+1);

编译代码后,赫兹量化软件发现错误被消除,代码编译后没有任何错误,如下所示:

添加图片注释,不超过 140 字(可选)

意外的令牌错误:

这是我们经常遇到的另一种代码,其原因是忘记了最后一行代码中的右括号,或者我们可能会在已有代码行中加入了额外的左括号。 我们可以看到此类错误的示例,如下所示:

出错的错误代码:

 
 

int a=(2+1;

我们可以在 “工具箱” 的 “错误” 选项卡中看到错误,如下所示:

添加图片注释,不超过 140 字(可选)

更正无错误代码:

 
 

int a=(2+1);

如同以下内容,通过添加右括号,赫兹量化软件可以看到在 “错误” 选项卡,其中无任何错误:

添加图片注释,不超过 140 字(可选)

未声明的标识符错误:

当我们使用变量而没有事先声明它时,就会发生这种类型的错误,因为我们必须在使用它、或为其分配任何数值之前声明任何新变量。 通过选择正确且合适的数据类型来声明它,我们需要将相应值返回到这个变量,例如整数或字符串。 下面是此类错误的示例,即在不声明新变量的情况下使用它。

出错的错误代码:

 
 

a=5;

在上面的代码中,我们在未声明情况下使用了变量(a),并为其赋值 5。 因此,当我们编译此代码时,我们会发现未声明的标识符错误,如下所示:

添加图片注释,不超过 140 字(可选)

正如我们所见,错误描述的准确性可能非常有帮助,因为它不仅报告错误,而且指出了导致此错误的变量 “a”。

更正无错误代码:

 
 

int a=5;

此代码正确编译后,赫兹量化软件从同一图片中未发现任何之前所提及的“工具箱”的“错误”选项卡里的错误。

左括号不平衡错误:

当我们缺少右括号、或多用了额外的右括号时,就会发生此类错误。 赫兹量化软件可以通过以下示例发现该错误。

出错的错误代码:

 
 

bool a=7; if (a=5 a=5;

在前面的代码中,我们发现,若忘记右括号,除了 “预期某些运算符” 的错误外,还出现了 “左括号不平衡” 的错误,如下图所示

添加图片注释,不超过 140 字(可选)

更正无错误代码:

 
 

bool a=7; if (a=5) a=5;

更正代码后,我们会发现编译时没有错误。

程序意外结束错误:

有时我们在代码中遗漏了一个右括号,继而发生意外的程序结束错误,我们必须检查我们的代码,查看需要添加的内容,或者我们需要确保每个左括号匹配一个右括号来解决此错误。 下面是该代码的示例。

出错的错误代码:

 
 

void OnStart() { bool a=7; if (a=5) a=5;

编写与上一段代码模块相同的代码,故意遗漏最后一行(a=5)后面的右括号,我们可以发现“意外的程序结束”错误,以及另一个 “不平衡括号” 错误,如同下图

添加图片注释,不超过 140 字(可选)

更正无错误代码:

 
 

void OnStart() { bool a=7; if (a=5) a=5; }

添加右括号更正代码后,赫兹量化软件会发现代码成功编译没有错误。

表达式不允许出现在全局范围错误:

当我们在复合运算符中缺少左括号时,就会发生该错误,或者当我们在特定函数范围之外编写语句或表达式时,可能会发生该错误,因为我们只能在函数范围内使用表达式。 以下示例示意此类错误。

  • 18
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的 MQL5 代码示例,演示了使用均线策略进行量化交易。在这个示例中,我们使用了简单移动平均线 (SMA) 来确定交易信号。 ```mql5 //+------------------------------------------------------------------+ //| Simple Moving Average EA | //| Copyright 2021, CSDN C知道 | //| https://blog.csdn.net | //+------------------------------------------------------------------+ #property copyright "CSDN C知道" #property link "https://blog.csdn.net" #property version "1.00" #property strict // 输入参数 input int FastMA_Period = 10; // 快速移动平均线周期 input int SlowMA_Period = 20; // 慢速移动平均线周期 input double LotSize = 0.1; // 交易手数 // 全局变量 int ticket = 0; // 订单号码 //+------------------------------------------------------------------+ //| 自定义指标函数 | //+------------------------------------------------------------------+ double MovingAverage(int period, int shift) { double sum = 0; for (int i = 0; i < period; i++) { sum += Close[i + shift]; } return sum / period; } //+------------------------------------------------------------------+ //| 程序初始化函数 | //+------------------------------------------------------------------+ void OnInit() { // 设置移动平均线指标参数 SetIndexBuffer(0, NULL); SetIndexStyle(0, DRAW_LINE); SetIndexLabel(0, "SMA"); // 创建订单标签 ObjectCreate("OrderLabel", OBJ_LABEL, 0, 0, 0); ObjectSet("OrderLabel", OBJPROP_CORNER, CORNER_LEFT_UPPER); } //+------------------------------------------------------------------+ //| 每个Tick的处理函数 | //+------------------------------------------------------------------+ void OnTick() { // 计算快速和慢速移动平均线的值 double fastMA = MovingAverage(FastMA_Period, 0); double slowMA = MovingAverage(SlowMA_Period, 0); // 检查是否有已存在的订单 if (ticket == 0) { // 检查交叉条件 if (fastMA > slowMA) { // 开多仓 ticket = OrderSend(Symbol(), OP_BUY, LotSize, Ask, 3, Bid - StopLevel * Point, Bid + TakeProfit * Point, "Buy Order", 0, 0, Green); } else if (fastMA < slowMA) { // 开空仓 ticket = OrderSend(Symbol(), OP_SELL, LotSize, Bid, 3, Ask + StopLevel * Point, Ask - TakeProfit * Point, "Sell Order", 0, 0, Red); } } else { // 检查订单是否已关闭 if (OrderClose(ticket, OrderClosePrice(), Bid, Slippage)) { ticket = 0; } } // 更新移动平均线指标 ObjectCreate("SMA", OBJ_TREND, 0, Time[0], fastMA); ObjectSet("SMA", OBJPROP_TIME1, Time[0]); ObjectSet("SMA", OBJPROP_PRICE1, fastMA); // 显示订单标签 ObjectSetText("OrderLabel", "Order: " + IntegerToString(ticket), 10, "Arial", Red); ObjectSet("OrderLabel", OBJPROP_XDISTANCE, 10); ObjectSet("OrderLabel", OBJPROP_YDISTANCE, 20); } //+------------------------------------------------------------------+ ``` 请注意,这只是一个简单的示例,可能需要根据您的具体需求进行修改和优化。在使用此代码之前,请确保您已经了解并熟悉 MQL5 语言和量化交易的基本概念。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值