Object MQL4绘制包含文本的动态矩形标签
我正在尝试绘制一个矩形标签,每个刻度上都有一个文本。。我想要一个与矩形标签完全匹配的文本。。作为文本,我使用标签。。但我不能让它完全发挥作用。。它的位置不正确 事实上,我想创建一个类,可以在一个。。。就像一个有文本的长方形,总是有相同的大小等等 任何帮助都将不胜感激Object MQL4绘制包含文本的动态矩形标签,object,label,mql4,drawrectangle,Object,Label,Mql4,Drawrectangle,我正在尝试绘制一个矩形标签,每个刻度上都有一个文本。。我想要一个与矩形标签完全匹配的文本。。作为文本,我使用标签。。但我不能让它完全发挥作用。。它的位置不正确 事实上,我想创建一个类,可以在一个。。。就像一个有文本的长方形,总是有相同的大小等等 任何帮助都将不胜感激 bool createRectangleLabel(long chart_ID,string name,string labelName,int shift,double price,string text,double xSiz
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;
}
}
不能每次勾选都调用
ObjectCreate()
,它将返回一个错误4200。
如果在创建之前检查对象是否存在,这会有所帮助。另一种方法是尝试创建对象,并在一个块中为其指定一些必要的属性(例如,对象的颜色、锚点等),然后将其移动到另一个块中
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
}
if(ObjectFind(chart\u id,labelName)当你说你想创建一个类时,你的思路是正确的。幸运的是,标准库已经包含了创建图表对象所需的所有类
示例指标:
#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;
}
#属性严格
#属性指示器\u图表\u窗口
#包括
类MyRectLabel:公共CChartObjectRectLabel
{
CChartObjectLabel MU标签;
公众:
bool Create(长图表、常量字符串名称、常量int窗口、,
常量整数X,常量整数Y,常量整数sizeX,常量整数sizeY)
{
如果(!CChartObjectRectLabel::Create(图表、名称、窗口、X、Y、sizeX、sizeY))
返回false;
返回m_标签。创建(图表,名称+“_”,窗口,X+8,Y+12);
}
布尔颜色(常量颜色clr){
返回m_标签颜色(clr);
}
布尔描述(常量字符串文本){
返回m_标签。说明(文本);
}
布尔字体大小(常量整数大小){
返回m_标签。字体大小(大小);
}
布尔工具提示(常量字符串文本){
返回(此.ToolTip(文本)和&m_标签.ToolTip(文本));
}
};
//+------------------------------------------------------------------+
myrect标签rect_标签;
//+------------------------------------------------------------------+
int OnInit()
{
如果(!rect_label.Create(0,“rlabel”,0,5,25100,50)
||!rect_label.BackColor(clrWhiteMoke)
||!rect_label.Description(“label!”)
||!rect_label.工具提示(“我是矩形标签”)
||!rect_label.Color(黑色)
||!rect_label.FontSize(18)
)
返回INIT_失败;
返回INIT_成功;
}
//+------------------------------------------------------------------+
int start()
{
静态双倍最后价格=0。;
矩形标签说明(双字符串(投标,数字));
如果(投标>最后价格)
矩形标签颜色(clrLimeGreen);
其他的
矩形标签颜色(红色);
最后价格=投标;
返回0;
}
谢谢你的回答,但我已经在代码的其他部分处理了这个问题…我的问题是关于确保标签对象和矩形标签的正确定位…我希望它们始终在同一位置,改变每个记号…谢谢…我的回答完全符合你的情况。你在OnInit()
部分,然后在OnTick()
块移动对象,方法是检查对象是否存在(如果手动删除-确定,然后再次创建),以及ObjectSetInteger()
之后ObjectFind()
)感谢您的努力,但请确保在回答之前理解问题。。我认真地问了其他问题,而不是处理对象的创建和删除。。我已经处理好了,但还有一些事情没有处理。。非常感谢您在这个方向上所做的努力。我有另一个类来确保对象在创建之前被删除。。我请求帮助,以便始终将这两个对象的图形位置保持在同一位置…很好。。。好奇为什么我在谷歌搜索中没有找到任何指向我的东西。。。非常感谢。