Пожалуйста, помогите мне разгадать эту загадку!!!

 

Я не могу понять, почему программа пропускает строки после успешной предыдущей строки и игнорирует инструкции в этих строках.

Если вы посмотрите на код ниже, то увидите, что есть транзакция на продажу, которая успешно выполняется в тестере стратегий, но транзакция на продажу никогда не записывается в журнал, и строки кода после OrderSend также игнорируются и также не записываются в журнал.

Что происходит?

(У меня действительно есть некоторые проблемы с данными, как видно из одной из многих строк: 2012.12.31 11:21:27 TestGenerator: ошибка несопоставленных данных (превышен лимит объема 2430 в 2012.11.05 06:00))

Вот фрагмент кода, на который я ссылаюсь:

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 - это double или int? Вы можете показать 2 части кода, которые вы разместили, со всеми частями кода между ними, пожалуйста....
 

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,

Я не понимаю, что вызывает ошибку, о которой вы говорите, но вы могли бы рассмотреть возможность переписать ваш код таким образом, чтобы ошибки не было.

С учетом сказанного, если бы вы могли опубликовать описание действия, которое вы хотите, чтобы выполнял ваш советник, мне (и/или другим) было бы проще предложить вам решение.

Вместо того чтобы пытаться изолировать ошибку, если на ее поиск уходит слишком много времени, подумайте о том, чтобы переписать код, чтобы убрать ошибку. Это полностью зависит от вас. Надеюсь, это будет полезно.

Спасибо.

 
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:

Вот что странно!

Тестер стратегий регистрирует множество сделок на продажу, но в журнале ничего не отображается.

Я собираюсь снова проработать код с самого начала, внести несколько изменений и посмотреть, что произойдет.

Спасибо за помощь, ребята. Очень признателен.

(Если я найду причину ошибки, я сообщу о ней - в противном случае я просто перепишу код).

Странно... если только вы не смотрите на вкладку Experts по ошибке? Вы посмотрели журнал в tester/logs/?
 
ernest02: Тестер стратегий регистрирует множество сделок на продажу, но в журнале ничего не отображается.
Если вы не используете визуальный режим в тестере, в журнале никогда ничего не будет.