新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 15

 
Vitalie Postolache:
循环必须按相反顺序计算,从OrdersTotal()-1到0
当在一个循环中关闭时。
 
Vitalie Postolache:
循环需要向后计数,从OrdersTotal()-1到0。
这些都是Kim的功能,它们的工作没有遗漏,问题出在其他方面
 
所以你不小心在同一个符号上打开了几个顾问,很多人都这么做了。
 
Neron_76:
你好!我已经在我的模拟账户上 安装了我的外汇机器人,它已经运行了第二个月了。我今天打开终端,一个信号有两个未结订单,尽管我以前只下过一个订单。我对订单的数量有限制。原因可能是什么?

从代码来看,你似乎有一个挂单,而不是一个市场订单。

对未结订单数量的限制只适用于市场订单。

这就是为什么没有错误,因此没有问题。

 
Renat Akhtyamov:

从代码来看,你似乎有一个挂单,而不是一个市场订单。

对未结订单数量的限制只适用于市场订单。

因此,没有错误,因此也没有问题。

这一限制适用于未平仓和挂单。这是我在一个半月内遇到的第二个案例;其他案例都是正确的。
 
Neron_76:
该限制适用于未结订单待定订单。这是一个半月内的第二次,所有其他案件都是如此。

这样试试吧。

if(NumberOfPositions(Symb,-1,Magik_number)==0 && NumberOfOrders(Symb,-1,Magik_number)==0 && Delta_Buy<Low[1] && sar>Close[1]) {
  SetOrder(NULL,OP_BUYSTOP,Lts,sar,sar-SL*Point(),sar+TP*Point(),Magik_number);
  return(0);
}
if(NumberOfPositions(Symb,-1,Magik_number)==0 && NumberOfOrders(Symb,-1,Magik_number)==0 && Delta_Sell>High[1] && sar<Close[1]) {
  SetOrder(NULL,OP_SELLSTOP,Lts,sar,sar+SL*Point(),sar-TP*Point(),Magik_number);
  return(0);
}

//===============================================================================================
//------------------------------- Возвращает количество позиций --------------------------------+
//===============================================================================================
int NumberOfPositions(string sy="", int op=-1, int mn=-1) {
int kp=0;
  if(sy=="") sy=Symbol();
  for(int i=0; i<OrdersTotal(); i++) {
   if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
    if((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
     if(OrderType()==OP_BUY || OrderType()==OP_SELL) {
      if(mn<0 || OrderMagicNumber()==mn) kp++;
}}}}
  return(kp);
}
//===============================================================================================
//------------------------------- Возвращает количество ордеров --------------------------------+
//===============================================================================================
int NumberOfOrders(string sy="", int op=-1, int mn=-1) {
int kp=0;
  if(sy=="") sy=Symbol();
  for(int i=0; i<OrdersTotal(); i++) {
   if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
    if((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
     if(OrderType()>1 && OrderType()<6) {
      if(mn<0 || OrderMagicNumber()==mn) kp++;
}}}}
  return(kp);
}
 
Vitaly Muzichenko:

这样试试吧。

if(NumberOfPositions(Symb,-1,Magik_number)==0 && NumberOfOrders(Symb,-1,Magik_number)==0 && Delta_Buy<Low[1] && sar>Close[1]) {
  SetOrder(NULL,OP_BUYSTOP,Lts,sar,sar-SL*Point(),sar+TP*Point(),Magik_number);
  return(0);
}
if(NumberOfPositions(Symb,-1,Magik_number)==0 && NumberOfOrders(Symb,-1,Magik_number)==0 && Delta_Sell>High[1] && sar<Close[1]) {
  SetOrder(NULL,OP_SELLSTOP,Lts,sar,sar+SL*Point(),sar-TP*Point(),Magik_number);
  return(0);
}

//===============================================================================================
//------------------------------- Возвращает количество позиций --------------------------------+
//===============================================================================================
int NumberOfPositions(string sy="", int op=-1, int mn=-1) {
int kp=0;
  if(sy=="") sy=Symbol();
  for(int i=0; i<OrdersTotal(); i++) {
   if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
    if((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
     if(OrderType()==OP_BUY || OrderType()==OP_SELL) {
      if(mn<0 || OrderMagicNumber()==mn) kp++;
}}}}
  return(kp);
}
//===============================================================================================
//------------------------------- Возвращает количество ордеров --------------------------------+
//===============================================================================================
int NumberOfOrders(string sy="", int op=-1, int mn=-1) {
int kp=0;
  if(sy=="") sy=Symbol();
  for(int i=0; i<OrdersTotal(); i++) {
   if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
    if((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
     if(OrderType()>1 && OrderType()<6) {
      if(mn<0 || OrderMagicNumber()==mn) kp++;
}}}}
  return(kp);
}
我更换了功能,它在测试中工作正常。让我们看看它在模拟交易中的表现如何。但由于某些原因,在我看来,在我的案例中,这些和这些功能都是执行同样的任务,即回答是否有订单和头寸的问题。
 
Neron_76:
功能已被替换,在测试中工作正常。让我们看看它在模拟交易中的表现如何。但出于某种原因,在我看来,这两个函数执行的是同样的任务,即它们回答了是否存在订单和头寸的问题。
如果我重复两次设置订单,那么应该重新考虑"SetOrder"函数,也许它给出了两个请求,在第一个请求之后没有退出函数,它有时间来发送第二个请求。
 
Vitaly Muzichenko:
如果重复设置订单,那么应该审查"SetOrder"函数,也许它给出了两个请求,在第一个请求后没有退出函数,并设法发送第二个请求。
如果是这样的话,为什么不总是这样,在抽签之间发生了什么?我对这个不是很在行。
 
Neron_76:
如果是这样的话,为什么不总是发生,在抽搐之间的东西?我对这个不是很在行。
在一个符号的跳动之间,可能会有另一个符号的跳动。如果EA是多币种的,它可以看到来自另一个符号的ticks。另外,定时器事件--OnTimer()和OnChartEvent() 事件可能会在刻度之间发生--我几乎写成了 "活动事件"。将是一个设置...
原因: