提醒:MT4终端复制专家发送的订单 - 页 5

 

嗨,朋友们。

很抱歉我之前没有回答。我不知道你的帖子,因为我没有收到Metaquotes的通知。我确实按照RaptorUK的建议开了一个勾,但他们根本就没有回答。必要时,我和JamesMadden 的做法一样。我只是关闭订单,松开点差。如果没有那么大的风险,我就把它留在那里!(如果我的EA是有利可图的,我就把它留在那里。(如果我的EA是有利可图的,从长远来看,它将赢多输少)然而,我当然不喜欢这个错误。

现在我在build 600上遇到了新的问题,我想知道,如果有人知道,你是如何让他们回答的呢? :)

PD:我怎样才能让这个网络应用程序在这个帖子被更新时给我发一封邮件?我已经订阅了这个主题。

 
Ricardo1:

嗨,朋友们。

很抱歉我之前没有回答。我不知道你的帖子,因为我没有收到Metaquotes的通知。我确实按照RaptorUK的建议开了一个勾,但他们根本就没有回答。必要时,我和JamesMadden 的做法一样。我只是关闭订单,松开点差。如果没有那么大的风险,我就把它留在那里!(如果我的EA是有利可图的,我就把它留在那里。(如果我的EA是有利可图的,从长远来看,它将赢多输少)然而,我当然不喜欢这个错误。

现在我在build 600上遇到了新的问题,我想知道,如果有人知道,你如何让他们回答?)

当你发现的时候,让我知道......。 我有一个从2013年3月开始的开放票据,一直没有得到回复。 我所能建议的是,每次都要不断添加新的评论,询问消息或答复。


PD:我怎样才能让这个网络应用程序在这个帖子被更新时给我发一封邮件?我已经订阅了这个主题。

电子邮件通知已经有几年没有用了......也许你可以向服务台报告。
 
RaptorUK:
当你发现时让我知道...。我有一张2013年3月的公开票据,一直没有得到回复。我所能建议的是,每次不断添加新的评论,询问消息或答复。 ,电子邮件通知已经几年没有工作了 ...... 也许你可以向服务台报告





你好。

我刚刚发现了这个话题,因为我正是在搜索这个问题。我以前没有注意到这个问题,但今天发生在我身上。

除了前面提到的专家日志,MetaTrader日志记录了所有的交易,无论是EA还是个人的交易。今天我在我的投资组合中发现了一笔交易,与几秒钟前进行的交易重复,但第二笔交易没有出现在专家日志或MetaTrader日志中。

我已经要求我的经纪人比较他们的传入请求和执行交易的日志,但我怀疑他们要么不保留日志,要么不想调查。

如果EA确实下了两个订单,我希望能在日志中看到这两个订单。即使桌面应用程序由于某种原因重复了请求,我也希望服务器能够响应并记录第二笔交易。现在看来,交易是由服务器而不是客户端执行的。

这是我第一次注意到这个问题,我找不到任何方法来重现这个问题。我现在处理的金额非常小,所以价值并不重要,但它确实引起了对MetaTrader可行性的关注。

我只是觉得我应该把我的想法借给一个已经存在了一段时间的话题。

编辑。

我一直在进一步检查,发现了另一个例子。该订单已经被止损 关闭,所以我没有注意到它。在这两种情况下,EA都下了一个预期订单。这在日志中显示,紧随其后的是一条登录信息,与所下的幻象订单相对应。

如果有人认为发生了幻象订单,请检查日志中的登录信息。它可能是重要的。

 

似乎我不是唯一受到这个恼人问题影响的人。和spikedog一样,我的EA申请了一个市场订单,结果在几毫秒内出现了另一个相同手数的重复交易,重复订单记录显示在日志中,但没有显示在专家标签中;后来我稍微修改了我的代码,希望能更好地防范这个问题,在OrderSend()之前过滤同一栏内的双重交易(只在栏内交易)。

这是我第一次遇到这种重复交易的问题;从那时起,我在3家经纪公司开了500多笔交易,直到现在都没有问题。另外,随后的交易又正常进行了。

附件是我在重复问题发生时处理OrderSend()的代码。我看不出我的EA是如何导致重复订单的。我现在能想到的唯一可能的原因是,也许在一个非常罕见的情况下,服务器正在处理我的OrderSend,但以某种方式返回"-1",而我的EA继续提出另一个请求,将第一个请求作为一个重新报价。这仅仅是我的猜测。


            bool Buy_Ticket = false;
            while(Buy_Ticket==false){     //Loop to solve Requote issues
               for(int BT_count=0; BT_count < RequoteTries; BT_count++){
                  if (!IsTradeAllowed()) Sleep(RequoteTries_WaitingTime);
                  RefreshRates();

                  int B_Spread = MarketInfo(Symbol(), MODE_SPREAD);  //TO CAPTURE EXACT SPREAD UPON BUY ORDER FOR SL
                  Buy_Ticket = OrderSend(Symbol(),0,order_lotsize,Ask,Slippage,0,0,EntryCode_comment,Magic,0,Blue) > 0;

               
                  if (Buy_Ticket==true){     //Modify to give SL & TP if new buy order executed
                     for(int buyMod=0; buyMod < OrdersTotal(); buyMod++){
                        if (OrderSelect(buyMod,SELECT_BY_POS,MODE_TRADES)){
                           if ((OrderSymbol()!=Symbol()) || (OrderType()!=OP_BUY)) continue;
                           if ((OrderStopLoss()==0) && (OrderTakeProfit()==0)){
                              double B_SL = NormalizeDouble((OrderOpenPrice()-((B_Spread*Point)+stoploss)),Digits);
                              double B_TP = NormalizeDouble((OrderOpenPrice()+takeprofit),Digits);

                              bool buy_ModSL_succeed = false;
                              while(buy_ModSL_succeed==false){     //Loop to solve SL+TP modify Requote issues   
                                 for(int buyMod_count=0; buyMod_count < RequoteTries; buyMod_count++){
                                    if (!IsTradeAllowed()) Sleep(5000);
                                    RefreshRates();                                 
                                    if (OrderModify(OrderTicket(), OrderOpenPrice(), B_SL, B_TP, 0, Red)==false) continue;
                                    buy_ModSL_succeed = true;
                                    Print(entrycode_txt," initiated Long trade successfully modified SL & TP.");
                                    break;                        
                                 }  //End FOR loop for requote handling
                                 if (buy_ModSL_succeed == false){
                                    getError = GetLastError();
                                    Alert("Error: ",getError," in Buy order#:",OrderTicket()," modify for SL:",B_SL," & TP:",B_TP," after ",RequoteTries," attempts.");
                                    break;
                                 }
                              }  //End WHILE loop for SL+TP modify requote handling
                           }  //End IF statement to select new orders without SL & TP
                        }  //End IF orderselect
                     }  //End FOR loop to modify new orders without SL & TP 
                  }  //End IF statement when buy order accepted & need SL+TP modify

                  if (Buy_Ticket==false) continue;
                  else break;
               }  //----------------------------//End FOR loop to carry out ordersend for buy trade when requote
               if (Buy_Ticket==false) break;    //Exit WHILE loop to handle Requote issues, fail to buy
            }  //-------------------------------//End WHILE loop to solve Requote issues
 
BigFisherman:

我看不出我的EA怎么会是重复订单的原因。

它可能与你代码中的这个错误有关,你应该修复它并再次测试。

                  Buy_Ticket = OrderSend(Symbol(),0,order_lotsize,Ask,Slippage,0,0,EntryCode_comment,Magic,0,Blue) > 0;

               
                  if (Buy_Ticket==true){     //Modify to give SL & TP if new buy order executed

OrderSend() 返回的是一个int 而不是bool,所以检查返回值是否为 "true "是不正确的。

 

@大渔夫

B.T.W你的代码是怎么回事?

if (Buy_Ticket==true){     //Modify to give SL & TP if new buy order executed
if (Buy_Ticket==false) continue;

再来看看?

else break;
 
RaptorUK:

这可能与你代码中的这个错误有关,你应该修复它并再次测试 . .

OrderSend() 返回一个int ,而不是一个bool,所以检查返回值是否为 "true "是不正确的。


谢谢raptoruk的建议。你是对的 :)
 
BigFisherman:

谢谢raptoruk的建议。我意识到了这一点。然而,我不认为这是重复交易的原因,因为提出的代码是有效的,尽管有点混乱。
如果OrderSend()成功,你会得到一个大于0的返回值,即票据号码,如果失败,你会得到-1的返回值,你是在测试真或假 ......修正你的代码,消除 不确定性。
 
RaptorUK:
如果OrderSend()工作,你会得到一个大于0的返回值,即票号,如果它失败,你会得到-1,你是在测试真或假. . .修复你的代码并消除不确定性。



再次感谢。

干杯!

 
RaptorUK:
如果OrderSend()成功,你会得到一个大于0的返回值,即票据号码,如果失败,你会得到-1的返回值,你是在测试真或假......修正你的代码并消除不确定性。


嗨,RaptorUK。



我有个问题,不完全是关于这个主题的,但希望用我之前的帖子作为例子,加深我对mql4编码的理解,也许也可以帮助其他像我一样的初学者(如果你认为它偏离主题,需要一个新的主题,请删除它并告诉我)。

我一开始对我最初把Buy_Ticket声明为bool而不是int的方式有点困惑,所以我做了进一步测试。 虽然我同意我最初将OrderSend()读作bool的方式不是一个好的编码方式(令人困惑),但我的测试表明它是有效的。 为了让阅读更简单,我编写了以下代码,请大家指教,并感谢大家的时间。


P.S.: 按照建议,我已经修改了我的EA,把OrderSend()读成int。



//+------------------------------------------------------------------+
//|                                                    Test_Bool.mq4 |
//|                                     Copyright 2014, BigFisherman |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, BigFisherman"

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//---
   
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
int start()
{
//---
   
   for (int SimRun=0; SimRun<3; SimRun++){
      bool Buy_Ticket = 0;
      int Ordersend = 0;            //AS AN EXAMPLE TO SIMULATE OrderSend() RETURNED CODE

      switch (SimRun)
      {
         case 0: break;             //FOR Ordersend==0
         case 1:
         {
            Ordersend = 1;          //SIMULATE SUCCESSFUL ORDERSEND() RETURNING TICKET NO. > 0
            break;
         }
         case 2:
         {
            Ordersend = -1;         //SIMULATE FAILED ORDERSEND() RETURNING "-1"
            break;
         }
      }
      
      
      // (MY ORIGINAL WAY OF CODING)   Buy_Ticket = OrderSend(Symbol(),0,order_lotsize,Ask,Slippage,0,0,EntryCode_comment,Magic,0,Blue) > 0;
      Buy_Ticket = Ordersend > 0;   //SIMPLIFIED CODE FOR EASIER READING
      
      
      if (Buy_Ticket==true){
         Print("** Buy_Ticket returns true  **  SimRun: "+SimRun+"  Ordersend: "+Ordersend+"  Buy_Ticket: "+Buy_Ticket);
      }
      else{                         //if (Buy_Ticket==false)
         Print("** Buy_Ticket returns false **  SimRun: "+SimRun+"  Ordersend: "+Ordersend+"  Buy_Ticket: "+Buy_Ticket);
      }
   }
   return(0);
}
//+------------------------------------------------------------------+


日报

2014.03.30 12:57:31.223 2014.03.25 23:30  Test_Bool AUDJPY,M30: ** Buy_Ticket returns false **  SimRun: 0  Ordersend: 0  Buy_Ticket: 0
2014.03.30 12:57:31.223 2014.03.25 23:30  Test_Bool AUDJPY,M30: ** Buy_Ticket returns true  **  SimRun: 1  Ordersend: 1  Buy_Ticket: 1
2014.03.30 12:57:31.223 2014.03.25 23:30  Test_Bool AUDJPY,M30: ** Buy_Ticket returns false **  SimRun: 2  Ordersend: -1  Buy_Ticket: 0