EA不会在多对上运行,需要帮助 - 页 2

 
Fernando Carreiro:

关于在多个货币对或时间框架上使用您的EA,还有一个非常重要的说明。

您的代码没有使用 "神奇数字 "选择,也没有在检查历史上的未结订单时检查使用的符号(或 "神奇数字")。因此,从本质上讲,你的EA将不能正确地工作,既不能与自己也不能与其他EA一起工作。

就像现在这样,你只能在没有其他EA运行的情况下单独使用该EA,甚至不能在另一个图表上使用该EA!

非常感谢你到目前为止对我的代码的帮助和你的时间,我将尝试做出必要的调整。
 
Keith Watford:

    bool ans;

   

         //You do not select an order

         if(OrderType()==OP_BUY)
         {
           while(fastma < slowma)                                 //Use if not while
           {
             ans = OrderClose(OrderTicket(),Lots,Bid,10,clrNONE);
             if(ticket < 1)                                        //ticket is a local variable and has not been assigned a value
             {     
                if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
                Print("Buy order closed : ", OrderClosePrice());   
             }   
             else
               Print("Error closing order : ", GetLastError());
               return(0);
           }
         }
重写代码的关闭顺序部分,使其符合逻辑,你根本不应该在这里使用ticket这个变量。
在写这篇文章的时候,我并没有把ticket这个变量放在那里,我只是想看看把它放在那里会不会对代码的运行方式产生影响,感谢你的意见和时间。
 
Matt_Townsend:
非常感谢你到目前为止对我的代码的帮助和你的时间,我将努力做出必要的调整。

因为您的EA有太多的逻辑问题,我建议您看一下MetaQuotes 的示例代码,即"Moving Average.mq4 "和/或 "MACD Sample.mq4",并在此基础上进行开发,直到您理解EA工作的基本原则。

我已经附上了这些文件,但您可以在 "MQL4/Experts "文件夹中找到它们。

附加的文件:
 
Fernando Carreiro:

编辑:关于代码,你正在使用OrderSelect,但你总是假设它每次都有效。当它不工作时,你就继续使用订单的细节函数,如OrderTicket(),如果最初的OrderSelect() 也失败了,这可能会失败。

在注意到你的编辑.....

我一直认为,当有新的tick时,OrderSelect()就会丢失。

所以我检查了一下,发现一旦一个订单被选中,即使在随后的新刻度线中也会保持选中。

每天都能学到新东西 :)

 
Keith Watford: 在注意到你的编辑.....

我一直认为,当有新的tick时,OrderSelect()就会丢失。

所以我检查了一下,发现一旦一个订单被选中,即使在随后的新刻度线中也会保持选中。

每天都能学到新东西:)

然而,在实践中,它没有什么用处,因为这些细节被冻结,所以像OrderClosePrice() 这样的东西不会更新,直到你再次选择它
 
直接使用OrdersTotal 和/或在你的OrderSelect 循环中没有魔数过滤意味着你的代码与每一个EA不兼容(包括在其他图表和手动交易中的自身)。当另一种货币被添加到另一个单独的图表中时,符号不等于Ordersymbol。- MQL4论坛
 
Fernando Carreiro:

关于在多个货币对或时间框架上使用您的EA,还有一个非常重要的说明。

您的代码没有使用 "神奇数字 "选择,也没有在检查历史上的未结订单时检查使用的符号(或 "神奇数字")。因此,从本质上讲,你的EA将无法正常工作,无论是对自己还是对其他EA。

就像现在这样,你只能在没有其他EA运行的情况下单独使用这个EA,甚至不能在另一个图表上使用这个EA!


    for(int i=0;i<OrdersTotal();i++)
      {
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
         if(OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol()) continue;
         //---Check Order Type
         if(OrderType()==OP_BUY)
         {
           if(fastma < slowma)
           {
             if(OrderClose(OrderTicket(),Lots,Bid,10,clrNONE))
             Print("Order Closed : ", OrderClosePrice());
             return(0);
           }
           else
            Print("Error : ", GetLastError());
            return(0);
           break;
         }
      if(OrderType()==OP_SELL)
        {
          if(fastma > slowma)
          {
             if(OrderClose(OrderTicket(),Lots,Ask,10,clrNONE))
             Print("Order Closed : ", OrderClosePrice());
             return(0);
            
          }
          else
               Print("Error : ", GetLastError());
               return(0);
          break;
        }

      } 

这里是OrderClose部分,我不再得到无效的票据错误,但我现在得到了无效的价格。

这里是直接来自日志的内容

2016.12.09 10:47:10.243 Simple Moving Average Crossover Strategy EURUSDi,H1: invalid price 1.05454000 for OrderClosefunction


 
Matt_Townsend:

           {
             if(OrderClose(OrderTicket(),Lots,Bid,10,clrNONE))
             Print("Order Closed : ", OrderClosePrice());
             return(0);
           }

...

         {

             if(OrderClose(OrderTicket(),Lots,Ask,10,clrNONE))
             Print("Order Closed : ", OrderClosePrice());
             return(0);

 

这里是OrderClose部分,我不再得到无效票据的错误,但我现在得到了无效的价格。

这里是直接来自日志的内容

2016.12.09 10:47:10.243 Simple Moving Average Crossover Strategy EURUSDi,H1: Invalid price 1.05454000 for OrderClosefunction


关闭时不要使用Bid/Ask,使用OrderClosePrice()。它将自动成为好的价格。
 
Alain Verleyen:
平仓时不要使用Bid/Ask,使用OrderClosePrice()。它将自动成为好的价格。

我是否应该在OrderClose函数中替换它?如果是,我是否应该在它下面的打印函数 中删除OrderClosePrice?

编辑。

我刚刚这样做了,但现在它不会保持任何仓位。只是开仓和平仓,尽管它现在在多个货币对上工作没有任何问题。

 

         if(OrderType()==OP_BUY)
         {
           if(fastma < slowma)
           {
             if(OrderClose(OrderTicket(),Lots,Bid,10,clrNONE))
             Print("Order Closed : ", OrderClosePrice());
             return(0);
           }
           else
            Print("Error : ", GetLastError());
            return(0);
           break;
         }

因为你需要完成循环,所以不需要返回或中断。

另外,你的错误打印取决于


           if(fastma < slowma)


为假,与OrderClose()是否失败无关。



   if(OrderType()==OP_BUY)
     {
      if(fastma<slowma)
        {
         if(OrderClose(OrderTicket(),Lots, OrderClosePrice(),10,clrNONE))
            Print("Order Closed : ",OrderClosePrice());
         else
            Print("Error : ",GetLastError())
        }
     }


原因: