Fehler Nr. 1 beim Ändern von Aufträgen - Seite 3

 

Fehler 1 ist ein normaler Fehler...

im Tester, tritt es normalerweise nicht auf (es sei denn, der Code ist gekrümmt und ändert unveränderte Auftragsparameter oder wenn der Tester Schlupf erzeugen kann).

im realen Markt ist dies (bei korrektem Orderänderungscode) möglich, wenn Sie Stops nahe am Markt ändern, insbesondere bei Slippage - die Art des Stop Loss bewegt sich direkt hinter dem Preis, wenn sich die Order ins Positive bewegt, und aufgrund von Slippage und Preisbewegung tritt der Fehler oft auf, und es ist klar, warum... guter Fehler...

 
borilunad:

Entschuldigung, SellLimit erfordert dist:

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

Boris, meine Methode fOrderModify() berücksichtigt alle Prüfungen, sowohl auf STOPLEVEL als auch auf FRIZLEVEL. Wenn also eine dieser Bedingungen nicht erfüllt wäre, wäre die Änderung nicht abgeschlossen worden.

Renat:

Sie liegen völlig falsch. Der letztgenannte Fehler wird in vielen wichtigen Funktionen immer noch zurückgesetzt. So funktioniert es auch in WinAPI.

Speichern Sie also den Fehlercode sofort nach seinem Auftreten in einer lokalen Variablen und versuchen Sie nicht, ihn nach zehnmaligem Löschen dieser Systemvariablen in einer Vielzahl Ihrer Zwischenfunktionen zu verwenden.

Nun, selbst wenn der Fehler als Option überschrieben würde, bliebe der letzte Fehler bestehen. Der letzte Fehler wäre in meinem Fall immer noch eine 1. Ist es nicht so?

Wenn ich auf diese Weise nicht einmal mit Fehlern arbeite. Darf ich Ihnen an einem Beispiel zeigen, was Sie meinen?

Hier ist meine Änderungsfunktion mit allen Druckern, weil ich sie gerade debugge.(Achten Sie nicht auf andere darin verwendete Methoden).

// 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);
}
 
Victor, Ihr erster Beitrag enthielt bereits alle notwendigen Informationen. Sie senden lediglich Aufträge zur Änderung eines Auftrags, ohne neue Werte für die Parameter dieses Auftrags.
 

Der Kellner antwortet: "Was willst du, alter Mann?

Oder: Du sagst mir, was du willst, vielleicht gebe ich dir, was du willst.

 

Ich habe weder Kritik noch ein herzliches russisches "Merci" erhalten. Traurig, Mädchen...

 
tara:

Ich habe weder Kritik noch ein herzliches russisches "Merci" erhalten. Traurig, Mädchen...

Wofür sollte man dankbar sein?
 
Ja...
 
borilunad:

Entschuldigung, SellLimit erfordert dist:

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

Boris, haben Sie noch nie die Möglichkeit gehabt, eine Pending Order innerhalb des Spreads zu platzieren? Und wie kommen Sie darauf, dass New_OOP das nicht enthält?
 
tara:
Victor, Ihr erster Beitrag enthielt bereits alle notwendigen Informationen. Sie senden einfach Aufträge, um einen Auftrag zu ändern, ohne neue Werte für die Parameter dieses Auftrags.

Boris, nehmen wir mal an, dass das der Fall ist... Angenommen. Wenn die Funktion jedoch einen Auftrag erneut sendet, um den Auftrag zu ändern, sollte der Signifikanzton geändert werden. Und bei mir ändert es sich überhaupt nicht. Selbst wenn wir uns das Protokoll im Protokoll ansehen, sehen wir Folgendes:

modify #2  sell limit 0.10 EURUSD at 1.34048 sl: 1.34125 tp: 1.33362 ok
OrderModify error 1
Warum wird die Bestellung abgeschickt? Wären die Parameter nicht korrekt, würde die Funktion abstürzen... Und hier ist es irgendwie in Ordnung... ...es wurde gesendet. Dann stellte sich heraus, dass ein Fehler vorlag. Was ist die Logik dahinter?
 

Was hat das mit Fehlern zu tun? Ich habe einen Fehlerausdruck direkt vor die Änderungsfunktion gesetzt:

//---- Выполняем модификацию в тестере
   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);
      }
      }
   }

Und hier ist das Protokoll dieses Codestücks:

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
Sie können deutlich sehen, dass es vor der Änderungsfunktion keine Fehler gibt! Was hat das mit Fehlern zu tun?