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

 
honest_knave:

粗略的检查表明它应该是有效的。但你可以提高工作效率。

想一想你在图表上画了多少不同的对象。如果你点击这些对象中的任何一个,你将循环浏览每一个订单,并试图找到一个匹配。许多对象可能与订单毫无关系。这样做效率很低。

这就是为什么我建议检查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,以防失败)

哇!我不知道这一点。

所以,你提到了两次,而我完全没有想到这一点。
现在我将自己测试一下,并把它带到我的主EA文件中。

谢谢你这么多。

 

我对其他对象使用了OrderTicket(),现在我看到当我点击那个对象时,订单关闭了。
我喜欢你的方法,但看起来它影响了其他对象。

其他像这样的物体名称,这里是其中之一。

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

谢谢你。

 
Max Enrik:

我对其他对象使用OrderTicket(),现在我看到当我点击那个对象时--订单关闭。
我喜欢你的方法,但看起来它影响了其他对象。

其他像这样的物体名称,这里是其中之一。

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

提前感谢。

更优雅的解决方案是改变你的命名系统

尽管如此,你仍然可以剥离出订单号。这只是取决于具体的命名格式。

但在这一切之前,这个按钮的OBJPROP_TEXT是什么?是否有其他对象具有相同的OBJPROP_TEXT?

 
honest_knave:

更优雅的解决方案是改变你的命名系统。
尽管如此,你仍然可以将订单号剥离出来。这只是取决于具体的命名格式。
但在这之前,这个按钮的OBJPROP_TEXT是什么?是否有其他对象有同样的OBJPROP_TEXT?

是的!我知道我可以改变按钮对象的名称(我也使用前缀)。我知道我可以改变Button对象 的名称(我也使用Prefix),如果我改变Button的名称,那么我可以改变很多东西,例如删除系统和其他东西,这些东西都是相互联系的。

下面是Button和HLine的名字。

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

(当然,对象的名称有一点不同,但方法是一样的)

先谢谢你了。

 

市场关闭

也许我找到了,但我不确定。
如果这不是好事,请告诉我。

if(id==CHARTEVENT_OBJECT_CLICK && StringFind(sparam,"close order button",0)>=0)

请提前感谢。

//----第2次编辑

嘿!伙计

非常感谢。到目前为止,没有任何问题。正确的工作!

 

#交叉的对象 - 开放

我曾多次遇到这个问题,有时我通过了,有时我放弃了,现在我不想再放弃了。
我有两个对象 "HLine和Button",它们交叉在一起,我的意思是当我点击其中一个对象时,两个对象都被选中,这对我来说不是一件好事。(BUTTON宽度=20,HLINE宽度=如你所知)

问: 请问我如何做到当我点击BUTTON对象 时,HLINE对象不会被选中,而它们却交叉在一起?
(我可以很容易地在它们不交叉的地方选择HLINE)

提前感谢。

(我正在努力,如果有好的意见就更好了,谢谢。)

 

威廉先生- 我使用您的 "Pip, Point ..."计算代码。
现在我尝试用下面的代码获得点值的利润。我有两个订单,其中一个显示正确(OP_BUY),另一个显示不正确 - 399 - 实际400(OP_SELL)。

问: 请问我在计算点数利润时是否做错了?

change_to_pips( OrderTakeProfit() - OrderOpenPrice() )

提前感谢。

(去年我查看了不同网站的论坛 - 这对我没有好处)

 

关于交易、自动交易系统和测试交易策略的论坛

带有更新的MQL4语言和应用市场的MetaTrader 4 Build 574已经发布

whroeder1, 2014.01.27 14:11

  1. 不要写这样的不可读、不可理解的代码。
    if (MyOrdersTotal() == 0 && (Hour()​>=​StartHour ​&& Hour()​<​EndHour && StartHour​<​EndHour) || (Hour()​>=​StartHour || Hour()​<​EndHour && StartHour​>​EndHour))
    要使代码具有可读性和简化性,并且在混合和/或的时候一定要用括号。
    bool    isHourOKnorm = StartHour < EndHour
                         && StartHour <= Hour() && Hour() < EndHour,
            isHourOKwrap = StartHour > EndHour
                         && (StartHour <= Hour() || Hour() < EndHour),
         isHourOK       = isHourOKnorm || isHourOKwrap;
    if(MyOrdersTotal() == 0 && isHourOK)
  2. 在StartHour == EndHour的情况下(即所有24小时)怎么办?

威廉先生 的 "如果 "运算符的复杂条件的惊人例子之一
谢谢!


我最近两天一直在努力解决我的 "if "运算符的复杂条件,但我无法解决我的问题,直到我发现了上面的伟大例子。

 

请有人帮助我,我真的很难解决这个问题。

#296

提前感谢。

 

下面的代码有时工作完美,有时不完美。我无法解决这个问题。当我使用单个订单时,它工作得很好,但当我打开多个订单时,这个功能 不能正确工作。
请帮助我,多解释一下(下面的代码有什么问题),对我来说会更好。

(现在,我正在努力。)

if(id==CHARTEVENT_OBJECT_CLICK && (StringFind(sparam,Button_1,0)>=0 || StringFind(sparam,Button_2,0)>=0))
  {
   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();
        }
     }
  }

先谢谢你。