주문 수정 시 실수 #1 - 페이지 3

 

오류 1 일반 오류..

일반적으로 테스터에서는 발생하지 않습니다(곡선 코드가 변경되지 않은 주문 매개변수를 수정하거나 테스터가 미끄러짐을 생성할 수 있는 경우 제외).

실제 시장에서 이것은 (정확한 주문 수정 코드가 있는) 스탑이 시장 가까이에서 변경될 때 가능합니다. 특히 슬리피지를 사용할 때 - 우리는 주문이 플러스로 움직일 때 가격 바로 뒤에서 스탑 로스를 움직입니다. 미끄러짐과 가격 변동을 이용해서 에러가 자주 발생하는데 왜 그런지 이해가 가는데..잘못된 실수..

 
borilunad :

죄송합니다. SellLimit에서는 거리를 유지해야 합니다.

not if ( New_OOP < Bid ) 계속 ; 그리고 if ( New_OOP-dist*Point < Bid ) 계속 ;

Boris , 내 fOrderModify() 메서드에서 STOPLEVEL과 FRIZLEVEL 모두에서 모든 검사가 고려됩니다. 따라서 이러한 조건 중 하나라도 준수되지 않으면 수정이 이루어지지 않습니다.

레나트 :

당신은 완전히 틀렸습니다. 마지막 오류는 여전히 많은 중요한 기능에서 재설정되고 있습니다. 이것은 WinAPI에서도 작동합니다.

따라서 오류 코드는 발생한 직후 로컬 변수에 저장하고, 많은 중간 기능에서 이 시스템 변수를 10번 클리어한 후 사용하지 마십시오.

글쎄, 내가 옵션으로 오류를 덮어 썼다면. 내 경우에는 마지막 하나가 여전히 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 );
}
 
Victor, 귀하의 첫 번째 게시물에는 이미 필요한 모든 정보가 포함되어 있습니다. 이 주문의 매개변수에 대한 새 값이 포함되지 않은 주문을 수정하기 위해 주문을 보내기만 하면 됩니다.
 

서버가 응답합니다. 무엇이 필요합니까, 노인?

글쎄, 또는 : 당신이 당신이 필요로하는 것을 말해, 아마도 당신이 원하는 것을 줄 것입니다.

 

나는 어떤 비판도 기다리지 않았고, 러시아인의 "merci"를 무자비하게 흘려보냈다. 슬프다 아가씨들...

 
tara :

나는 어떤 비판도 기다리지 않았고, 러시아인의 "merci"를 무자비하게 흘려보냈다. 슬프다 아가씨들...

그러나 그것은 무엇을위한 것입니까?
 
예...
 
borilunad :

죄송합니다. SellLimit에서는 거리를 유지해야 합니다.

not if ( New_OOP < Bid ) 계속 ; 그리고 if ( New_OOP-dist*Point < Bid ) 계속 ;

보리스, 스프레드 안에 보류 주문 을 넣을 기회를 본 적이 있습니까? 그리고 여기서 링크한 이 dist가 New_OOP에 포함되지 않는다고 결정한 이유는 무엇인가요?
 
tara :
Victor, 귀하의 첫 번째 게시물에는 이미 필요한 모든 정보가 포함되어 있습니다. 이 주문의 매개변수에 대한 새 값이 포함되지 않은 주문을 수정하기 위해 주문을 보내기만 하면 됩니다.

보리스, 이것이 그렇다고 가정합시다 ... 가정 해 봅시다. 그러나 함수가 주문 수정 주문을 다시 보내면 수정해야 합니다. 그리고 전혀 수정하지 않습니다. 로그의 로그를 보면 다음과 같이 표시됩니다.

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
수정 기능 이전에 오류가 없는 것을 분명히 알 수 있습니다! 그리고 여기에 오류가 있습니까???
사유: