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()); } } }
粗略的检查表明它应该是有效的。但你可以提高工作效率。
想一想你在图表上画了多少不同的对象。如果你点击这些对象中的任何一个,你将循环浏览每一个订单,并试图找到一个匹配。许多对象可能与订单毫无关系。这样做效率很低。
这就是为什么我建议检查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());
}
}
}
哇!我不知道这一点。
所以,你提到了两次,而我完全没有想到这一点。
现在我将自己测试一下,并把它带到我的主EA文件中。
谢谢你这么多。
我对其他对象使用了OrderTicket(),现在我看到当我点击那个对象时,订单关闭了。
我喜欢你的方法,但看起来它影响了其他对象。
其他像这样的物体名称,这里是其中之一。
谢谢你。
我对其他对象使用OrderTicket(),现在我看到当我点击那个对象时--订单关闭。
我喜欢你的方法,但看起来它影响了其他对象。
其他像这样的物体名称,这里是其中之一。
提前感谢。
更优雅的解决方案是改变你的命名系统
尽管如此,你仍然可以剥离出订单号。这只是取决于具体的命名格式。
但在这一切之前,这个按钮的OBJPROP_TEXT是什么?是否有其他对象具有相同的OBJPROP_TEXT?
更优雅的解决方案是改变你的命名系统。
尽管如此,你仍然可以将订单号剥离出来。这只是取决于具体的命名格式。
但在这之前,这个按钮的OBJPROP_TEXT是什么?是否有其他对象有同样的OBJPROP_TEXT?
是的!我知道我可以改变按钮对象的名称(我也使用前缀)。我知道我可以改变Button对象 的名称(我也使用Prefix),如果我改变Button的名称,那么我可以改变很多东西,例如删除系统和其他东西,这些东西都是相互联系的。
下面是Button和HLine的名字。
"#"+IntegerToString(OrderTicket())+" -"+"Object Button"
(当然,对象的名称有一点不同,但方法是一样的)
先谢谢你了。
市场关闭
也许我找到了,但我不确定。
如果这不是好事,请告诉我。
请提前感谢。
//----第2次编辑
嘿!伙计
非常感谢。到目前为止,没有任何问题。正确的工作!
#交叉的对象 - 开放
我曾多次遇到这个问题,有时我通过了,有时我放弃了,现在我不想再放弃了。
我有两个对象 "HLine和Button",它们交叉在一起,我的意思是当我点击其中一个对象时,两个对象都被选中,这对我来说不是一件好事。(BUTTON宽度=20,HLINE宽度=如你所知)
问: 请问我如何做到当我点击BUTTON对象 时,HLINE对象不会被选中,而它们却交叉在一起?
(我可以很容易地在它们不交叉的地方选择HLINE)
提前感谢。
(我正在努力,如果有好的意见就更好了,谢谢。)
威廉先生- 我使用您的 "Pip, Point ..."计算代码。
现在我尝试用下面的代码获得点值的利润。我有两个订单,其中一个显示正确(OP_BUY),另一个显示不正确 - 399 - 实际400(OP_SELL)。
问: 请问我在计算点数利润时是否做错了?
提前感谢。
(去年我查看了不同网站的论坛 - 这对我没有好处)
关于交易、自动交易系统和测试交易策略的论坛
带有更新的MQL4语言和应用市场的MetaTrader 4 Build 574已经发布
whroeder1, 2014.01.27 14:11
威廉先生 的 "如果 "运算符的复杂条件的惊人例子之一。
谢谢!
我最近两天一直在努力解决我的 "if "运算符的复杂条件,但我无法解决我的问题,直到我发现了上面的伟大例子。
请有人帮助我,我真的很难解决这个问题。
#296
提前感谢。
下面的代码有时工作完美,有时不完美。我无法解决这个问题。当我使用单个订单时,它工作得很好,但当我打开多个订单时,这个功能 不能正确工作。
请帮助我,多解释一下(下面的代码有什么问题),对我来说会更好。
(现在,我正在努力。)
{
ticketnumber=(int) StringSubstr(sparam,1);
if(OrderSelect(ticketnumber,SELECT_BY_TICKET))
{
if(StringFind(sparam,Button_1,0)>=0)
{
// ...
}
if(StringFind(sparam,Button_2,0)>=0)
{
//...
}
for(i=OrdersTotal()-1; i>=0; i--)
{
if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
if(Symbol()!=OrderSymbol()) continue;
update_1();
update_2();
update_3();
}
}
}
先谢谢你。