在图表中添加一个按钮

AutoBringChartToTop.mq4

//+------------------------------------------------------------------+
//|                                           AutoBringChartToTop.mq4|
//|                        Copyright 2013, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
//2017-05-25 12:42:27 publish to MQL5.COM codebase
//2016-02-18 14:51:31 add input ENUM_BASE_CORNER Corner=3;
/*
Note:
https://www.mql5.com/en/docs/constants/objectconstants/enum_anchorpoint
The OBJ_BUTTON, OBJ_RECTANGLE_LABEL and OBJ_EDIT objects
have a fixed anchor point in the upper left corner (ANCHOR_LEFT_UPPER).
*/

//2014-5-1 22:07 coded

#property copyright "Copyright 2014,fxMeter."
#property link      "https://www.mql5.com/en/users/fxmeter"
#property version   "1.00"
#property strict
#property indicator_chart_window
#include <ChartObjects\ChartObjectsTxtControls.mqh>
//--- input parameters
input ENUM_BASE_CORNER Corner = 3;
input int  ShiftX = 5;
input int  ShiftY = 15;
input int  IntervalSeconds = 3;

CChartObjectButton ExtBtn; //object to create button
string btnName = "fmtbtnAlt_show"; //button name
long chartToTop = -1, nextChart = -1; //chartID to bringh it top, next ChartID to bring to top
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit() {
//---

//--- create button
    int width = 100, height = 30; // width and height of button
    if(!ButtonCreate(ExtBtn, btnName, ShiftX, ShiftY, width, height, Corner)) {
        Alert("Create buttons failed!");
        return(INIT_FAILED);
    }
    ExtBtn.SetString(OBJPROP_TEXT, "OFF"); // init button text to OFF

//---set timer
    if(!EventSetTimer(IntervalSeconds))
        return(INIT_FAILED);
//---
    return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int reason) {
    EventKillTimer();
    ObjectDelete(0, btnName);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[]) {
//---

//--- return value of prev_calculated for next call
    return(rates_total);
}
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer() {
//---
    if(chartToTop > 0) { // or if(ExtBtn.GetString(OBJPROP_TEXT)=="ON")
        ChartSetInteger(chartToTop, CHART_BRING_TO_TOP, true);

        nextChart = ChartNext(chartToTop); // if nextChart==-1,chartToTop=ChartFirst();
        chartToTop = nextChart;
        if(chartToTop == -1)chartToTop = ChartFirst();

    }

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

//--- click button to switch ON/OFF
    if(id == CHARTEVENT_OBJECT_CLICK) {
        if(sparam == btnName) { //button is clicked
            if(chartToTop == -1) { // or if(ExtBtn.GetString(OBJPROP_TEXT)=="OFF")
                ExtBtn.SetString(OBJPROP_TEXT, "ON"); //set the current state to ON
                ExtBtn.BackColor(clrYellowGreen);
                ExtBtn.BorderColor(clrYellowGreen);
                chartToTop = ChartFirst(); //work from the first chart.
            } else { //switch to OFF
                ExtBtn.SetString(OBJPROP_TEXT, "OFF"); //set the current state to OFF
                ExtBtn.BackColor(clrTomato);
                ExtBtn.BorderColor(clrTomato);
                chartToTop = -1; // stop
            }
        }
    }

}
//+------------------------------------------------------------------+
bool ButtonCreate(CChartObjectButton &btn, const string name,
                  const int x, const int y, int width, int height, ENUM_BASE_CORNER corner = CORNER_RIGHT_LOWER) {

//---button coordinate, relative to the corner of chart
    int pointX = 0, pointY = 0; //Exactly,it is the coordinate of the button's LEFT_UPPER

//---Note:when create buttons,the anchor point is always the button's LEFT_UPPER
//---It means we should use the coordinate of the LEFT_UPPER point to create button.
//---So,calculte the coordinate of the LEFT_UPPER point (anchor point)

    /* this code is ok in MQL4,but it is not correct in MQL5.
       if(corner==0){ pointX=x; pointY=y;} //corner=0,button is at the left upper of chart
       if(corner==1){ pointX= x+width; pointY = y;} //1
       if(corner==2){ pointX = x; pointY = height+y;}//2
       if(corner==3){ pointX=x+width; pointY=y+height;}//3
    */

    if(corner == CORNER_LEFT_UPPER) {
        pointX = x;    //corner=0,button is at the left upper of chart
        pointY = y;
    }
    if(corner == CORNER_RIGHT_UPPER) {
        pointX = x + width;    //1
        pointY = y;
    }
    if(corner == CORNER_LEFT_LOWER) {
        pointX = x;    //2
        pointY = height + y;
    }
    if(corner == CORNER_RIGHT_LOWER) {
        pointX = x + width;    //3
        pointY = y + height;
    }

//---Create button
    if(!btn.Create(0, name, 0, pointX, pointY, width, height)) return(false);
    if(!btn.Corner(corner)) return(false);
    if(!btn.FontSize(10)) return(false);
    if(!btn.Color(clrWhite)) return(false);//OBJPROP_COLOR: the color of text on button
    if(!btn.BackColor(clrTomato)) return(false);//OBJPROP_BGCOLOR
    if(!btn.BorderColor(clrTomato)) return(false);//OBJPROP_BORDER_COLOR,same as backcolor to make button flat.
    if(!btn.SetInteger(OBJPROP_HIDDEN, true))return(false);
    if(!btn.SetInteger(OBJPROP_SELECTABLE, false))return(false);
//--- successful execution
    return(true);
}
//+------------------------------------------------------------------+

打印/导出