MQL5 Cookbook: 使用不同的打印模式
简介
这是 MQL5 Cookbook 系列的第一篇文章,我将会从简单的实例开始,让那些刚刚开始编程的人逐渐熟悉这门新语言。我还记得我开始设计和编写交易系统时的尝试,可以说是非常困难,事实上那是我所学的第一门编程语言,那时我曾经想过,我天生不是这块料,没法弄懂它了。
然而,后来还是比我想象的简单一些,我只用了几个月的时间就能够开发相对复杂的程序了。您可以在一篇叫做 "使用 MetaQuotes语言编辑器 5 和 MQL5 的无尽机会"的文章中获得更多信息。
在这里,我将尝试指导进行EA交易开发的新手从简单到复杂,逐步通过整个编程过程,我不准备在此复制任何 MetaQuotes语言编辑器 5 “帮助”中的任何信息,所以要准备经常按F1键了。同时,本系列文章将提供很多实例代码,制作完成的函数以及框架,您可以在开发中直接使用或者进行定制。
让我们开始吧!在本文中,我们将会创建一个脚本程序,使用不同模式打印交易品种的一些属性。在开发一个程序的时候,特别是学习过程的早期,经常会遇到程序没有根据期待而进行回应的情况,如果这种情况发生,您将需要检查计算中相关变量的值。在我们的案例中,我们将详细了解三种方法,我们将会使用 Print(), Comment() 和 Alert() 函数,这样您就可以决定那种方法对您来说更加方便了。
MQL5 向导
我对MQL5的学习是从脚本开始的,这非常简单而且快速。当脚本被载入时,它执行你创建的功能,然后再被从图表上移除,这使你可以一直做试验来决定向哪个方向移动。
如果您还没有安装MetaTrader 5交易终端,您可以马上安装. 安装完成以后,启动终端,然后按F4打开MetaQuotes语言编辑器 5. 这个按钮可以用于在MetaTrader 5和 MetaQuotes语言编辑器 5之间快速切换,您也可以点击终端工具条上的相应按钮来启动MetaQuotes语言编辑器 5。请记住使用交易终端和MetaQuotes语言编辑器 5的“帮助”(F1) 好好学习编程界面,因为我们只有在遇到某些问题的时候才会接触到它。
启动 MetaQuotes语言编辑器 5,然后按Ctrl+N 或者MetaQuotes语言编辑器面板主菜单下面的New(新建) 按钮,打开一个MQL5 向导窗口,您可以在其中选择您所要创建程序的类型,在我们的实例中,我们选择脚本 然后按 下一步:
图 1. MQL5 向导 - 脚本
然后您需要输入脚本名称 (文件名),默认条件下,脚本创建于Metatrader 5\MQL5\Scripts\file_name.mq5. 在该目录下,您也可以创建其他文件夹把您的文件根据目标进行分组。
图 2. MQL5 向导 - 文件名
此时,如有必要您也可以增加输入参数。当所有方面设置完成后,点击完成. 一个新文档将会根据模板创建,您可以继续进行脚本编程:
//+------------------------------------------------------------------+ //| PrintModes.mq5 | //| Copyright 2012, MetaQuotes Software Corp. | //| http://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2012, MetaQuotes Software Corp." #property link "http://www.mql5.com" #property version "1.00" //+------------------------------------------------------------------+ //| 脚本程序开始函数 | //+------------------------------------------------------------------+ void OnStart() { //--- } //+------------------------------------------------------------------+
写一行代码
在双斜线后面的所有东西都是注释,不影响程序的执行,我们通常建议在您的代码中提供详细的注释,以便使程序逻辑更容易理解,特别是在很长时间以后。
前三行代码在#property之后的部分是程序相关属性,每个函数和属性的有关信息可以在MQL5 参考中找到。为了快速查看任何函数的描述,您只需要在函数上双击鼠标来选择它,然后按F1. 帮助窗口将会打开,并且提供您所选函数的描述。
之后是主要的脚本函数 - OnStart(), 它包含所有其他函数和计算.
在程序执行之前,我们需要能够选择一种方法来打印所需要的信息,也就是说我们应该有一个外部参数来使我们从下拉列表中选择必要的模式,另外,我们需要指定另外的属性(#property) 用于在程序执行之前打开一个窗口显示脚本的外部参数,这个属性是 script_show_inputs. 我们将把它增加到所有其他已有属性之下:
#property copyright "Copyright 2012, MetaQuotes Software Corp." #property link "http://www.mql5.com" #property version "1.00" #property script_show_inputs //---
为了有外部参数的下拉列表,我们需要创建所有模式的枚举类型,让我们在程序属性之后插入这些代码:
// 枚举 enum ENUM_PRINT_MODE { PRINT = 0, COMMENT = 1, ALERT = 2 }; //---
之后是此脚本的唯一外部参数 - PrintMode:
// 输入参数 input ENUM_PRINT_MODE printMode=PRINT; // 打印模式
作为原则,输入参数位于程序的开端,并在变量类型之前使用input修饰符对外部参数进行定义. 如果我们现在就运行脚本,会打开一个程序窗口,我们可以从打印模式参数的下拉列表中选择一个打印的模式:
图 3. 脚本参数窗口
然后我们创建变量并赋值(在我们的实例中,我们将打印一些交易品种数据),进而使用用户在外部参数中指定的模式打印它们。为了这个目的,我们需要安排一个独立的用户函数 - PrintSymbolProperties() - 并且在主 OnStart() 函数中调用它.
为了创建这个函数,我们只需要简单地插入如下代码:
//+------------------------------------------------------------------+ //| 打印交易品种属性 | //+------------------------------------------------------------------+ void PrintSymbolProperties() { }
返回值的类型应该在函数名之前指定,在我们的实例中,如果函数不返回任何东西,我们可以选择设置为 void. 然后,我们需要在PrintSymbolProperties() 函数体中, 在括号之间写剩下的代码. 让我们首先创建变量:
string symb_symbol = ""; // 交易品种 int symb_digits = 0; // 小数点位数 int symb_spread = 0; // 买价和卖价之间的差异 (点差) int symb_stoplevel = 0; // 止损级别 double symb_ask = 0.0; // 买价 double symb_bid = 0.0; // 卖价
变量的类型取决于对它赋值的数据类型,现在让我们给这些变量赋值,为了取得交易品种的属性,MQL5 提供了针对每种数据类型的特别函数.
symb_symbol =Symbol(); symb_digits =(int)SymbolInfoInteger(_Symbol,SYMBOL_DIGITS); symb_spread =(int)SymbolInfoInteger(_Symbol,SYMBOL_SPREAD); symb_stoplevel =(int)SymbolInfoInteger(_Symbol,SYMBOL_TRADE_STOPS_LEVEL); symb_ask =SymbolInfoDouble(_Symbol,SYMBOL_ASK); symb_bid =SymbolInfoDouble(_Symbol,SYMBOL_BID); //---
为了确认学习了充分的资料, 使用 MQL5 参考 来学习每个函数和它们的传入参数. 所有的交易品种属性都显示在表格中,您将会经常参考。
现在这些变量都已经赋值了,我们只需要写下对应每种打印模式的代码了。代码看起来如下:
//--- // 如果打印到日志中 if(printMode==PRINT) { Print("交易品种: ",symb_symbol,"\n", "小数位数: ",symb_digits,"\n", "点差: ",symb_spread,"\n", "止损级别: ",symb_stoplevel,"\n", "买价: ",symb_ask,"\n", "卖价: ",symb_bid ); } //--- // 如果打印到图表上 if(printMode==COMMENT) { int mb_res=-1; // 对话框中选择选项的变量 //--- Comment("交易品种: ",symb_symbol,"\n", "小数位数: ",symb_digits,"\n", "点差: ",symb_spread,"\n", "止损级别: ",symb_stoplevel,"\n", "买价: ",symb_ask,"\n", "卖价: ",symb_bid ); //--- // 打开一个对话框 mb_res=MessageBox("您想要删除图表中的注释吗?",NULL,MB_YESNO|MB_ICONQUESTION); //--- // 如果点击了 "Yes", 删除图表中的注释 if(mb_res==IDYES) { Comment(""); } //--- return; } //--- // 如果打印到提醒窗口 if(printMode==ALERT) { Alert("交易品种: "+symb_symbol+"\n", "小数位数: "+IntegerToString(symb_digits)+"\n", "点差: "+IntegerToString(symb_spread)+"\n", "止损级别: "+IntegerToString(symb_stoplevel)+"\n", "买价: "+DoubleToString(symb_ask,_Digits)+"\n", "卖价: "+DoubleToString(symb_bid,_Digits) ); } //---
如果您选择 PRINT 作为EA交易的外部参数, 信息将被打印到EA交易的日志中 (工具箱 - 专家 页面):
Fig. 4. 工具箱 - 专家页面
如果您选择 COMMENT, 信息将显示在图表的左上角. 在信息出现在图表中以后,MessageBox() 函数会打开一个对话框提示您删除图表中的注释:
Fig. 5. 图表左上角的注释
如果您选择ALERT, 在运行脚本之后,会出现一个提醒窗口,包含了请求的信息或者简单的用户信息。在这种情况下, 和 PRINT 选项一样, 信息也会被打印到日志中,但同时还会有额外的声音通知.
Fig. 6. 提醒窗口
以下是完整的脚本代码:
//+------------------------------------------------------------------+ //| PrintModes.mq5 | //| Copyright 2012, MetaQuotes Software Corp. | //| http://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2012, MetaQuotes Software Corp." #property link "http://tol64.blogspot.com" #property description "email: hello.tol64@gmail.com" #property version "1.00" #property script_show_inputs //--- //--- 枚举 enum ENUM_PRINT_MODE { PRINT = 0, COMMENT = 1, ALERT = 2 }; //--- // 输入参数 input ENUM_PRINT_MODE printMode=PRINT; // 打印模式 //--- //+------------------------------------------------------------------+ //| 主函数 | //+------------------------------------------------------------------+ void OnStart() { PrintSymbolProperties(); } //+------------------------------------------------------------------+ //| 打印交易品种属性 | //+------------------------------------------------------------------+ void PrintSymbolProperties() { string symb_symbol = ""; // 交易品种 int symb_digits = 0; // 小数点位数 int symb_spread = 0; // 买价和卖价之间的差异 (点差) int symb_stoplevel = 0; // 止损级别 double symb_ask = 0.0; // 买价 double symb_bid = 0.0; // 卖价 //--- symb_symbol =Symbol(); symb_digits =(int)SymbolInfoInteger(_Symbol,SYMBOL_DIGITS); symb_spread =(int)SymbolInfoInteger(_Symbol,SYMBOL_SPREAD); symb_stoplevel =(int)SymbolInfoInteger(_Symbol,SYMBOL_TRADE_STOPS_LEVEL); symb_ask =SymbolInfoDouble(_Symbol,SYMBOL_ASK); symb_bid =SymbolInfoDouble(_Symbol,SYMBOL_BID); //--- // 如果打印到日志中 if(printMode==PRINT) { Print("交易品种: ",symb_symbol,"\n", "小数位数: ",symb_digits,"\n", "点差: ",symb_spread,"\n", "止损级别: ",symb_stoplevel,"\n", "买价: ",symb_ask,"\n", "卖价: ",symb_bid ); } //--- // 如果打印到图表上 if(printMode==COMMENT) { int mb_res=-1; // 对话框中选择选项的变量 //--- Comment("交易品种: ",symb_symbol,"\n", "小数位数: ",symb_digits,"\n", "点差: ",symb_spread,"\n", "止损级别: ",symb_stoplevel,"\n", "买价: ",symb_ask,"\n", "卖价: ",symb_bid ); //--- // 打开一个对话框 mb_res=MessageBox("您想要删除图表中的注释吗?",NULL,MB_YESNO|MB_ICONQUESTION); //--- // 如果点击了"Yes", 删除图表上的注释 if(mb_res==IDYES) { Comment(""); } //--- return; } //--- // 如果打印到提醒窗口 if(printMode==ALERT) { Alert("交易品种: "+symb_symbol+"\n", "小数位数: "+IntegerToString(symb_digits)+"\n", "点差: "+IntegerToString(symb_spread)+"\n", "止损级别: "+IntegerToString(symb_stoplevel)+"\n", "买价: "+DoubleToString(symb_ask,_Digits)+"\n", "卖价: "+DoubleToString(symb_bid,_Digits) ); } } //+------------------------------------------------------------------+
结论
现在我们结束这篇文章. 除了以上提到的方法,您还可以向文件中写数据. 它可以是一个纯文本文件甚或是一个使用CSS格式化的漂亮的HTML报告. 但是这些方法对初学者来说太过复杂,以上提供的对于起步已经足够了.
本文由MetaQuotes Ltd译自俄文
原文地址: https://www.mql5.com/ru/articles/638