この謎を解くのに協力してください!

 

なぜプログラムは成功した前の行の後の行をスキップし、その行の指示を無視するのかが理解できません。

以下のコードを見ると、Strategy Testerでは 売りの取引が成功 しましたが、ジャーナルには売りの取引が記録されず、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:

なぜプログラムは成功した前の行の後の行をスキップし、その行の指示を無視するのかが理解できません。

以下のコードを見ると、Strategy Testerでは売りの取引が成功 しましたが、ジャーナルには売りの取引が記録されず、OrderSendの後のコードも無視されてジャーナルに記録されないことがわかります。

どうなっているのでしょうか?

OrderSend(), OrderModify(), OrderClose() などのOrderXxxx() 関数が失敗したときにエラーを表示するコードを追加してください ... 詳細:関数の戻り値とは 何ですか?どのように使用するのですか?
 

ernest02です。

もしかしたら、これが役に立つかもしれませんよ?

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

ありがとうございます。

 

ありがとうございます。

ストラテジーテスターでは、いくつかのSellトランザクションが表示されます - - そして、トランザクションにエラーが発生した場合のエラールーチン(下図のコード)がありますが、エラーは報告されていません。


  // 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:

ありがとうございます。

ストラテジーテスターでは、いくつかのSellトランザクションが表示されます - - そして、トランザクションにエラーが発生した場合のエラールーチン(下図のコード)がありますが、エラーは報告されていません。

SellTicketはdouble ですか、それともintですか ? あなたが投稿した2つのコードとその間のすべてのコードを見せてください。
 

SellTicketはIntegerです。

以下はコードの詳細です。

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はIntegerです。

以下はコードの詳細です。

ありがとうございます。.ただ、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:

これがとても不思議なんです。

ストラテジーテスターは多くの売りの取引を記録していますが、ジャーナルには何も表示されません。

もう一度、コードを最初から見直し、少し変更して、どうなるか見てみようと思います。

皆さん、ありがとうございました。とても感謝しています。

(エラーの原因がわかったら報告します。そうでなければコードを書き直します。)

変な話ですが、間違って「エキスパート」タブを見ているのでなければ、tester/logs/の ログを見てみましたか?
 
ernest02: ストラテジーテスターで多くの売り取引を記録しているのに、ジャーナルに何も表示されません。
テスターでビジュアルモードを使用していない限り、ジャーナルに何も表示されることはありません。