请帮助我解开这个谜团!!

 

我不明白为什么程序会跳过前一行成功后的几行,而忽略了这几行的指令。

如果你看一下下面的代码,你会发现有一个卖出交易策略测试器中 被成功执行,但是卖出交易从未被记录在日志中,OrderSend之后的几行代码也被忽略,也没有记录在日志中。

这到底是怎么回事?

(我的数据确实有一些问题,从许多行中可以看出。2012.12.31 11:21:27 TestGenerator: unmatched data error (volume limit 2430 at 2012.11.05 06:00 exceeded))

以下是我所指的代码片段。

if(IsTradeContextBusy()) Sleep(10);
      SellTicket = OrderSend(Symbol(),OP_SELL,LotSize,SellPrice,UseSlippage,SellStopLoss,SellTakeProfit,"CCITrendReversal",MagicNumber,0,Red);
        Print("SellTicket is ",SellTicket);  
           if (SellTicket >= 0) 
           {
             PlaySound("news.wav");
             SellTime = OrderOpenTime();
             SellSignal = false;
           }
          Print("SellSignal2 is ", SellSignal);
 
ernest02:

我不明白为什么程序会跳过前一行成功后的几行,而忽略了这几行的指令。

如果你看一下下面的代码,你会发现有一个卖出交易 在策略测试器中被成功执行,但是卖出交易从未被记录在日志中,OrderSend之后的几行代码也被忽略,也没有记录在日志中。

这到底是怎么回事?

卖出交易没有成功 ......添加代码,当任何OrderXxxx()函数失败时打印错误,如OrderSend(), OrderModify(), OrderClose(), 等等 ......更多信息:什么是函数返回值?我如何使用它们?
 

ernest02,

也许这对你会有帮助?

Print("Error description",GetLastError());

谢谢你。

 

谢谢大家....,但是...


  // Error handling
             if(SellTicket == -1)
               {
                ErrorCode = GetLastError();
                ErrDesc = ErrorDescription(ErrorCode);

                ErrAlert = StringConcatenate("Open Sell Order - Error ",ErrorCode,": ",ErrDesc);
                Alert(ErrAlert);

                ErrLog = StringConcatenate("Ask: ",Ask," Lots: ",LotSize," Price: ",SellPrice," Stop: ",SellStopLoss," Profit: ",SellTakeProfit);
                Print(ErrLog);
               }
 
ernest02:

谢谢大家....,但是...

SellTicket是双数 还是整数? 你能不能把你发布的两段代码和中间的所有代码显示出来?
 

SellTicket是一个整数。

下面是更多的代码。

if (SellSignal == true && CCIReal < (CCILevel - SellLevel) && TotalSellOrders <= MaxTrans && SellTrans == true)

      {
       Print("CCI is ",CCIReal);
       
       for (Count = OrdersTotal()-1; Count >= 0; Count--)
                    if (OrderSelect(Count, SELECT_BY_POS)
                    && OrderType() == OP_BUY
                    && OrderMagicNumber() == MagicNumber)
                    
                    {
                    int BuyOrder = OrderTicket();
                    
                    while(IsTradeContextBusy()) Sleep(10);
                
                    bool Closed = OrderClose(BuyOrder, OrderLots(), Bid, UseSlippage, Blue);
                                            
                            // Error handling
                  if(Closed == false)
                     {
                        ErrorCode = GetLastError();
                        string ErrDesc = ErrorDescription(ErrorCode);

                        string ErrAlert = StringConcatenate(" Close Buy Order Error - Error ",ErrorCode,": ",ErrDesc, " Bid is ", Bid, " SellTakeProfit is ", SellTakeProfit);
                        Alert(ErrAlert);

                        string ErrLog = StringConcatenate("OrderTicket: ",OrderTicket());
                        Print(ErrLog);
                        
                     }
                      
                            }
                       
      
      RefreshRates();
      
      SellPrice = Bid;
      
      if (TrailingStopFunc == false)
      
         
         SellStopLoss = Bid + (StopLoss * UsePoint);
         else SellStopLoss = 0;
           
      
      SellTakeProfit = Bid - (TakeProfit * UsePoint);
      
      if(IsTradeContextBusy()) Sleep(10);
      SellTicket = OrderSend(Symbol(),OP_SELL,LotSize,SellPrice,UseSlippage,SellStopLoss,SellTakeProfit,"CCITrendReversal",MagicNumber,0,Red);
        Print("SellTicket is ",SellTicket);  
           if (SellTicket >= 0) 
           {
             PlaySound("news.wav");
             SellTime = OrderOpenTime();
             SellSignal = false;
           }
          Print("SellSignal2 is ", SellSignal);
          
          // Error handling
             if(SellTicket == -1)
               {
                ErrorCode = GetLastError();
                ErrDesc = ErrorDescription(ErrorCode);

                ErrAlert = StringConcatenate("Open Sell Order - Error ",ErrorCode,": ",ErrDesc);
                Alert(ErrAlert);

                ErrLog = StringConcatenate("Ask: ",Ask," Lots: ",LotSize," Price: ",SellPrice," Stop: ",SellStopLoss," Profit: ",SellTakeProfit);
                Print(ErrLog);
               }
         
         }
 

ernest02,

我不明白是什么导致了你所说的错误,但你可以考虑以这样的方式重写你的代码,使错误不存在。

说到这里, 如果你能发布一个你希望你的EA执行的行动描述,我(和/或其他人)将更容易为你提供解决方案。

与其试图隔离错误,如果错误花费太多时间去寻找,不如考虑重写代码来删除 错误。这完全取决于你。希望这是很有用的。

谢谢你。

 
ernest02:

SellTicket是一个整数。

下面是更多的代码。

谢谢你.......只是想弄清楚,如果Sell成功了,应该发生什么。.

Print("SellTicket is ",SellTicket);    //  <---  this will be printed to the journal
           if (SellTicket >= 0) 
           {
             PlaySound("news.wav");    //  <---  PlaySound does not work in the Strategy Tester 
             SellTime = OrderOpenTime();   //  <---  if the Sell worked this variable will be set (or do we first need an OrderSelect() ?)
             SellSignal = false;           //  <---  if the Sell worked this variable will be set
           }
          Print("SellSignal2 is ", SellSignal);    //  <---  this will be printed to the journal
 

这就是最奇怪的地方!

策略测试器 记录了许多卖出交易,但日志中却没有显示。

我打算再次从头开始研究代码,做一些修改,看看会发生什么。

谢谢大家的帮助。非常感谢。

(如果我找到了错误的原因,我将向你们报告--否则我将重写代码)。

 
ernest02:

这就是最奇怪的地方!

策略测试器记录了许多卖出交易,但日志中却没有显示。

我打算再从头看一遍代码,做一些修改,看看会发生什么。

谢谢大家的帮助。非常感谢。

(如果我找到了错误的原因,我将向你们报告--否则我将重写代码)。

奇怪 ......除非你错看了专家选项卡? 你有没有看一下测试器/日志/中 的日志?
 
ernest02: 策略测试器记录了许多卖出交易,但在日志中却没有显示。
除非你在测试器中使用可视化模式,否则日记中永远不会有任何东西。
原因: