首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MQL4绘制包含文本的动态Rectangle_Label

MQL4绘制包含文本的动态Rectangle_Label
EN

Stack Overflow用户
提问于 2018-08-31 02:20:05
回答 2查看 5.5K关注 0票数 -1

我正在尝试绘制一个矩形标签,其中每个刻度都包含一个文本。我想要一个完全适合Rectangle_Label的文本。作为一个文本,我使用的是Label..但是不能让它准确地工作..它的位置不正确。

事实上,我想创建一个类,它将在一个...就像一个包含文本的矩形,它总是具有相同的坐标和大小等。

任何帮助都将不胜感激。

代码语言:javascript
运行
复制
 bool createRectangleLabel(long chart_ID,string name,string labelName,int shift,double price,string text,double xSize,double ySize,double xOffSet,double yOffSet,double xDistance,double yDistance)
     {
      if(ObjectCreate(chart_ID,labelName,OBJ_RECTANGLE_LABEL,0,TimeCurrent()-shift,price))
    {
     Print(xDistance+"  "+yDistance);
     ObjectSetInteger(chart_ID,labelName,OBJPROP_BGCOLOR,clrBlack);
     ObjectSetInteger(chart_ID,labelName,OBJPROP_XDISTANCE,xDistance);
     ObjectSetInteger(chart_ID,labelName,OBJPROP_YDISTANCE,yDistance);
     ObjectSetInteger(chart_ID,labelName,OBJPROP_YSIZE,ySize);
     ObjectSetInteger(chart_ID,labelName,OBJPROP_XSIZE,xSize);
     ObjectSetString(chart_ID,labelName,OBJPROP_TEXT,text);
     ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,ANCHOR_CENTER);

     return true;
    }
  else
    {
     Print("createRectangleLabel return error code: ",GetLastError());
     Print("+--------------------------------------------------------------+");
     return false;
    }
 }
   bool createLineText(long chart_ID,string name,string labelName,int shift,double price,string text)
 {
  int xDistance=0;
  int yDistance=0;
  int xSize,xOffSet;
  int ySize,yOffSet;
  bool i=ChartTimePriceToXY(chart_ID,0,TimeCurrent(),price,xDistance,yDistance);

  if(ObjectCreate(chart_ID,name,OBJ_LABEL,0,TimeCurrent()-shift,price))
    {
     ObjectSetInteger(chart_ID,name,OBJPROP_BGCOLOR,clrWhite);
     ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,xDistance);
     ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,yDistance);
     ObjectSetString(chart_ID,name,OBJPROP_TEXT,text);
     ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,ANCHOR_CENTER);
     ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clrWhite);
     ObjectSetInteger(chart_ID,name,OBJPROP_FONTSIZE,10);
     xSize = ObjectGet(name,OBJPROP_XSIZE);
     ySize = ObjectGet(name,OBJPROP_YSIZE);
     xOffSet = ObjectGet(name,OBJPROP_XOFFSET);
     yOffSet = ObjectGet(name,OBJPROP_YOFFSET);
     TextGetSize(name,xSize,ySize);
     createRectangleLabel(chart_ID,name,labelName,shift,price,text,xSize,ySize,xOffSet,yOffSet,xDistance,yDistance);
     return true;
    }
  else
    {
     Print("createLineText return error code: ",GetLastError());
     Print("+--------------------------------------------------------------+");
     return false;
    }
 }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-08-31 22:59:08

当你说你想创建一个类的时候,你的想法是正确的。幸运的是,standard library已经包含了创建图表对象所需的所有类。Documentation

示例指标:

代码语言:javascript
运行
复制
#property strict
#property indicator_chart_window

#include <ChartObjects\ChartObjectsTxtControls.mqh>

class MyRectLabel : public CChartObjectRectLabel
{
   CChartObjectLabel m_label;
public:
   bool Create(long chart, const string name, const int window, 
               const int X, const int Y, const int sizeX, const int sizeY)
   {
      if(!CChartObjectRectLabel::Create(chart,name,window,X,Y,sizeX,sizeY))
         return false;
      return m_label.Create(chart, name + "_", window, X + 8, Y + 12);
   }
   bool Color(const color clr){
      return m_label.Color(clr);
   }
   bool Description(const string text){
      return m_label.Description(text);
   }
   bool FontSize(const int size){
      return m_label.FontSize(size);
   }
   bool ToolTip(const string text){
      return (this.ToolTip(text) && m_label.Tooltip(text));
   }
};
//+------------------------------------------------------------------+
MyRectLabel rect_label;
//+------------------------------------------------------------------+
int OnInit()
{
   if(!rect_label.Create(0, "rlabel", 0, 5, 25, 100, 50)
      || !rect_label.BackColor(clrWhiteSmoke)
      || !rect_label.Description("LABEL!")
      || !rect_label.Tooltip("I am a rectangle label")
      || !rect_label.Color(clrBlack)
      || !rect_label.FontSize(18)
   )
      return INIT_FAILED;
   return INIT_SUCCEEDED;
}
//+------------------------------------------------------------------+
int start()
{ 
   static double last_price = 0.;
   rect_label.Description(DoubleToString(Bid, _Digits));
   if(Bid > last_price)
      rect_label.Color(clrLimeGreen);
   else
      rect_label.Color(clrRed);
   last_price = Bid;
   return 0; 
}
票数 0
EN

Stack Overflow用户

发布于 2018-08-31 05:36:00

你不能每次都调用ObjectCreate() --它会返回一个4200错误。如果您在创建之前检查对象是否存在,这将有所帮助。另一种方法是尝试创建对象,并在一个块中为其分配一些必要的属性(例如,对象的颜色、锚点等),然后在另一个块中移动它。

代码语言:javascript
运行
复制
if(ObjectFind(chart_id,labelName)<0){
   if(ObjectCreate(chart_ID,labelName,OBJ_RECTANGLE_LABEL,0,TimeCurrent()-shift,price)){
      ObjectSetInteger(chart_ID,labelName,OBJPROP_BGCOLOR,clrBlack);//etc.
   }
   ObjectSetInteger(chart_ID,labelName,OBJPROP_XDISTANCE,xDistance);
   ObjectSetInteger(chart_ID,labelName,OBJPROP_YDISTANCE,yDistance);//if you need to move the object or take other steps each tick, e.g. update text - do it here
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52103202

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档