诚信为本
量力而为
当前位置:ea编程网 EA知识 正文

创建和管理标签对象在MQL4中的应用

本文将详细介绍如何在MQL4中创建和管理标签对象(Label Object),并且深入探讨如何使用不同的属性和函数来定制和操作这些对象。

MQL4中的标签对象

标签对象概述

标签对象(Label Object)是MetaTrader 4平台中的一种图形对象,用于在交易图表上显示文本信息。通过标签对象,您可以精确控制文本的位置、字体、颜色以及与图表窗口边角的相对关系。标签对象通常用于显示价格标签、技术指标值或自定义注释,以辅助交易决策或分析市场走势。

枚举和属性

在MQL4中,标签对象的创建和定位依赖于以下关键属性:

  • OBJPROP_CORNER:指定标签对象相对于图表的哪个角落定位。
  • OBJPROP_ANCHOR:定义标签对象相对于自身的锚点位置。
  • OBJPROP_TEXT:设置标签对象显示的文本内容。
  • OBJPROP_FONTOBJPROP_FONTSIZE:控制文本的字体和大小。
  • OBJPROP_COLOR:指定文本的颜色。
  • OBJPROP_XDISTANCEOBJPROP_YDISTANCE:设置标签对象的X和Y坐标位置。

示例代码解析

以下是一个示例脚本,演示了如何创建、移动和更改标签对象的属性:

#property strict
#property description "Script creates \"Label\" graphical object."

input string            InpName="Label";         // 标签名称
input int               InpX=150;                // X轴距离
input int               InpY=150;                // Y轴距离
input string            InpFont="Arial";         // 字体
input int               InpFontSize=14;          // 字体大小
input color             InpColor=clrRed;         // 颜色
input double            InpAngle=0.0;            // 倾斜角度
input ENUM_ANCHOR_POINT InpAnchor=ANCHOR_CENTER; // 锚点类型
input bool              InpBack=false;           // 背景对象
input bool              InpSelection=true;       // 高亮显示以移动
input bool              InpHidden=true;          // 在对象列表中隐藏
input long              InpZOrder=0;             // 鼠标点击优先级

// 创建标签对象
bool LabelCreate(const long              chart_ID=0,
                 const string            name="Label",
                 const int               sub_window=0,
                 const int               x=0,
                 const int               y=0,
                 const ENUM_BASE_CORNER  corner=CORNER_LEFT_UPPER,
                 const string            text="Label",
                 const string            font="Arial",
                 const int               font_size=10,
                 const color             clr=clrRed,
                 const double            angle=0.0,
                 const ENUM_ANCHOR_POINT anchor=ANCHOR_LEFT_UPPER,
                 const bool              back=false,
                 const bool              selection=false,
                 const bool              hidden=true,
                 const long              z_order=0)
{
   // 重置错误状态
   ResetLastError();
   // 创建文本标签
   if(!ObjectCreate(chart_ID, name, OBJ_LABEL, sub_window, 0, 0))
   {
      Print(__FUNCTION__, ": 创建文本标签失败!错误代码 = ", GetLastError());
      return false;
   }
   // 设置标签坐标
   ObjectSetInteger(chart_ID, name, OBJPROP_XDISTANCE, x);
   ObjectSetInteger(chart_ID, name, OBJPROP_YDISTANCE, y);
   // 设置锚点类型
   ObjectSetInteger(chart_ID, name, OBJPROP_ANCHOR, anchor);
   // 设置文本内容
   ObjectSetString(chart_ID, name, OBJPROP_TEXT, text);
   // 设置字体
   ObjectSetString(chart_ID, name, OBJPROP_FONT, font);
   // 设置字体大小
   ObjectSetInteger(chart_ID, name, OBJPROP_FONTSIZE, font_size);
   // 设置文本颜色
   ObjectSetInteger(chart_ID, name, OBJPROP_COLOR, clr);
   // 设置倾斜角度
   ObjectSetDouble(chart_ID, name, OBJPROP_ANGLE, angle);
   // 设置背景显示
   ObjectSetInteger(chart_ID, name, OBJPROP_BACK, back);
   // 设置是否可选择移动
   ObjectSetInteger(chart_ID, name, OBJPROP_SELECTABLE, selection);
   ObjectSetInteger(chart_ID, name, OBJPROP_SELECTED, selection);
   // 设置是否隐藏在对象列表中
   ObjectSetInteger(chart_ID, name, OBJPROP_HIDDEN, hidden);
   // 设置鼠标点击优先级
   ObjectSetInteger(chart_ID, name, OBJPROP_ZORDER, z_order);
   // 操作成功
   return true;
}

// 移动文本标签
bool LabelMove(const long   chart_ID=0,
               const string name="Label",
               const int    x=0,
               const int    y=0)
{
   // 重置错误状态
   ResetLastError();
   // 移动文本标签
   if(!ObjectSetInteger(chart_ID, name, OBJPROP_XDISTANCE, x))
   {
      Print(__FUNCTION__, ": 移动X坐标失败!错误代码 = ", GetLastError());
      return false;
   }
   if(!ObjectSetInteger(chart_ID, name, OBJPROP_YDISTANCE, y))
   {
      Print(__FUNCTION__, ": 移动Y坐标失败!错误代码 = ", GetLastError());
      return false;
   }
   // 操作成功
   return true;
}

// 修改标签对象的角落位置
bool LabelChangeCorner(const long             chart_ID=0,
                       const string           name="Label",
                       const ENUM_BASE_CORNER corner=CORNER_LEFT_UPPER)
{
   // 重置错误状态
   ResetLastError();
   // 修改锚点角落位置
   if(!ObjectSetInteger(chart_ID, name, OBJPROP_CORNER, corner))
   {
      Print(__FUNCTION__, ": 修改锚点角落失败!错误代码 = ", GetLastError());
      return false;
   }
   // 操作成功
   return true;
}

// 修改标签对象的文本内容
bool LabelTextChange(const long   chart_ID=0,
                     const string name="Label",
                     const string text="Text")
{
   // 重置错误状态
   ResetLastError();
   // 修改对象文本
   if(!ObjectSetString(chart_ID, name, OBJPROP_TEXT, text))
   {
      Print(__FUNCTION__, ": 修改文本失败!错误代码 = ", GetLastError());
      return false;
   }
   // 操作成功
   return true;
}

// 删除文本标签
bool LabelDelete(const long   chart_ID=0,
                 const string name="Label")
{
   // 重置错误状态
   ResetLastError();
   // 删除标签
   if(!ObjectDelete(chart_ID, name))
   {
      Print(__FUNCTION__, ": 删除文本标签失败!错误代码 = ", GetLastError());
      return false;
   }
   // 操作成功
   return true;
}

// 脚本程序开始函数
void OnStart()
{
   // 存储标签的坐标
   int x = InpX;
   int y = InpY;
   // 获取图表窗口尺寸
   long x_distance, y_distance;
   if(!ChartGetInteger(0, CHART_WIDTH_IN_PIXELS, 0, x_distance))
   {
      Print("获取图表宽度失败!错误代码 = ", GetLastError());
      return;
   }
   if(!ChartGetInteger(0, CHART_HEIGHT_IN_PIXELS, 0, y_distance))
   {
      Print("获取图表高度失败!错误代码 = ", GetLastError());
      return;
   }
   // 检查输入参数的正确性
   if(InpX < 0 || InpX > x_distance - 1 || InpY < 0 || InpY > y_distance - 1)
   {
      Print("错误!输入参数值不正确!");
      return;
   }
   // 准备标签的初始文本
   string text = StringConcatenate("左上角: ", x, ",", y);
   // 在图表上创建文本标签
   if(!LabelCreate(0, InpName, 0, InpX, InpY, CORNER_LEFT_UPPER, text, InpFont, InpFontSize,
                   InpColor, Inp

Angle, InpAnchor, InpBack, InpSelection, InpHidden, InpZOrder))
   {
      return;
   }
   // 重绘图表并等待半秒钟
   ChartRedraw();
   Sleep(500);
   // 向下移动标签并同时修改其文本
   int h_steps = (int)(x_distance / 2 - InpX);
   int v_steps = (int)(y_distance / 2 - InpY);
   for(int i = 0; i < v_steps; i++)
   {
      // 改变坐标
      y += 2;
      // 移动标签并修改文本
      MoveAndTextChange(x, y, "左上角: ");
   }
   Sleep(500);
   // 向右移动标签
   for(int i = 0; i < h_steps; i++)
   {
      // 改变坐标
      x += 2;
      // 移动标签并修改文本
      MoveAndTextChange(x, y, "左上角: ");
   }
   Sleep(500);
   // 向上移动标签
   for(int i = 0; i < v_steps; i++)
   {
      // 改变坐标
      y -= 2;
      // 移动标签并修改文本
      MoveAndTextChange(x, y, "左上角: ");
   }
   Sleep(500);
   // 向左移动标签
   for(int i = 0; i < h_steps; i++)
   {
      // 改变坐标
      x -= 2;
      // 移动标签并修改文本
      MoveAndTextChange(x, y, "左上角: ");
   }
   Sleep(500);
   // 现在,通过更改锚点角落移动标签
   // 移动到左下角
   if(!LabelChangeCorner(0, InpName, CORNER_LEFT_LOWER))
      return;
   // 更改标签文本
   text = StringConcatenate("左下角: ", x, ",", y);
   if(!LabelTextChange(0, InpName, text))
      return;
   ChartRedraw();
   Sleep(2000);
   // 移动到右下角
   if(!LabelChangeCorner(0, InpName, CORNER_RIGHT_LOWER))
      return;
   // 更改标签文本
   text = StringConcatenate("右下角: ", x, ",", y);
   if(!LabelTextChange(0, InpName, text))
      return;
   ChartRedraw();
   Sleep(2000);
   // 移动到右上角
   if(!LabelChangeCorner(0, InpName, CORNER_RIGHT_UPPER))
      return;
   // 更改标签文本
   text = StringConcatenate("右上角: ", x, ",", y);
   if(!LabelTextChange(0, InpName, text))
      return;
   ChartRedraw();
   Sleep(2000);
   // 移动到左上角
   if(!LabelChangeCorner(0, InpName, CORNER_LEFT_UPPER))
      return;
   // 更改标签文本
   text = StringConcatenate("左上角: ", x, ",", y);
   if(!LabelTextChange(0, InpName, text))
      return;
   ChartRedraw();
   Sleep(2000);
   // 删除标签
   LabelDelete(0, InpName);
   ChartRedraw();
   Sleep(500);
}

// 移动对象并修改文本的功能
bool MoveAndTextChange(const int x, const int y, string text)
{
   // 移动标签
   if(!LabelMove(0, InpName, x, y))
      return false;
   // 更改标签文本
   text = StringConcatenate(text, x, ",", y);
   if(!LabelTextChange(0, InpName, text))
      return false;
   // 重绘图表
   ChartRedraw();
   // 等待0.01秒
   Sleep(10);
   // 函数结束
   return true;
}

结论

通过本文,您学习了如何在MQL4中使用标签对象创建、定位和管理文本标签。这些技术可以帮助您更好地管理交易图表上的信息展示,从而提升交易决策的效率和准确性。在实际应用中,您可以根据具体需求调整标签对象的属性,以实现定制化的交易辅助功能。

未经允许不得转载:ea编程网 » 创建和管理标签对象在MQL4中的应用