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

 
borilunad :
Victor, Renat는 일반적으로 Alexey가 필요한 마지막 확인을 보여 주었고 의미의 모호성을 피하고 조건을 놓치지 않기 위해 모든 뉘앙스를 사용하여 각 매개 변수에 대해 필요한 모든 확인을 더 일찍 수행했습니다!
그리고 이게 무슨 소용입니까? 결국 각 함수에서 _LastError 값을 재설정합니다. 항상 기억에 남아있지는 않습니다...
 
hoz :
그리고 이게 무슨 소용입니까? 결국 각 함수에서 _LastError 값을 재설정합니다. 항상 기억에 남아있지는 않습니다...
죄송합니다, 당신은 당신의 기능과 수표의 희생자입니다! 관심 차트에 정보 표시,트레이딩 후 출력 오류 체크 기능 !
 
evillive :
3개의 매개변수 중 어느 것도 변경되지 않은 경우 OrderModify도 건드려서는 안 된다는 사실에 대해 또 다른 확인이 필요합니다.

나는 당신을 이해했다. 도움이되지 않았습니다. 다음은 수정 방법의 코드입니다.

   ResetLastError ();
   
//---- Определяем цвет значков модификации ордеров
   if (fc_Arrow == CLR_NONE)
       fc_Arrow = ColorByModify [OrderType() % 2 ];
   
//---- Выполняем модификацию в тестере
   if (!CBase.GetRealTrade())         \\ Если работаем в тестере...
   {
       if ((OrderOpenPrice() != fd_OpenPrice) || (OrderStopLoss() != fd_NewSL) || (OrderTakeProfit() != fd_NewTP))
      
       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, "; OOP = " , fd_OpenPrice, "; SL = " , fd_NewSL, "; TP = " , fd_NewTP);
         return ( false );
      }
   }
여기에서 오류 값이 재설정된 것을 명확하게 볼 수 있습니다.

그런 다음 그는 시장 정보를 얻습니다. 수정이 테스터에 있다면... 그럼... Alexey 가 제안한 검사를 수행하고.. 수정이 성공하지 못하면... 로그를 작성하고 저널에 인쇄합니다.

일반적으로 ResetLastError() .. 사이에는 오류가 없는 것이 분명합니다. 잘못된 점은 없습니다.

잡지:

0        20 : 24 : 08          2013.08 . 26 00 : 00   Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::fOrderModify: Вошли в функцию 
0        20 : 24 : 08          2013.08 . 26 00 : 00   Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::fOrderModify: До проверки на FREEZELEVEL и STOPLEVEL  тикета № 2
0        20 : 24 : 08          2013.08 . 26 00 : 00   Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::fOrderModify: Тикет № 2 ; OOP = 1.34048 ; SL = 1.34125 ; TP = 1.33362
0        20 : 24 : 08          2013.08 . 26 00 : 00   Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::CheckLevelsBLOCK: Вошли в функцию
0        20 : 24 : 08          2013.08 . 26 00 : 00   Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::CheckLevelsBLOCK: Тикет № 2 ; fd_NewOpenPrice = 1.34048 ; fd_NewSL = 1.34125 ; fd_NewTP = 1.33362
0        20 : 24 : 08          2013.08 . 26 00 : 00   Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::CheckLevelsBLOCK: fi_Type > 2 = true
0        20 : 24 : 08          2013.08 . 26 00 : 00   Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::CheckLevelsBLOCK: Тикет № 2 ; fd_NewOpenPrice = 1.34048 ; fd_NewSL = 1.34125 ; fd_NewTP = 1.33362
0        20 : 24 : 08          2013.08 . 26 00 : 00   Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::CheckLevelsBLOCK: Вышли из функции
0        20 : 24 : 08          2013.08 . 26 00 : 00   Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::fOrderModify: После проверки на FREEZELEVEL и STOPLEVEL  тикета № 2
0        20 : 24 : 08          2013.08 . 26 00 : 00   Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::fOrderModify: Тикет № 2 ; OOP = 1.34048 ; SL = 1.34125 ; TP = 1.33362
2        20 : 24 : 08          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        20 : 24 : 08          2013.08 . 26 00 : 00   Kevin Martens_Moi_Myrei EURUSD,M15: OrderModify error 1
 
hoz :

나는 당신을 이해했다. 도움이되지 않았습니다. 다음은 수정 방법의 코드입니다.

여기에서 오류 값이 재설정된 것을 명확하게 볼 수 있습니다.

그런 다음 그는 시장 정보를 얻습니다. 수정이 테스터에 있다면... 그럼... Alexey 가 제안한 검사를 수행하고.. 수정이 성공하지 못하면... 로그를 작성하고 저널에 인쇄합니다.

일반적으로 ResetLastError() .. 사이에는 오류가 없는 것이 분명합니다. 잘못된 점은 없습니다.

잡지:

변경하기 전에 OOP, SL 및 TP의 이전 값을 로그에 출력해야 합니다. 갑자기 새 값과 일치하면 오류 1번의 원인이 더 명확해집니다.
 

그래서 모든 것이...

EA에서는 다음과 같이 클래스 메서드를 호출합니다 .

 if (OrderType() == OP_SELLLIMIT)
      {
         if (OrderOpenPrice() != ND (fd_MurreyLevelsValue[ 11 ]))
            New_OOP = ND (fd_MurreyLevelsValue[ 11 ]);
         else New_OOP = OrderOpenPrice();
         if (OrderStopLoss() != ND (fd_MurreyLevelsValue[ 12 ]))
            New_SL = ND (fd_MurreyLevelsValue[ 12 ]);
         else New_SL = OrderStopLoss();
         if (OrderTakeProfit() != ND (fd_MurreyLevelsValue[ 2 ]))
            New_TP = ND (fd_MurreyLevelsValue[ 2 ]);
         else New_TP = OrderTakeProfit();
         
         Print ( __FUNCTION__ , ": " , "New_OOP = " , New_OOP, "; New_SL = " , New_SL, "; New_TP = " , New_TP);
         Print ( __FUNCTION__ , ": " , "Тикет № " , OrderTicket(), "; OrderOpenPrice() = " , OrderOpenPrice(),
             "; OrderStopLoss() = " , OrderStopLoss(), "; OrderTakeProfit() = " , OrderTakeProfit());
             
         if (ND (OrderOpenPrice()) != fd_MurreyLevelsValue[ 11 ])
         {
             if (New_OOP < Bid) continue ;
            
             if (!CPosMan.fOrderModify (Ticket,  New_OOP, New_SL, New_TP))
            {
               if ( _LastError != 0 )
                  CLogs.WriteLog ( StringConcatenate ( __FUNCTION__ , ". В строке " , __LINE__ , " " , CErrs.ErrorToString ( _LastError )),
                                  CLogs.GetNeedLogs(), CLogs.GetPrintUP(), CLogs.GetCommentUP());
            }
             else
            {
               Print ( __FUNCTION__ , ": " , "Модификация тикета №" , OrderTicket(), " успешно завершена!" );
               Print ( __FUNCTION__ , ": " , "Тикет № " , OrderTicket(), "; OrderOpenPrice() = " , OrderOpenPrice(),
             "; OrderStopLoss() = " , OrderStopLoss(), "; OrderTakeProfit() = " , OrderTakeProfit());
            }
         }
      }

다음은 우리가 관심 있는 클래스의 일부입니다.

 // 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, "; OOP = " , fd_OpenPrice, "; SL = " , fd_NewSL, "; 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, "; OOP = " , fd_OpenPrice, "; SL = " , fd_NewSL, "; TP = " , fd_NewTP);
   
   ResetLastError ();
   
//---- Определяем цвет значков модификации ордеров
   if (fc_Arrow == CLR_NONE)
       fc_Arrow = ColorByModify [OrderType() % 2 ];
   
//---- Выполняем модификацию в тестере
   if (!CBase.GetRealTrade())
   {
       if ((OrderOpenPrice() != fd_OpenPrice) || (OrderStopLoss() != fd_NewSL) || (OrderTakeProfit() != fd_NewTP))
      
       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, "; OOP = " , fd_OpenPrice, "; SL = " , fd_NewSL, "; TP = " , fd_NewTP);
         return ( false );
      }
   }

다음은 로그의 일부입니다.

0        21 : 11 : 44          2013.08 . 26 09 : 45   Kevin Martens_Moi_Myrei EURUSD,M15: MovingLimitPositions: Выбран тикет № 2
0        21 : 11 : 44          2013.08 . 26 09 : 45   Kevin Martens_Moi_Myrei EURUSD,M15: MovingLimitPositions: Тикет № 2 ; OrderOpenPrice() = 1.34048 ; OrderStopLoss() = 1.34125 ; OrderTakeProfit() = 1.33362
0        21 : 11 : 44          2013.08 . 26 09 : 45   Kevin Martens_Moi_Myrei EURUSD,M15: MovingLimitPositions: New_OOP = 1.3401 ; New_SL = 1.34048 ; New_TP = 1.33667
0        21 : 11 : 44          2013.08 . 26 09 : 45   Kevin Martens_Moi_Myrei EURUSD,M15: MovingLimitPositions: Тикет № 2 ; OrderOpenPrice() = 1.34048 ; OrderStopLoss() = 1.34125 ; OrderTakeProfit() = 1.33362
0        21 : 11 : 44          2013.08 . 26 09 : 45   Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::fOrderModify: Вошли в функцию 
0        21 : 11 : 44          2013.08 . 26 09 : 45   Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::fOrderModify: До проверки на FREEZELEVEL и STOPLEVEL  тикета № 2
0        21 : 11 : 44          2013.08 . 26 09 : 45   Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::fOrderModify: Тикет № 2 ; OrderOpenPrice() = 1.34048 ; OrderStopLoss() = 1.34125 ; OrderTakeProfit() = 1.33362
0        21 : 11 : 44          2013.08 . 26 09 : 45   Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::fOrderModify: Тикет № 2 ; OOP = 1.3401 ; SL = 1.34048 ; TP = 1.33667
0        21 : 11 : 44          2013.08 . 26 09 : 45   Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::CheckLevelsBLOCK: Вошли в функцию
0        21 : 11 : 44          2013.08 . 26 09 : 45   Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::CheckLevelsBLOCK: Тикет № 2 ; fd_NewOpenPrice = 1.3401 ; fd_NewSL = 1.34048 ; fd_NewTP = 1.33667
0        21 : 11 : 44          2013.08 . 26 09 : 45   Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::CheckLevelsBLOCK: fi_Type > 2 = true
0        21 : 11 : 44          2013.08 . 26 09 : 45   Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::CheckLevelsBLOCK: Ещё Чутка дальше
0        21 : 11 : 44          2013.08 . 26 09 : 45   Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::CheckLevelsBLOCK: Тикет № 2 ; fd_NewOpenPrice = 1.3401 ; fd_NewSL = 1.34048 ; fd_NewTP = 1.33667
0        21 : 11 : 44          2013.08 . 26 09 : 45   Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::CheckLevelsBLOCK: Вышли из функции
0        21 : 11 : 44          2013.08 . 26 09 : 45   Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::fOrderModify: После проверки на FREEZELEVEL и STOPLEVEL  тикета № 2
0        21 : 11 : 44          2013.08 . 26 09 : 45   Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::fOrderModify: Тикет № 2 ; OOP = 1.3401 ; SL = 1.34048 ; TP = 1.33667
2        21 : 11 : 44          2013.08 . 26 09 : 45   Kevin Martens_Moi_Myrei EURUSD,M15: modify # 2 sell limit 0.10 EURUSD at 1.34010 sl: 1.34048 tp: 1.33667 ok
3        21 : 11 : 44          2013.08 . 26 09 : 45   Kevin Martens_Moi_Myrei EURUSD,M15: OrderModify error 1
 

설명하겠습니다. 수정은 fOrderModify() 메서드에서 발생합니다. 이 fOrderModify() 메서드에 대한 입력에서 본문 시작 부분에 주문 매개변수의 현재 값과 새 계획 매개변수가 인쇄됩니다. 다음과 같이 볼 수 있습니다.

   Print ( __FUNCTION__ , ": " , "До проверки на FREEZELEVEL и STOPLEVEL  тикета № " , fi_Ticket);
   Print ( __FUNCTION__ , ": " , "Тикет № " , OrderTicket(), "; OrderOpenPrice() = " , OrderOpenPrice(),
             "; OrderStopLoss() = " , OrderStopLoss(), "; OrderTakeProfit() = " , OrderTakeProfit());
   Print ( __FUNCTION__ , ": " , "Тикет № " , fi_Ticket, "; OOP = " , fd_OpenPrice, "; SL = " , fd_NewSL, "; TP = " , fd_NewTP);

로그의 이 부분:

 0        21 : 11 : 44          2013.08 . 26 09 : 45   Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::fOrderModify: Вошли в функцию 
0        21 : 11 : 44          2013.08 . 26 09 : 45   Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::fOrderModify: До проверки на FREEZELEVEL и STOPLEVEL  тикета № 2
0        21 : 11 : 44          2013.08 . 26 09 : 45   Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::fOrderModify: Тикет № 2 ; OrderOpenPrice() = 1.34048 ; OrderStopLoss() = 1.34125 ; OrderTakeProfit() = 1.33362
0        21 : 11 : 44          2013.08 . 26 09 : 45   Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::fOrderModify: Тикет № 2 ; OOP = 1.3401 ; SL = 1.34048 ; TP = 1.33667
매개변수가 다른 것을 알 수 있습니다. 문제가 없어야 합니다.
 
hoz :

그래서 모든 것이...

EA에서는 다음과 같이 클래스 메서드를 호출합니다.

다음은 우리가 관심 있는 클래스의 일부입니다.

다음은 로그의 일부입니다.

이해가 안되는 부분이 있습니다. 주문이 보류 중인 경우 입찰과 어떤 관련이 있습니까?

 if ( OrderType() == OP_SELLLIMIT )
      {
         if (OrderOpenPrice() != ND (fd_MurreyLevelsValue[ 11 ]))
            New_OOP = ND (fd_MurreyLevelsValue[ 11 ]);
         else New_OOP = OrderOpenPrice();
         if (OrderStopLoss() != ND (fd_MurreyLevelsValue[ 12 ]))
            New_SL = ND (fd_MurreyLevelsValue[ 12 ]);
         else New_SL = OrderStopLoss();
         if (OrderTakeProfit() != ND (fd_MurreyLevelsValue[ 2 ]))
            New_TP = ND (fd_MurreyLevelsValue[ 2 ]);
         else New_TP = OrderTakeProfit();
         
         Print ( __FUNCTION__ , ": " , "New_OOP = " , New_OOP, "; New_SL = " , New_SL, "; New_TP = " , New_TP);
         Print ( __FUNCTION__ , ": " , "Тикет № " , OrderTicket(), "; OrderOpenPrice() = " , OrderOpenPrice(),
             "; OrderStopLoss() = " , OrderStopLoss(), "; OrderTakeProfit() = " , OrderTakeProfit());
             
         if (ND (OrderOpenPrice()) != fd_MurreyLevelsValue[ 11 ])
         {
             if ( New_OOP < Bid ) continue ;
            
             if (!CPosMan.fOrderModify (Ticket,  New_OOP, New_SL, New_TP))
            {
               if ( _LastError != 0 )
                  CLogs.WriteLog ( StringConcatenate ( __FUNCTION__ , ". В строке " , __LINE__ , " " , CErrs.ErrorToString ( _LastError )),
                                  CLogs.GetNeedLogs(), CLogs.GetPrintUP(), CLogs.GetCommentUP());
            }
             else
            {
               Print ( __FUNCTION__ , ": " , "Модификация тикета №" , OrderTicket(), " успешно завершена!" );
               Print ( __FUNCTION__ , ": " , "Тикет № " , OrderTicket(), "; OrderOpenPrice() = " , OrderOpenPrice(),
             "; OrderStopLoss() = " , OrderStopLoss(), "; OrderTakeProfit() = " , OrderTakeProfit());
            }
         }
      }


Bid는 항상 SellLimit보다 낮고, if(New_OOP < Bid) 라인은 절대 참이 되지 않습니다... 따라서 수정은 순조롭게 진행됩니다.

 
hoz :

또한 오류 배열을 얻을 수 있습니까? 결국 문서에는 _LastError 변수가 마지막 오류 번호를 저장한다고 흑백으로 나와 있습니다. 그리고 리셋은 ResetLastError() 함수에 의해 수행됩니다. _LastError에 대한 호출 사이에 더 이상 오류가 없으면 _LastError는 마지막 오류 값을 저장합니다. 나는 도중에 더 이상 오류가 없었습니다. 그리고 그것은 문제가 아닙니다.

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

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

 

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

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

 
hoz :

이 빌어먹을 오류를 제거하는 방법? 그녀는 이미 나를 얻었다. 함수의 각 입력 매개변수를 확인합니다. 현재 나는 다음과 같이 가지고 있습니다.

저것들. 매개변수가 변경되지 않으면 변경할 필요가 없습니다. 해본적은 없지만...

그런 다음 내 매개변수가 다음과 같이 주문 수정 방법으로 전달됩니다.

Hv 로그 출력:

수정 등의 로그를 알려주는 것으로 밝혀졌습니다. 확인 후 ... 오류가 발생했습니다. 설정이 변경되지 않았습니다.

주문이 보류 중입니다. 그래서 당신은 시작 가격을 변경할 수 있습니다. 그리고 이것은 내가 이해하는 바와 같이 문서와 모순되지 않습니다.

누가 비슷한 것에 직면 했습니까? 결정하는 방법?

그리고 매개변수가 수정되지 않은 경우 지연을 수정하려고 시도하지 않습니다.