オーダー変更時のエラー1 - ページ 3

 

error 1 は通常のエラーです...

の場合、通常は発生しません(コードが曲がっていて、変更されていない注文パラメータが変更されている場合や、テスターでスリッページを発生させることができる場合を除く)。

実際の市場では、これは(正しい注文修正コードで)あなたが市場の近くにストップを変更すると、特にスリッページで可能です - 型ストップロスは、注文が正に移動しているときに価格のすぐ後ろに移動し、スリッページと価格の動きのために、エラーがしばしば発生し、理由は明らかです...良いエラーです...。

 
borilunad:

申し訳ございませんが、SellLimitはdistを必要とします。

not if (New_OOP < Bid) continue; butif (New_OOP-dist*Point < Bid) continue;

Boris さん、私のfOrderModify() メソッドは、STOPLEVELとFRIZLEVELの両方で、すべてのチェックを考慮に入れています。つまり、これらの条件のいずれかが満たされていなければ、改造は完了しなかったということです。

レナート

あなたは絶対に間違っています。後者のエラーは、今でも多くの重要な機能でリセットされています。WinAPIでもそのように動作します。

だから、エラーコードが発生したらすぐにローカル変数に保存し、中間関数の塊でこのシステム変数を10回クリアしてから使おうとはしないことだ。

まあ、仮にオプションでエラーが上書きされたとしても、最後の1つはそのままでしょう。最後のエラーは、私の場合、やはり1になってしまいます。そうでしょう?

そうやってエラーも出ずに作業していたら。例で示そうか?

今デバッグ中なので、全てのプリンターを使った改造関数を紹介します。(他のメソッドは無視して ください)。

// 1.2 Функция модифицирует выделенный ордер (установка TP и SL). =========================================================================
bool PositionsManipulations::fOrderModify (int       fi_Ticket,             // OrderTicket()
                                           double    fd_OpenPrice,          // OpenPrice
                                           double    fd_NewSL,              // Новый StopLoss (УРОВЕНЬ !!!)
                                           double    fd_NewTP,              // Новый TakeProfit (УРОВЕНЬ !!!)
                                           datetime  fdt_Expiration = 0,    // Время истечения отложенного ордера
                                           color     fc_Arrow = CLR_NONE)   // Цвет стрелок модификации StopLoss и/или TakeProfit на графике
{
   Print (__FUNCTION__, ": ", "Вошли в функцию ");

//---- Проверяем необходимость модификации
   if (fd_NewSL == OrderStopLoss() && fd_NewTP == OrderTakeProfit())
       return (false);
//----
   string ls_fName = "fOrderModify()";
   int    li_Cnt = 0;
   double ld_Price;
   bool   lb_InvalidSTOP = false,
          lb_FixInvalidPrice = false;    // Флаг первоначальной коррекции отложки

//---- Получаем актуальную информацию по символу и текущему ордеру
   CBase.GetMarkerInfo (OrderSymbol(), fi_Ticket);
   
   Print (__FUNCTION__, ": ", "До проверки на FREEZELEVEL и STOPLEVEL  тикета № ", fi_Ticket);
   Print (__FUNCTION__, ": ", "Тикет № ", OrderTicket(), "; OrderOpenPrice() = ", OrderOpenPrice(),
             "; OrderStopLoss() = ", OrderStopLoss(), "; OrderTakeProfit() = ", OrderTakeProfit());
   Print (__FUNCTION__, ": ", "Тикет № ", fi_Ticket, "; New_OOP = ", fd_OpenPrice, "; New_SL = ", fd_NewSL, "; New_TP = ", fd_NewTP);
//---- Проверяем на условия FREEZELEVEL и STOPLEVEL
   if (!CheckLevelsBLOCK (3, SPos.gs_Symbol, SPos.gi_Type, fd_OpenPrice, fd_NewSL, fd_NewTP, lb_FixInvalidPrice))
   {
      if (StringLen (CErrs.ErrInf) > 0)
      {
         CLogs.WriteLog (CErrs.ErrInf);
         return (false);
      }
   }
   Print (__FUNCTION__, ": ", "После проверки на FREEZELEVEL и STOPLEVEL  тикета № ", fi_Ticket);
   Print (__FUNCTION__, ": ", "Тикет № ", fi_Ticket, "; New_OOP = ", fd_OpenPrice, "; New_SL = ", fd_NewSL, "; New_TP = ", fd_NewTP);
   
   ResetLastError();
   
//---- Определяем цвет значков модификации ордеров
   if (fc_Arrow == CLR_NONE)
       fc_Arrow = ColorByModify [OrderType() % 2];
   
//---- Выполняем модификацию в тестере
   if (!CBase.GetRealTrade())
   {
      static int i = 0;
      
      if ((ND (OrderOpenPrice()) != fd_OpenPrice) || ND ((OrderStopLoss()) != fd_NewSL) || (ND (OrderTakeProfit()) != fd_NewTP)) {
      ResetLastError();
      
      Print (__FUNCTION__, ": ", " i = [", IToS (i), "] Тикет № ", OrderTicket(), "; OrderOpenPrice() = ", OrderOpenPrice(),
             "; OrderStopLoss() = ", OrderStopLoss(), "; OrderTakeProfit() = ", OrderTakeProfit());
      Print (__FUNCTION__, ": ", "Тикет № ", fi_Ticket, "; New_OOP = ", fd_OpenPrice, "; New_SL = ", fd_NewSL, "; New_TP = ", fd_NewTP);
      
      i++;
      
      if (!OrderModify (fi_Ticket, fd_OpenPrice, fd_NewSL, fd_NewTP, fdt_Expiration, fc_Arrow))
      {
         CLogs.WriteLog (StringConcatenate ("fOrderModify(): ", CErrs.ErrorToString (_LastError)));
         Print (__FUNCTION__, ": ", "После модификации тикета № ", fi_Ticket);
         Print (__FUNCTION__, ": ", "Тикет № ", fi_Ticket, "; New_OOP = ", fd_OpenPrice, "; New_SL = ", fd_NewSL, "; New_TP = ", fd_NewTP);
         return (false);
      }
      }
   }
   
//---- Выполняем модификацию в on-line торговле
   while (IsTradeAllowed() == true)
   {
      if (!IsExpertEnabled() || IsStopped() || li_Cnt > 200)
      {
         CLogs.WriteLog (StringConcatenate ("Error: Trying to modify ticket #", fi_Ticket, ", which is ", GetNameOP (SPos.gi_Type), " NOT IsTradeContextBusy"));
 
         if (!IsExpertEnabled()) {CLogs.WriteLog ("Permit ExpertEnabled !!!");}
             return (false);
      }
   
      if (OrderModify (fi_Ticket, fd_OpenPrice, fd_NewSL, fd_NewTP, fdt_Expiration, fc_Arrow))
      {
         break;
      }
   
      if (CErrs.ErrorHandling (_LastError, lb_InvalidSTOP))
         break;
 
      CLogs.WriteLog (StringConcatenate ("Error Occured : ", CErrs.ErrorToString (_LastError)));
      CLogs.WriteLog (StringConcatenate ("fOrderModify(): ", SPos.gs_Symbol, "# ", fi_Ticket, "/", GetNameOP (SPos.gi_Type), " | Price = ", DToS (fd_OpenPrice), " | SL = ", DToS (fd_NewSL), " | TP = ", DToS (fd_NewTP)));
   
      if (lb_InvalidSTOP)
      {
         RefreshRates();
 
         ld_Price = CBase.GetTradePrice (SPos.gi_Type % 2, true, SPos.gs_Symbol);
 
         if (SPos.gi_Type < 2)
         {
            CheckValidStops (ld_Price, SPos.gi_Type, fd_NewSL, fd_NewTP, false);
         }
         else
         {
            CheckValidOOP (SPos.gs_Symbol, SPos.gi_Type, fd_OpenPrice, fd_NewSL, fd_NewTP, ld_Price, lb_FixInvalidPrice);
         }
      }
      li_Cnt++;
   
      if (NumberOfTry < li_Cnt)
          return (false);
   }
//---- Контролируем возможные ошибки
   if (_LastError > 0)
       CLogs.Printing (StringConcatenate ("ls_fName => ", CErrs.ErrorToString (_LastError)));
//----
   return (true);
}
 
ビクター、あなたの最初の投稿には、すでに必要な情報がすべて含まれています。その注文のパラメータに新しい値がない状態で、注文を修正するための注文を送信しているに過ぎません。
 

サーバーはこう答える。「何しに来たんだい、おじいさん?

あるいは、「何が欲しいか言ってくれれば、欲しいものをあげるよ。

 

批判もされなかったし、ロシア人の心のこもった「メルシー」ももらえた。悲しいよ、君達...。

 
tara:

批判もされなかったし、ロシア人の心のこもった「メルシー」ももらえた。悲しいよ、君達...。

感謝することは何ですか?
 
そうですね...
 
borilunad:

申し訳ございませんが、SellLimitはdistを必要とします。

not if (New_OOP < Bid) continue; butif (New_OOP-dist*Point < Bid) continue;

ボリス、スプレッドの内側にペンディングオーダーを 置く機会に遭遇したことはないのですか?そして、New_OOPにそれが含まれていないと考える根拠は何ですか?
 
tara:
ビクター、あなたの最初の投稿には、すでに必要な情報がすべて含まれています。そのオーダーのパラメータに新しい値がない状態で、オーダーを修正するためのオーダーを送信するだけです。

ボリス 仮にそうだとすると......。想定しています。しかし、関数が注文を修正するために再送信する場合、有意差は修正されるべきです。そして、私の場合は、まったく修正しないのです。過去ログで見ても、見えてくるのはこうだ。

modify #2  sell limit 0.10 EURUSD at 1.34048 sl: 1.34125 tp: 1.33362 ok
OrderModify error 1
なぜ注文が送信されるのですか?パラメータが正しくないと、この関数はクラッシュしてしまうのです......。そして、ここはちょっとOK...。...送信されました。すると、誤りがあることが判明した。どのような理屈なのでしょうか。
 

エラーとどう関係があるのでしょうか?モディファイ関数の直前にエラープリントを貼りました。

//---- Выполняем модификацию в тестере
   if (!CBase.GetRealTrade())
   {
      if ((ND (OrderOpenPrice()) != fd_OpenPrice) || ND ((OrderStopLoss()) != fd_NewSL) || (ND (OrderTakeProfit()) != fd_NewTP)) {
      ResetLastError();
      
      Print (__FUNCTION__, ": ", " i = [", IToS (i), "] Тикет № ", OrderTicket(), "; OrderOpenPrice() = ", OrderOpenPrice(),
             "; OrderStopLoss() = ", OrderStopLoss(), "; OrderTakeProfit() = ", OrderTakeProfit());
      Print (__FUNCTION__, ": ", "Тикет № ", fi_Ticket, "; New_OOP = ", fd_OpenPrice, "; New_SL = ", fd_NewSL, "; New_TP = ", fd_NewTP);
      Print (__FUNCTION__, ": ", "_LastError = ", _LastError);                    \\ ВОТ ТУТ Я ПРОВЕРЯЮ НАЛИЧИЕ ОШИБКИ ПЕРЕД СЛЕДУЮЩЕЙ ФУНКЦИЕЙ МОДИФИКАЦИИ!!!
      
      if (!OrderModify (fi_Ticket, fd_OpenPrice, fd_NewSL, fd_NewTP, fdt_Expiration, fc_Arrow))
      {
         CLogs.WriteLog (StringConcatenate ("fOrderModify(): ", CErrs.ErrorToString (_LastError)));
         Print (__FUNCTION__, ": ", "После модификации тикета № ", fi_Ticket);
         Print (__FUNCTION__, ": ", "Тикет № ", fi_Ticket, "; New_OOP = ", fd_OpenPrice, "; New_SL = ", fd_NewSL, "; New_TP = ", fd_NewTP);
         return (false);
      }
      }
   }

そして、このコードの一部分のログは以下の通りです。

0       11:45:28        2013.08.26 00:00  Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::fOrderModify: Тикет № 2; New_OOP = 1.34048; New_SL = 1.34125; New_TP = 1.33362
0       11:45:28        2013.08.26 00:00  Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::fOrderModify:  Тикет № 2; OrderOpenPrice() = 1.34048; OrderStopLoss() = 0.0; OrderTakeProfit() = 0.0
0       11:45:28        2013.08.26 00:00  Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::fOrderModify: Тикет № 2; New_OOP = 1.34048; New_SL = 1.34125; New_TP = 1.33362
0       11:45:28        2013.08.26 00:00  Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::fOrderModify: _LastError = 0
2       11:45:28        2013.08.26 00:00  Kevin Martens_Moi_Myrei EURUSD,M15: modify #2  sell limit 0.10 EURUSD at 1.34048 sl: 1.34125 tp: 1.33362 ok
3       11:45:28        2013.08.26 00:00  Kevin Martens_Moi_Myrei EURUSD,M15: OrderModify error 1
修正機能の前にエラーがないことがよくわかりますね!エラーとどう関係があるのでしょうか?