分享

使用mql5创建你自己的图形化操作面板2[译文] ? 7号交易员

 visionary555 2012-07-31

这篇文章是使用mql5创建你自己的图形化操作面板1[译文]的第二篇,预计一共4篇,敬请期待!

创建一个图形面板

让我们先理解这个概念,图形面板是一个我们可以用来显示自定义的内容但不包括画线的缓冲区的单独的窗口。这个面板使用图表对象(chart objects)嵌入在终端中(MT5)简单的显示了需要的信息。这些信息可以以以下这些形式展现:
数字,文本,颜色,以及更多...
我们将在下面的内容详细的讲解创建一个图形化面板的每一个步骤。

为了创建这个面板,我们需要2个文件:
1.需要包含那些描述显示面板的类的包含文件。(在include文件夹里)
2.自定义指标源代码文件。
上面的这些模板文件可以直接使用MQL5向导自动生成。在自定义指标目录下(\Indicators),创建一个单独的文件夹:MyIndicators和一个子文件夹:MyPanel.这个创建文件夹的过程将不必在这里处理,看help里有对这个操作的描述(就是直接写目录就行,程序会自动创建文件夹)。

类的描述

现在,我们已经创建了工作文件夹,让我们现在在菜单中找到“导航”窗口并单击鼠标右键,在弹出的菜单中选择“New File”(创建新文件),然后在选择“New Class”(新建类),这样就会弹出一个mql5向导窗口,单击“下一步”。按下面的图片中的现实填写内容。

Creating new class in MQL Wizard

单击“完成”。结果就是我们得到了下面的代码:

//+------------------------------------------------------------------+
//|                                                  PanelDialog.mqh |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                              http://www. |
//+------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp."
#property link      "http://www."
#property version   "1.00"
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class CPanelDialog : public CAppDialog
  {
private:

public:
                     CPanelDialog();
                    ~CPanelDialog();
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
CPanelDialog::CPanelDialog()
  {
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
CPanelDialog::~CPanelDialog()
  {
  }
//+------------------------------------------------------------------+

在标准库里加入包含文件<Controls\Dialog.mqh>,里面有基类:CAppDialog类的描述和注释。

//+------------------------------------------------------------------+
//|                                                  PanelDialog.mqh |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                              http://www. |
//+------------------------------------------------------------------+
#include <Controls\Dialog.mqh>
//+------------------------------------------------------------------+
//| CPanelDialog class                                               |
//| Function: main application dialog                             |
//+------------------------------------------------------------------+
class CPanelDialog : public CAppDialog
  {
private:

public:
                     CPanelDialog(void);
                    ~CPanelDialog(void);
  };
//+------------------------------------------------------------------+
//| Constructor                                                      |
//+------------------------------------------------------------------+
CPanelDialog::CPanelDialog(void)
  {
  }
//+------------------------------------------------------------------+
//| Destructor                                                       |
//+------------------------------------------------------------------+
CPanelDialog::~CPanelDialog(void)
  {
  }
//+------------------------------------------------------------------+

现在我们拥有一个类的描述允许我们在自定义指标中使用对话框。我们的对话框现在是空的,但接下来我们将在里面加上一些控件。现在,让我们开始这个指标吧。

这个自定义指标的源代码

我们依然用MQL5向导来创建这个自定义指标。和我们之前写类的描述时必须填写的类似。只有一个比较麻烦的地方:我们在MQL5向导中选择“自定义指标”,为了创建这个指标,我们需要填写3个对话框。
第一个就是我们必须为指标指定一个唯一的名字,如下:

Creating new indicator in MQL Wizard

在第二个对话框中,勾选“OnChartEvent"(必需)和“OnTimer”,如下:

Setting event handlers for custom indicator in MQL Wizard

在第三个对话框中勾选“单独的窗口指标”(必需)

Setting indicator drawing properties in MQL Wizard

然后单击“完成”。生成的代码如下:

//+------------------------------------------------------------------+
//|                                               PanelIndicator.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                              http://www. |
//+------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp."
#property link      "http://www."
#property version   "1.00"
#property indicator_separate_window
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping

//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
              const int prev_calculated,
              const int begin,
              const double &price[])
  {
//---

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---

  }
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                const long &lparam,
                const double &dparam,
                const string &sparam)
  {
//---

  }
//+------------------------------------------------------------------+

加入我们的模板后代码中包含以下内容:

Missing(?)指标属性的描述
包含文件包含了对对话框类的描述
一个全局变量 - 对话框的类的实例对象
创建对话框的代码,开始应用程序并在OnInit()函数体中创建一个计时器
解析函数OnDeinit()包含了当对话框结束或者计时器结束后执行的代码。
OnChartEvent(...)函数提供了事件钩子的代码,
注释

我们将得到可以直接使用的指标代码:

//+------------------------------------------------------------------+
//|                                               PanelIndicator.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                              http://www. |
//+------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp."
#property link      "http://www."
#property version   "1.00"
#property indicator_separate_window
#property indicator_plots               0
#property indicator_buffers             0
#property indicator_minimum             0.0
#property indicator_maximum             0.0
//+------------------------------------------------------------------+
//| Include files                                                  |
//+------------------------------------------------------------------+
#include "PanelDialog.mqh"
//+------------------------------------------------------------------+
//| Global variables                                             |
//+------------------------------------------------------------------+
CPanelDialog ExtDialog;
//+------------------------------------------------------------------+
//| Initialization                                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- creating the application dialog
   if(!ExtDialog.Create(0,"Panel Indicator",0,0,0,0,130))
     return(-1);
//--- starting the application
   if(!ExtDialog.Run())
     return(-2);
//--- creating the timer
   EventSetTimer(1);
//--- success
   return(0);
  }
//+------------------------------------------------------------------+
//| Deinitialization                                                 |
//+------------------------------------------------------------------+
int OnDeinit()
  {
//--- destroying the dialog
   ExtDialog.Destroy();
//--- killing the timer
   EventKillTimer();
  }
//+------------------------------------------------------------------+
//| Iteration                                                        |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
              const int prev_calculated,
              const int begin,
              const double &price[])
  { 
//--- returning the prev_calculated value for the next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Timer event handler                                        |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
  }
//+------------------------------------------------------------------+
//| Chart event handler                                          |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                const long &lparam,
                const double &dparam,
                const string &sparam)
  {
//--- handling the event
   ExtDialog.ChartEvent(id,lparam,dparam,sparam);
  }
//+------------------------------------------------------------------+

目前以上的代码不会显示任何内容。我们编译后并在客户端的导航中使用它,在图表中会出现一个新的窗口,里面有一个空的对话框。
尽管这个对话框是空的,我们的指标仍然获得了一定的功能:
1.在指标创建的时候图表的子窗口的高已经根据对话框的高做出了调整。
2.对话框的宽度一直和窗口的宽是一致的
3.这个指标在这个子窗口中拥有它自己的最大值和最小值。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多