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

 
我是编码mql4的新手,并且已经完成了我的第一个EA。我现在唯一的问题是,我不能让它在一个以上的货币对上打开交易。在终端上日记旁边的EA部分,它发送了一个错误流,订单关闭功能 的无效票据,尽管EA在一个货币对上打开和关闭交易都很好。谁能帮帮我。
 
Matt_Townsend:
我是编码mql4的新手,并且已经完成了我的第一个EA。我现在唯一的问题是,我不能让它在一个以上的货币对上进行交易。在终端上日记旁边的EA部分,它发送了一个错误流,订单关闭功能的无效票据,尽管EA在一个货币对上打开和关闭交易都很好。谁能帮帮我。

如果你不展示你的代码和你的错误日志,你怎么能指望我们知道呢?

我们不是读心者! 如果你想得到我们的帮助,你必须展示你的代码以及它给出的错误(日志中的结果)。当我们看了你的代码后,知道你在哪些货币对和时间框架上进行测试也会有帮助。

另外,请注意,在MetaTrader 4 上,你在策略测试器中 一次只能测试一种货币。如果您的EA在一个图表上同时交易多种货币,您将无法在策略测试器中 测试它--只能在真实的模拟账户或真实账户上测试

 
Matt_Townsend: 即使该EA在一个货币对上打开和关闭交易都很好。
这就是为什么我建议
不要在一个EA中交易多种货币
 
Matt_Townsend: 这是我的代码,我在现场演示中遇到了这个问题,我甚至尝试过是否可以使用多个终端,来解决这个问题。谢谢你到目前为止的反馈。

请编辑你的帖子并使用SRC按钮来添加你的代码不 要只是复制/粘贴为标准文本,因为这很难阅读。我相信你可以从其他主题中看到应该如何做。请使用SRC按钮来发布你的代码。

编辑:正如之前所要求的那样-- ...如果知道你在什么货币对 和时间框架上进行测试,也会有帮助...

EDIT2: 按照之前 的要求 - ... 以及它给出的错误(日志中的结果) ...

 
Fernando Carreiro:
请编辑你的帖子并使用SRC按钮来添加你的代码不 要只是复制/粘贴为标准文本,因为这很难阅读。我相信你可以从其他主题中看到应该如何做。请使用SRC按钮来发布你的代码。
//+------------------------------------------------------------------+
//|                     Simple Moving Average Crossover Strategy.mq4 |
//|                                                 Matthew Townsend |
//+------------------------------------------------------------------+
#property version   "1.05"
#property strict
//---

//---Inputs
extern  double Lots         =0.01;
extern  int    FastMA       =5;
input   int    FastMAMode   =MODE_EMA;
extern  int    SlowMA       =8;
input   int    SlowMAMode   =MODE_SMA;

//+----------------------------------------+
//|undesirables                            |
//+----------------------------------------+
int init()
{
   //----
   //----
   return(0);
}

int deinit()
{
   //----
   //----
   return(0);
}
//+---------------------------------------------+
//|System start                                 |
//+---------------------------------------------+
int start()
{


    double fastma, slowma;
    int    ticket, total;
    //---define Ma's
    
    fastma = iMA(NULL,0,5,0,MODE_EMA,PRICE_CLOSE,0);
    slowma = iMA(NULL,0,8,0,MODE_SMA,PRICE_CLOSE,0);
    
    total = OrdersTotal();
    //---Start operations
    
    if(total < 1)
    {
       if(fastma > slowma)
       {
         ticket = OrderSend(Symbol(),OP_BUY,Lots,Ask,10,0,0,"",0,0,Blue);
         if(ticket > 0)
         {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
            Print("Buy order opened : ", OrderOpenPrice());
         }
         else
           Print("Error opening order : ", GetLastError());
           return(0);
       }
       if(fastma < slowma)
       {
         ticket = OrderSend(Symbol(),OP_SELL,Lots,Bid,10,0,0,"",0,0,Red);
         if(ticket > 0)
         {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
            Print("Sell order opened : ", OrderOpenPrice());
         }
         else
           Print("Error opening order : ", GetLastError());
           return(0);
       }
       return(0);
    }
    bool ans;
    
        
         if(OrderType()==OP_BUY)
         {
           while(fastma < slowma)
           {
             ans = OrderClose(OrderTicket(),Lots,Bid,10,clrNONE);
             if(ticket < 1)
             {      
                if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
                Print("Buy order closed : ", OrderClosePrice());    
             }    
             else
               Print("Error closing order : ", GetLastError());
               return(0);
           }
         }
      if(OrderType()==OP_SELL)
        {
          while(fastma > slowma)
          {
             ans = OrderClose(OrderTicket(),Lots,Ask,10,clrNONE);
             if(ticket < 1)
             {
               if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
               Print("Sell order closed : ", OrderClosePrice());
              
             }
             else
               Print("Error closing order : ", GetLastError());
               return(0);
          }
          
        }
    
    return(0);
}

//+-----------------------------------------------------------------------------------+
 
Fernando Carreiro:
我要求你编辑 你之前的帖子,而不是添加新的帖子,这样就不会让这个主题变得那么长了
对不起,我也是第一次来这个论坛,我可以删除这2个帖子吗?
 
Matt_Townsend:
我是在1小时的时间框架,欧元兑美元和1小时的英镑兑美元上测试的。
下面的代码已经有两个编译器警告了。
...
ans = OrderClose(OrderTicket(),Lots,Bid,10,clrNONE);
...
ans = OrderClose(OrderTicket(),Lots,Ask,10,clrNONE);
...

你没有正确检查关闭操作的结果。

在逻辑方面,你的EA有几个问题,但就目前的情况来看,它在我这边的策略测试器中 运行时没有任何错误,所以请提供你得到的错误列表

 
Fernando Carreiro:
下面的代码已经有两个编译器警告了。
...
ans = OrderClose(OrderTicket(),Lots,Bid,10,clrNONE);
...
ans = OrderClose(OrderTicket(),Lots,Ask,10,clrNONE);
...

你没有正确检查关闭操作的结果。

在逻辑方面,你的EA有几个问题,但就目前的情况来看,它在我这边的运行没有任何错误,所以请提供你得到的错误列表

我从EA得到的唯一错误是orderclose函数 的无效票据,旁边有一个数字,我想显示实际的日志,但在EA运行的第二个图表上,它没有做任何事情,因为通常它会试图立即打开一个交易。如果,当日志中开始出现错误时,我将如何向你展示实际日志?
 
Matt_Townsend:
我从EA得到的唯一错误是订单关闭功能 的无效票据,旁边有一个数字,我想显示实际的日志,但在EA运行的第二个图表上,它没有做任何事情,因为通常它会试图立即打开一个交易。如果,当日志中开始出现错误时,我将如何向你展示实际的日志?

用点击、Ctrl-点击或Shift-点击(标准的windows操作)选择有问题的线条,然后右击选择的内容,选择 "复制"!这样就可以了。

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

 

    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);
           }
         }
重写密令部分的代码,使之符合逻辑,你根本就不应该在这里使用变量票。
 
Matt_Townsend:
我从EA得到的唯一错误是订单关闭功能 的无效票据,旁边有一个数字,我想显示实际的日志,但在EA运行的第二个图表上,它没有做任何事情,因为通常它会试图立即打开一个交易。如果,当日志中开始出现错误时,我将如何向你展示实际的日志?

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

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

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