第二十五章 物件函数
这是一组用于处理与图表相关的任何指定图形对象的函数。
定义图形对象属性的函数,以及用于根据图表创建图形对象的函数ObjectCreate() 和 移动物件的ObjectMove()函数,实际上是用来向图表发送命令的。如果这些函数成功执行,那么这个命令就包含在图表事件的公共队列中。当处理图表事件的队列时,将会实施(看到)图解物件属性的可视变化。
因此,调用这些函数以后,不要期望图解物件会立即有可视化的改变。通常情况下,图表上的图解物件会在变更事件之后自动更新 —— 接收到一个新报价,调整了图表窗口大小等。使用ChartRedraw()函数,可以强制立即更新图解物件。
函数 | 功能 |
---|---|
ObjectCreate | 在指定的图表窗口中创建指定类型图形物件 |
ObjectName | 返回指定图表窗口中相关类型物件名称(或 指定图表子窗口) |
ObjectDelete | 从指定图表移除指定名称的物件(或 从指定图表子窗口) |
ObjectsDeleteAll | 从指定图表移除指定类型的所有物件(从指定图表子窗口) |
ObjectFind | 依据名称搜索指定ID的物件 |
ObjectGetTimeByValue | 对指定物件的 价格值 返回 时间值 |
ObjectGetValueByTime | 对指定时间返回物件的价格值 |
ObjectMove | 改变指定物件的定位点坐标(即移动图形对象) |
ObjectsTotal | 返回指定图表中指定类型物件数(或 指定图表子窗口) |
ObjectGetDouble | 返回相应物件属性的双精度值 |
ObjectGetInteger | 返回相应物件属性的整数型值 |
ObjectGetString | 返回相应物件属性的字符串值 |
ObjectSetDouble | 设置相应物件属性值 |
ObjectSetInteger | 设置相应物件属性值 |
ObjectSetString | 设置相应物件属性值 |
TextSetFont | 设置使用绘制方法展示的文本字体(默认使用Arial 20) |
TextOut | 文本转到专为创建图形资源而设计的自定义数组(缓冲区) |
TextGetSize | 返回当前字体设置的字符串宽度和高度 |
每个图形对象在一个图表中应该具有一个唯一的名称,包括子窗口。更改图形对象的名称会生成两个事件:删除具有旧名称的对象;使用新名称创建对象。
创建对象或修改对象属性后,建议调用ChartRedraw()函数,该函数命令客户端立即强制重新绘制一次图表(以及其中的所有可见对象)。
# 25.1 ObjectCreate
此函数用于在指定图表窗口(或副图子窗口)中,按指定的名称,类型和初始坐标创建图形物件,在创建期间最多可以指定30个坐标。
bool ObjectCreate(
long chart_id, // 图表标识符
string name, // 物件名称
ENUM_OBJECT type, // 物件类型
int sub_window, // 窗口索引
datetime time1, // 第一定位点的时间
double price1, // 第一定位点的价格
...
datetime timeN=0, // 第N个定位点的时间
double priceN=0, //
...
datetime time30=0, // 第30个定位点的时间
double price30=0 // 第30个定位点的价格
);
2
3
4
5
6
7
8
9
10
11
12
13
14
参数
chart_id
[in] 图表标识符。0代表当前图表。
name
[in] 物件名称。该名称在图表中是唯一的,包括子窗口。
类型
[in] 物件类型。取值范围是 ENUM_OBJECT 枚举值之一。
sub_window
[in] 图表子窗口数量。0代表主图表窗口。如果是指定子窗口,则子窗口必须存在,否则函数返回错误值。
time1
[in] 第一个定位点的时间坐标。
price1
[in] 第一个定位点的价格坐标。
timeN=0
[in] 第N点时间坐标。
priceN=0
[in] 第N点的价格坐标。
time30=0
[in] 第三十个定位点的时间坐标。
price30=0
[in] 第三十个定位点的价格坐标。
返回值
如果命令成功添加图形对象到指定图表队列那么函数返回true,否则返回false。如果对象已经创建,则会尝试改变它的坐标。
注意
非同步调用通常用于ObjectCreate(),这也是函数仅返回命令添加到图表队列的结果。在这种情况下,true仅表示命令已成功加入队列,但执行结果尚不可知。
若要检查命令执行结果,您可以使用ObjectFind()函数或任何其它请求对象属性的函数,例如ObjectGetXXX。但是,您需要牢记的是这类函数将被加入到图表的队尾,需要等待执行结果(因为同步调用),因此,可能会耗费大量时间。当处理图表上的大量对象时应该考虑这个特性。
对象名称不应超过63个字符。
图表子窗口的数量(如果图表中有附带指标的子窗口)以1开始,图表主窗口总是以0开始检索。
实施大量锚点(最多30个)以供将来使用。同时,图形对象的30个可能锚点的限制与调用函数时可以使用的物件名称参数的数量限制有关(不超过64)。(意即:此函数最多可以一次创建64个图形对象,并且最多使用30个定位锚点。—— 智能交易*姚 提示)
重命名图形对象时,会同时形成两个事件。这些事件可以通过OnChartEvent()函数在EA交易程序 或 指标中处理:
• 删除具有旧名称的对象的事件;
• 使用新名称创建对象的事件。
下表是创建每个图形物件类型时必须指定的锚点(定位点)数量:
ID | 描述 | 定位点 |
---|---|---|
OBJ_VLINE | 垂直线 | 一个定位点。只使用时间坐标。 |
OBJ_HLINE | 水平线 | 一个定位点。只使用价格坐标。 |
OBJ_TREND | 趋势线 | 两个定位点。 |
OBJ_TRENDBYANGLE | 角度趋势线 | 两个定位点。 |
OBJ_CYCLES | 循环线 | 两个定位点。 |
OBJ_ARROWED_LINE | 箭头线 | 两个定位点。 |
OBJ_CHANNEL | 等距通道 | 三个定位点。 |
OBJ_STDDEVCHANNEL | 标准偏差通道 | 两个定位点。 |
OBJ_REGRESSION | 线性回归通道 | 两个定位点。 |
OBJ_PITCHFORK | 安德鲁鱼叉理论 | 三个定位点。 |
OBJ_GANNLINE | 江恩线 | 两个定位点。 |
OBJ_GANNFAN | 江恩扇形线 | 两个定位点。 |
OBJ_GANNGRID | 江恩网格 | 两个定位点。 |
OBJ_FIBO | 斐波纳契回调线 | 两个定位点。 |
OBJ_FIBOTIMES | 斐波纳契时间周期线 | 两个定位点。 |
OBJ_FIBOFAN | 斐波纳契扇形线 | 两个定位点。 |
OBJ_FIBOARC | 斐波纳契角度线 | 两个定位点。 |
OBJ_FIBOCHANNEL | 斐波纳契通道 | 三个定位点。 |
OBJ_EXPANSION | 斐波纳契扩展线 | 三个定位点。 |
OBJ_ELLIOTWAVE5 | 埃利奥特波动 | 五个定位点。 |
OBJ_ELLIOTWAVE3 | 埃利奥特修正波 | 三个定位点。 |
OBJ_RECTANGLE | 矩形 | 两个定位点。 |
OBJ_TRIANGLE | 三角形 | 三个定位点。 |
OBJ_ELLIPSE | 椭圆形 | 三个定位点。 |
OBJ_ARROW_THUMB_UP | 拇指向上 | 一个定位点。 |
OBJ_ARROW_THUMB_DOWN | 拇指向下 | 一个定位点。 |
OBJ_ARROW_UP | 箭头向上 | 一个定位点。 |
OBJ_ARROW_DOWN | 箭头向下 | 一个定位点。 |
OBJ_ARROW_STOP | 停止符号 | 一个定位点。 |
OBJ_ARROW_CHECK | 检查符号 | 一个定位点。 |
OBJ_ARROW_LEFT_PRICE | 向左价格标签 | 一个定位点。 |
OBJ_ARROW_RIGHT_PRICE | 向右价格标签 | 一个定位点。 |
OBJ_ARROW_BUY | 买入符号 | 一个定位点。 |
OBJ_ARROW_SELL | 卖出符号 | 一个定位点。 |
OBJ_ARROW | 箭头 | 一个定位点。 |
OBJ_TEXT | 文本 | 一个定位点。 |
OBJ_LABEL | 标签 | 使用 OBJPROP_XDISTANCE 和 OBJPROP_YDISTANCE 属性设置位置。 |
OBJ_BUTTON | 按钮 | 使用 OBJPROP_XDISTANCE and OBJPROP_YDISTANCE属性设置位置。 |
OBJ_CHART | 图表 | 使用 OBJPROP_XDISTANCE and OBJPROP_YDISTANCE属性设置位置。 |
OBJ_BITMAP | 位图 | 一个定位点。 |
OBJ_BITMAP_LABEL | 位图标签 | 使用 OBJPROP_XDISTANCE and OBJPROP_YDISTANCE 属性设置位置。 |
OBJ_EDIT | 编辑 | 使用OBJPROP_XDISTANCE and OBJPROP_YDISTANCE 属性设置位置。 |
OBJ_EVENT | 经济日历中对应事件的"事件"物件 | 一个定位点。实际上只使用时间坐标。 |
OBJ_RECTANGLE_LABEL | 用于创建和设计自定义图形界面的“矩形标签”对象。 | 使用OBJPROP_XDISTANCE and OBJPROP_YDISTANCE 属性设置位置。 |
# 25.2 ObjectName
该函数返回指定图表窗口中(或 副图子窗口中)指定类型的相应对象的名称。
string ObjectName(
long chart_id, // 图表标识符
int pos, // 物件列表中的数量
int sub_window=-1, // 窗口索引
int type=-1 // 物件类型
);
2
3
4
5
6
参数
chart_id
[in] 图表标识符。0表示当前图表。
pos
[in] 根据指定条件的对象的数量,索引编号由子窗口的数量和类型决定。
sub_window=-1
[in] 副图子窗口的数量。0代表主图表窗口,-1代表所有图表子窗口,包括主窗口。
type = -1
[in] 物件类型。取值范围是 ENUM_OBJECT 枚举值之一,-1表示全部类型。
返回值
如果成功返回物件名称。
注释
该函数使用同步调用,这意味着这个函数会等待在调用之前已进入图表的所有命令队列中的执行完成之后才执行,这就是该函数耗费时间的原因。当处理图表上的大量对象时应该考虑这个特性。
重命名图形对象时,会同时形成两个事件。这些事件可以通过OnChartEvent()函数在EA交易程序 或 指标中处理:
• 删除具有旧名称的对象的事件;
• 使用新名称创建对象的事件。
# 25.3 ObjectDelete
bool ObjectDelete(
long chart_id, // 图表标识符
string name // 物件名称
);
2
3
4
参数 chart_id [in] 图表标识符。0表示当前图表。 name
[in] 删除物件的名称。
返回值 如果命令成功添加到指定图表的命令队列中,那么函数返回true,否则返回false。
注意 非同步调用通常用于ObjectDelete(),这也是函数仅返回命令是否已被添加到图表命令队列的结果。在这种情况下,true仅表示命令已成功加入命令队列,但执行结果尚不可知。
若要检查命令执行结果,您可以使用ObjectFind()函数或任何其它请求对象属性的函数,例如ObjectGetXXX。但是,您需要牢记的是这类函数将被加入到图表的队尾,需要等待执行结果(因为同步调用),因此,可能会耗费大量时间。当处理图表上的大量对象时应该考虑这个特性。
重命名图形对象时,会同时形成两个事件。这些事件可以通过OnChartEvent()函数在EA交易程序 或 指标中处理:
• 删除具有旧名称的对象的事件;
• 使用新名称创建对象的事件。
# 25.4 ObjectsDeleteAll
该函数从指定图表中删除所有物件,指定图表子窗口,指定类型。
int ObjectsDeleteAll(
long chart_id, // 图表标识符
int sub_window=-1, // 窗口索引
int type=-1 // 物件类型
);
2
3
4
5
根据对象名称的前缀移除所有指定类型的对象。
int ObjectsDeleteAll(
long chart_id, // 图表标识符
const string prefix, // 对象名称前缀
int sub_window=-1, // 窗口索引
int object_type=-1 // 对象类型
);
2
3
4
5
6
参数
chart_id
[in] 图表标识符。0代表当前图表。
prefix
[in] 对象名称前缀:所有名称以这组字符开头的对象都将从图表移除。您可以指定前缀为 'name' 或 'name*' —— 两种形式的执行结果相同。如果设定前缀空为字符串,那么所有可能名称的对象都将被移除。
sub_window=-1
[in] 图表子窗口号码。0代表主要图表窗口,-1代表图表子窗口,包括主窗口。
type=-1
[in] 物件类型。取值范围是 ENUM_OBJECT枚举值之一,-1表示全部类型。
返回值
返回删除物件的数量。想要获取更多关于错误的详细信息,请调用 GetLastError()。
注意
该函数使用同步调用,这意味着这个函数会等待在调用之前已进入图表的所有命令队列中的执行完成之后才执行,这就是该函数耗费时间的原因。当处理图表上的大量对象时应该考虑这个特性。
# 25.5 ObjectFind
该函数在指定ID的图表中搜索指定名称的物件。
int ObjectFind(
long chart_id, // 图表标识符
string name // 物件名称
);
2
3
4
参数
chart_id
[in] 图表标识符,0表示当前图表。
name
[in] 搜索物件名称。
返回值
如果成功函数返回子窗口的号码(0表示图表的主窗口),表示找到了图形物件。如果没有找到图形物件,函数返回 负值。想要获取更多关于错误的详细信息,请调用 GetLastError()。
注意
该函数使用同步调用,这意味着这个函数会等待在调用之前已进入图表的所有命令队列中的执行完成之后才执行,这就是该函数耗费时间的原因。当处理图表上的大量对象时应该考虑这个特性。
重命名图形对象时,会同时形成两个事件。这些事件可以通过OnChartEvent()函数在EA交易程序 或 指标中处理: • 删除具有旧名称的对象的事件; • 使用新名称创建对象的事件。
# 25.6 ObjectGetTimeByValue
该函数根据指定图形物件的价格值,返回对应的时间值。
datetime ObjectGetTimeByValue(
long chart_id, // 图表标识符
string name, // 物件名称
double value, // 价格
int line_id // 线
);
2
3
4
5
6
参数
chart_id
[in] 图表标识符。0表示当前图表。
name
[in] 图形物件名称。
value
[in] 价格值。
line_id
[in] 绘制线的索引号。
返回值
为指定物件的指定价格值设定时间值。
注意
该函数使用同步调用,这意味着这个函数会等待在调用之前已进入图表的所有命令队列中的执行完成之后才执行,这就是该函数耗费时间的原因。当处理图表上的大量对象时应该考虑这个特性。
一个对象在一个价格坐标内可能有多个对应的值,因此有必要指明对应的线的索引号。这个函数仅应用于以下对象: • 趋势线(OBJ_TREND) • 角度趋势线(OBJ_TRENDBYANGLE) • 江恩线(OBJ_GANNLINE) • 等距通道(OBJ_CHANNEL) —— 2条线 • 线性回归通道 (OBJ_REGRESSION) —— 3条线 • 标准偏差通道(OBJ_STDDEVCHANNEL) —— 3 条线 • 箭头线 (OBJ_ARROWED_LINE)
相关参考 对象类型
# 25.7 ObjectGetValueByTime
该函数根据指定图形物件的时间值,返回对应的价格值。
double ObjectGetValueByTime(
long chart_id, // 图表标识符
string name, // 物件名称
datetime time, // 时间
int line_id // 线
);
2
3
4
5
6
参数
chart_id
[in] 图表标识符。0表示当前图表。
name
[in] 图形物件名称。
value
[in] 时间值。
line_id
[in] 绘制线的索引号。
返回值
为指定物件的指定价格值设定价格值。
注意
该函数使用同步调用,这意味着这个函数会等待在调用之前已进入图表的所有命令队列中的执行完成之后才执行,这就是该函数耗费时间的原因。当处理图表上的大量对象时应该考虑这个特性。
一个对象在一个价格坐标内可能有多个对应的值,因此有必要指明对应的线的索引号。这个函数仅应用于以下对象: • 趋势线(OBJ_TREND) • 角度趋势线(OBJ_TRENDBYANGLE) • 江恩线(OBJ_GANNLINE) • 等距通道(OBJ_CHANNEL) —— 2条线 • 线性回归通道 (OBJ_REGRESSION) —— 3条线 • 标准偏差通道(OBJ_STDDEVCHANNEL) —— 3 条线 • 箭头线 (OBJ_ARROWED_LINE)
相关参考
对象类型
# 25.8 ObjectMove
该函数更改图形物件对象的定位锚点坐标。
bool ObjectMove(
long chart_id, // 图表标识符
string name, // 物件名称
int point_index, // 定位点的索引编号
datetime time, // 时间
double price // 价格
);
2
3
4
5
6
7
参数
chart_id
[in] 图表标识符。0代表当前图表。
name
[in] 物件对象名称。
point_index
[in] 定位点索引编号。定位点的数量取决于物件对象类型。
time
[in] 所选定位点的时间坐标。
价格
[in] 所选定位点的价格坐标。
返回值
如果命令成功添加到指定图表队列那么函数返回true,否则返回false。
注意
非同步调用通常用于ObjectMove(),这也是函数仅返回命令添加到图表队列的结果。在这种情况下,true仅表示命令已成功加入队列,但执行结果尚不可知。
若要检查命令执行结果,您可以使用ObjectFind()函数或任何其它请求对象属性的函数,例如ObjectGetXXX。但是,您需要牢记的是这类函数将被加入到图表的队尾,需要等待执行结果(因为同步调用),因此,可能会耗费大量时间。当处理图表上的大量对象时应该考虑这个特性。
# 25.9 ObjectsTotal
函数返回在指定子窗口中指定类型的图形物件对象的总数量。
int ObjectsTotal(
long chart_id, // 图表标识符
int sub_window=-1, // 窗口索引
int type=-1 // 物件类型
);
2
3
4
5
参数
chart_id
[in] 图表标识符。0表示当前图表。
sub_window=-1
[in] 图表子窗口的数量。0代表主图表窗口,-1代表图表的所有子窗口,包括主窗口。
type=-1
[in] 物件类型。取值范围是 ENUM_OBJECT枚举值之一,-1表示全部类型。
返回值
图形物件对象的数量。
注意
该函数使用同步调用,这意味着这个函数会等待在调用之前已进入图表的所有命令队列中的执行完成之后才执行,这就是该函数耗费时间的原因。当处理图表上的大量对象时应该考虑这个特性。
# 25.10 ObjectSetDouble
该函数设置相应对象的属性值。对象属性必须是双精度(double)类型。该函数有2种变体。
设置属性值,无修饰符
bool ObjectSetDouble(
long chart_id, // 图表标识符
string name, // 物件名称
ENUM_OBJECT_PROPERTY_DOUBLE prop_id, // 属性
double prop_value // 值
);
2
3
4
5
6
设置属性值,带修饰符
bool ObjectSetDouble(
long chart_id, // 图表标识符
string name, // 物件名称
ENUM_OBJECT_PROPERTY_DOUBLE prop_id, // 属性
int prop_modifier, // 修饰符
double prop_value // 值
);
2
3
4
5
6
7
参数
chart_id
[in] 图表标识符。0表示当前图表。
name
[in] 物件名称。
prop_id
[in] 物件属性ID。取值范围是 ENUM_OBJECT_PROPERTY_DOUBLE 枚举值之一。
prop_modifier
[in] 指定属性的修饰语,用于表示 斐波纳契 图解对象的水平线的数量 和 安德鲁分叉图解物件,水平线的编号从0开始。
prop_value [in] 属性值。
返回值
当更改图形对象属性的命令已成功发送到图表命令队列时,该函数才返回true。否则返回false。调用函数GetLastError() 读取更多关于错误信息。
注意
该函数使用非同步调用,这意味着该函数不会等待已添加到指定图表命令队列的执行结果。相反,它立即返回控制。
要检查命令执行结果,可以使用请求指定对象属性的函数。但是,您应该记住,此类函数会添加到该图表队列的末尾,并且它们会等待执行结果,因此可能非常耗时。在图表上处理大量对象时,应考虑此功能。
示例:新建斐波纳契图解物件 和 添加新的水平线
//+------------------------------------------------------------------+
//| 脚本程序启动函数 |
//+------------------------------------------------------------------+
void OnStart()
{
//--- 辅助数组
double high[],low[],price1,price2;
datetime time[],time1,time2;
//--- 复制开盘价 - 最新的100柱就足够
int copied=CopyHigh(Symbol(),0,0,100,high);
if(copied<=0)
{
Print("Failed to copy the values of the High price series");
return;
}
//--- 复制收盘价 - 最新100柱就足够
copied=CopyLow(Symbol(),0,0,100,low);
if(copied<=0)
{
Print("Failed to copy the values of the Low price series");
return;
}
//--- 复制最新100柱的开盘时间
copied=CopyTime(Symbol(),0,0,100,time);
if(copied<=0)
{
Print("Failed to copy the values of the price series of Time");
return;
}
//--- 如访问时间序列一样组织访问复制的数据-反向
ArraySetAsSeries(high,true);
ArraySetAsSeries(low,true);
ArraySetAsSeries(time,true);
//--- 斐波纳契物件的第一定位点的坐标
price1=high[70];
time1=time[70];
//--- 斐波纳契物件的第二定位点的坐标
price2=low[50];
time2=time[50];
//--- 创建斐波纳契物件的时间
bool created=ObjectCreate(0,"Fibo",OBJ_FIBO,0,time1,price1,time2,price2);
if(created) // 如果物件成功创建
{
//--- 设置斐波纳契色阶调整颜色
ObjectSetInteger(0,"Fibo",OBJPROP_LEVELCOLOR,Blue);
//--- 另外,有多少斐波纳契色阶?
int levels=ObjectGetInteger(0,"Fibo",OBJPROP_LEVELS);
Print("Fibo levels before = ",levels);
//---输出到日志 => 水平号:水平值描述
for(int i=0;i<levels;i++)
{
Print(i,": ",ObjectGetDouble(0,"Fibo",OBJPROP_LEVELVALUE,i),
" ",ObjectGetString(0,"Fibo",OBJPROP_LEVELTEXT,i));
}
//--- 增加每单元的水平面数量
bool modified=ObjectSetInteger(0,"Fibo",OBJPROP_LEVELS,levels+1);
if(!modified) // 更改水平面数量失败
{
Print("Failed to change the number of levels of Fibo, error ",GetLastError());
}
//--- 只是通知
Print("Fibo levels after = ",ObjectGetInteger(0,"Fibo",OBJPROP_LEVELS));
//--- 为新创建的水平面设置一个值
bool added=ObjectSetDouble(0,"Fibo",OBJPROP_LEVELVALUE,levels,133);
if(added) // 为水平面管理并设置一个值
{
Print("Successfully set one more Fibo level");
//--- 还不要忘记设置水平面描述
ObjectSetString(0,"Fibo",OBJPROP_LEVELTEXT,levels,"my level");
ChartRedraw(0);
//--- 在斐波纳契物件中获得水平面数量的实际值
levels=ObjectGetInteger(0,"Fibo",OBJPROP_LEVELS);
Print("Fibo levels after adding = ",levels);
//--- 再次输出所有水平-只是为了证实
for(int i=0;i<levels;i++)
{
Print(i,":",ObjectGetDouble(0,"Fibo",OBJPROP_LEVELVALUE,i),
" ",ObjectGetString(0,"Fibo",OBJPROP_LEVELTEXT,i));
}
}
else // 如果在斐波纳契物件中增加水平面数量则会失败
{
Print("Failed to set one more Fibo level. Error ",GetLastError());
}
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
相关参考
物件类型, 物件属性
# 25.11 ObjectSetInteger
该函数设置相应对象的属性值。对象属性必须是 日期时间,整型,颜色,布尔或者字符型。该函数有2种变体。
设置属性值,无修饰符
bool ObjectSetInteger(
long chart_id, // 图表标识符
string name, // 物件名称
ENUM_OBJECT_PROPERTY_INTEGER prop_id, // 属性
long prop_value // 值
);
2
3
4
5
6
设置属性值,带修饰符
bool ObjectSetInteger(
long chart_id, // 图表标识符
string name, // 物件名称
ENUM_OBJECT_PROPERTY_INTEGER prop_id, // 属性
int prop_modifier, // 修饰符
long prop_value // 值
);
2
3
4
5
6
7
参数
chart_id
[in] 图表标识符。0表示当前图表。
name
[in] 物件名称。
prop_id
[in] 物件属性ID。取值范围是 ENUM_OBJECT_PROPERTY_INTEGER 枚举值之一。
prop_modifier
[in] 指定属性的修饰语,用于表示 斐波纳契 图解对象的水平线的数量 和 安德鲁分叉图解物件,水平线的编号从0开始。
prop_value [in] 属性值。
返回值
当更改图形对象属性的命令已成功发送到图表命令队列时,该函数才返回true。否则返回false。用函数GetLastError() 读取更多关于错误信息。
注意
该函数使用非同步调用,这意味着该函数不会等待已添加到指定图表命令队列的执行结果。相反,它立即返回控制。
要检查命令执行结果,可以使用请求指定对象属性的函数。但是,您应该记住,此类函数会添加到该图表队列的末尾,并且它们会等待执行结果,因此可能非常耗时。在图表上处理大量对象时,应考虑此功能。
示例:如何创建网页颜色表格
//+------------------------------------------------------------------+
//| Table of Web Colors|
//| Copyright 2011, MetaQuotes Software Corp |
//| https://www.metaquotes.net |
//+------------------------------------------------------------------+
#define X_SIZE 140 // 编辑物件的宽度
#define Y_SIZE 33 // 编辑物件的高度
//+------------------------------------------------------------------+
//| 网络颜色数组 |
//+------------------------------------------------------------------+
color ExtClr[140]=
{
clrAliceBlue,clrAntiqueWhite,clrAqua,clrAquamarine,clrAzure,clrBeige,clrBisque,clrBlack,clrBlanchedAlmond,
clrBlue,clrBlueViolet,clrBrown,clrBurlyWood,clrCadetBlue,clrChartreuse,clrChocolate,clrCoral,clrCornflowerBlue,
clrCornsilk,clrCrimson,clrCyan,clrDarkBlue,clrDarkCyan,clrDarkGoldenrod,clrDarkGray,clrDarkGreen,clrDarkKhaki,
clrDarkMagenta,clrDarkOliveGreen,clrDarkOrange,clrDarkOrchid,clrDarkRed,clrDarkSalmon,clrDarkSeaGreen,
clrDarkSlateBlue,clrDarkSlateGray,clrDarkTurquoise,clrDarkViolet,clrDeepPink,clrDeepSkyBlue,clrDimGray,
clrDodgerBlue,clrFireBrick,clrFloralWhite,clrForestGreen,clrFuchsia,clrGainsboro,clrGhostWhite,clrGold,
clrGoldenrod,clrGray,clrGreen,clrGreenYellow,clrHoneydew,clrHotPink,clrIndianRed,clrIndigo,clrIvory,clrKhaki,
clrLavender,clrLavenderBlush,clrLawnGreen,clrLemonChiffon,clrLightBlue,clrLightCoral,clrLightCyan,
clrLightGoldenrod,clrLightGreen,clrLightGray,clrLightPink,clrLightSalmon,clrLightSeaGreen,clrLightSkyBlue,
clrLightSlateGray,clrLightSteelBlue,clrLightYellow,clrLime,clrLimeGreen,clrLinen,clrMagenta,clrMaroon,
clrMediumAquamarine,clrMediumBlue,clrMediumOrchid,clrMediumPurple,clrMediumSeaGreen,clrMediumSlateBlue,
clrMediumSpringGreen,clrMediumTurquoise,clrMediumVioletRed,clrMidnightBlue,clrMintCream,clrMistyRose,clrMoccasin,
clrNavajoWhite,clrNavy,clrOldLace,clrOlive,clrOliveDrab,clrOrange,clrOrangeRed,clrOrchid,clrPaleGoldenrod,
clrPaleGreen,clrPaleTurquoise,clrPaleVioletRed,clrPapayaWhip,clrPeachPuff,clrPeru,clrPink,clrPlum,clrPowderBlue,
clrPurple,clrRed,clrRosyBrown,clrRoyalBlue,clrSaddleBrown,clrSalmon,clrSandyBrown,clrSeaGreen,clrSeashell,
clrSienna,clrSilver,clrSkyBlue,clrSlateBlue,clrSlateGray,clrSnow,clrSpringGreen,clrSteelBlue,clrTan,clrTeal,
clrThistle,clrTomato,clrTurquoise,clrViolet,clrWheat,clrWhite,clrWhiteSmoke,clrYellow,clrYellowGreen
};
//+------------------------------------------------------------------+
//| 创建和初始化编辑物件 |
//+------------------------------------------------------------------+
void CreateColorBox(int x,int y,color c)
{
//--- 生成新编辑物件的名称
string name="ColorBox_"+(string)x+"_"+(string)y;
//--- 创建新的编辑物件
if(!ObjectCreate(0,name,OBJ_EDIT,0,0,0))
{
Print("Cannot create: '",name,"'");
return;
}
//--- 设置坐标,宽度和高度
ObjectSetInteger(0,name,OBJPROP_XDISTANCE,x*X_SIZE);
ObjectSetInteger(0,name,OBJPROP_YDISTANCE,y*Y_SIZE);
ObjectSetInteger(0,name,OBJPROP_XSIZE,X_SIZE);
ObjectSetInteger(0,name,OBJPROP_YSIZE,Y_SIZE);
//--- 设置文本颜色
if(clrBlack==c) ObjectSetInteger(0,name,OBJPROP_COLOR,clrWhite);
else ObjectSetInteger(0,name,OBJPROP_COLOR,clrBlack);
//--- 设置背景色
ObjectSetInteger(0,name,OBJPROP_BGCOLOR,c);
//--- 设置文本
ObjectSetString(0,name,OBJPROP_TEXT,(string)c);
}
//+------------------------------------------------------------------+
//| 脚本程序开始函数 |
//+------------------------------------------------------------------+
void OnStart()
{
//--- 创建颜色编辑物件的7x20表格
for(uint i=0;i<140;i++)
CreateColorBox(i%7,i/7,ExtClr[i]);
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# 25.12 ObjectSetString
该函数设置相应对象的属性值。对象属性必须是字符串类型。该函数有2种变体。
设置属性值,无修饰符
bool ObjectSetString(
long chart_id, // 图表标识符
string name, // 物件名称
ENUM_OBJECT_PROPERTY_STRING prop_id, // 属性
string prop_value // 值
);
2
3
4
5
6
设置属性值,带修饰符
bool ObjectSetString(
long chart_id, // 图表标识符
string name, // 物件名称
ENUM_OBJECT_PROPERTY_STRING prop_id, // 属性
int prop_modifier, // 修饰符
string prop_value // 值
);
2
3
4
5
6
7
参数
chart_id
[in] 图表标识符。0表示当前图表。
name
[in] 物件名称。
prop_id
[in] 物件属性ID。取值范围是 ENUM_OBJECT_PROPERTY_STRING 枚举值之一。
prop_modifier
[in] 指定属性的修饰语,用于表示 斐波纳契 图解对象的水平线的数量 和 安德鲁分叉图解物件,水平线的编号从0开始。
prop_value
[in] 属性值。
返回值
当更改图形对象属性的命令已成功发送到图表命令队列时,该函数才返回true。否则返回false。调用函数GetLastError() 读取更多关于错误信息。
注意
该函数使用非同步调用,这意味着该函数不会等待已添加到指定图表命令队列的执行结果。相反,它立即返回控制。
要检查命令执行结果,可以使用请求指定对象属性的函数。但是,您应该记住,此类函数会添加到该图表队列的末尾,并且它们会等待执行结果,因此可能非常耗时。在图表上处理大量对象时,应考虑此功能。
重命名图形对象时,会同时形成两个事件。这些事件可以通过OnChartEvent()函数在EA交易程序 或 指标中处理:
• 删除具有旧名称的对象的事件;
• 使用新名称创建对象的事件。
# 25.13 ObjectGetDouble
该函数返回相应对象的属性值。对象属性必须是双精度类型。该函数有2种变体。
- 直接返回属性值。
double ObjectGetDouble(
long chart_id, // 图表标识符
string name, // 物件名称
ENUM_OBJECT_PROPERTY_DOUBLE prop_id, // 属性标识符
int prop_modifier=0 // 属性修饰符, 如果需要的话
);
2
3
4
5
6
- 返回true或false,具体取决于函数的成功。如果成功,则将属性值放在由最后一个形式参数传递的接收变量上。
bool ObjectGetDouble(
long chart_id, // 图表标识符
string name, // 物件名称
ENUM_OBJECT_PROPERTY_DOUBLE prop_id, // 属性标识符
int prop_modifier, // 属性修饰符
double& double_var // 这里接受属性值
);
2
3
4
5
6
7
参数
chart_id
[in] 图表标识符。0代表当前图表。
name
[in] 物件名称。
prop_id
[in] 物件属性ID。取值范围是 ENUM_OBJECT_PROPERTY_DOUBLE 枚举值之一。
prop_modifier
[in] 指定属性修饰语,对于该函数的第一种变体来说,默认修饰语的值是0,大多属性不要求修饰语。表示 斐波纳契图解工具的水平线数量 和 安德鲁分叉图解物件 时,水平线编号从0开始。
double_var
[out] 用于接收需求属性值的双精度类型变量。
返回值
调用第一种变体,该函数返回双精度类型值。
调用第二种变体,如果维护此属性并将值成功放入double_var变量,则函数返回true,否则返回false。为了获取更多关于错误的详细信息,请调用GetLastError()。
注意
该函数使用同步调用,这意味着这个函数会等待在调用之前已进入图表的所有命令队列中的执行完成之后才执行,这就是该函数耗费时间的原因。当处理图表上的大量对象时应该考虑这个特性。
# 25.14 ObjectGetInteger
该函数返回相应对象的属性值。对象属性必须是日期时间,整型,颜色,布尔或者字符类型。该函数有2种变体。
- 直接返回属性值。
long ObjectGetInteger(
long chart_id, // 图表标识符
string name, // 物件名称
ENUM_OBJECT_PROPERTY_INTEGER prop_id, // 属性标识符
int prop_modifier=0 // 属性修饰符, 如果需要的话
);
2
3
4
5
6
- 返回true或false,具体取决于函数的成功。如果成功,则将属性值放在由最后一个形式参数传递的接收变量上。
bool ObjectGetInteger(
long chart_id, // 图表标识符
string name, // 物件名称
int prop_id, // 属性标识符
ENUM_OBJECT_PROPERTY_INTEGER prop_modifier, // 属性修饰符
long& long_var // 这里接受属性值
);
2
3
4
5
6
7
参数
chart_id
[in] 图表标识符。0代表当前图表。
name
[in] 物件名称。
prop_id
[in] 物件属性ID。取值范围是 ENUM_OBJECT_PROPERTY_INTEGER 枚举值之一。
prop_modifier
[in] 指定属性修饰语,对于该函数的第一种变体来说,默认修饰语的值是0,大多属性不要求修饰语。表示 斐波纳契图解工具的水平线数量 和 安德鲁分叉图解物件 时,水平线编号从0开始。
long_var
[out] 用于接收需求属性值的长整型变量。
返回值
调用第一种变体,该函数返回长整型值。
调用第二种变体,如果维护此属性并将值成功放入long_var变量,则函数返回true,否则返回false。为了获取更多关于错误的详细信息,请调用GetLastError()。
注意
该函数使用同步调用,这意味着这个函数会等待在调用之前已进入图表的所有命令队列中的执行完成之后才执行,这就是该函数耗费时间的原因。当处理图表上的大量对象时应该考虑这个特性。
# 25.15 ObjectGetString
该函数返回相应对象的属性值。对象属性必须是字符串类型。该函数有2种变体。
- 直接返回属性值。
string ObjectGetString(
long chart_id, // 图表标识符
string name, // 物件名称
ENUM_OBJECT_PROPERTY_STRING prop_id, // 属性标识符
int prop_modifier=0 // 属性修饰符, 如果需要的话
);
2
3
4
5
6
- 返回true或false,具体取决于函数的成功。如果成功,则将属性值放在由最后一个形式参数传递的接收变量上。
bool ObjectGetString(
long chart_id, // 图表标识符
string name, // 物件名称
ENUM_OBJECT_PROPERTY_STRING prop_id, // 属性标识符
int prop_modifier, // 属性修饰符
string& string_var // 这里接受属性值
);
2
3
4
5
6
7
参数
chart_id
[in] 图表标识符。0代表当前图表。
name
[in] 物件名称。
prop_id
[in] 物件属性ID。取值范围是 ENUM_OBJECT_PROPERTY_STRING 枚举值之一。
prop_modifier
[in] 指定属性修饰语,对于该函数的第一种变体来说,默认修饰语的值是0,大多属性不要求修饰语。表示 斐波纳契图解工具的水平线数量 和 安德鲁分叉图解物件 时,水平线编号从0开始。
string_var
[out] 用于接收需求属性值的长整型变量。
返回值
调用第一种变体,该函数返回字符串型值。
调用第二种变体,如果维护此属性并将值成功放入string_var变量,则函数返回true,否则返回false。为了获取更多关于错误的详细信息,请调用GetLastError()。
注意
重命名图形对象时,会同时形成两个事件。这些事件可以通过OnChartEvent()函数在EA交易程序 或 指标中处理:
• 删除具有旧名称的对象的事件;
• 使用新名称创建对象的事件。
# 25.16 TextSetFont
该函数设置使用绘制方法显示文本的字体,并返回该操作的结果。默认情况下使用大小为-120(12 pt)的Arial字体。
bool TextSetFont(
const string name, // 字体名称或磁盘上字体文件的路径
int size, // 字体大小
uint flags, // 组合标识
int orientation=0 // 文本方向
);
2
3
4
5
6
参数
name
[in] 系统字体名称或包括字体或磁盘字体文件路径的资源名称。
size
[in] 字体大小。
flags
[in] 描述字体样式的组合标帜。
orientation
[in] 文字与X轴的水平倾斜度,测量单位为0.1度。 这意味着方向= 450代表倾斜度等于45度。
返回值
如果当前字体成功安装,返回true,否则返回false。可能出现的错误代码:
• ERR_INVALID_PARAMETER(4003) - name 显示 NULL 或 "" (空字符串),
• ERR_INTERNAL_ERROR(4001) - 操作系统错误 (例如,试图创建不存在的字体)。
注意
如果在字体名称中使用“::”,则从EX5资源下载字体。如果使用扩展名指定名称字体名称,则从文件下载字体,如果路径从“\”或“/”开始,则相对于MQL5目录搜索文件。 否则,相对于调用TextSetFont()函数的EX5文件的路径进行搜索。
字体大小使用 正负值 进行设置。该事实从操作系统设置定义了文本大小的依赖性(大小比例)。
• 如果大小指定为 正数,那么当从逻辑字体变为物理字体时,该大小转变为设备的物理测量单位(像素),并且该大小符合从有效字体挑选的符号图形高度。当在图表上一起使用通过TextOut()函数显示的文本 和 通过OBJ_LABEL ("Label") 图形物件显示的文本时,不推荐使用这种情况。
• 如果大小指定为 负数,那么该数字被认为是逻辑点的十分之一( -350等于35逻辑点)并且被10除。获得的值然后转变为设备的物理测量单位(像素),并且符合从有效字体挑选的符号高度的绝对值。物件属性中指定的字体大小乘以 -10,使得屏幕上的文本大小类似OBJ_LABEL物件的文本大小。
该标识可以被用作样式标识和指定字体宽度标识的结合体。标识名称显示如下。
指定字体样式的标帜
标识 | 描述 |
---|---|
FONT_ITALIC | 斜体字 |
FONT_UNDERLINE | 下划线 |
FONT_STRIKEOUT | 加删除线 |
指定字体宽度的标帜
标识 |
---|
FW_DONTCARE |
FW_THIN |
FW_EXTRALIGHT |
FW_ULTRALIGHT |
FW_LIGHT |
FW_NORMAL |
FW_REGULAR |
FW_MEDIUM |
FW_SEMIBOLD |
FW_DEMIBOLD |
FW_BOLD |
FW_EXTRABOLD |
FW_ULTRABOLD |
FW_HEAVY |
FW_BLACK |
相关参考
资源, ResourceCreate(), ResourceSave(), TextOut()
# 25.17 TextOut
该函数显示自定义数组中的文本(缓冲区)并返回该操作结果。数组是专为创建图形资源而设计的。
bool TextOut(
const string text, // 显示的文本
int x, // X 坐标
int y, // Y 坐标
uint anchor, // 定位类型
uint &data[], // 输出缓冲区
uint width, // 缓冲区像素宽度
uint height, // 缓冲区像素高度
uint color, // 文本颜色
ENUM_COLOR_FORMAT color_format // 输出的颜色格式
);
2
3
4
5
6
7
8
9
10
11
参数
text
[in] 将被写入缓冲区的文本显示。只显示单行文本。
x
[in] 显示文本的定位点的 X 坐标。
y
[in] 显示文本的定位点的 Y 坐标。
anchor
[in] 显示文本定位点位置的9种预定义方法的值。该值通过结合两种标帜设置 —— 水平和垂直文本对齐标帜。标帜名称列在附注中。
data[]
[in] 缓冲区,文本在这里显示。缓冲区被用于创建图形资源。
width
[in] 缓冲区像素宽度。
height
[in] 缓冲区像素高度。
color
[in] 文本颜色。
color_format
[in] 通过ENUM_COLOR_FORMAT 枚举值设置的颜色格式。
返回值
如果成功,返回 true ,否则 false。
注意
通过anchor指定的定位点是水平文本对齐和垂直文本对齐两个标识的组合。水平文本对齐标帜:
•TA_LEFT —— 边框左侧定位点
•TA_CENTER —— 边框中心的水平定位点
•TA_RIGHT —— 边框右侧定位点
垂直文本对齐标帜
•TA_TOP —— 边框上方定位点
•TA_VCENTER —— 边框中心的垂直定位点
•TA_BOTTOM —— 边框下方定位点
图片中显示了标帜和指定定位点可能的组合。
示例:
//--- 画布的宽和高(用于绘制)
#define IMG_WIDTH 200
#define IMG_HEIGHT 200
//--- 启动脚本前显示参数窗口
#property script_show_inputs
//--- 启用设置颜色格式
input ENUM_COLOR_FORMAT clr_format=COLOR_FORMAT_XRGB_NOALPHA;
//--- 绘制数组(缓冲区)
uint ExtImg[IMG_WIDTH*IMG_HEIGHT];
//+------------------------------------------------------------------+
//| 脚本程序起始函数 |
//+------------------------------------------------------------------+
void OnStart()
{
//--- 创建用于绘制的OBJ_BITMAP_LABEL物件
ObjectCreate(0,"CLOCK",OBJ_BITMAP_LABEL,0,0,0);
//--- 指定用于在CLOCK物件编写的图形资源的名称
ObjectSetString(0,"CLOCK",OBJPROP_BMPFILE,"::IMG");
//--- 辅助变量
double a; // 箭头计数器
uint nm=2700; // 分钟计数器
uint nh=2700*12; // 小时计数器
uint w,h; // 接收文本字符串大小的变量
int x,y; // 计算文本字符串定位点当前坐标的变量
//--- 无限循环旋转时针,直至脚本停止
while(!IsStopped())
{
//--- 清空绘制缓冲区数组的时钟
ArrayFill(ExtImg,0,IMG_WIDTH*IMG_HEIGHT,0);
//--- 为钟面设置绘制数字的字体
TextSetFont("Arial",-200,FW_EXTRABOLD,0);
//--- 绘制钟面
for(int i=1;i =12;i++)
{
//--- 接收钟面上当前小时的大小
TextGetSize(string(i),w,h);
//--- 计算钟面上当前小时的坐标
a=-((i*300)%3600*M_PI)/1800.0;
x=IMG_WIDTH/2-int(sin(a)*80+0.5+w/2);
y=IMG_HEIGHT/2-int(cos(a)*80+0.5+h/2);
//--- 输出钟面上的小时到ExtImg[]缓冲区
TextOut(string(i),x,y,TA_LEFT|TA_TOP,ExtImg,IMG_WIDTH,IMG_HEIGHT,0xFFFFFFFF,clr_format);
}
//--- 现在,指定绘制分针的字体
TextSetFont("Arial",-200,FW_EXTRABOLD,-int(nm%3600));
//--- 接收分针的大小
TextGetSize("----->",w,h);
//--- 计算钟面上分针的坐标
a=-(nm%3600*M_PI)/1800.0;
x=IMG_WIDTH/2-int(sin(a)*h/2+0.5);
y=IMG_HEIGHT/2-int(cos(a)*h/2+0.5);
//--- 在ExtImg[]缓冲区输出分针到钟面
TextOut("----->",x,y,TA_LEFT|TA_TOP,ExtImg,IMG_WIDTH,IMG_HEIGHT,0xFFFFFFFF,clr_format);
//--- 现在,设置绘制分针的字体
TextSetFont("Arial",-200,FW_EXTRABOLD,-int(nh/12%3600));
TextGetSize("==>",w,h);
//--- 计算钟面上时针的坐标
a=-(nh/12%3600*M_PI)/1800.0;
x=IMG_WIDTH/2-int(sin(a)*h/2+0.5);
y=IMG_HEIGHT/2-int(cos(a)*h/2+0.5);
//--- 在ExtImg[]缓冲区输出时针到钟面
TextOut("==>",x,y,TA_LEFT|TA_TOP,ExtImg,IMG_WIDTH,IMG_HEIGHT,0xFFFFFFFF,clr_format);
//--- 更新图形资源
ResourceCreate("::IMG",ExtImg,IMG_WIDTH,IMG_HEIGHT,0,0,IMG_WIDTH,clr_format);
//--- 强制图表更新
ChartRedraw();
//--- 增加小时和分钟计数器
nm+=60;
nh+=60;
//--- 框架之间保持短暂停顿
Sleep(10);
}
//--- 完成脚本操作时删除 CLOCK 物件
ObjectDelete(0,"CLOCK");
//---
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
相关参考 资源, ResourceCreate(), ResourceSave(), TextGetSize(), TextSetFont()
# 25.18 TextGetSize
该函数返回当前字体设置的线宽和高度。
bool TextGetSize(
const string text, // 文本字符串
uint& width, // 缓冲区像素宽度
uint& height // 缓冲区像素高度
);
2
3
4
5
参数
text
[in] 字符串,用于获得长度和宽度。
width
[out] 接收宽度的输入参数。
height
[out] 接收高度的输入参数。
返回值
如果成功返回true,否则 false。可能的错误代码:
• ERR_INTERNAL_ERROR(4001) —— 操作系统错误。
相关参考
资源, ResourceCreate(), ResourceSave(), TextSetFont(), TextOut()