Errore #1 quando si modificano gli ordini - pagina 3

 

l'errore 1 è un errore normale...

nel tester, di solito non si verifica (a meno che il codice non sia curvo e modifichi parametri d'ordine invariati o se il tester può generare slittamenti).

nel mercato reale questo (con codice di modifica dell'ordine corretto) è possibile quando si cambia stop vicino al mercato, specialmente con slippage - il tipo di stop loss si muove proprio dietro il prezzo quando l'ordine si sta muovendo in positivo e a causa dello slippage e del movimento del prezzo, l'errore si verifica spesso ed è chiaro perché... buon errore...

 
borilunad:

Spiacente, SellLimit richiede un dist:

non se (New_OOP < Bid) continua; mase (New_OOP-dist*Point < Bid) continua;

Boris, il mio metodo fOrderModify() tiene conto di tutti i controlli, sia su STOPLEVEL che FRIZLEVEL. Quindi, se una di queste condizioni non fosse stata soddisfatta, la modifica non sarebbe stata completata.

Renat:

Si sbaglia di grosso. L'ultimo errore è ancora resettato in molte funzioni importanti. Funziona così anche in WinAPI.

Quindi, salvate il codice di errore nella variabile locale subito dopo che si è verificato, e non cercate di usarlo dopo aver cancellato questa variabile di sistema dieci volte nella massa delle vostre funzioni intermedie.

Beh, anche se l'errore viene sovrascritto come opzione, l'ultimo sarebbe ancora lì. L'ultimo errore sarebbe ancora 1 nel mio caso. Non è così?

Se non lavoro nemmeno con gli errori in quel modo. Posso mostrarle cosa intende con un esempio?

Ecco la mia funzione di modifica con tutte le stampanti, perché la sto debuggando ora.(Ignora gli altri metodi che usa).

// 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, il tuo primo post conteneva già tutte le informazioni necessarie. State semplicemente inviando ordini per modificare un ordine senza nuovi valori per i parametri di quell'ordine.
 

Il server risponde: Cosa vuoi, vecchio?

Oppure: tu mi dici quello che vuoi, forse io ti darò quello che vuoi.

 

Non ho ricevuto nessuna critica o un cordiale "merci" russo. Triste, ragazze...

 
tara:

Non ho ricevuto nessuna critica o un cordiale "merci" russo. Triste, ragazze...

Per cosa c'è da essere grati?
 
Sì...
 
borilunad:

Spiacente, SellLimit richiede un dist:

non se (New_OOP < Bid) continua; mase (New_OOP-dist*Point < Bid) continua;

Boris, non hai mai incontrato l'opportunità di piazzare un ordine pendente all'interno dello spread? E cosa vi fa pensare che New_OOP non lo contenga?
 
tara:
Victor, il tuo primo post conteneva già tutte le informazioni necessarie. Si inviano semplicemente ordini per modificare un ordine senza nuovi valori per i parametri di quell'ordine.

Boris, supponiamo che sia così... Assumendo. Ma, se la funzione invia nuovamente un ordine per modificare l'ordine, il significantton dovrebbe essere modificato. E con me non si modifica affatto. Anche se guardiamo il registro nel registro, quello che vediamo è questo:

modify #2  sell limit 0.10 EURUSD at 1.34048 sl: 1.34125 tp: 1.33362 ok
OrderModify error 1
Perché l'ordine viene inviato? Se i suoi parametri non fossero corretti, la funzione andrebbe in crash... E qui va abbastanza bene... ...è stato inviato. Poi si è scoperto che c'era un errore. Qual è la logica che c'è dietro?
 

Cosa c'entra questo con gli errori? Ho messo una stampa di errore appena prima della funzione di modifica:

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

Ed ecco il log di questo pezzo di codice:

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
Si vede chiaramente che non ci sono errori prima della funzione di modifica! Cosa c'entra questo con gli errori?
Motivazione: