文章 "向指标或者EA中快速添加控制面板"

 

新文章 向指标或者EA中快速添加控制面板已发布:

你是不是觉得需要向你的指标或者EA中添加图形面板来提升配置参数的速度和便捷性?在本文中,你将学会如何一步一步在你的MQL4/MQL5程序中实现输入参数的交互面板。

你的MQL4/MQL5指标或EA可能是世界上最有效的但是它仍旧有改进的空间。在大多数情况下,你需要进入程序设置来改变其输入参数。然而,这一步可以绕过去。

基于标准类库来开发你自己的控制面板。这将允许您更改设置而无需重新启动程序。此外,这将使你的程序更具吸引力,让它从竞争对手中脱颖而出。您可以在市场中浏览多种图形面板。

在本文中,我将向你展示如何向您的MQL4/MQL5程序添加简易面板。您还将了解到如何让程序读取输入参数并对它们的改变进行响应。

2.2. 面板

最终的PanelDialog2.mqh面板看上去如下:

面板2

图 4. 面板2

MACD Sample.mq5EA和PanelDialog2.mqh面板结合的好处是什么?这允许我们快速的修改EA参数(LotsTrailing Stop Level (in pips),及其他),以及加载在当前时间框架上的EA的事件发生通知方式(Mail, Push, 和 Alert)。

被修改EA的参数(LotsTrailing Stop Level (in pips),及其他)在点击Apply changes按钮后生效。 交易事件通知设置的改变(MailPush,和Alert)自动生效。没有必要按Apply changes按钮。

作者:Karputov Vladimir

 
非常有用。谢谢。
 
感谢您的文章!如何更改面板本身的背景和边框颜色?我在标准类中 没有找到。
 
Maxim Dmitrievsky:
感谢您的文章!如何更改面板本身的背景和边框颜色?我在标准类中 没有找到。
如果使用简单的方法,就无法更改。我没有找复杂的方法。
 
Maxim Dmitrievsky:
感谢您的文章!如何更改面板本身的背景和边框颜色?我在标准类中 没有找到。
覆盖 Defines.mqh 中的定义。
 
Andrey Khatimlianskii:
重新定义 Defines.mqh 中的定义。
  1. 下次更新时,标准程序库 将被恢复,Defines.mqh 文件也会相应恢复。
  2. 编辑标准库是不可取的。
 
Karputov Vladimir:
  1. 在最近的更新 中,标准程序库 将被恢复,Defines.mqh 文件也将相应恢复。
  2. 编辑标准程序库是不可取的。
我不建议编辑它。您应该在包含该文件后,但在创建面板前重新定义它。
 
Andrey Khatimlianskii:
我不建议编辑它。您需要在启用此文件后,但在创建面板前覆盖它。
请你举个简单的例子告诉我怎么做,我不太擅长 OOP。我改变了库中定义的颜色,但面板的颜色没有改变。
 
Maxim Dmitrievsky:
请举一个简单的例子告诉我怎么做,我对 oop 了解不多。我改变了库中定义的颜色,但面板的颜色没有改变。

更改文件后,重新编译 EA,应该可以正常工作。别忘了备份,以便在更新后恢复变量。

重写可以使用 #undef 和 #define。但你需要把它们放在正确的位置;)

 
Andrey Khatimlianskii:

使用 #undef 和 #define 可以实现覆盖。但你必须把它们放在正确的位置上;)

区分 ...和 ....
 
Andrey Khatimlianskii:

更改文件后,重新编译 EA,应该就能正常工作了。别忘了备份,以便在更新后恢复变量。

重写可以使用 #undef 和 #define。但你需要把它们放在正确的位置上;)

我就是这么做的,但没有任何效果。面板还是原来的白色

编译器写入了 Macro redifinition,即它是一种覆盖类型....

//+------------------------------------------------------------------+
//|MyPanel.mqh | |
//|版权所有 © 2013, DeltaTrader |
//|http://www.deltatrader.com.br || 
//+------------------------------------------------------------------+
#property copyright     "DeltaTrader © 2013
#property link          "www.deltatrader.com.br"
#property version       "1.000"
#property description   "Test Panel"
#property indicator_plots 0
//+------------------------------------------------------------------+
//| 包括|
//+------------------------------------------------------------------+
#include <Controls\Dialog.mqh>
#include <Controls\Label.mqh>
#include <Controls\Panel.mqh>
#include <Controls\Edit.mqh>
#include <Controls\Defines.mqh>

#define  CONTROLS_DIALOG_COLOR_BORDER_LIGHT  C'0x00,0x00,0xFF'
#define  CONTROLS_DIALOG_COLOR_BORDER_DARK  C'0x00,0x00,0xFF'
#define  CONTROLS_DIALOG_COLOR_BG            C'0x00,0x00,0xFF'
#define  CONTROLS_DIALOG_COLOR_CAPTION_TEXT  C'0x00,0x00,0xFF'
#define  CONTROLS_DIALOG_COLOR_CLIENT_BG     C'0x00,0x00,0xFF'
#define  CONTROLS_DIALOG_COLOR_CLIENT_BORDER C'0x00,0x00,0xFF'

//+------------------------------------------------------------------+
//| 全局参数|
//+------------------------------------------------------------------+
int      panelXX     =  200;
int      panelYY     =  200;
int      panelWidth  =  600;
int      panelHeight =  400;

CAppDialog m_panel;

//-- 竞标对象
CPanel m_bidcolor;
CLabel m_bidlabel;
 

//--- 询问对象
CPanel m_askcolor;
CLabel m_asklabel;
CEdit m_edit;
//+------------------------------------------------------------------+
//| 启动时|
//+------------------------------------------------------------------+
int OnInit() 
  {
//--- 创建面板
   m_panel.Create(0,"blablabla",0,panelXX,panelYY,panelWidth,panelHeight);
//--- 投标标签和颜色
   m_bidcolor.Create(0,"Bid Background Color",0,1,1,panelWidth-30,30);
   m_bidcolor.ColorBackground(clrYellow);
   m_panel.Add(m_bidcolor);
   
   m_bidlabel.Create(0,"Bid Text",0,5,5,0,0);
   m_bidlabel.Text("Bid "+DoubleToString(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits));
   m_bidlabel.Color(clrBlue);
   m_panel.Add(m_bidlabel);
//--- 询问标签和颜色
   m_askcolor.Create(0,"Ask Background Color",0,1,1,panelWidth-30,30);
   m_askcolor.ColorBackground(clrAqua);
   m_panel.Add(m_askcolor);
   
   m_asklabel.Create(0,"Ask Text",0,5,30,0,0);
   m_asklabel.Text("Ask "+DoubleToString(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits));
   m_asklabel.Color(clrRed);
   m_panel.Add(m_asklabel);
   
   m_edit.Create(0,"Bid Background Color",0,1,1,panelWidth-30,30);
   m_panel.Add(m_edit);
//--- 运行面板
   m_panel.Run();
   return(0);
  }
//+------------------------------------------------------------------+
//| 注销时|
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- 销毁面板
   m_panel.Destroy(reason);
//-- 删除所有对象
   ObjectsDeleteAll(0,0);
  }
//+------------------------------------------------------------------+
//| 计算时|
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[])
  {
//-- 一个非常简单的投标标签
   m_bidlabel.Text("Bid "+DoubleToString(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits));
//--- 一个非常简单的问询标签
   m_asklabel.Text("Ask "+DoubleToString(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits));
//---
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| 图表事件|
//+------------------------------------------------------------------+

void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//--- 用鼠标移动面板
   m_panel.ChartEvent(id,lparam,dparam,sparam);
//--- 
  }
//+------------------------------------------------------------------+