複数注文の問題 - ページ 5

 
RaptorUK:

実行エラーコードに 目を通して、あなたのコードがそこに与えられた情報に準拠するようにしてください、例えば.

err_trade_timeout128取引のタイムアウトに達した。再試行する前に(少なくとも1分間)、取引操作が本当に成功していないことを確認する必要があります(新しいポジションが開設されていないか、既存の注文が変更または削除されていないか、既存のポジションが閉じられていない)。


RaptorUKさん、こんにちは。

手がかりをありがとうございました。

もう一つの問題(より多くの問題......)。

ECNブローカーで1つの取引が開かれているとします。「取引を行う際の要件と制限」によると、ストップロスが凍結距離内にある場合、成行注文は閉じることができません。その場合、このCloseAll関数は凍結距離内にある注文も閉じるのでしょうか?

よろしくお願いします。

ルイス

void CloseAllOnSL()
 {
   int OrdType, GLError;
   double OrderClosed;   
        RefreshRates(); 

   int LastClosedTicket=GetTicketFromHistory(Symbol(),MagicNumber);  
   if(LastClosedTicket>0)                                          
   {//28                                                  
      Print("LastClosedTicket=",LastClosedTicket);                   
      if(OrderSelect(LastClosedTicket,SELECT_BY_TICKET))             
      {//29        
         if(MathAbs(OrderTakeProfit()-OrderClosePrice())>            
            MathAbs(OrderStopLoss()-OrderClosePrice()))              
            {//30        
            Print("Order with ticketnr: ", LastClosedTicket,
                  " hit SL! Close all open orders");

      for(int OrderPos = OrdersTotal()-1; OrderPos >= 0; OrderPos--)       
         if(OrderSelect(OrderPos, SELECT_BY_POS, MODE_TRADES)
            && OrderMagicNumber()== MagicNumber 
            && OrderSymbol()== Symbol())                                       
            {//31
            OrdType = OrderType();
            if(OrdType == OP_BUY || OrdType==OP_SELL)
              {//32
              if(!OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(),RealSlippage, Yellow))
                  GLError = GetLastError();
              }//32               
             }//31      
         }//28 
      }//29     
   }//30 
 
  if(GLError > 0) Print("Error Closing/Deleting Order, error # ", GLError, " for ticket: ", OrderTicket());           
}
 
luisneves:


こんにちは、RaptorUKです。

ヒントをありがとうございました。

もう一つの問題(もっとあるのですが・・・)。

ECNブローカーで1つのトレードを開いていて、「トレードを行う際の要件と制限」によって、ストップロスが凍結距離の内側にある場合、成行注文を閉じることができないとします。その場合、このCloseAll機能は、凍結距離内にある注文も閉じるのでしょうか?

いいえ、それは失敗します、おそらくエラー130
 

こんにちは、RaptorUKです。

もし可能であれば、この問題についてのヘルプをお願いしたいのですが。

このコードは最後のOrderLots()を見つけ、倍率を掛けるのですが、ある時はこの倍率を越えてしまい、0.01, 196,83, 590,49 などの注文が入っています。

この場合、注文は5つまでしか出せません。このロジックでは、たとえ5以上の注文を出す条件があっても、注文は出ませんし、プール内の注文数は 5つに制限されています。このコードで、私が認識していない何か間違ったことがありますか?

(インデントがうまくいっていればいいのですが...)

for(int cnt = 0; cnt < OrdersTotal(); cnt++)
   {//11
 if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
   {//12
 if(OrderSymbol() == Symbol()&& OrderMagicNumber() == MagicNumber)
   {//13
     LastLot = OrderLots();
   }//13              
     MLots = 0;                       
     MLots = LastLot * Multiplier;        
   }//12
 else MLots = LotSize;
   }//11 
 return(0);
 }//0 

よろしくお願いします。

ルイス

 
luisneves:

こんにちは、RaptorUKです。

もし可能であれば、この問題についてのヘルプをお願いしたいのですが。

このコードは最後のOrderLots()を見つけ、倍率を掛けるのですが、ある時はこの倍率を越えてしまい、0.01, 196,83, 590,49 などの注文が入っています。

この場合、注文は5つまでしか出せません。このロジックでは、たとえ5以上の注文を出す条件があっても、注文は出ませんし、プール内の注文数は5つに制限されています。このコードで、私が認識していない何か間違ったことがありますか?

(インデントがうまくいっていればいいのですが...)

私はこのようにやっています ... ...

for(int cnt = 0; cnt < OrdersTotal(); cnt++)
   {//11
   if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
      {//12
      if(OrderSymbol() == Symbol()&& OrderMagicNumber() == MagicNumber)
         {//13
         LastLot = OrderLots();
         }//13              
      MLots = 0;                       
      MLots = LastLot * Multiplier;        
      }//12
   else MLots = LotSize;
   }//11 
return(0);
}//0 

OrderSelect()が失敗したら MLots = LotSize ? なぜ ? あなたのインデントは、あなたの if 文と中括弧で何が起こっているかを見るのに役立ちません .......あなたはこれを行うことを意味するのですか?

for(int cnt = 0; cnt < OrdersTotal(); cnt++)
   {//11
   if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
      {//12
      if(OrderSymbol() == Symbol()&& OrderMagicNumber() == MagicNumber)
         {//13
         LastLot = OrderLots();
         MLots = 0;                       
         MLots = LastLot * Multiplier; 
         }//13              
      }//12
   }//11 
if(MLots < 0.001) MLots = LotSize;  //  if MLots == 0.0
return(0);
}//0 

私はこれをやった .

if(MLots < 0.001)

二重比較の問題を避けるための簡単で汚い方法として、あなたはこれを読んだことがありますか?価格 != 価格でも いいですか?

 
RaptorUK:

私はこのようにします ... ...

OrderSelect()が失敗した場合 MLots = LotSize ? なぜ ? あなたのインデントは、あなたの if 文と中括弧で何が起こっているかを見るのに役立ちません .......あなたはこれを行うことを意味するのですか?

私はこれをやった .

.二重比較の問題を避けるための迅速かつ汚い方法として、あなたはこれを読んだことがありますか?価格 != 価格を することができますか?


こんにちは、RaptorUk。

早速のご回答ありがとうございます。

ということは、elseは無駄にあるので、利用しない方が良いということですね。また、リンクもありがとうございます。

最高のegards

ルイス

 

RaptorUKさん、こんにちは。

一つ問題があります。

一部の注文が時間前に終了してしまうのですが、どういうことかというと

これらの注文はずっと開いていて、6個までしか開けられない制限があります。すべての注文はTrailingStopで決済されるはずなのですが、1,3,5の注文が時間前に決済されています。3と5は、(07:43)以降にクローズした他の注文より先にクローズしている。

この3つの注文は他の注文より先に決済されているので、7、8、9の注文をオープンするスペースができ、これらの注文は最後のロット(2.43)を基準にしてオープンされます。

つまり、私が理解する限り、07:23に不規則な注文のクローズは起こるはずもなく、エラーも見つかっていない...

1 - 49518192013.01.28 19:51売る0.01eurusdi1.345471.350471.343472013.01.29 07:231.34347-0.060.000.001.49
2 - 49520362013.01.28 20:04買う0.03eurusdi1.345791.340791.347792013.01.29 07:431.34421-0.170.00-0.04-3.53
3 - 49520742013.01.28 20:12売る0.09eurusdi1.345481.350481.343482013.01.29 07:231.34348-0.500.000.0013.40
4 - 49520932013.01.28 20:20買う0.27eurusdi1.345791.340791.347792013.01.29 07:431.34421-1.490.00-0.38-31.74
5 - 49521102013.01.28 20:27売る0.81eurusdi1.345481.350481.343482013.01.29 07:231.34348-4.460.000.00120.58
6 - 49521502013.01.28 20:48買う2.43eurusdi1.345791.340791.347792013.01.29 07:431.34421-13.370.00-3.43-285.63
7 - 49593372013.01.29 07:23売る7.29eurusdi1.343511.348511.341512013.01.29 07:431.34424-40.100.000.00-395.89
8 - 49598582013.01.29 07:40買う21.87eurusdi1.343821.344221.345822013.01.29 07:431.34422-120.290.000.00650.79
9 - 49598602013.01.29 07:40売る65.61eurusdi1.343821.348821.341822013.01.29 07:431.34424-360.860.000.00-2 049.95

TrailingStopによってこれらの注文をすべてクローズするコードはこれです。

このコードは失敗し、異なる時間に注文を閉じることができますか?

void CloseAllOnSL()
 {
   int OrdType, GLError;
   double OrderClosed;
        
   int LastClosedTicket=GetTicketFromHistory(Symbol(),MagicNumber);  
   if(LastClosedTicket > 0 )                                          
   {//28                                                  
      Print("LastClosedTicket=",LastClosedTicket);                   
      if(OrderSelect(LastClosedTicket,SELECT_BY_TICKET))             
      {//29        
         if(MathAbs(OrderTakeProfit()- OrderClosePrice())>            
            MathAbs(OrderStopLoss()- OrderClosePrice()))             
            {//30        
            Print("Order with ticketnr: ", LastClosedTicket,
                  " hit SL! Close all open orders");

      for(int OrderPos = OrdersTotal()-1; OrderPos >= 0; OrderPos--)       
         if(OrderSelect(OrderPos, SELECT_BY_POS, MODE_TRADES)
            && OrderMagicNumber()== MagicNumber 
            && OrderSymbol()== Symbol())                                       
            {//31
            OrdType = OrderType();
            if(OrdType == OP_BUY || OrdType==OP_SELL)
              {//32
              while(IsTradeContextBusy()) Sleep(SleepTime);  
                   RefreshRates();
              if(!OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(),RealSlippage, Yellow))                
                 GLError = GetLastError();
              }//32               
             }//31      
         }//28 
      }//29     
   }//30 

よろしくお願いします。

ルイス

 
luisneves:


TrailingStopですべてをクローズするコードはこれです。

このコードが失敗して、異なる時間に注文をクローズする可能性は?

トレーリングSLは、もし価格が注文と一緒に動いたら、SLは価格の方に移動し、もし新しいSLがヒットしたら、損失は少なく、あるいは利益が出るように設定されています。もしあなたがOrderClose()するつもりなら、なぜトレーリングSLを設定するのですか? それはトレーリングSLではなく、EAを通して積極的に取引を終了させるので、いかなる種類のSLでもないのです。

多分、あなたのCloseAllOnSL()関数は 私が思うのとは違うことをするのでしょうが、しかし、あなたのコードが何をしようとしているのかを説明するコメントはありません。 OrderModify()がないようにトレーリングSLもないのです。

 

続きを読む:関数の戻り値とは 何ですか?どのように使用するのですか?

if(OrdType == OP_BUY || OrdType==OP_SELL)
              {//32
              while(IsTradeContextBusy()) Sleep(SleepTime);  
                   RefreshRates();
              if(!OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(),RealSlippage, Yellow))                
                 {
                 GLError = GetLastError();

                 //  ? ? ? ? ?  why aren't you printing the information about the OrderClose() failure ? ? 
                 Print("OrderClose failed, error# ", GLError);  //<-----  like this  but more info
                 } 
              }//32 

Print文にさらに情報を追加します。OrderTicket(), OrderLots(), OrderClosePrice(), Bid, Askなど、エラーが発生したときに何が問題だったのかを判断するのに必要なあらゆる情報を追加します。

 
luisneves:


だから、私が理解する限り、07:23の注文の不規則なクローズは起こってはならないし、エラーは見つかっていない...

1 - 49518192013.01.28 19:51売る0.01eurusdi1.345471.350471.343472013.01.29 07:231.34347-0.060.000.001.49
2 - 49520362013.01.28 20:04買う0.03eurusdi1.345791.340791.347792013.01.29 07:431.34421-0.170.00-0.04-3.53
3 - 49520742013.01.28 20:12売る0.09eurusdi1.345481.350481.343482013.01.29 07:231.34348-0.500.000.0013.40
4 - 49520932013.01.28 20:20買う0.27eurusdi1.345791.340791.347792013.01.29 07:431.34421-1.490.00-0.38-31.74
5 - 49521102013.01.28 20:27売る0.81eurusdi1.345481.350481.343482013.01.29 07:231.34348-4.460.000.00120.58
6 - 49521502013.01.28 20:48買う2.43eurusdi1.345791.340791.347792013.01.29 07:431.34421-13.370.00-3.43-285.63
7 - 49593372013.01.29 07:23売る7.29eurusdi1.343511.348511.341512013.01.29 07:431.34424-40.100.000.00-395.89
8 - 49598582013.01.29 07:40買う21.87eurusdi1.343821.344221.345822013.01.29 07:431.34422-120.290.000.00650.79
9 - 49598602013.01.29 07:40売る65.61eurusdi1.343821.348821.341822013.01.29 07:431.34424-360.860.000.00-2 049.95

この現象が起きたときのログの出力を表示する ... ...
 
RaptorUK:

続きを読む:関数の戻り値とは 何ですか?どのように使用するのですか?

Print文にさらに情報を追加します。OrderTicket(), OrderLots(), OrderClosePrice(), Bid, Askなど、エラーが発生したときに何が問題だったのかを判断するのに必要なあらゆる情報を追加します。


RaptorUkさん、こんにちは。

お時間をいただきありがとうございました。

TrailingStopのコードは別のところにあり、送られたコードはTrailingStopによって注文が閉じられたらすべて閉じるというものです。

しかし、私はあなたの助言に従って、なぜ注文が他のものより先に閉まるのか、より多くの追加情報を与えることができるエラーを探します。

ところで、以下のコードでは、MLots = 0; の位置を実際の場所からforループの前に変更することに意味があるのでしょうか?

   MLots = 0; <-----------------------------------------------------------------to here 
   for(int cnt = 0; cnt < OrdersTotal(); cnt++)
      {//11
      if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
         {//12
         if(OrderSymbol() == Symbol()&& OrderMagicNumber() == MagicNumber)
            {//13
            LastLot = OrderLots();
            }//13            
         MLots = 0;  <-----------------------------------------------------------from here                      
         MLots = LastLot * Multiplier;        
         }//12      
      }//11 
   return(0);
   }//0 

よろしくお願いします。

ルイス