专家顾问 - 杂项问题 - 页 29

 
honest_knave:
把你的代码贴出来,你在哪里得到OrderTicket的名字。

(当有人需要一些代码时--我延迟发布它--因为我使用OBJECT_****函数,它与对象文档有一点不同)

下面的代码是在OnTick()中。

for(i=OrdersTotal()-1;i>=0;i--)
  {
   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()调用该对象,如下所示。

if(id==CHARTEVENT_OBJECT_CLICK && sparam=="#"+IntegerToString(OrderTicket())+" -"+"Object Button")
  {
   // when click this button - do something...
  }

谢谢你。

 
它不在订单环路内,所以它不知道OrderTicket()。
 
Marco vd Heijden:
它不在订单环路内,所以它不知道OrderTicket()。
那么,是不是没有机会了?
 
Max Enrik:
那么,是不是没有机会了?

大多数事情都是可能的。但我不清楚你想达到什么目的。这个按钮是什么?当它被点击的时候,你想做什么?

你可能可以得到你想要的结果,但你的方法可能需要改变。

 
honest_knave:

大多数事情都是可能的。但我不清楚你想达到什么目的。这个按钮是什么?当它被点击的时候,你想做什么?

你可能可以得到你想要的结果,但你的方法可能需要改变。


我的目的是,当我点击这个按钮 时,这个按钮对象 可以显示票据的节点和它们的利润,即订单云关闭。

我是在移动设备上写的这个评论。谢谢你的意见。
 
Max Enrik:

我的目的是这个按钮对象 可以显示票数和它们的利润,当我点击它们时,该订单云就会关闭。

我在移动设备上写了这个评论。谢谢你的意见。

在对象名称中要有一个独特的标签来识别这些按钮。你似乎是在使用 "#"

if(id==CHARTEVENT_OBJECT_CLICK && StringSubstr(sparam,0,1)=="#") // this is one of your order buttons being clicked

然后从对象名称的其余部分或按钮文本中提取订单号。

在这个阶段不需要使用OrderTicket()。

 

他的对象是由orderticket标识的。

"#"+IntegerToString(OrderTicket())+" -"+"Object Button"

因此,每个对象的字符串名称中都有票号,以便能够找到该对象属于哪个订单。

这意味着,每个对象的字符串名称中都有 "#"。

因此,基本上在点击按钮时,他首先要从对象的字符串名称中提取订单票号,然后运行orderselectloop,当选择的订单票与从按钮字符串名称中提取的订单票号相匹配时,他就找到了这个订单。

或者他可以直接

SELECT_BY_TICKET

要在图表事件里面选择订单。

现在,如果他只给对象提供票号/名称而不给其他东西,那就容易多了。

ObjectCreate(0,"IntegerToString(OrderTicket()),OBJ_BUTTON,0,0,0);

因为这样他就可以直接选择票据或比较数字。

 

去年我曾尝试过OrderSelect()循环。现在,我首先将很快再试一次。
然后我将深入研究你的最新评论。

谢谢你的宝贵时间。

 

我在我的test.mq4文件中尝试了下面的代码,所以下面的代码工作得很好,到目前为止,我没有遇到任何问题,但我仍在测试它。

问: 如果下面的代码不好,你能改进它吗?

if(id==CHARTEVENT_OBJECT_CLICK)
  {
   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()中的代码将是这样的(未编译,未测试,深夜......)。

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());
        }
     }
  }
(你可能也想处理OrderSelect,以防失败)