MT5入门到精通之十八(图表或面板上添加按钮及事件)

一.简单按钮开仓实现
1.效果图

image.png

2.代码实现

//+------------------------------------------------------------------+
//|                                             testChartEventEA.mq5 |
//|                        Copyright 2017, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"

#include <wz\Trade.mqh>
#include <wz\Kline.mqh>
#include <wz\Draw.mqh>

input int magic=170507;

Trade td;
Kline kl;
Draw dr;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
   dr.label("lots_label","请输入下单量:",20,25,0,White);
   dr.edit("lots_edit","0.1",120,20,80,20,0,Yellow);

   dr.label("slPoint_label","请输入止损点:",20,50,0,White);
   dr.edit("slPoint_edit","200",120,45,80,20,0,Yellow);

   dr.label("tpPoint_label","请输入止盈点:",20,75,0,White);
   dr.edit("tpPoint_edit","200",120,70,80,20,0,Yellow);

   dr.button("openBuy_button","开多单",20,100,80,20);
   dr.button("openSell_button","开空单",120,100,80,20);

   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   ObjectsDeleteAll(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {

  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
   if(id==CHARTEVENT_OBJECT_CLICK)
     {
      double lots=StringToDouble(ObjectGetString(0,"lots_edit",OBJPROP_TEXT));
      int slPoint=StringToInteger(ObjectGetString(0,"slPoint_edit",OBJPROP_TEXT));
      int tpPoint=StringToInteger(ObjectGetString(0,"tpPoint_edit",OBJPROP_TEXT));
      if(sparam=="openBuy_button")
        {
         //Alert("按下了开多单按钮");
         td.buy(Symbol(),td.formatLots(Symbol(),lots),slPoint,tpPoint,Symbol()+"buy",magic);
         ObjectSetInteger(0,sparam,OBJPROP_STATE,false);//设置按钮回复原状
        }
      if(sparam=="openSell_button")
        {
         //Alert("按下了开空单按钮");
         td.sell(Symbol(),td.formatLots(Symbol(),lots),slPoint,tpPoint,Symbol()+"sell",magic);
         ObjectSetInteger(0,sparam,OBJPROP_STATE,false);//设置按钮回复原状
        }
     }
  }
//+------------------------------------------------------------------+

二.用系统库面板控件实现
1.效果

image.png

2.实现原理 完全类推contorls测试代码

image.png

3.代码实现
3.1EA代码

//+------------------------------------------------------------------+
//|                                            testControllersEA.mq5 |
//|                        Copyright 2017, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"

#include "ControlsDialog.mqh"
//+------------------------------------------------------------------+
//| Global Variables                                                 |
//+------------------------------------------------------------------+
CControlsDialog ExtDialog;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create application dialog
   if(!ExtDialog.Create(0,"Controls",0,20,20,300,250))
      return(INIT_FAILED);
//--- run application
   ExtDialog.Run();
//--- succeed
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy dialog
   ExtDialog.Destroy(reason);
  }
//+------------------------------------------------------------------+
//| Expert chart event function                                      |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,         // event ID  
                  const long& lparam,   // event parameter of the long type
                  const double& dparam, // event parameter of the double type
                  const string& sparam) // event parameter of the string type
  {
   ExtDialog.ChartEvent(id,lparam,dparam,sparam);
  }
//+------------------------------------------------------------------+

3.2类推控件库代码

//+------------------------------------------------------------------+
//|                                               ControlsDialog.mqh |
//|                   Copyright 2009-2017, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#include <Controls\Dialog.mqh>
#include <Controls\Label.mqh>
#include <Controls\Button.mqh>
#include <Controls\Edit.mqh>
#include <Controls\SpinEdit.mqh>

#include <wz\Trade.mqh>
#include <wz\Kline.mqh>
#include <wz\Draw.mqh>

input int magic=170506;

Trade td;
Kline kl;
Draw dr;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class CControlsDialog : public CAppDialog
  {
private:
   CLabel            m_label1;
   CLabel            m_label2;
   CLabel            m_label3;
   CEdit             m_edit;                          // the display field object
   CButton           m_button1;                       // the button object
   CButton           m_button2;                       // the button object
   CSpinEdit         m_spin_edit1;                     // the up-down object
   CSpinEdit         m_spin_edit2;

public:
                     CControlsDialog(void);
                    ~CControlsDialog(void);
   //--- create
   virtual bool      Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2);
   //--- chart event handler
   virtual bool      OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam);

protected:
   //--- create dependent controls
   bool              CreateLabel1(void);
   bool              CreateEdit(void);
   bool              CreateLabel2(void);
   bool              CreateSpinEdit1(void);
   bool              CreateLabel3(void);
   bool              CreateSpinEdit2(void);
   bool              CreateButton1(void);
   bool              CreateButton2(void);

   //--- create dependent controls
   void              OnClickButton1(void);
   void              OnClickButton2(void);
   void              OnChangeSpin_edit1(void);

  };
//+------------------------------------------------------------------+
//| Event Handling                                                   |
//+------------------------------------------------------------------+
EVENT_MAP_BEGIN(CControlsDialog)
ON_EVENT(ON_CLICK,m_button1,OnClickButton1)
ON_EVENT(ON_CLICK,m_button2,OnClickButton2)
ON_EVENT(ON_CHANGE,m_spin_edit1,OnChangeSpin_edit1)
EVENT_MAP_END(CAppDialog)
//+------------------------------------------------------------------+
//| Constructor                                                      |
//+------------------------------------------------------------------+
CControlsDialog::CControlsDialog(void)
  {
  }
//+------------------------------------------------------------------+
//| Destructor                                                       |
//+------------------------------------------------------------------+
CControlsDialog::~CControlsDialog(void)
  {
  }
//+------------------------------------------------------------------+
//| Create                                                           |
//+------------------------------------------------------------------+
bool CControlsDialog::Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2)
  {
   if(!CAppDialog::Create(chart,name,subwin,x1,y1,x2,y2))
      return(false);
//--- create dependent controls
   if(!CreateLabel1())
      return(false);
   if(!CreateEdit())
      return(false);
   if(!CreateLabel2())
      return(false);
   if(!CreateSpinEdit1())
      return(false);
   if(!CreateLabel3())
      return(false);
   if(!CreateSpinEdit2())
      return(false);
   if(!CreateButton1())
      return(false);
   if(!CreateButton2())
      return(false);

   return(true);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool CControlsDialog::CreateLabel1(void)
  {
   bool result=true;
   if(!m_label1.Create(0,"lable1",0,20,20,20+100,20+20))result=false;
   m_label1.Text("输入下单量:");
   if(!Add(m_label1))result=false;
   return result;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool CControlsDialog::CreateEdit(void)
  {
   bool result=true;
   if(!m_edit.Create(0,"lots_edit",0,20+100,20,20+100+100,20+20))result=false;
   m_edit.Text("0.1");
   m_edit.ReadOnly(false);
   if(!Add(m_edit))result=false;
   return result;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool CControlsDialog::CreateLabel2(void)
  {
   bool result=true;
   if(!m_label2.Create(0,"label2",0,20,20+20,20+100,20+20+20))result=false;
   m_label2.Text("输入止损点:");
   if(!Add(m_label2))result=false;
   return result;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool CControlsDialog::CreateSpinEdit1(void)
  {
   bool result=true;
   if(!m_spin_edit1.Create(0,"slPoint_spinEdit",0,20+100,20+20,20+100+100,20+20+20))result=false;
   m_spin_edit1.MaxValue(10000);
   m_spin_edit1.MinValue(100);
   m_spin_edit1.Value(200);
   if(!Add(m_spin_edit1))result=false;
   return result;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool CControlsDialog::CreateLabel3(void)
  {
   bool result=true;
   if(!m_label3.Create(0,"label3",0,20,20+20+20,20+100,20+20+20+20))result=false;
   m_label3.Text("输入止盈点:");
   if(!Add(m_label3))result=false;
   return result;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool CControlsDialog::CreateSpinEdit2(void)
  {
   bool result=true;
   if(!m_spin_edit2.Create(0,"tpPoint_spinEdit",0,20+100,20+20+20,20+100+100,20+20+20+20))result=false;
   m_spin_edit2.MaxValue(10000);
   m_spin_edit2.MinValue(100);
   m_spin_edit2.Value(200);
   if(!Add(m_spin_edit2))result=false;
   return result;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool CControlsDialog::CreateButton1(void)
  {
   bool result=true;
   if(!m_button1.Create(0,"openBuy_button",0,20,20+20+20+20+20,20+50,20+20+20+20+20+20))result=false;
   m_button1.Text("开多单");
   m_button1.Color(Red);
   if(!Add(m_button1))result=false;
   return result;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool CControlsDialog::CreateButton2(void)
  {
   bool result=true;
   if(!m_button2.Create(0,"openSell_button",0,20+50+50,20+20+20+20+20,20+50+50+50,20+20+20+20+20+20))result=false;
   m_button2.Text("开空单");
   m_button2.Color(Yellow);
   m_button2.ColorBackground(clrBlack);
   if(!Add(m_button2))result=false;
   return result;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void CControlsDialog::OnClickButton1(void)
  {
   double lots=StringToDouble(m_edit.Text());
   int sl=StringToInteger(m_spin_edit1.Value());
   int tp=StringToInteger(m_spin_edit2.Value());
   td.buy(Symbol(),td.formatLots(Symbol(),lots),sl,tp,Symbol()+"buy",magic);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void CControlsDialog::OnClickButton2(void)
  {
   double lots=StringToDouble(m_edit.Text());
   int sl=StringToInteger(m_spin_edit1.Value());
   int tp=StringToInteger(m_spin_edit2.Value());
   td.sell(Symbol(),td.formatLots(Symbol(),lots),sl,tp,Symbol()+"sell",magic);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void CControlsDialog::OnChangeSpin_edit1(void)
  {
   string sp=m_spin_edit1.Value();
   m_spin_edit1.Value(sp);
  }
//+------------------------------------------------------------------+

如果您发现本文对你有所帮助,如果您认为其他人也可能受益,请把它分享出去。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 224,535评论 6 522
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 96,106评论 3 402
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 171,668评论 0 366
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 60,863评论 1 300
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 69,874评论 6 399
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 53,362评论 1 314
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 41,748评论 3 428
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 40,717评论 0 279
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 47,249评论 1 324
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 39,280评论 3 345
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 41,408评论 1 354
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 37,020评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 42,727评论 3 337
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 33,191评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 34,320评论 1 275
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 49,946评论 3 381
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 46,473评论 2 365

推荐阅读更多精彩内容