修改订单时的错误#1 - 页 3

 

错误1是一个正常的错误...

在测试器中,通常不会发生(除非代码是弯曲的,并且修改了未改变的订单参数,或者测试器可以产生滑移)。

在真实的市场中,当你在接近市场的地方改变止损点时,这是有可能的(有正确的订单修改代码),特别是在滑移的情况下--当订单向正方向移动时,止损类型就在价格后面移动,由于滑移和价格移动,错误经常发生,原因很明显......好的错误......

 
borilunad:

对不起,SellLimit需要dist。

不是如果 (New_OOP < Bid) 继续;而是如果 (New_OOP-dist*Point < Bid) 继续

Boris,我的fOrderModify() 方法考虑到了所有的检查,包括对STOPLEVEL和FRIZLEVEL的检查。因此,如果这些条件中有任何一项没有得到满足,修改就不会完成。

雷纳特

你是绝对错误的。在许多重要的功能中,最后一个错误仍然被重置。它在WinAPI中也是这样工作的。

因此,在错误发生后立即将错误代码保存到本地变量中,并且在你的中间函数中大量清除这个系统变量十次后不要试图使用它。

好吧,即使错误被覆盖为一个选项,最后一个选项仍然会存在。在我的情况下,最后一个错误仍然是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。

不是如果 (New_OOP < Bid) 继续;而是如果 (New_OOP-dist*Point < Bid) 继续

鲍里斯,你从未遇到过在价差内下挂单 的机会吗?而你为什么认为New_OOP不包含这些呢?
 
tara:
维克多,你的第一个帖子已经包含了所有必要的信息。您只需发送订单来修改一个订单,该订单的参数没有新的值。

鲍里斯,让我们假设是这样的情况...假设。但是,如果该函数重新发送一个订单来修改订单,则应修改signantton。而对我来说,它根本就没有修改。即使我们看一下日志中的记录,我们看到的也是这样。

modify #2  sell limit 0.10 EURUSD at 1.34048 sl: 1.34125 tp: 1.33362 ok
OrderModify error 1
为什么要发送订单?如果它的参数不正确,这个函数就会崩溃...而这里还算可以............它被送来了。然后事实证明,有一个错误。这背后的逻辑是什么?
 

这与错误有什么关系?我在修改函数之前放了一个错误打印。

//---- Выполняем модификацию в тестере
   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
你可以清楚地看到,在修改功能之前没有任何错误!这与错误有什么关系?