Erro nº 1 na modificação de ordens - página 3

 

erro 1 é um erro normal...

no testador, geralmente não ocorre (a menos que o código seja curvo e modifique os parâmetros de ordem inalterados ou se o testador puder gerar escorregamentos).

no mercado real isso (com o código correto de modificação de ordem) é possível quando você muda de paradas próximas ao mercado, especialmente com o escorregamento - tipo de parada perdida se move bem atrás do preço quando a ordem está se movendo para o positivo e devido ao escorregamento e ao movimento de preço, o erro freqüentemente ocorre e é claro o porquê... bom erro...

 
borilunad:

Desculpe, SellLimit requer dist:

não se (New_OOP < Bid) continuar; masse (New_OOP-dist*Point < Bid) continuar;

Boris, meu método fOrderModify() leva em conta todas as verificações, tanto no STOPLEVEL como no FRIZLEVEL. Portanto, se alguma destas condições não fosse atendida, a modificação não chegaria ao ponto.

Renat:

Você está absolutamente errado. O último erro ainda é reposto em muitas funções importantes. Funciona assim também no WinAPI.

Portanto, salve o código de erro em variável local logo após sua ocorrência, e não tente usá-lo após limpar esta variável do sistema dez vezes em massa de suas funções intermediárias.

Bem, mesmo se o erro fosse sobrescrito como opção, o último ainda estaria lá. O último erro ainda seria 1 no meu caso. Não é assim?

Se eu não estiver trabalhando com erros dessa forma. Posso lhe mostrar o que você quer dizer com um exemplo?

Aqui está minha função de modificação com todas as impressoras, porque estou fazendo a depuração agora.(Ignorar os outros métodos que utiliza).

// 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, seu primeiro posto já continha todas as informações necessárias. Você está simplesmente enviando ordens para modificar uma ordem sem novos valores para os parâmetros dessa ordem.
 

O servidor responde: O que você quer, meu velho?

Ou: Você me diz o que quer, talvez eu lhe dê o que você quer.

 

Não recebi nenhuma crítica ou um sincero "merci" russo. Triste, meninas...

 
tara:

Não recebi nenhuma crítica ou um sincero "merci" russo. Triste, meninas...

O que há para ser agradecido?
 
Sim...
 
borilunad:

Desculpe, SellLimit requer dist:

não se (New_OOP < Bid) continuar; masse (New_OOP-dist*Point < Bid) continuar;

Boris, você nunca encontrou uma oportunidade de colocar uma ordem pendente dentro do spread? E o que o faz pensar que o New_OOP não contém isso?
 
tara:
Victor, seu primeiro posto já continha todas as informações necessárias. Você simplesmente envia ordens para modificar uma ordem sem novos valores para os parâmetros dessa ordem.

Boris, vamos supor que é esse o caso... Assumindo. Mas, se a função reenviar uma ordem para modificar a ordem, o significado deve ser modificado. E comigo não modifica em nada. Mesmo que olhemos para o tronco no toro, o que vemos é isto:

modify #2  sell limit 0.10 EURUSD at 1.34048 sl: 1.34125 tp: 1.33362 ok
OrderModify error 1
Por que a ordem está sendo enviada? Se seus parâmetros não estivessem corretos, a função colidiria. E aqui está tudo bem... ...foi enviado. Aconteceu então que havia um erro. Qual é a lógica por trás disso?
 

O que isso tem a ver com erros? Coloco uma impressão de erro imediatamente antes da função de modificação:

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

E aqui está o registro deste pedaço de código:

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
Você pode ver claramente que não há erros antes da função de modificação! O que isso tem a ver com erros?