if(id==CHARTEVENT_OBJECT_CLICK && StringSubstr(sparam,0,1)=="#") // this is an order button { int ticket=(int)StringSubstr(sparam,1); // extract the ticket number if(OrderSelect(ticket,SELECT_BY_TICKET)) // select the order { if(!OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),3,CLR_NONE)) // close the order { Print("# Error ",GetLastError()); } } }
把你的代码贴出来,你在哪里得到OrderTicket的名字。
(当有人需要一些代码时--我延迟发布它--因为我使用OBJECT_****函数,它与对象文档有一点不同)
下面的代码是在OnTick()中。
{
if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
if(Symbol()!=OrderSymbol()) continue;
ObjectCreate(0,"#"+IntegerToString(OrderTicket())+" -"+"Object Button",OBJ_BUTTON,0,0,0);
}
现在,我试图通过OnChartEvent()调用该对象,如下所示。
{
// when click this button - do something...
}
谢谢你。
它不在订单环路内,所以它不知道OrderTicket()。
那么,是不是没有机会了?
大多数事情都是可能的。但我不清楚你想达到什么目的。这个按钮是什么?当它被点击的时候,你想做什么?
你可能可以得到你想要的结果,但你的方法可能需要改变。
大多数事情都是可能的。但我不清楚你想达到什么目的。这个按钮是什么?当它被点击的时候,你想做什么?
你可能可以得到你想要的结果,但你的方法可能需要改变。
我的目的是,当我点击这个按钮 时,这个按钮对象 可以显示票据的节点和它们的利润,即订单云关闭。
我是在移动设备上写的这个评论。谢谢你的意见。
我的目的是这个按钮对象 可以显示票数和它们的利润,当我点击它们时,该订单云就会关闭。
我在移动设备上写了这个评论。谢谢你的意见。
在对象名称中要有一个独特的标签来识别这些按钮。你似乎是在使用 "#"
然后从对象名称的其余部分或按钮文本中提取订单号。
在这个阶段不需要使用OrderTicket()。
他的对象是由orderticket标识的。
因此,每个对象的字符串名称中都有票号,以便能够找到该对象属于哪个订单。
这意味着,每个对象的字符串名称中都有 "#"。
因此,基本上在点击按钮时,他首先要从对象的字符串名称中提取订单票号,然后运行orderselectloop,当选择的订单票与从按钮字符串名称中提取的订单票号相匹配时,他就找到了这个订单。
或者他可以直接
要在图表事件里面选择订单。
现在,如果他只给对象提供票号/名称而不给其他东西,那就容易多了。
因为这样他就可以直接选择票据或比较数字。
去年我曾尝试过OrderSelect()循环。现在,我首先将很快再试一次。
然后我将深入研究你的最新评论。
谢谢你的宝贵时间。
我在我的test.mq4文件中尝试了下面的代码,所以下面的代码工作得很好,到目前为止,我没有遇到任何问题,但我仍在测试它。
问: 如果下面的代码不好,你能改进它吗?
{
for(i=OrdersTotal()-1; i>=0; i--)
{
if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
if(OrderSymbol()!=Symbol()) continue;
if(sparam=="#"+IntegerToString(OrderTicket())+" -"+"Object Button")
{
if(!OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),3,CLR_NONE))
{
Print("# Error ",GetLastError());
}
}
}
}
提前感谢。
(我正在努力解决这个问题)
粗略的检查表明它应该是有效的。但你可以提高工作效率。
想一想你在图表上画了多少不同的对象。如果你点击这些对象中的任何一个,你将循环浏览每一个订单,并试图找到一个匹配。许多对象可能与订单毫无关系。这样做效率很低。
这就是为什么我建议检查 sparam的第一个字符为 "#"。这将自动识别该对象与订单有关。
此外,没有必要在订单中进行循环。对象名称 和/或对象文本已经包含了票号。因此,从那里提取票号并关闭订单
例子。
你打开一个订单。它被赋予票据号12345
创建一个OBJ_BUTTON,名称为"#12345"
OnChartEvent()中的代码将是这样的(未编译,未测试,深夜......)。
{
int ticket=(int)StringSubstr(sparam,1); // extract the ticket number
if(OrderSelect(ticket,SELECT_BY_TICKET)) // select the order
{
if(!OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),3,CLR_NONE)) // close the order
{
Print("# Error ",GetLastError());
}
}
}